4

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

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

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

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

难道我做错了什么?我将非常感谢任何建议。

太感谢了!

4

3 回答 3

3

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

于 2015-12-08T04:51:54.613 回答
0

我之前没有尝试过 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

于 2016-05-02T20:24:27.260 回答
0

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

我经常使用的最好的一个是“加法问题”:

我们给出一个形式为 (value, mask) 的元组序列。Value 是介于 0 和 1 之间的实数值标量数。Mask 是二进制值 - 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。最后时间步的目标是这两个值的平均值其中掩码为 1。除最后一个时间步外,所有其他时间步的输出都将被忽略。任意选择掩码的值和位置。因此,这个简单的任务显示了您的实现是否真的可以长时间记住事物。

于 2016-07-28T13:55:26.910 回答