zoukankan      html  css  js  c++  java
  • 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)。
    将单元状态与输出合并为一个状态:。

    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()函数将元组作为新的形状的参数。

  • 相关阅读:
    【C++clock()函数学习(计算自己代码运行时间)】
    YCOJ 1041113【最近的回文数】
    计蒜客【汉诺塔II】
    YCOJ【汉诺塔】
    【常用算法总结——递归】
    YCOJ【查找】
    【常用算法总结——分治】
    Redis哨兵机制
    Redis主从复制
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/Ann21/p/11328291.html
Copyright © 2011-2022 走看看