原创

常见的五种神经网络(3)-循环神经网络(下)篇

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://thinkgamer.blog.csdn.net/article/details/100943664

转载请注明出处:https://thinkgamer.blog.csdn.net/article/details/100943664
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
公众号:搜索与推荐Wiki


引言

常见的五种神经网络系列第三篇,主要介绍循环神经网络,由于循环神经网络包含的内容过多,分为上中下三篇进行介绍,本文主要是循环神经网络(下)篇,主要介绍以下内容:

  • 长短期记忆网络(LSTM)
  • 门控循环单元网络(GRU)
  • 递归循环神经网络(RecNN)
  • 图网络(GN)

该系列的其他文章:


LSTM

长短期记忆(Long Short-Term Memory,LSTM)网络是循环神经网络的一个变体,可以有效的解决简单循环神经网络的梯度爆炸和梯度消失问题。

LSTM的改进包含两点:

  • 新的内部状态
  • 门机制

新的内部状态

LSTM网络引入一个新的内部状态(internal state)ctc_t专门进行线性的循环传递,同时(非线性)输出信息给隐藏层的外部状态hth_t(公式3-1)。
ct=ftct1+itct~ht=ottanh(ct) c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c_t} \\ h_t = o_t \odot tanh(c_t)
其中 ftf_titi_toto_t为三个门来控制信息传递的路径,\odot为向量元素乘积,ct1c_{t-1}为上一时刻的记忆单元,ct~\tilde{c_t}是通过非线性函数得到的候选状态(公式3-2):

ct~=tanh(Wcxt+Ucht1+bc) \tilde{c_t} = tanh( W_c x_t + U_c h_{t-1} + b_c )

在每个时刻t,LSTM网络的内部状态ctc_t记录了到当前时刻为止的历史信息。

门机制

LSTM网络引入门机制来控制信息的传递, ftitotf_t,i_t,o_t分别为遗忘门,输入门,输出门。电路中门是0或1,表示关闭和开启,LSTM网络中的门是一种软门,取值在(0,1),表示以一定比例的信息通过,其三个门的作用分别为:

  • ftf_t:控制上一个时刻的内部状态 ct1c_{t-1}需要遗忘多少信息
  • iti_t:控制当前时刻的候选状态ct~\tilde{c_t}有多少信息需要保存
  • oto_t:控制当前时刻的状态ctc_t有多少信息需要输出为hth_t

三个门的计算如下(公式3-3):
it=σ(Wixt+Uiht1+bi)ft=σ(Wfxt+Ufht1+bf)ot=σ(Woxt+Uoht1+bo) i_t=\sigma (W_i x_t+U_i h_{t-1} + b_i) \\ f_t=\sigma (W_f x_t+U_f h_{t-1}+ b_f ) \\ o_t=\sigma (W_o x_t+U_o h_{t-1}+b_o)
其中σ\sigma为logsitic函数,其输出区间为(0,1),xtx_t为当前输入,ht1h_{t-1}为上一时刻的外部状态。

下图(图3-1)给出了LSTM的循环单元结构,其计算分为三个过程:

  1. 利用当前时刻的输入xtx_t和上一时刻的外部状态ht1h_{t-1}计算出三个门和候选状态ct~\tilde{c_t}
  2. 结合遗忘门ftf_t和输入门iti_t来更新记忆单元ctc_t
  3. 结合输出门oto_t将内部状态信息传递给外部状态hth_t

LSTM循环单元结构

通过LSTM循环单元,整个网络可以建立长距离的时序依赖关系,公式3-1~3-3可以简单的描述为(公式3-4):
[ct~otitft]=[tanhσσσ](W[xtht1]+b)ct=ftct1+itct~ht=ottanh(ct) \begin{bmatrix} \tilde{c_t}\\ o_t\\ i_t\\ f_t \end{bmatrix} = \begin{bmatrix} tanh\\ \sigma \\ \sigma \\ \sigma \end{bmatrix} (W\begin{bmatrix} x_t\\ h_{t-1} \end{bmatrix} + b) \\ c_t = f_t \odot c_{t-1}+ i_t \odot \tilde{c_t} \\ h_t = o_t \odot tanh(c_t)
其中xtx_t为当前时刻的输入,WWbb为网络参数。

循环神经网络中的隐状态h存储了历史信息,可以看作是一种记忆(Memeory)。在简单循环网络中,隐状态每个时刻都会被重写,因此可以看作一种短期记忆(Short-term Memeory)。在神经网络中,长期记忆(Long-term Memory)可以看作是网格参数,隐含了从训练数据中学到的经验,其更新周期要远远慢于短期记忆。而在LSTM网络中,记忆单元c可以在某个时刻捕捉到某个关键信息,并有能力将该信息保存一段时间,记忆单元c中保存的信息要远远长于隐状态h,但又远远短于长期记忆,因此被成为长短期记忆网络(Long Short-term Memory)。


GRU

门控单元(Gate Recurrent Unit,GRU)网络是一种比LSTM更加简单的循环神经网络。在LSTM中遗忘门和输入门是互补关系,比较冗余,GRU将遗忘门和输入门合并成一个门:更新门。同时GRU也不引入额外的记忆单元,直接在当前的状态hth_t和上一个时刻的状态ht1h_{t-1}之间引入线性依赖关系。

在GRU网络中,当前时刻的候选状态ht~\tilde{h_t}为(公式3-5):
ht~=tanh(Whxh+Uh(rtht1)+bh) \tilde{h_t} = tanh( W_h x_h + U_h(r_t\odot h_{t-1}) + b_h )

计算ht~\tilde{h_t}时,选用tanh激活函数是因为其导数有比较大的值域,缓解梯度消失问题。

其中rt[0,1]r_t \in [0,1] 为重置门(reset gate),用来控制候选状态ht~\tilde {h_t}的计算是否依赖上一时刻的状态ht1h_{t-1},公式如下(公式3-6):
rt=σ(Wrxt+Urht1+br) r_t = \sigma ( W_r x_t + U_r h_{t-1} + b_r)

rtr_t为0 时,候选状态ht~\tilde{h_t}只和当前输入xtx_t有关,和历史状态无关,当rtr_t为1时,候选状态ht~\tilde{h_t}和当前输入xtx_t,历史状态ht1h_{t-1}都有关,和简单循环网络一致。

GRU网络隐状态hth_t的更新方式为(公式3-7):
ht=ztht1+(1zt)ht~ h_t = z_t \odot h_{t-1}+ (1-z_t) \odot \tilde {h_t}
其中z[0,1]z \in [0,1]为更新门(update gate),用来控制当前状态需要从历史状态中保留多少信息(不经过非线性变换),以及需要从候选状态中获取多少信息。ztz_t公式如下(公式3-8):
zt=σ(Wzxt+Uzht1+bz) z_t = \sigma (W_z x_t + U_z h_{t-1} + b_z)

  • zt=0z_t=0,当前状态hth_t和历史状态ht1h_{t-1}之间为非线性函数。
  • zt=0r=1z_t=0,r=1,GRU退化为简单循环网络
  • zt=0r=0z_t=0,r=0,当前状态hth_t只和当前输入xtx_t有关,和历史状态ht1h_{t-1}无关
  • zt=1z_t=1,当前时刻状态ht=ht1h_t=h_{t-1},和当前输入xtx_t无关

GRU网络循环单元结构如下(图3-2):

GRU网络循环单元结构


RecNN

如果将循环神经网络按时间展开,每个时刻的隐状态hth_t看做是一个节点,那么这些节点构成一个链式结构,而链式结构是一种特殊的图结构,很容易将这种消息传递的思想扩展到任意的图结构上。

递归神经网络(Recursive Neurnal Network,RecNN)是循环神经网络在有向无循环图上的控制,递归神经网络一般结构为树状的层次结构,如下图所示(图3-3):

递归神经网络

以上图(a)为例,包含3个隐藏层h1,h2,h3h_1,h_2,h_3,其中h1h_1由两个输入x1,x2x_1,x_2计算得到,h2h_2由两个输入x3,x4x_3,x_4计算得到,h3h_3由两个隐藏层h1,h2h_1,h_2计算得到。

对于一个节点hih_i,它可以接受来自子节点集合πi\pi_i中所有节点的消息,并更新自己的状态,如下所示(公式3-9):
hi=f(hπi) h_i = f(h_{\pi_i})
其中hπih_{\pi_i}表示πi\pi_i集合中所有节点状态的拼接,f(.)f(.)是一个和节点状态无关的非线性函数,可以为一个单层的前馈神经网络,比如图3-3(a)所表示的递归神经网络可以表示为(公式3-10):
h1=σ(W[x1x2]+b)h2=σ(W[x3x4]+b)h3=σ(W[h1h2]+b) h_1 = \sigma (W \begin{bmatrix} x_1\\ x_2 \end{bmatrix}+ b) \\ h_2 = \sigma (W \begin{bmatrix} x_3\\ x_4 \end{bmatrix}+ b) \\ h_3 = \sigma (W \begin{bmatrix} h_1\\ h_2 \end{bmatrix}+ b)
其中σ\sigma表示非线性激活函数,W和b为可学习的参数,同样输出层y可以为一个分类器,比如(公式3-11):
h3=g(W[h1h2]+b) h_3 = g (W' \begin{bmatrix} h_1\\ h_2 \end{bmatrix}+ b')
其中g(.)g(.)为分类器,WW'bb'为分类器的参数。当递归神经网络的结构退化为图3-3(b)时,就等价于简单神经循环网络。

递归神经网络主要用来建模自然语言句子的语义,给定一个句子的语法结构,可以使用递归神经网络来按照句法的组合关系来合成一个句子的语义,句子中每个短语成分可以分成一些子成分,即每个短语的语义可以由它的子成分语义组合而来,进而合成整句的语义。

同样也可以使用门机制来改进递归神经网络中的长距离依赖问题,比如树结构的长短期记忆模型就是将LSTM的思想应用到树结构的网络中,来实现更灵活的组合函数。


GN

在实际应用中,很多数据是图结构的,比如知识图谱,社交网络,分子网络等。而前馈网络和反馈网络很难处理图结构的数据。

**图网络(Graph Network,GN)**是将消息传递的思想扩展到图结构数据上的神经网络。

对于一个图结构G(V,ε)G(V,\varepsilon ),其中VV表示节点结合,ε\varepsilon表示边集合。每条边表示两个节点之间的依赖关系,节点之间的连接可以是有向的,也可以是无向的。图中每个节点v都用一组神经元来表示其状态h(v)h^{(v)} ,初始状态可以为节点v的输入特征x(v)x^{(v)},每个节点接受相邻节点的信息,来更新自己的状态,如下所示(公式3-12):
mt(v)=uN(v)f(ht1(v),ht1(u),e(u,v))ht(v)=g(ht1(v),mt(u)) m^{(v)}_t = \sum_{u \in N(v)} f( h^{(v)}_{t-1},h^{(u)}_{t-1},e^{(u,v)} ) \\ h^{(v)}_t = g(h^{(v)}_{t-1},m^{(u)}_t)
其中N(v)N(v)表示节点v的邻居节点,mt(v)m^{(v)}_t 表示在t时刻节点v接受到的信息,e(u,v)e^{(u,v)}为边(v,u)上的特征。

公式3-12是一种同步更新方式,所有结构同时接受信息并更新自己的状态,而对于有向图来说,使用异步的更新方式会更有效率,比如循环神经网络或者递归神经网络,在整个图更新T次后,可以通过一个读出函数g(.)来得到整个网络的表示。

至此,循环神经网络(上)(中)(下)篇已经介绍完毕。


【搜索与推荐Wiki】专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!

文章最后发布于: 2019-09-18 08:14:54
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览