【问题标题】:LSTM network learningLSTM 网络学习
【发布时间】:2015-05-05 04:29:53
【问题描述】:

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

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

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

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

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

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      这是我对重量优化的建议。

      1. 使用动量法进行梯度下降。

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        测试 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 的两个值。除最后一个之外的所有其他时间步的输出都将被忽略。任意选择掩码的值和位置。因此,这个简单的任务显示了您的实现是否真的可以长时间记住事物。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-02
          • 2016-07-11
          • 2017-02-28
          • 1970-01-01
          • 2016-05-25
          • 2018-09-25
          • 2019-03-15
          相关资源
          最近更新 更多