赞
踩
神经网络类型:LSTM seq2seq
深度:5层
Embedding 维度:300
其它技术:双向encode、残差技术、dropout技术、注意力机制
QA语料集,2000组对话,单句最长小于200字符。
下图是LSTM seq2seq模型训练轮数与预测准确率增长曲线,,batch_size=10,训练了65轮准确率达到100%。在训练初期(10%以下)与后期(90%以上)准确率曲线平缓,增长很慢,初期与后期训练轮数占了半数以上。所以提速训练,应该从初期与后期着手。
在LSTM seq2seq模型训练中,一般使用小批量梯度下降,一般教材推荐在内存许可情况下,尽量增大batch_size,以加速训练。实际使用中,发现如果训练batch_size与模型实际预测不一致时,训练校验准确率达到100%,测试准确率不等于校验准确率,校验准确率是小批量校验的,使用的batch_size与训练相同,模型实际预测时是单条进行的,因此测试准确率使用单条进行的。小批量梯度下降使用一批训练数据的平均loss值更新梯度,反映的是一批数据与标签符合情况,为了能够正确预测单条数据,每批训练数据需要随机抽取,以达到每轮每批训练数据的组合不相同。当batch_size大于1,测试准确率能否等于校验准确率,取决于每批训练数据随机抽样组合充分混合程度。batch_size增大,测试准确率与校验准确率偏离越大,测试准确率波动是随机的。如下图所示。当训练语料集很大,训练很耗时间,如果选用batch_size大于1,花了很长时间训练出来的模型有达不到目标准确率风险,因此,大语料集推荐使用batch_size=1进行训练。
从前面训练轮数与预测准确率增长曲线图可以看到,在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, #最小的学习率
power=1.0, #多项式的幂
cycle=False, #定义学习率是否到达最低学习率后升高,然后再降低
name=None #名称
)
多项式衰减的学习率计算公式:
global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) *
(1 - global_step / decay_steps) ^ (power) +
end_learning_rate
依据多项式衰减的学习率计算公式,通过调小decay_steps可以加快学习率的调整速度。当训练准确率大于90%时,decay_steps值按下面公式计算:
decay_steps =(epoch+adjust)*steps
epoch:已经训练轮数
adjust:调整轮数,经验值,与训练集数量有关,一般取值15-50
steps:每轮训练迭代次数
测试效果对比,分阶段调整学习率对模型训练提速效果显著,平均提升了177/43=4.1倍,见下表。
分阶段调整学习率修改前训练测试 | ||||
测试次数 | decay_steps | Batch_size | 准确率100%轮数 | 总迭代次数 |
1 | 500000 | 1 | 155 | 238855 |
2 | 500000 | 1 | 200 | 308200 |
平均 |
| 177 | 272757 |
分阶段调整学习率训练测试 | ||||||
测试次数 | 初始decay_steps | 调整decay_steps轮数 | decay_steps调整值 | Batch_size | 准确率100%轮数 | 总迭代次数 |
1 | 123280 | 25 | 61640 | 1 | 40 | 61640 |
2 | 123280 | 31 | 70886 | 1 | 47 | 72427 |
3 | 123280 | 26 | 63181 | 1 | 42 | 64722 |
平均 |
|
|
| 43 | 66263 |
从前面训练轮数与预测准确率增长曲线图可以看到,在10%准确率之前的训练初期,曲线平缓,准确率增长缓慢,这个时期主要是初始化权重W,找准梯度下降方向,可以用较大的batch_size进行训练,减少训练时间。
测试效果对比(分阶段调整学习率启用):
从测试结果可以看到,相对于分阶段调整学习率,大batch_size预训练模型,训练时间缩短25%,49406/66263=75%。分阶段调整学习率加上大batch_size预训练模型,训练时间可以缩短272757/49406=5.5倍。
测试次数 | 阶段 | Batch_size | 准确率100%轮数 | 迭代次数 | 总迭代次数 |
1 | 第一阶段 | 80 | 34 | 646 | 49958 |
第二阶段 | 1 | 32 | 49312 | ||
2 | 第一阶段 | 80 | 31 | 589 | 49901 |
第二阶段 | 1 | 32 | 49312 | ||
3 | 第一阶段 | 80 | 31 | 589 | 48360 |
第二阶段 | 1 | 31 | 47771 | ||
平均 |
|
|
| 49406 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。