首页 文章

LSTM网络学习

提问于
浏览
4

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

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

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

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

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

非常感谢!

3 回答

  • 3

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

  • 0

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

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

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

    以下是我对重量优化的建议 .

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

    • 为训练集添加一些高斯噪声以防止过度拟合 .

    • 使用每个单位的自适应学习率 .

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

    或者你可以看看GitHub上的其他例子 . 例如 :

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

  • 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.除了最后一个步骤之外的所有其他时间步骤的输出被忽略 . 掩模的值和位置是任意选择的 . 因此,这个简单的任务显示您的实现是否可以在很长一段时间内实际记住事物 .

相关问题