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,也有很多可能无法正常工作。权重不容易通过简单的梯度下降训练。
以下是我对权重优化的建议。
使用Momentum方法进行梯度下降
在训练集中添加一些高斯噪声以防止过度拟合。
对每个单元使用自适应学习率。
或许你可以看看多伦多大学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 的两个值的平均值。除了最后一个之外,所有其他时间步的输出都将被忽略。掩码的值和位置是任意选择的。因此,这个简单的任务表明您的实现是否真的可以长时间记住事情。
我尝试编写自己的 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,也有很多可能无法正常工作。权重不容易通过简单的梯度下降训练。
以下是我对权重优化的建议。
使用Momentum方法进行梯度下降
在训练集中添加一些高斯噪声以防止过度拟合。
对每个单元使用自适应学习率。
或许你可以看看多伦多大学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 的两个值的平均值。除了最后一个之外,所有其他时间步的输出都将被忽略。掩码的值和位置是任意选择的。因此,这个简单的任务表明您的实现是否真的可以长时间记住事情。