LSTM
循环神经网络在网络中引入了定性循环,使得信号从一个神经元传递到下一个神经元并不会马上消失,而是继续存活,隐藏层的输入不仅包括上一层的输出,还包括上一时刻该隐藏层的输出。
RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。每步的参数都是共享的
在经典的RNN结构中,通常使用tanh作为激活函数。
存在以下结构: N vs 1 RNN结构和1 vs N RNN结构。
RNN的公式:h_t=f(Ux_t+Wh_(t-1)+b)
RNN很难处理长程依赖问题,即无法学到序列中蕴含的间隔时间较长的规律。
循环神经网络的发展有两个方向:一是增加隐藏层的功能,如simple RNN,GRU,LSTM,CW-RNN;另外一个是双向化及加深网络,如Bidirectional RNN和Reep Bidirectionsal RNN;两个结合引申出DBLSTM.
LSTM规避了标准RNN中的梯度爆炸和梯度消失的问题。
LSTM的隐状态有两部分:一部分是ht,一部分是Ct,Ct是在各个步骤间传递的主要信息,长程传播。Ct在Ct-1的基础上遗忘和记住一些内容。
经典英文讲解:Understanding LSTM Networks LSTM:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
keras的LSTM函数详解:https://www.cnblogs.com/wzdLY/p/10071262.html
keras.layers.recurrent.LSTM(
units, #输出维度:input_dim; return_sequences:布尔值,默认为false,控制返回类型,若Ture则返回整个序列,否则仅仅返回输出序列的最后一个输出
input_length:当输入序列的长度固定时,该参数为输入序列的长度。当需要在该层后连接Flatten层,然后又要连接Dense层时,需要指定该参数,否则全连接的输出无
法计算出来;输入shape ,形如(samples,timesteps,input_dim)的3D张量;输出shape:如果return_sequences=True:返回形如(samples,timesteps,
output_dim)的3D张量否则,返回形如(samples,output_dim)的2D张量
activation='tanh',
recurrent_activation='hard_sigmoid',
use_bias=True,
kernel_initializer='glorot_uniform',
recurrent_initializer='orthogonal',
bias_initializer='zeros',
unit_forget_bias=True,
kernel_regularizer=None,
recurrent_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
recurrent_constraint=None,
bias_constraint=None,
dropout=0.0,
recurrent_dropout=0.0
)
备注:
1.输入和输出的类型
相对之前的tensor,这里多了个参数timesteps.举个栗子,假如输入100个句子,每个句子由5个单词组成,每个单词用64维词向量表示。那么samples=100,timesteps=5,input_dim=64,可以简单地理解timesteps就是输入序列的长度input_length(视情而定).
2.units
假如units=128,就一个单词而言,可以把LSTM内部简化看成Y=X1×64W64×128 ,X为上面提及的词向量比如64维,W中的128就是units,也就是说通过LSTM把词的维度由64转变成了128.
3.return_sequences
我们可以把很多LSTM层串在一起,但是最后一个LSTM层return_sequences通常为False
原理:https://www.toutiao.com/a6502203093856289294/
https://zybuluo.com/hanbingtao/note/581764
https://www.baidu.com/link?url=37of3JeCjo_4kQV6L3UiV6HfrvVupC32faTooS3Nb8xNduHopngbL_xw2ywp-tVgoV-pfD41kyXB5dTNJ6ZfB8ZPE3w3j2Sze2BJva5Lg0_&wd=&eqid=a336a4440000438a000000055d4cda0c
扩展:
GRU
前面我们讲了一种普通的LSTM,事实上LSTM存在很多变体,许多论文中的LSTM都或多或少的不太一样。在众多的LSTM变体中,GRU (Gated Recurrent Unit)也许是最成功的一种。它对LSTM做了很多简化,同时却保持着和LSTM相同的效果。因此,GRU最近变得越来越流行。
GRU对LSTM做了两个大改动:
将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate)。
将单元状态与输出合并为一个状态:。
预测建模问题的类型可对所使用的损失函数进行约束。例如,下面是不同的预测模型类型的一些标准损失函数:
回归:均方误差,或者 mean squared error,简称 mse。
二分类(2类):对数损失,也叫做交叉熵或者 binary crossentropy。
多分类(大于2类):多分类的对数损失, categorical crossentropy。
最常见的优化算法是经典的随机梯度下降算法,但是Keras还支持一套其他扩展的经典优化算法,这种算法表现很好、配置很少。由于它们通常的性能更好,也许最常用的优化算法是:
Stochastic Gradient Descent,或者sgd。
Adam,或者adam。
RMSprop,或者rmsprop。
最后,除了损失函数外,你也可以指定性能指标(Metrics)来收集拟合你模型时候的信息。总的来说,最有用的附加性能指标(Metrics)来收集的是分类问题的准确性(例如‘accuracy’或者简称‘acc’ )。用来收集的性能指标(Metrics)可以通过性能指标(Metrics)数组中的名称或者损失函数的名字来指定。例如:
model.compile(optimizer= 'sgd' , loss= 'mean_squared_error' , metrics=[ 'accuracy' ])
LSTM输入的建议
LSTM输入层必须是3D的;
3个输入维度的含义是:样本、时间步长和特征。
LSTM输入层在输入隐藏层上由输入形状参数决定。
输入形状参数采用两个值的元组,以减少时间步长和特征的数量。
假设样本的数量是1个或者更多。
NumPy数组中的 reshape()函数可以用来将1D或者2D数据变换为3D的。
reshape()函数将元组作为新的形状的参数。