深度学习(06)_循环神经网络RNN和LSTM_01

15 篇文章 2 订阅
4 篇文章 0 订阅

循环神经网络RNN和LSTM_01

一、介绍

1、什么是RNN

  • 传统的神经网络是层与层之间是全连接的,但是每层之间的神经元是没有连接的(其实是假设各个数据之间是独立的
    • 这种结构不善于处理序列化的问题。比如要预测句子中的下一个单词是什么,这往往与前面的单词有很大的关联,因为句子里面的单词并不是独立的。
  • RNN 的结构说明当前的的输出与前面的输出也有关,即隐层之间的节点不再是无连接的,而是有连接的
    • 基本的结构如图,可以看到有个循环的结构,将其展开就是右边的结构

RNN基本结构

2、运算说明

  • 如上图,输入单元(inputs units): {x0,x1,,xt,xt+1,} ,
    • 输出单元(output units)为: {o0,o1,,ot,ot+1,} ,
    • 隐藏单元(hidden units)输出集: {s0,s1,,ost,st+1,}
  • 时间 t 隐层单元的输出为: st=f(Uxt+Wst1)
    • f就是激励函数,一般是sigmoid,tanh, relu
    • 计算 s0 时,即第一个的隐藏层状态,需要用到 s1 ,但是其并不存在,在实现中一般置为0向量
    • (如果将上面的竖着立起来,其实很像传统的神经网络,哈哈)
  • 时间 t 的输出为: ot=Softmax(Vst)
    • 可以认为隐藏层状态 st 网络的记忆单元. st 包含了前面所有步的隐藏层状态。而输出层的输出 ot 只与当前步的 st 有关。
    • (在实践中,为了降低网络的复杂度,往往 st 只包含前面若干步而不是所有步的隐藏层状态)
  • RNNs中,每输入一步,每一层都共享参数U,V,W,(因为是将循环的部分展开,天然应该相等)
  • RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。

3、应用方面

  • 循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural Language Processing, NLP)中取得了巨大成功以及广泛应用。目前使用最广泛最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆模型)模型

(1) 语言模型和文本生成

(2) 机器翻译

机器翻译

(3) 语音识别

(4) 图像描述生成

  • 根据图像,生成一段描述图像的话
  • 需要和CNN结合使用

二、结构

1、One to One

  • 即一个输入对应一个输出,就是上面的图

2、Many to One

  • 即多个输入对应一个输出,比如情感分析,一段话中很多次,判断这段话的情感
  • 其中 x1,x2,,xt 表示句子中的t个词,o代表最终输出的情感标签
  • 前向计算就是:
    f(x)=Vst=V(Uxt+Wst1)=V(Uxt+W(Uxt1+Wst2))

    Many to one

3、One to Many

  • 前向计算类似,不再给出
    One to Many

4、Many to Many

  • 前向计算类似,不再给出
    Many to Many

5、双向RNN(Bidirectional RNN)

  • 比如翻译问题往往需要联系上下文内容才能正确的翻译,我们上面的结构线性传递允许“联系上文”,但是联系下文并没有,所以就有双向RNN
  • 前向运算稍微复杂一点,以t时刻为例
    ot=W(os)tst+W(oh)tht =W(os)t(W(ss)t1st1+W(sx)txt1)+W(oh)t(W(hh)tht+1+W(hx)txt)
    RNN

6、深层的RNN

  • 上面的结构都是只含有一层的state层,根据传统NN和CNN,深层次的结构有更加号的效果,结构如图
    深层的RNN

三、Back Propagation Through Time(BPTT)训练

  • 关于传统神经网络BP算法可以查看这里神经网络部分的推导

1、符号等说明

  • 以下图为例

RNN基本结构
- 符号说明
- ϕ ………………………………………………隐藏层的激励函数
- φ ………………………………………………输出层的变换函数
- Lt=Lt(ot,yt) ……………………………模型的损失函数
- 标签数据 yt 是一个 one-hot 向量

2、反向传播过程

  • 接受完序列中所有样本后再统一计算损失,此时模型的总损失可以表示为(假设输入序列长度为n):
    L=t=1nLt

    RNN
  • ot=φ(Vst)=φ(V(Uxt+Wst1))
    • 其中 s0=0=(0,0,,0)T
  • 令: ot=Vst,st=Uxt+Wst1............(1) (就是没有经过激励函数和变换函数前)
    • 则: ot=φ(ot)
    • st=ϕ(st)

(1) 矩阵V的更新

  • 矩阵 V 的更新过程,根据(1)式可得, (和传统的神经网络一致,根据求导的链式法则):

    • Ltot=Ltototot=Ltotφ(ot)
    • LtV=LtVstVstV=Ltot×sTt=(Ltotφ(ot))×sTt
  • 因为 L=nt=1Lt ,所以对矩阵V的更新对应的导数:

    LV=t=1n(Ltotφ(ot))×sTt

(2) 矩阵U和W的更新

  • RNNBP 算法的主要难点在于它 State 之间的通信
  • 可以采用循环的方法来计算各个梯度,t应从n开始降序循环至 1
  • 计算时间通道上的局部梯度(同样根据链式法则)
    Ltst=LtVst×sTtVTtststst=VT×(Ltotφ(ot))

Ltsk1=sksk1×Ltsk=WT×(Ltskϕ(sk1)),(k=1,......,t).........(2)

- 利用局部梯度计算 UW的梯度
- 这里累加是因为权值是共享的,所以往前推算一直用的是一样的权值
LtU+=k=1tLtsk×skU=k=1tLtsk×xTt

LtW+=k=1tLtsk×skW=k=1tLtsk×sTt1....................(3)

3、训练问题

  • * 公式(2)和(3) *中可以看出,时间维度上的权重W更新需要计算 ϕ(sk) ,即经过激励函数的导数
  • 如果时间维度上很长,则这个梯度是累积的,所以造成梯度消失或爆炸
    • 可以想象将结构图竖起来,就是一个深层的神经网络,所以容易出现梯度问题
    • 关于梯度消失的问题可以查看我这里一遍博客
  • RNN 主要的作用就是能够记住之前的信息,但是梯度消失的问题又告诉我们不能记住太久之前的信息,改进的思路有两点
    • 一是使用一些trick,比如合适的激励函数,初始化,BN等等
    • 二是改进state的传递方式,比如就是下面提及的LSTM
    • 关于为何 LSTMs 能够解决梯度消失,直观上来说就是上方时间通道是简单的线性组合

四、Long Short-Term Memory(LSTM,长短时记忆网络)

1、介绍

  • LSTM 是一般 RNN 的升级,因为一些序列问题,我们可能需要忘记一些东西, LSTM 和普通 RNN 相比, 多出了三个控制器. (输入控制, 输出控制, 忘记控制)
  • LSTM里,这个叫做cell(其实就是前面的state,只是这里更加复杂了), 可以看作一个黑盒,这个cell结合前面cell的输出 ht1 和当前的输入 xt 来决定是否记忆下来,该网络结构在对长序列依赖问题中非常有效

2、结构

  • 一个经典的cell结构如下图
    • ϕ1 sigmoid函数, ϕ2 tanh函数
    • *表示 element wise 乘法(就是点乘),使用X表示矩阵乘法
  • LSTMscell 的时间通道有两条
    • 上方的时间通道( h(old)h(new) )仅包含了两个代数运算,这意味着它信息传递的方式会更为直接
      h(new)=h(old)r1+r2
    • 位于下方的时间通道( s(old)s(new) )则运用了大量的层结构,在 LSTMs 中,我们通常称这些层结构为门(Gates

LSTM cell结构

3、运算说明

  • Sigmoid 函数取值区间为 0-1,那么当 Sigmoid 对应的层结构输出 0 时,就对应着遗忘这个过程;当输出 1 时,自然就对应着接受这个过程。
    • 事实上这也是 Sigmoid 层叫门的原因——它能决定“放哪些数据进来”和决定“不让哪些数据通过”
  • 最左边的Sigmoid gate 叫做遗忘门, 控制着时间通道信息的遗忘程度
    • 前向计算: r1=ϕ1(W1×x)
    • 其中 x=Δ[x,s(old)] ,表示当前输入样本和下方时间通道 s(old) 连接(concat)起来
  • 第二个 Sigmoid Gate 通常被称为输入门(Input Gate), 控制着当前输入和下方通道信息对上方通道信息的影响
    • 前向运算为: g1=ϕ1(W2×x) ,
  • 第三个 Tanh Gate 则允许网络结构驳回历史信息, 因为tanh的值域是(-1,1)
    • 前向运算为: g2=ϕ2(W3×x)
    • r2=g1g2
  • 第四个 Sigmoid Gate 通常被称为输出门(Output Gate),它为输出和传向下一个 cell 的下方通道信息作出了贡献。
    • 对应的前向传导算法为: g3=ϕ1(W4×x)
  • 最终cell的输出为: o=s(new)=ϕ2(h(new))g3
  • 每个 Gate 对应的权值矩阵是不同的( W1W4 ),切勿以为它们会共享权值

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值