【问题标题】:Tweaking the Loss before the Optimizer Step在优化器步骤之前调整损失
【发布时间】:2017-06-20 22:41:55
【问题描述】:

我想在我的loss 上运行AdamOptimizer 操作之前添加一个额外的操作,以帮助模型处理我的数据中的重复。相关代码 sn-p 看起来是这样的:

loss = tf.nn.softmax_cross_entropy_with_logits(logits=predLogits, labels=actLabels)
loss = tf.reshape(loss, [batchsize, -1])
repMask = tf.sqrt(tf.cast(tf.abs(tf.subtract(tf.cast(Y, tf.int64), tf.cast(X, tf.int64))), tf.float32))
lossPost = loss - repMask
train_step = tf.train.AdamOptimizer(LR).minimize(lossPost)

因此,换句话说,我不想最小化loss,而是希望AdamOptimizer 最小化其略微调整的版本,即lossPost。然后我以通常的方式训练模型:

_ = sess.run([train_step], feed_dict=feed_dict)

我注意到添加最小化lossPost 而不是loss 的解决方法对模型的准确性没有影响。无论有没有这种变通方法,该模型都会产生完全相同的输出。看来它还在继续优化原始的、未修改的loss。为什么会这样?

我最初的方法是在softmax_cross_entropy_with_logits 步骤执行此调整,而是使用weighted_cross_entropy_with_logits,但我有一个额外的复杂性,因为有一个额外的词汇维度(这是一个字符级-样式模型)。所以我觉得做这个后记会更容易,只要在优化步骤之前完成应该是可行的?

【问题讨论】:

    标签: machine-learning tensorflow


    【解决方案1】:

    在您的模型中,XY 似乎是常量(也就是说,它们仅取决于数据)。在这种情况下,repMask 也是常量,由

    定义
    repMask = tf.sqrt(tf.cast(tf.abs(tf.subtract(tf.cast(Y, tf.int64), tf.cast(X, tf.int64))), tf.float32))
    

    因此,losslossPost 在常数值上有所不同,这对最小化过程没有影响(就像找到最小化 x^2-1x 与最小化 x^2-5x。两者都@ 987654331@都一样)。

    【讨论】:

    • X 和 Y 是每个训练步骤的输入值和预测值。所以实验的想法是调整模型预测值与输入值相同的实例的损失(因为我在数据中有很多重复)。因此,在它们相同的地方,X-Y 为零,调整为零,而在其他地方,调整为正(以使损失更小)。所以我想问题变成了,当每一步都预测到 Y 时,在这一步进行优化是否为时已晚?
    • 或者我猜你的意思是从优化器的角度来看 X 和 Y 是常量,因为它们在每一步的优化之外?
    • 是的,这就是我的意思。现在,由于 lossPost 是一个向量而不是数字,您可以尝试在代码中添加以下行: lossPost=tf.reduce_mean(lossPost) (由于 lossPost 是一个向量,因此将平方和最小化更有意义其值)。但是,我不确定这种方法是否有意义(在处理重复时)。代码第一行的损失向量和 repMask 向量的数量完全不同,单位不同。
    猜你喜欢
    • 2018-08-07
    • 2020-12-28
    • 2018-05-20
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多