sun*_*ide 27 neural-network deep-learning conv-neural-network tensorflow
在训练网络时,我一直看到一种非常奇怪的行为,经过几十次迭代(8到10小时)的学习,一切都中断,训练损失增加:
训练数据本身是随机的,并且分布在.tfrecord包含1000每个示例的许多文件中,然后在输入阶段再次洗牌并批量处理200示例.
我正在设计一个同时执行四个不同回归任务的网络,例如确定对象出现在图像中的可能性并同时确定其方向.网络以几个卷积层开始,一些具有剩余连接,然后分支到四个完全连接的段.
由于第一次回归导致概率,我使用交叉熵进行损失,而其他使用经典L2距离.然而,由于它们的性质,概率损失大约为0..1,而定向损失可能要大得多0..10.我已经将输入和输出值标准化并使用剪切
normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)
Run Code Online (Sandbox Code Playgroud)
在事情变得非常糟糕的情况下.
我已经(成功地)使用Adam优化器来优化包含所有不同损失(而不是reduce_sum它们)的张量,如下所示:
reg_loss = tf.reduce_sum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
loss = tf.pack([loss_probability, sin_cos_mse, magnitude_mse, pos_mse, reg_loss])
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate,
epsilon=self.params.adam_epsilon)
op_minimize = optimizer.minimize(loss, global_step=global_step)
Run Code Online (Sandbox Code Playgroud)
为了在TensorBoard中显示结果,我实际上是这样做的
loss_sum = tf.reduce_sum(loss)
Run Code Online (Sandbox Code Playgroud)
标量摘要.
Adam被设置为学习率1e-4和epsilon 1e-4(我看到与epislon的默认值相同的行为,当我保持学习率时,它会更快地打破1e-3).正规化对这一点也没有影响,它在某种程度上是这样做的.
我还应该补充说,停止训练并从最后一个检查点重新启动 - 这意味着训练输入文件也会再次洗牌 - 导致相同的行为.在那一点上,训练似乎总是表现得相似.
pat*_*_ai 43
是.这是亚当的一个已知问题.
亚当的方程是
t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
m_t <- beta1 * m_{t-1} + (1 - beta1) * g
v_t <- beta2 * v_{t-1} + (1 - beta2) * g * g
variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)
Run Code Online (Sandbox Code Playgroud)
其中m是平均梯度的指数移动平均值,是梯度v平方的指数移动平均值.问题是,当你已经训练了很长时间,并且接近最佳状态时,那么v就会变得非常小.如果然后突然间梯度开始再次增加,它将被除以非常小的数量并爆炸.
默认情况下beta1=0.9和beta2=0.999.所以m变化要快得多v.所以m可以再次开始变大,而v仍然很小,无法赶上.
为了解决这个问题,你可以增加epsilon这是10-8默认.因此,通过0几乎停止分裂的问题,根据您的网络,值上epsilon的0.1,0.01或者0.001可能是很好的.
是的,这可能是某种超级复杂的不稳定数字/方程的情况,但可以肯定的是,你的训练率只是太高了,因为你的损失迅速减少到 25K,然后在同一水平上振荡很多。尝试将其减少 0.1 倍,看看会发生什么。您应该能够达到更低的损失值。
继续探索!:)
| 归档时间: |
|
| 查看次数: |
9109 次 |
| 最近记录: |