【问题标题】:Custom loss function in tensorflow张量流中的自定义损失函数
【发布时间】:2018-03-27 02:29:30
【问题描述】:

我有一个 seq2seq 模型,我的输入是短句,例如

x = "The XYZ pub near Cafe ABC has a 5 star rating.  Prices start at £30."

我的输出是从输入句子中提取的语义信息,例如:

y_true = name[XYZ], type[pub], price[moderate], rating[5], close_to[Cafe ABC]

问题在于,虽然在许多情况下我的 t_true 包含完整的语义信息,但在某些情况下它缺少诸如

之类的信息
y_true = name[XYZ], type[pub]

我想做的是,即使模型预测:

y_predicted = name[XYZ], type[pub], price[moderate], rating[5], close_to[Cafe ABC]

如果

y_true = name[XYZ], type[pub]

损失函数还应该在输入中回溯并检查不在目标中的预测语义信息是否位于输入中,如果它们在输入中,则成本应为零。

y_predicted 和输入 x 的比较将是正则表达式匹配。是否可以将这样的复杂过程集成到损失函数中,特别是在 tensorflow 中?

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    当然可以,实际上这很简单。对于单个样本,您正在计算一个包含 5 个损失值的向量,例如 losses = [1.2, 0.3, 1.5, 3.3, 0.6]。请注意,此结果是在您对损失执行任何 tf.reduce_mean 函数之前。

    现在在 tensorflow 中为自己构建一个函数,该函数为每个损失值生成 1 或 0 的结果,以指示您是将其归零 (0) 还是保持 (1)。您现在拥有mask = [1 1 0 0 0],基于您想要保留名称和类型并将其他三个的损失归零的示例。

    现在您乘以 final_loss = losses * mask 以获得最终损失值,现在应用 tf.reduce_mean 并将其传递给您的优化器。需要注意的关键点是,这在梯度下降中可以满足您的要求,因为 1x = dx 和 0x = 0 在您进行导数时,因此在不应该应用的情况下最终将梯度归零。这就是具有可变序列长度的 RNN 在传入虚拟填充值时的工作方式,它使用掩码将梯度归零。

    【讨论】:

    • 感谢这是一个非常巧妙的解决方案。
    猜你喜欢
    • 2017-09-02
    • 2019-09-20
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多