几个小技巧,LSTM seq2seq模型训练提速数倍

>本文测试用的模型

神经网络类型:LSTM seq2seq

深度:5

Embedding 维度:300

其它技术:双向encode、残差技术、dropout技术、注意力机制

>测试用的语料集

QA语料集,2000组对话,单句最长小于200字符。

 

>行百里,半九十

下图是LSTM seq2seq模型训练轮数与预测准确率增长曲线,,batch_size=10,训练了65轮准确率达到100%。在训练初期(10%以下)与后期(90%以上)准确率曲线平缓,增长很慢,初期与后期训练轮数占了半数以上。所以提速训练,应该从初期与后期着手。

几个小技巧,LSTM seq2seq模型训练提速数倍_第1张图片

>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模型训练提速数倍_第2张图片

几个小技巧,LSTM seq2seq模型训练提速数倍_第3张图片

 

>分阶段调整学习率,加速LSTM seq2seq模型训练

从前面训练轮数与预测准确率增长曲线图可以看到,在90%准确率之前的初期与中期训练阶段,需要较大的学习率,快速调整权重参数,使模型快速收敛,准确率到达90%的后期阶段,有10%没有训练好的语料属于困难样本,如果学习率较大,会陷入局部震荡,这一轮的预测样本loss值调整变小收敛,会影响前面loss值已经收敛的部分样本,像跷跷板,这头loss值压下了,另一头翘起来了,来回震荡,如下图“25-29轮1-20条对话组loss值曲线”所示。学习率太大,会导致权重W调整步伐太大,会调整过头,结果是部分样本的loss值远远大于loss平均值,这时如果学习率保持不变,模型会陷入局部震荡状态,难以收敛。另一方面,当模型训练到这个状态,说明大部分的样本已经训练好,可以加快调整学习率的速度,loss值的峰值会跟随学习率逐步降低,模型快速收敛,准确率达到100%。

几个小技巧,LSTM seq2seq模型训练提速数倍_第4张图片

模型动态学习率调整选用多项式学习率迭代函数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

>先用较大的batch_size预训练,缩短训练初期的时间

从前面训练轮数与预测准确率增长曲线图可以看到,在10%准确率之前的训练初期,曲线平缓,准确率增长缓慢,这个时期主要是初始化权重W,找准梯度下降方向,可以用较大的batch_size进行训练,减少训练时间。

几个小技巧,LSTM seq2seq模型训练提速数倍_第5张图片

测试效果对比(分阶段调整学习率启用):

从测试结果可以看到,相对于分阶段调整学习率,大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

 

 

你可能感兴趣的:(NLP)