我最近发现LayerNormBasicLSTMCell是LSTM的一个版本,它实现了Layer Normalization和dropout。因此,我使用LSTMCell替换了我的原始代码和LayerNormBasicLSTMCell。这种变化不仅将测试精度从~96%降低到~92%,而且需要更长的时间(~33小时)进行训练(原始训练时间约为6小时)。所有参数都相同:历元数(10),堆叠层数(3),隐藏矢量大小数(250),丢失保持概率(0.5),......硬件也相同。
我的问题是:我在这里做错了什么?
我的原始模型(使用LSTMCell):
...
dropcells = []
for iiLyr in range(3):
cell_iiLyr = tf.contrib.rnn.LayerNormBasicLSTMCell(
num_units=250,
forget_bias=1.0,
activation=tf.tanh,
layer_norm=True,
norm_gain=1.0,
norm_shift=0.0,
dropout_keep_prob=0.5
)
dropcells.append(cell_iiLyr)
...
我的新模型(使用LayerNormBasicLSTMCell):
{{1}}
答案 0 :(得分:4)
或许应为dropout_keep_prob
分配占位符而不是常量值。尝试在培训时分配0.5
,在推理时分配1.0
。只是一个猜测。
答案 1 :(得分:2)
关于培训时间:我发现了这篇博文:http://olavnymoen.com/2016/07/07/rnn-batch-normalization。见最后一张图。批量标准化的lstm比香草lstm慢3倍以上。作者认为原因是批量统计计算。
关于准确性:我不知道。
答案 2 :(得分:1)
批量标准化和图层规范化不仅仅是通过小批量标准化输入分布,它们还添加了新的可学习变量beta和gamma。这是每个输入的每个维度的标量,因此四个输入乘以输入维度的两倍。
我认为这是导致经济放缓的大量新的可训练变量。
顺便说一下,如果你关闭layer_norm
,它会大幅加速,这样就可以支持假设这是问题的层规范化。