没有起始序列的 LSTM 训练/预测

数据挖掘 机器学习 喀拉斯 lstm 顺序 语言模型
2022-01-29 22:59:20

ML新手在这里。作为练习,我正在尝试基于简单的 1 层 LSTM 构建基于字符的语言模型。根据我对 LSTM 的了解,一种常见的用法是接收一系列字符,然后预测下一个字符。我不完全理解的是,当还没有前面的序列时,我将如何预测第一个字符(或者,通过扩展,当没有足够长的前面序列作为 LSTM 单元的输入时预测一个字符)。

我能想到的最好的解决方案是在词汇表中保留一个特殊字符来表示任何字符的缺失。一个玩具例子:

Full training corpus: "foo"
LSTM unit count: 2
"Absent character" symbol: ABSENT
"End of file" symbol: EOF
Training inputs:
    sample: [ABSENT, ABSENT] label: 'f'
    sample: [ABSENT, 'f'] label: 'o'
    sample: ['f', 'o'] label: 'o'
    sample: ['o', 'o'] label: EOF

我的问题是:做这种事情的最佳做法是什么?我在正确的轨道上吗?

1个回答

您可以选择仅在序列的 N 步过去后才要求预测。然后,预测是值得信赖的。你必须给你的 LSTM 一些东西,可以说是一些上下文。

通常您将网络在所有时间步中产生的错误相加,但在这种情况下,您会忽略其输出,直到第 N 个时间步之后。如下所示,它所做的任何预测都不应导致您的错误总和:TotalErrorOfTheSequence

请注意,在这种情况下,当反向传播时,您的梯度不会在第 N 个时间步之前流入网络。


您还可以通过相对于实际的反向传播来直接学习初始状态cell_t0传统上你会用零初始化cell_t0,但因为你可以计算一个梯度,你可以把它的起始值越来越接近通常需要的值。

可以通过噪声改善 LSTM 的最佳起始状态,这实际上提高了预测的质量。它减轻了网络在序列的早期状态上的过度拟合,在这些状态下,由于可用的上下文小,误差通常最大,而且校正很强。“使用递归神经网络进行预测:12 个技巧”。- 阅读第三招

以下是我的理解,如有错误请指正:

1)将您的 Cell 状态训练为变量(如上所述),以获得良好的价值。

2)构造一个随机变量,它以您的cell_t0.

3) 收集数百个 G 值的缓冲区,然后开始随机采样,并将每个值用作与您学习的“cell_t0”的最大可能偏差。所以你随机偏离学习到的“cell_t0”一些采样的 G 值

每个这样的 G 值都是朝向实际已经学习的梯度的值cell_0

我认为跟踪哪些此类 G 值是最旧的,并在它们过时时慢慢将它们从缓冲区中删除是有意义的

在测试期间要禁用噪音。

再一次,不确定我是否正确理解了这种方法

也看看这些帖子:

https://datascience.stackexchange.com/a/33994/43077 https://stats.stackexchange.com/a/319854/187816