这是来自UDACITY的LSTM代码,用于情感分类。
以下是整句_nn代码的链接:udacity/sentiment-rnn
我想知道为什么他们在for循环的for循环下初始化单元格状态。
我认为当输入句子改变时,单元格状态必须为零初始化,因此它必须在mini-batch for loop语句下。
## part of the sentence-rnn code
# Getting an initial state of all zeros
initial_state = cell.zero_state(batch_size, tf.float32)
with tf.Session(graph=graph) as sess:
sess.run(tf.global_variables_initializer())
iteration = 1
for e in range(epochs):
state = sess.run(initial_state) ###### i think this line
for ii, (x, y) in enumerate(get_batches(train_x, train_y, batch_size), 1):
###### should be here
feed = {inputs_: x,
labels_: y[:, None],
keep_prob: 0.5,
initial_state: state}
loss, state, _ = sess.run([cost, final_state, optimizer], feed_dict=feed)
是谁能解释原因?
谢谢!
答案 0 :(得分:2)
- 如果影响较小,零状态初始化是很好的做法
醇>
初始化RNN状态的默认方法是使用零状态。这通常很有效,特别是对于序列到序列的任务,如语言建模,其中受初始状态影响很大的输出比例很小。
- 每批中的零状态初始化可能导致过度拟合
醇>
每个批次的零初始化将导致以下情况:序列到序列模型的早期步骤(即,状态重置后的那些)的损失将大于后续步骤中的损失,因为历史。因此,他们在学习期间对梯度的贡献将相对较高。但是如果所有状态复位都与零状态相关联,那么模型可以(并且将会)学习如何精确地补偿这一点。随着状态重置与总观察的比率增加,模型参数将越来越多地调整到零状态,这可能会影响后续时间步长的性能。
- 我们还有其他选择吗?
醇>
一个简单的解决方案是使初始状态有噪声(以减少第一步的损耗)。在这里查看details and other ideas