Skip to content

循环神经网络

📅 发表于 2017/10/19
🔄 更新于 2017/10/19
👁️ 次访问
📝 0 字
0 分钟
深度学习
#RNN
#LSTM
#GRU

RNN, LSTM, GRU图文介绍,RNN梯度消失问题等

LSTM经典描述

经典RNN模型

模型

人类在思考的时候,会从上下文、从过去推断出现在的结果。传统的神经网络无法记住过去的历史信息。

循环神经网络是指随着时间推移,重复发生的结构。它可以记住之前发生的事情,并且推断出后面发生的事情。用于处理时间序列很好。所有的神经元共享权值。如下图所示。

记住短期信息

比如预测“天空中有__”,如果过去的信息“鸟”离当前位置比较近,则RNN可以利用这个信息预测出下一个词为“鸟”

不能长期依赖

如果需要的历史信息距离当前位置很远,则RNN无法学习到过去的信息。这就是不能长期依赖的问题。

LSTM总览与核心结构

  • LSTM可以记住一些记忆,捕获长依赖问题
  • 也可以让ERROR根据输入,依照不同强度流动

见后面GRU解决梯度消失

总览

所有的RNN有着重复的结构,如下图,比如内部是一个简单的tanh 层。

LSTM也是一样的,只不过内部复杂一些。

单元状态

单元状态像一个传送带,通过整个链向下运行,只有一些小的线性作用信息就沿着箭头方向流动

LSTM的门结构

LSTM的门结构 可以添加或者删除单元状态的信息,去有选择地让信息通过。它由sigmoid网络层点乘操作组成。输出属于[0,1]之间,代表着信息通过的比例。

LSTM细节解剖

一些符号说明,都是t时刻的信息 :

  • Ct1 : 的单元状态
  • ht : 隐状态信息 (也作单个神经元的输出信息)
  • xt : 输入信息
  • ot :输出信息 (输出特别的信息)

1 遗忘旧信息

对于Ct1中的每一个数字, ht1xt会输出0-1之间的数来决定遗忘Ct1中的多少信息。

2 生成候选状态和它的更新比例

生成新的状态:tanh层创建新的候选状态C^t

输入门:决定新的状态哪些信息会被更新it,即候选状态C^t的保留比例。

3 新旧状态合并更新

生成新状态Ct旧状态Ct1 + 候选状态C^t

旧状态Ct1遗忘不需要的, 候选状态C^t1保留需要更新的,都是以乘积比例形式去遗忘或者更新。

4 输出特别的值

sigmoid:决定单元状态Ct的哪些信息要输出。

tanh: 把单元状态Ct的值变到[1,1]之间。

LSTM总结

核心结构如下图所示

要忘掉部分旧信息,旧信息Ct1的遗忘比例ft

ft=σ(Wf[ht1,xt]+bf)

新的信息来了,生成一个新的候选C^t

C^t=tanh(WC[ht1,xt]+bC)

新信息留多少呢,新候选C^t的保留比例it

it=σ(Wi[ht1,xt]+bi)

合并旧信息和新信息,生成新的状态信息Ct

Ct=ftCt1+itC^t

输出多少呢,单元状态Ct的输出比例ot

ot=σ(Wo[ht1,xt]+bo)

Ct化到[1,1]再根据比例输出

ht=ottanh(Ct)

图文简介描述LSTM

总体架构

单元架构

流水线架构

数据流动

圆圈叉叉代表着遗忘Ct1的信息。乘以向量来实现,向量各个值在[0,1]之间。 靠近0就代表着遗忘很多,靠近1就代表着保留很多。

框框加号代表着数据的合并。旧信息Ct1和新候选信息C^t的合并。 合并之后就得到新信息Ct

遗忘门

上一个LSTM的输出ht1 和 当前的输入xt,一起作为遗忘门的输入。 0是偏置b0, 一起做个合并,再经过sigmoid生成遗忘权值ft信息, 去遗忘Ct1

新信息门

新信息门决定着新信息对旧信息的影响力。和遗忘门一样ht1xt作为输入。

sigmoid:生成新信息的保留比例。tanh:生成新的信息。

新旧信息合并

旧信息Ct1和新信息C^t合并,当然分别先过遗忘阀门和更新阀门。

输出特别的值

把新生成的状态信息Ct使用tanh变成(1,1)之间,然后经过输出阀门进行输出。

LSTM变体

观察口连接

传统LSTM阀门值比例的计算,即更新、遗忘、输出的比例只和ht1,xt有关。

观察口连接,把观察到的单元状态也连接sigmoid上,来计算。即遗忘、更新比例和Ct1,ht1,xt有关,输出的比例和Ct,ht1,xt有关。

组队遗忘

如下图所示,计算好Ct1的遗忘概率it后,就不再单独计算新候选C^t的保留概率it。而是直接由1减去遗忘概率得到更新概率。即it=1ft,再去更新。

GRU

LSTM有隐状态ht和输出状态ot,而GRU只有ht,即GRU的隐状态和输出状态是一样的,都用ht表示。

更新门zt负责候选隐层h^t保留的比例1zt负责遗忘旧状态信息ht1的比例

zt=σ(Wz[ht1,xt])

候选隐藏层h^t的计算由ht1xt一起计算得到。所以计算h^t之前,要先计算ht1的重置比例。

重置门rt负责**ht1于生成新的候选h^t的作用比例**

rt=σ(Wr[ht1,xt])

新记忆h^t的计算

h^t=tanh(W[rtht1,xt])

最终记忆htht1h^t计算得到,分别的保留比例是1ztzt

ht=(1zt)ht1+zth^t

更新门 zt:过去的信息有多重要。 z=1, 则过去信息非常重要,完全保留下来

重置门rt: 旧记忆对新记忆的贡献程度。r=0, 则当前新记忆和旧记忆不想关。

RNN梯度问题

RNN梯度推导

简单点

ht=Wht1+W(hx)xty^t=W(s)f(ht)

总的误差是之前每个时刻的误差之和

EW=t=1TEtW

每一时刻的误差又是之前每个时刻的误差之和,应用链式法则

EtW=Etytythtk=1ththkhkWEtW=k=1tEtytythththkhkWEtW=k=1tEkykykhkhkhk1hk1W

hthk会变得非常大或者非常小!!

hthk=j=k+1thjhj1=j=k+1tWT×diag[f(jj1)]

而导数矩阵雅克比矩阵

hjhj1=[hjhj1,1,,hjhj1,dh]=[hj,1hj1,1hj,1hj1,dhhj,dhhj1,1hj,dhhj1,dh]

合并起来,得到最终的

EW=t=1Tk=1tEtytytht(j=k+1thjhj1)hkW

两个不等式

hjhj1WTdiag[f(hj1)]βWβh

所以有,会变得非常大或者非常小。会产生梯度消失或者梯度爆炸问题。

hthk=j=k+1thjhj1(βWβh)tk

梯度 是过去对未来影响力的一个度量方法。如果梯度消失了不确定tk之间是否有关系,或者是因为参数错误 。

解决梯度爆炸

原始梯度

g^=EW

如果g^>, 则更新

g^=thresholdg^g^

GRU解决梯度消失

  • LSTM可以记住一些记忆,捕获长依赖问题
  • 也可以让ERROR根据输入,依照不同强度流动

RNN的前向和反向传播,都会经过每一个节点

GRU可以自动地去创建一些短连接,也可以自动地删除一些不必要的连接。(门的功能)

RNN会读取之前所有信息,并且更新所有信息。

GRU

  • 选择可读部分,读取
  • 选择可写部分,更新
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2025