这是来自 UDACITY 的用于情感分类的 LSTM 代码。
这里是整句rnn代码的链接:udacity/sentiment-rnn
我想知道为什么他们会在 epoch 的 for 循环下初始化单元状态。
我认为当输入语句改变时cell state一定是零初始化的,所以它一定在mini-batch for循环语句下。
## 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)
谁能解释一下原因?
谢谢!
最佳答案
- Zero State Initialization is good practice if the impact is low
初始化 RNN 状态的默认方法是使用零状态。这通常很有效,特别是对于像语言建模这样的序列到序列任务,其中受初始状态显着影响的输出比例很小。
- Zero State Initialization in each batch can lead to overfitting
每个批处理的零初始化将导致以下结果:序列到序列模型早期步骤的损失(即状态重置后立即发生的损失)将大于后期步骤的损失,因为损失更少历史。因此,它们在学习过程中对梯度的贡献会相对较高。但是,如果所有状态重置都与零状态相关联,则模型可以(并且将会)学习如何精确地对此进行补偿。随着状态重置与总观测值的比率增加,模型参数将越来越多地调整到该零状态,这可能会影响后续时间步长的性能。
- Do we have other options?
一个简单的解决方案是使初始状态有噪声(以减少第一个时间步的损失)。在这里寻找 details and other ideas
关于python - 我什么时候应该在 LSTM 代码中初始化状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496751/