python - 我什么时候应该在 LSTM 代码中初始化状态?

标签 python tensorflow initialization lstm recurrent-neural-network

这是来自 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)

谁能解释一下原因?

谢谢!

最佳答案

  1. Zero State Initialization is good practice if the impact is low

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

  1. Zero State Initialization in each batch can lead to overfitting

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

  1. Do we have other options?

一个简单的解决方案是使初始状态有噪声(以减少第一个时间步的损失)。在这里寻找 details and other ideas

关于python - 我什么时候应该在 LSTM 代码中初始化状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496751/

相关文章:

python - 如何使用 Numpy 获取表示一对值与另一个值之间关系的函数?

python - 在 OpenERP 7 中按下按钮时如何获取工作流程状态中的日期?

python - 替换 pandas 数据框中的 nan

r - 安装 R 4.0.2 版本

java - 什么是初始化 block ?

python - platform.linux_distribution() 已弃用 - 有哪些替代方案?

python-3.x - ImportError : libcublas. so.9.0: 没有那个文件或目录

python - Tensorflow 对象检测 API 没有 train.py 文件

c# - 在c#中的任意起始索引上初始化数组

ruby - 在 `initialize' : string contains null byte Ruby