欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LSTM

程序员文章站 2024-03-25 08:05:10
...

循环神经网络在网络中引入了定性循环,使得信号从一个神经元传递到下一个神经元并不会马上消失,而是继续存活,隐藏层的输入不仅包括上一层的输出,还包括上一时刻该隐藏层的输出。

    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)。
将单元状态与输出合并为一个状态:。

https://www.baidu.com/link?url=Fw4PiShsyX8d4qKc3iq0sfcO48IfozErV3XXzlK3sPrn-VzwXdE5K-EOTPIkkwRU3NrAUUpay53-2eHd05S5Z_&wd=&eqid=a336a4440000438a000000055d4cda0c

预测建模问题的类型可对所使用的损失函数进行约束。例如,下面是不同的预测模型类型的一些标准损失函数:

回归:均方误差,或者 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()函数将元组作为新的形状的参数。

上一篇: 乱七八糟小知识总结

下一篇: evo