昨天跑seq2seq的模型中遇到一些问题,总结一下。
本来以为模型已经收敛了,因为loss在震荡,后来发现我理解错了,因为我所看到的震荡其实是不同batch之间loss不同导致的,纵向来看,每个epoch同一个batch的loss仍在下降,所以其实没有必要缩小learning rate,例如将learning rate从0.01缩小到0.001,对于一个仍在准确逼近的模型可能会使模型收敛的速度减慢十倍,所以在更改参数前要先观察下loss的变化趋势。
而假如已经略有震荡了,learning rate的调整还是得视情况而定,减小会影响收敛速度,不变又会有震荡带来的副作用。
另外,我查了一些loss震荡资料,尽管事实上loss并没有震荡,除了更改learning rate以外还可以调整batch_size。我将batch_size从32扩大到了128(32倍数的原因是为了让系统更快的处理,与内存、处理器读取机制有关),调整后每个batch的loss也上升了,这个也很好理解。
值得注意的一点,无论是learning rate还是batch_size与模型结构本身都是无关的,所以理所当然可以修改,为了更快的逼近最优值。
至于batch_size如何影响loss,参考了https://blog.youkuaiyun.com/u013250416/article/details/78843254这篇博客后,大概如下:
这个参数的选取有两个极端,一个是1,也就是每次只训练一个样本。
这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元,非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,难以达到收敛。
第二个极端batch_size为全数据集(Full Batch Learning):
好处:
1.由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
2.由于不同权重的梯度值差别巨大,因此选择一个全局的学习率很困难。Full Batch Learning可以使用Rprop只基于梯度符号并且针对性单独更新各权值。

本文探讨了Seq2Seq模型训练过程中的问题及解决方法,包括理解loss曲线、调整learning rate与batch size的影响,以及这些参数如何帮助模型更快地收敛。
最低0.47元/天 解锁文章
36万+

被折叠的 条评论
为什么被折叠?



