LSTM网络学习

LSTM network learning

我尝试编写自己的 LSTM(长短期记忆)神经网络。我想验证基本功能是否正常工作。我已经通过时间 BPTT 算法实现了反向传播来训练单细胞网络。

单细胞 LSTM 网络应该能够学习一个简单的序列,还是需要多个细胞?网络似乎无法学习简单的序列,例如 1 0 0 0 1 0 0 0 1 0 0 0 1.

我正在按顺序将序列 1 和 0 一个一个地发送到网络中,并向前馈送。我记录了序列的每个输出。

在 运行 整个序列通过 LSTM 单元之后,我将平均误差信号反馈回单元,保存单元内部的权重变化,在一个单独的集合中,并且在 运行 所有错误一一通过并计算每个错误后的新权重,我将新权重平均在一起以获得新权重,对于单元格中的每个权重。

我是不是做错了什么?如果有任何建议,我将不胜感激。

非常感谢!

只有一个单元格(一个隐藏单元)不是一个好主意,即使您只是在测试代码的正确性。即使是这样简单的问题,你也应该尝试 50。这篇论文在这里:http://arxiv.org/pdf/1503.04069.pdf 给了你非常清晰的更新参数的梯度规则。话虽如此,即使您的数据集 and/or 您正在处理的问题是新的 LSTM,也没有必要实施您自己的。从现有库(Theano、mxnet、Torch 等...)中选择并从那里进行修改我认为这是一种更简单的方法,因为它不易出错并且它支持 gpu 计算,这对于在合理的时间内训练 lstm 至关重要.

我之前没有尝试过 1 个隐藏单元,但我确信 2 或 3 个隐藏单元可以用于序列 0,1,0,1,0,1。不一定细胞越多,结果就越好。训练难度也随着细胞数量的增加而增加。

您说您将新的权重平均在一起以获得新的权重。这是否意味着您 运行 多次训练并取训练重量的平均值?

即使您正确实施了 LSTM,也有很多可能无法正常工作。权重不容易通过简单的梯度下降训练。

以下是我对权重优化的建议。

  1. 使用Momentum方法进行梯度下降

  2. 在训练集中添加一些高斯噪声以防止过度拟合。

  3. 对每个单元使用自适应学习率。

或许你可以看看多伦多大学Coursera的课程Neural Network,和那里的人一起讨论。

或者您可以查看 GitHub 上的其他示例。例如:

https://github.com/JANNLab/JANNLab/tree/master/examples/de/jannlab/examples

测试 LSTM 实现的最佳方法(在梯度检查之后)是在原始 LSTM 论文本身中描述的玩具记忆问题上进行尝试。

我经常使用的最好的是 'Addition Problem':

我们给出形式为 (value, mask) 的元组序列。值是介于 0 和 1 之间的实数值标量。掩码是二进制值 - 0 或 1。

0.23, 0 0.65, 0 ... 0.86, 0 0.13, 1 0.76, 0 ... 0.34, 0 0.43, 0 0.12, 1 0.09, 0 .. 0.83, 0 -> 0.125

在这样的元组的整个序列中(通常长度为100),只有2个元组的掩码为1,其余元组的掩码为0。最终时间步的目标是a掩码为 1 的两个值的平均值。除了最后一个之外,所有其他时间步的输出都将被忽略。掩码的值和位置是任意选择的。因此,这个简单的任务表明您的实现是否真的可以长时间记住事情。