LSTM网络学习

时间:2015-03-04 08:54:25

标签: machine-learning artificial-intelligence neural-network lstm

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

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

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

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

我做错了吗?我非常感谢任何建议。

非常感谢你!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

你说你将新的重量平均在一起以获得新的重量。这是否意味着你进行了许多训练课程并取得训练重量的平均值?

即使您正确实施了LSTM,LSTM仍有许多可能性。通过简单的梯度下降训练重量不容易。

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

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

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

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

  4. 也许您可以查看多伦多大学提供的Coursera课程神经网络,并与那里的人讨论。

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

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

答案 2 :(得分:0)

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

我经常使用的最好的是'加法问题':

我们给出一系列形式的元组(值,掩码)。值是介于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.最后一个时间步的目标是平均值掩码为1的两个值。忽略除最后一个步骤之外的所有其他时间步的输出。掩模的值和位置是任意选择的。因此,这个简单的任务表明你的实现是否能够长时间记住事物。

相关问题