3

这是 UDACITY 用于情感分类的 LSTM 代码。

这是整个句子-rnn代码的链接:udacity/sentiment-rnn

我想知道为什么他们在 for 循环下初始化单元状态以进行 epoch。

我认为当输入语句发生变化时,单元格状态必须为零初始化,所以它必须在小批量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)

谁能解释为什么?

谢谢!

4

1 回答 1

2
  1. 如果影响较小,零状态初始化是一种很好的做法

初始化 RNN 状态的默认方法是使用零状态。这通常效果很好,特别是对于像语言建模这样的序列到序列任务,其中受初始状态显着影响的输出比例很小。

  1. 每批中的零状态初始化可能导致过拟合

每个批次的零初始化将导致以下情况: 序列到序列模型的早期步骤(即状态重置之后的那些)的损失将大于后期步骤的损失,因为历史较少。因此,它们在学习过程中对梯度的贡献会相对较高。但是,如果所有状态重置都与零状态相关联,则模型可以(并且将)学习如何精确地对此进行补偿。随着状态重置与总观测值的比率增加,模型参数将越来越多地调整到这个零状态,这可能会影响后续时间步的性能。

  1. 我们还有其他选择吗?

一个简单的解决方案是使初始状态有噪声(以减少第一个时间步的损失)。在这里查看详细信息和其他想法

于 2018-03-12T10:10:57.123 回答