先前学习
Karpathy博客链接:[传送门](http://karpathy.github.io/2015/05/21/rnn-effectiveness/)
Colah博客链接:[传送门](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)
B站干货课程:[传送门](https://www.bilibili.com/video/av30578651?from=search&seid=9493375067974870259)
神经网络模拟了人脑处理未来信号的行为过程。每一个信号都有一个合理的weights。下图为一个神经元的样子:
RNN
人类不会每秒钟都从头开始思考。对于每个词的理解,都是建立在对之前的词的理解上的。传统的神经网络做不到这一点。RNN解决了这个问题,它们是带有循环的网络,信息可以“持续存在”,解决sequence问题。
RNN的一个吸引力是他们可能能够将先前信息连接到当前任务(环线),例如使用先前的视频帧参与对当前帧的理解。但是有一些情况需要更多的背景信息(时间较长的记忆关系),RNN有可能无法学习连接信息。理论上,RNN绝对能够处理这种“长期依赖性”。人类可以仔细挑选参数来解决这种形式的问题。遗憾的是,在实践中,RNN似乎无法学习它们。庆幸的是,LSTM没有这个问题!
代码看RNN
核心部分,RNN的API十分友好,它接受x,输出y。
rnn = RNN()
y = rnn.step(x) # x is an input vector, y is the RNN's output vector
class RNN:
# ...
def step(self, x):
# update the hidden state
self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))
# compute the output vector
y = np.dot(self.W_hy, self.h)
return y
两层的RNN:
y1 = rnn1.step(x)
y = rnn2.step(y1)
LSTM
长短期内存网络–通常只称为“LSTM” - 是一种特殊的RNN,能够学习长期依赖性。LSTM可以选择性忘记不重要的信息,只关联重要的信息。所有的递归神经网络都有一个神经网络的重复模块链的形式。在LSTM中,这个重复模块有4层。
LSTM的核心思想
LSTM最关键的是细胞的状态,也就是贯穿整个图像的最上方一条线。它像是一条传输带一样,数据只是有一些线性的互动。想做到信息顺其运送而不发生改变很简单。
一步一步看LSTM
LSTM的第二步是判断要在细胞状态中存储什么新的信息。由两部分组成,包括一个叫做“input gate layer”的sigmoid层决定需要更新什么内容;和一个tanh层创建需要被加入现在state的结果向量。
LSTM的第三步是根据自身input以及要不要忘记衡量自己的价值,最终传递到output layer,决定输出。
LSTM的应用
对于不确定性很高的内容(语音识别、手写识别),LSTM非常重要。
- input不是sequence,output是
上传一张图片,生成文字描述 - input是sequence,output不是
视频分类,财经数据分析 - input和output都是sequence
语音翻译。
Bi-LSTM
介绍博客:传送门
训练代码博客:传送门
BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。LSTM模型可以捕捉到较长距离的依赖关系,但是无法捕捉反向的语义依赖(e.g. ”这个餐厅脏得不行“,“不行”修饰的是“脏”)。Bi-LSTM可以解决这个问题。
对“我爱中国”进行编码:
Tree-LSTM
介绍与计算博客:传送门