博客引流

终于发完proposal 的邮件 深吸一口气

希望明天不要被怼的太惨

已经连续 高强度(hua shui) 看paper n天了

一切 索然无味

随着看到的paper层次越来越高

就越发羡慕搞NLP

昨天还在跟室友说 一开始觉得写SMNWuWei dalao指不定是个中年油腻大叔

结果人家研究生还没毕业

哇 满脸的羡慕

言归正传 打算用两三篇blog 讲一下最近学习的多轮检索式对话这个领域

第一篇就来谈一谈 在检索式对话中用到最多的 RNN 模型家族 (之所以 称之为 家族 因为变种太多了)

Naïve RNN

RNN = Recureent Neural Network

翻译成中文就是循环神经网络(注意不是递归,虽然它的过程很递归)

和传统的卷积神经网络CNN 全连接神经网络DNN不同的是其包含时序信息

顺带说一下另外两者的特点

DNN: n层与n-1层每个都有关, 参数数量级巨大;
CNN: 卷积+pool,至于什么是卷积?加权叠加

这一点十分有利于用于训练和时间相关的Dataset 尤其是NLP方面

有没有觉得很像马尔科夫链(en 不是过程 就是链)

事实上在有CNN之前 确实一般都做成隐马尔科夫链

NN起源于多层感知机MLP

感知机之所以能战胜同时期的元胞自动机异军突起 主要是其拥有反向传播算法

但NN随着训练层数的增大 会出现梯度消失现象 但层度深 确实效果好呀

于是就有一堆学者提出了 各种办法 使得 NN的层数能够扩展

比如说预处理 高速公路网络(highway network)和深度残差学习(deep residual learning)

时序的效果不仅仅是训练结果和之前的转态有关 还带来了变长度输出的特性 这点和其他NN尤为不同

CNN 可以在下一个时间点 把输出作用在节点自身

如果按时间展开 就变成那张经典的图 作用在t+1时刻输出o(t+1)是该时刻输入和所有历史共同作用的结果

可以看出 s t + 1 , o t = f ( s t , x t , U , V , W ) s_{t+1}, o_t = f(s_t, x_t, U, V, W) st+1​,ot​=f(st​,xt​,U,V,W)

和别的NN不同的是RNN所有步骤共享相同的参数 U , V , W U, V, W U,V,W

有正向的RNN 很容易想到是不是还有双向的(Bidirectional RNN) 深度(Deep Bidirectional RNN)

但对于上述RNN都不可避免的会出现前面说的梯度消失的现象

只不过在这里对的是时间维度上的消失(即 时序信息传播不过k间隔)

所以就有了一系列改进版RNN

LSTM

比如说最著名的LSTM[4]

LSTM = LONG SHORT-TERM MEMORY

其通过的设置来实现长时期的记忆能力

LSTM每个时刻的hidden state包含了多个memory blocks

每个block包含了多个memory cell

每个memory cell包含一个Cell和三个Gate: 输入门,输出门,遗忘门

Forward Pass

  • I n p u t G a t e Input Gate InputGate
    a l t = ∑ i = 1 I w i l x i t + ∑ h = 1 H w h l b h t − 1 + ∑ c = 1 C w c l s c t − 1 a_l^t=\sum\limits_{i=1}^Iw_{il}x_i^t+\sum\limits_{h=1}^Hw_{hl}b_h^{t-1}+\sum\limits_{c=1}^Cw_{cl}s_c^{t-1} alt​=i=1∑I​wil​xit​+h=1∑H​whl​bht−1​+c=1∑C​wcl​sct−1​

    b l t = f ( a l t ) b_l^t=f(a_l^t) blt​=f(alt​)

  • F o r g e t G a t e Forget Gate ForgetGate
    a ϕ t = ∑ i = 1 I w i ϕ x i t + ∑ h = 1 H w h ϕ b h t − 1 + ∑ c = 1 C w c ϕ s c t − 1 a_\phi^t=\sum\limits_{i=1}^Iw_{i\phi}x_i^t+\sum\limits_{h=1}^Hw_{h\phi}b_h^{t-1}+\sum\limits_{c=1}^Cw_{c\phi}s_c^{t-1} aϕt​=i=1∑I​wiϕ​xit​+h=1∑H​whϕ​bht−1​+c=1∑C​wcϕ​sct−1​

    b ϕ t = f ( a ϕ t ) b_\phi^t=f(a_\phi^t) bϕt​=f(aϕt​)

  • C e l l Cell Cell
    a c t = ∑ i = 1 I w i c x i t + ∑ h = 1 H w h c b h t − 1 a_c^t=\sum\limits_{i=1}^Iw_{ic}x_i^t+\sum\limits_{h=1}^Hw_{hc}b_h^{t-1} act​=i=1∑I​wic​xit​+h=1∑H​whc​bht−1​

    s c t = b ϕ t s c t − 1 + b l t g ( a c t ) s_c^t=b_\phi ^ts_c^{t-1}+b_l^tg(a_c^t) sct​=bϕt​sct−1​+blt​g(act​)

  • O u t p u t G a t e Output Gate OutputGate
    a ω t = ∑ i = 1 I w i ω x i t + ∑ h = 1 H w h ω b h t − 1 + ∑ c = 1 C w c ω s c t a_\omega^t=\sum\limits_{i=1}^Iw_{i\omega}x_i^t+\sum\limits_{h=1}^Hw_{h\omega}b_h^{t-1}+\sum\limits_{c=1}^Cw_{c\omega}s_c^t aωt​=i=1∑I​wiω​xit​+h=1∑H​whω​bht−1​+c=1∑C​wcω​sct​

    b ω t = f ( a ω t ) b_\omega^t=f(a_\omega^t) bωt​=f(aωt​)

  • C e l l O u t p u t s Cell Outputs CellOutputs

    b c t = b ω t h ( s c t ) b_c^t=b_\omega^th(s_c^t) bct​=bωt​h(sct​)

注意OutPut Gate中最后一项是 s c t s_c^t sct​, 而不是 s c t − 1 s_c^{t-1} sct−1​ 因为此时Cell结果已经产生了

Backward Pass

定义 ϵ c t = ∂ Γ ∂ b c t \epsilon_c^t=\dfrac{\partial \Gamma}{\partial b_c^t} ϵct​=∂bct​∂Γ​ ϵ s t = ∂ Γ ∂ s c t \epsilon_s^t=\dfrac{\partial \Gamma}{\partial s_c^t} ϵst​=∂sct​∂Γ​

  • C e l l O u t p u t s Cell Outputs CellOutputs

    ϵ c t = ∑ k = 1 K w c k δ k t + ∑ g = 1 G w c g δ g t + 1 \epsilon_c^t=\sum\limits_{k=1}^Kw_{ck}\delta_k^t+\sum\limits_{g=1}^Gw_{cg}\delta_g^{t+1} ϵct​=k=1∑K​wck​δkt​+g=1∑G​wcg​δgt+1​

  • O u t p u t G a t e s Output Gates OutputGates

    ϵ ω t = f ′ ( a ω t ) ∑ c = 1 C h ( s c t ) ϵ c t \epsilon_\omega^t=f'(a_\omega^t)\sum\limits_{c=1}^Ch(s_{c}^t)\epsilon_c^t ϵωt​=f′(aωt​)c=1∑C​h(sct​)ϵct​

  • S t a t e State State

    ϵ s t = b w t h ′ ( s c t ) + b ϕ t + 1 ϵ s t + 1 + w c ϕ δ ϕ t + 1 + w c w δ w t \epsilon_s^t=b_w^th'(s_c^t)+b_\phi^{t+1}\epsilon_s^{t+1}+w_{c\phi}\delta_\phi^{t+1}+w_{cw}\delta_w^t ϵst​=bwt​h′(sct​)+bϕt+1​ϵst+1​+wcϕ​δϕt+1​+wcw​δwt​

  • C e l l Cell Cell

    δ c t = b l t g ′ ( a c t ) ϵ s t \delta_c^t=b_l^tg'(a_c^t)\epsilon_s^{t} δct​=blt​g′(act​)ϵst​

  • F o r g e t G a t e s Forget Gates ForgetGates

    ϵ ϕ t = f ′ ( a ϕ t ) ∑ c = 1 C s c t − 1 ϵ s t \epsilon_\phi^t=f'(a_\phi^t)\sum\limits_{c=1}^Cs_{c}^{t-1}\epsilon_s^t ϵϕt​=f′(aϕt​)c=1∑C​sct−1​ϵst​

  • I n p u t G a t e s Input Gates InputGates

    ϵ l t = f ′ ( a l t ) ∑ c = 1 C g ( a c t ) ϵ s t \epsilon_l^t=f'(a_l^t)\sum\limits_{c=1}^Cg(a_{c}^{t})\epsilon_s^t ϵlt​=f′(alt​)c=1∑C​g(act​)ϵst​

可以看出Forget Gates和其他两个Gates在指数上略有差别

嗯 我放这么些公式就是想要恶心大家的

我已经料想到没什么人 可以看到这里了

实际上你可以把LSTM想象成一个传送带,从过去一直拉到未来

而门则是管控上下这根传送带尽职的保安大叔

Forget Gate规定着什么时候必须下车放心 这是去幼儿园的车

Input Gate负责到点把东西放入传送带

Output Gate负责到点把东西从传送带输出(Forget是无用的 Output是有用的)

结合下图再理解下

GRU

注意到LSTM有三个门

在计算时这三个门都需要进行迭代 在计算时耗时较大 并行操作空间较小

故提出了GRU模型[9]

其通过Update Gates 替代Output Gates + Forget Gates

Cell State 和 隐状态 h i h_i hi​ 合并

  • LSTM转态转移方程(这才是需要记得公式)

    i t = σ ( W i s t − 1 + U i x t + b i ) i_t=\sigma(W_is_{t-1}+U_ix_t+b_i) it​=σ(Wi​st−1​+Ui​xt​+bi​)

    o t = σ ( W o s t − 1 + U o x t + b o ) o_t=\sigma(W_os_{t-1}+U_ox_t+b_o) ot​=σ(Wo​st−1​+Uo​xt​+bo​)

    f t = σ ( W f s t − 1 + U f x t + b f ) f_t=\sigma(W_fs_{t-1}+U_fx_t+b_f) ft​=σ(Wf​st−1​+Uf​xt​+bf​)

    s t ~ = ϕ ( W ( o t ⨀ s t − 1 ) ) + U x t + b ) \tilde{s_t}=\phi(W(o_t\bigodot s_{t-1}))+Ux_t+b) st​~​=ϕ(W(ot​⨀st−1​))+Uxt​+b)

    s t = f t ⨀ s t − 1 + i t ⨀ s t ~ s_t=f_t\bigodot s_{t-1}+i_t\bigodot \tilde{s_t} st​=ft​⨀st−1​+it​⨀st​~​

    其中i, o, f分别代表input, output, forget gates

  • GRU转态转移方程

    r t = σ ( W r s t − 1 + U r x t + b r ) r_t=\sigma(W_rs_{t-1}+U_rx_t+b_r) rt​=σ(Wr​st−1​+Ur​xt​+br​)

    z t = σ ( W z s t − 1 + U z x t + b z ) z_t=\sigma(W_zs_{t-1}+U_zx_t+b_z) zt​=σ(Wz​st−1​+Uz​xt​+bz​)

    s t ~ = ϕ ( W ( r t ⨀ s t − 1 ) ) + U x t + b ) \tilde{s_t}=\phi(W(r_t\bigodot s_{t-1}))+Ux_t+b) st​~​=ϕ(W(rt​⨀st−1​))+Uxt​+b)

    s t = z t ⨀ s t − 1 + ( 1 − z t ) ⨀ s t ~ s_t=z_t\bigodot s_{t-1}+(1-z_t)\bigodot \tilde{s_t} st​=zt​⨀st−1​+(1−zt​)⨀st​~​

    其中r, z分别代表reset, update

可以看出转态转移方程少了一个 计算量 势必会下降

很显然 GRU LSTM也都有对应的双向版本

SRU 及 类似模型

GRU的结果实际上已经比较好了

但 计算代价还是太大

于是在16年末到17年 逐渐由学者提出进一步缩减门运算的模型结构

门减少 势必会减小运算量 但之所以引入门 是因为 我们需要更好的传递性

当然在顶会上 发Paper的这几个模型 在实际效果上 都不错

我这里写SRU不太恰当 Quasi-RNN, MRU都是类似的思想 这里以SRU为例来进行分析

直接来看

  • SRU的转态转移方程[8]

    s t ~ = W s t \tilde{s_t}=Ws_t st​~​=Wst​

    f t = σ ( W f s t + b f ) f_t=\sigma(W_fs_t+b_f) ft​=σ(Wf​st​+bf​)

    r t = σ ( W r s t + b r ) r_t=\sigma(W_rs_t+b_r) rt​=σ(Wr​st​+br​)

    s t ~ = ϕ ( W ( r t ⨀ s t − 1 ) ) + U x t + b ) \tilde{s_t}=\phi(W(r_t\bigodot s_{t-1}))+Ux_t+b) st​~​=ϕ(W(rt​⨀st−1​))+Uxt​+b)

    c t = f t ⨀ c t − 1 + ( 1 − f t ) ⨀ s t ~ c_t=f_t\bigodot c_{t-1}+(1-f_t)\bigodot \tilde{s_t} ct​=ft​⨀ct−1​+(1−ft​)⨀st​~​

    h t = r t ⨀ g ( c t ) + ( 1 − r t ) ⨀ s t h_t=r_t\bigodot g(c_t)+(1-r_t)\bigodot s_t ht​=rt​⨀g(ct​)+(1−rt​)⨀st​

可以看出其相较于之前的模型最大的差别在于转态不再和之前转态有关

这意味着什么?

意味着 我们不再需要等着迭代

在预处理的时候 就可以把所有门状态值计算出来

!!!而且这些门的计算都是复杂度十分高的矩阵乘法

注意这里的是矩阵乘法 而下面隐层 h t h_t ht​中的运算都是矩阵的Hadamard乘–对应 i , j i,j i,j直接相乘

这两者的复杂度差别十分大了

所以 SRU这类模型 最大的贡献就是 提升 RNN运算速度

当然 SRU 并没有不依赖前者转态

self-attention

当然 dalao也不会闲着

就在大家已经觉得时序就=RNN的时候

Google Brain的dalao 发了一篇题目就很拉风的paper

Attention is all you need[10]

简单来说 其一次性计算出带较长语句的word encodeing

通过positional matrix 来获得时序信息

这样的好处就是可以并行计算 在计算性能上较RNN更优

self-attention的另外一个优点就是寻找时序关系更优

尤其是适合在跳跃topic的语料中

举个例子聊天聊到一半你说你去收个衣服,在这里topic就中断了,直到你再次回来

position的方式更容易计算之间的关系 而不用担心梯度消失

  • 具体公式
    A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) =softmax(\dfrac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk​ ​QKT​)V

    Q ∈ R n × d k , K ∈ R d k × m , V ∈ R m × d v Q\in R^{n\times d_k},K\in R^{d_k\times m},V\in R^{m\times d_v} Q∈Rn×dk​,K∈Rdk​×m,V∈Rm×dv​

    A t t e n t i o n ( q t , K , V ) = ∑ s = 1 m 1 z e x p ( &lt; q t , k s &gt; d k ) v s Attention(q_t,K,V) =\sum\limits_{s=1}^m\dfrac{1}{z}exp(\dfrac{&lt;q_t,k_s&gt;}{\sqrt{d_k}})v_s Attention(qt​,K,V)=s=1∑m​z1​exp(dk​ ​<qt​,ks​>​)vs​

    h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i = Attention(QW_i^Q,KW_i^K,VW_i^V) headi​=Attention(QWiQ​,KWiK​,VWiV​)

    M u l t i H e a d ( Q , K , V ) = c o n c a t ( h e a d 1 , h e a d 2 , . . . , h e a d h ) MultiHead(Q,K,V) = concat(head_1, head_2,...,head_h) MultiHead(Q,K,V)=concat(head1​,head2​,...,headh​)

Sliced Recurrent Neural Networks

从上文我们可以知道 RNN的结构是链式的

必须在前者进行完之后才能进行下一步

有人就对这样的链式结构进行优化[7]

通过类似二分的思想对RNN运行顺序进行优化 也得到了较好的结果

然后[6]中周志华dalao 利用FSA 对RNN 过程进行捕捉 从而进行可解释分析

Reference

  1. Understanding LSTM Networks
  2. The Unreasonable Effectiveness of Recurrent Neural Networks
  3. 如何评价新提出的RNN变种SRU?
  4. LONG SHORT-TERM MEMORY
  5. Supervised Sequence Labelling with Recurrent Neural Networks
  6. Learning with Interpretable Structure from RNN
  7. Sliced Recurrent Neural Networks
  8. Simple Recurrent Units for Highly Parallelizable Recurrence
  9. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling
  10. Attention Is All You Need

试谈`RNN`中`门`的变迁相关推荐

  1. 学校计算机操作技能(文字录入),试谈计算机文字录入技能训练.doc

    试谈计算机文字录入技能训练 浅谈计算机文字录入技能训练 沈雅清 摘要:计算机文字录入是我校计算机专业和文科专业必须掌握的一门技能课.作为一门技能课,它集知识和技巧于一体,要有效地培养出技术全面.技艺娴 ...

  2. gather torch_浅谈Pytorch中的torch.gather函数的含义

    pytorch中的gather函数 pytorch比tensorflow更加编程友好,所以准备用pytorch试着做最近要做的一些实验. 立个flag开始学习pytorch,新开一个分类整理学习pyt ...

  3. 浅谈CTF中各种花式绕过的小trick

    文章目录 浅谈CTF中各种花式绕过的小trick 前言 md5加密bypass 弱比较绕过 方法一:0e绕过 方法二:数组绕过 强比较绕过 方法:数组绕过 md5碰撞绕过 方法:使用Fastcoll生 ...

  4. RNN中BPTT的推导和可能的问题

    最近开始啃LSTM,发现BPTT这块还是不是很清晰,结合RNN,把这块整理整理 RNN 前馈神经网络(feedforward neural networks)如下图所示(这块内容可见我的博客神经网络B ...

  5. oracle表里面空值要填满,漫 谈oracle 中 的 空 值(转)

    漫 谈oracle 中 的 空 值 河 北 省 统 计 局 贾 书 民 ---- 在 数 据 库 中, 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况. 在 一 个 表 中, ...

  6. 激活函数设计vhdl_浅谈神经网络中激活函数的设计

    激活函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. 那么,常见的激活函数有哪些呢?或者说,激活函数的 ...

  7. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  8. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  9. 【keras】rnn中的LSTM

    keras rnn中常见的rnn layer 1. LSTM LSTM内部结构如下, 公式为 inputgate:it=σ(Wixt+Uih(t−1))forgetgate:ft=σ(Wfxt+Ufh ...

最新文章

  1. 漫画:垃圾男人分类图鉴
  2. python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call
  3. 云路由 vyatta 体验(二)NAT
  4. ASP.NET MVC 二维码生成(ThoughtWorks.QRCode)
  5. 在线音乐用户寄望用爱发电,资本不愿无米之炊
  6. 数据结构 - 线索化二叉树(线索化与遍历)
  7. java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序
  8. Linux设备树语法详解【转】
  9. sql instr函数_如何实现SQL INSTR()函数?
  10. 1926: 粟粟的书架 前缀和+二分+主席树
  11. 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记
  12. 计算机网络(北京理工大学出版社)课后习题答案
  13. 气象要素色斑图的配色
  14. 汽车功能安全标准“ISO 26262”导入实践(上)
  15. Macbook中的文件显示与隐藏方法
  16. 2021年田野的风响彻了整个冰岛
  17. starbound服务器文件,starbound星界边境开新档并从老存档转移物资的方法_快吧单机游戏...
  18. DNS服务器未响应惊叹号,怎么办呢电脑连接网络出现感叹号?
  19. DIY微信朋友圈截图制作生成小程序源码下载
  20. 第十二周项目四----利用遍历思想求解图问题之输出一些简单回路

热门文章

  1. 如何打开不知道文件类型的文件
  2. 【Prompt Engineering 教程:写 Prompt 的艺术】1、什么是 Prompt Engineering?
  3. 玩转多功能QQ机器人【含ChatGPT实现】
  4. 实时深度学习的推理加速
  5. DTCC2017| 我有故事,你约吗?
  6. CDH6.3.2搭建HIVE ON TEZ步骤
  7. Excel一键删除工作簿中多余空白表的操作
  8. 『NLP经典项目集』08: 使用预训练模型完成阅读理解
  9. js数组怎么删除指定元素?
  10. tp6中无限极分类里面的获取多级分类数据