RNN
循环神经网络(Recurrent Neural Network,RNN ),主要处理序列数据,输入的序列数据可以是连续的、长度不固定的序列数据,也可以是固定的序列数据。循环神经网络能保持对过去事件和当前事件的记忆,从而可以捕获长距离样本之间的关联信息。循环神经网络在文字预测、语音识别等领域表现较大优势。
RNN网络结构解析
图1是RNN网络图示
RNN存在的问题
存在梯度爆炸和消失的问题,对于长距离的句子的学习效果不好。
反向传播中,对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。
RNN代码示例
pytorch 简单代码示例
rnn = nn.RNN(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)
LSTM
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的。
LSTM网络结构解析
LSTM网络结构如图2所示
LSTM优势
RNN中只有一个隐藏状态,LSTM增加了一个元胞状态单元,其在不同时刻有着可变的连接权重,以解决RNN中梯度消失或爆炸问题。隐藏状态控制短期记忆,元胞状态单元控制长期记忆,和配合形成长短期记忆。
LSTM代码示例
pytorch 简单代码示例
rnn = nn.LSTM(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
c0 = torch.randn(2, 3, 20)
output, (hn, cn) = rnn(input, (h0, c0))
GRU单元
门控循环单元(gated recurrent unit,GRU)是为了解决循环神经网络中计算梯度, 以及矩阵连续乘积导致梯度消失或梯度爆炸的问题而提出,GRU更简单,通常它能够获得跟LSTM同等的效果,优势是计算的速度明显更快。
GRU单元结构解析
GRU单元结构如图3所示
GRU优势
GRU可以取得与LSTM想当甚至更好的性能,且收敛速度更快。
GRU代码示例
pytorch 简单代码示例
rnn = nn.GRU(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)