>本文测试用的模型
神经网络类型:LSTM seq2seq
深度:5层
Embedding 维度:300
其它技术:双向encode、残差技术、dropout技术、注意力机制
>测试用的语料集
QA语料集,2000组对话,单句最长小于200字符。
>行百里,半九十
下图是LSTM seq2seq模型训练轮数与预测准确率增长曲线,,batch_size=10,训练了65轮准确率达到100%。在训练初期(10%以下)与后期(90%以上)准确率曲线平缓,增长很慢,初期与后期训练轮数占了半数以上。所以提速训练,应该从初期与后期着手。
>batch_size值太大会导致测试准确率低
在LSTM seq2seq模型训练中,一般使用小批量梯度下降,一般教材推荐在内存许可情况下,尽量增大batch_size,以加速训练。实际使用中,发现如果训练batch_size与模型实际预测不一致时,训练校验准确率达到100%,测试准确率不等于校验准确率,校验准确率是小批量校验的,使用的batch_size与训练相同,模型实际预测时是单条进行的,因此测试准确率使用单条进行的。小批量梯度下降使用一批训练数据的平均loss值更新梯度,反映的是一批数据与标签符合情况,为了能够正确预测单条数据,每批训练数据需要随机抽取,以达到每轮每批训练数据的组合不相同。当batch_size大于1,测试准确率能否等于校验准确率,取决于每批训练数据随机抽样组合充分混合程度。batch_size增大,测试准确率与校验准确率偏离越大,测试准确率波动是随机的。如下图所示。当训练语料集很大,训练很耗时间,如果选用batch_size大于1,花了很长时间训练出来的模型有达不到目标准确率风险,因此,大语料集推荐使用batch_size=1进行训练。
>分阶段调整学习率,加速LSTM seq2seq模型训练
从前面训练轮数与预测准确率增长曲线图可以看到,在90%准确率之前的初期与中期训练阶段,需要较大的学习率,快速调整权重参数,使模型快速收敛,准确率到达90%的后期阶段,有10%没有训练好的语料属于困难样本,如果学习率较大,会陷入局部震荡,这一轮的预测样本loss值调整变小收敛,会影响前面loss值已经收敛的部分样本,像跷跷板,这头loss值压下了,另一头翘起来了,来回震荡,如下图“25-29轮1-20条对话组loss值曲线”所示。学习率太大,会导致权重W调整步伐太大,会调整过头,结果是部分样本的loss值远远大于loss平均值,这时如果学习率保持不变,模型会陷入局部震荡状态,难以收敛。另一方面,当模型训练到这个状态,说明大部分的样本已经训练好,可以加快调整学习率的速度,loss值的峰值会跟随学习率逐步降低,模型快速收敛,准确率达到100%。
模型动态学习率调整选用多项式学习率迭代函数tf.train.polynomial_decay():
tf.train.polynomial_decay(
learning_rate, #初始学习率
global_step, #当前训练轮次,epoch
decay_steps, #定义衰减周期
end_learning_rate=0.0001, #最小的学习率