深度学习04-RNN

文章目录

  • 1 为什么需要RNN
    • 1.1RNN的应用场景
    • 1.2 DNN和CNN不能解决的问题
  • 2 RNN的网络结构
    • 2.1 RNN基础结构
    • 2.2 不同类型的RNN
  • 3 RNN的优化算法BPTT
  • 4 LSTM
  • 5 GRU

1 为什么需要RNN

1.1RNN的应用场景

1 模仿论文(生成序列)。输入是一堆的论文文章,输出是符合论文格式的文本。
2 模仿linux 内核代码写程序(生成序列)
3 模仿小四写文章(生成文本序列)
Alt
4 机器翻译
5 image to text 看图说话
在这里插入图片描述

1.2 DNN和CNN不能解决的问题

在这里插入图片描述

深度神经网络DNN是上面这个样子。前一层输出是后一层输入。每一层的输入输出是独立的。第n层的输出和第n+1层的输出是独立的,是没有关系的。CNN也一样。例如一张图像中要画出猫和狗的位置,那猫和狗是独立的,是用不同的神经元捕获特征。不会去根据猫的位置或者特征推测狗的位置。

但有些任务中后续的输出和之前的内容是有关系的。例如完形填空:我是中国人,我的母语是_____。RNN就是用来解决这类问题。

2 RNN的网络结构

2.1 RNN基础结构

RNN网络结构的特点是每一层网络执行相同的任务,但是输出依赖于输入和记忆。
在这里插入图片描述

W,U,V是三个权重向量(是向量还是矩阵?),并且在所有网络层,值是相同的。
xtx_txt是t时刻的输入
StS_tSt是t时刻的记忆:St=f(UXt+WSt−1)S_t=f(UX_t+WS_{t-1})St=f(UXt+WSt1),f可以是tanh等函数,这个函数应该是一个值域范围固定的函数,例如函数范围在(-1,1)之间。这样可以保证神经网络不会爆炸
OtO_tOt是t时刻的输出,如果是输出下个词的话,那就是输出每个候选词的概率,Ot=Softmax(VSt)O_t=Softmax(VS_t)Ot=Softmax(VSt)

我们用高中学习的类比。如果t=高三,那么
W,U,V是我们的学习方法,高一,高二,高三这三年学习方法不变(在一轮迭代中)。
xtx_txt是高三这一年老师教给我们的知识。
StS_tSt是高三学习完以后能够记住的知识。我们能记住的知识取决于高二学习后能记住的知识St−1S_{t-1}St1和高三这一年老师能交给我们的知识xtx_txt
OtO_tOt可以是高三毕业考试的成绩,它与高三学习完以后能够记住的知识有关。当然成绩是一个线性回归问题,与上面例子中说的多分类问题是两种类型的问题。

由于每一层共享参数W、U、V,所以RNN的参数量与CNN相比,是比较小的。
在有些问题中不一定有OtO_tOt。例如情感分类的任务中,只需要在读完所有句子,也就是最后一个时刻输出情感类别即可,过程中不需要。
StS_tSt并不能捕捉所有时刻的信息,StS_tSt是一个矩阵,能够存储的信息是有限的。

示例代码:唐诗生成器

2.2 不同类型的RNN

1 深层双向RNN
在这里插入图片描述
在有些情况下,当前的输出不仅依赖于之前序列的元素,还与之后的元素有关。例如在句法解析中。“He said, Teddy bears are on sale” and “He said, Teddy Roosevelt was a great President。在上面的两句话中,当我们看到“Teddy”和前两个词“He said”的时候,我们有可能无法理解这个句子是指President还是Teddy bears。因此,为了解决这种歧义性,我们需要往后查找。

S⃗t=f(W⃗xt+V⃗S⃗t−1+b⃗)\vec S_t = f(\vec Wx_t+\vec V\vec S_{t-1}+\vec b)St=f(Wxt+VSt1+b)
S←t=f(W←xt+V←S←t+1+b←)\overleftarrow{S}_{t}=f\left(\overleftarrow{W} x_{t}+\overleftarrow{V} \overleftarrow{S}_{t+1}+\overleftarrow{b}\right)St=f(Wxt+VSt+1+b)
yt=g(U[S⃗t;S←t]+c)y_{t}=g\left(U\left[\vec{S}_{t} ; \overleftarrow{S}_t\right]+c\right)yt=g(U[St;St]+c)

从左向右计算记忆S⃗t\vec S_tSt,从右向左计算记忆S←t\overleftarrow{S}_tStU[S⃗t;S←t]U\left[\vec{S}_{t} ; \overleftarrow{S}_t\right]U[St;St]是对两个矩阵做拼接。

2 深层双向RNN
在这里插入图片描述
图中的h和之前的S是等价的。
这样的网络是说在每个时刻不仅学习一遍,可以学习3遍甚至更多。类比于,你读了三遍高一,三遍高二,三遍高三。

3 RNN的优化算法BPTT

BPTT和BP很类似,是一个思路,但是因为这里和时刻有关系。
在这里插入图片描述
在这样一个多分类器中,损失函数是一个交叉熵。
某一时刻的损失函数是:Et(yt,y^t)=−ytlog⁡y^tE_{t}\left(y_{t}, \hat{y}_{t}\right)=-y_{t} \log \hat{y}_{t}Et(yt,y^t)=ytlogy^t
最终的损失函数是所有时刻的交叉熵相加:E(y,y^)=∑tEt(yt,y^t)=−∑ytlog⁡y^t\begin{aligned} E(y, \hat{y}) &=\sum_{t} E_{t}\left(y_{t}, \hat{y}_{t}\right) \\ &=-\sum y_{t} \log \hat{y}_{t} \end{aligned}E(y,y^)=tEt(yt,y^t)=ytlogy^t

损失函数对W求偏导:∂E∂W=∑t∂Et∂W\frac{\partial E}{\partial W}=\sum_{t} \frac{\partial E_{t}}{\partial W}WE=tWEt

假设t=3,∂E3∂W=∂E3∂y^3∂y^3∂s3∂s3∂W\frac{\partial E_{3}}{\partial W}=\frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}} \frac{\partial s_{3}}{\partial W}WE3=y^3E3s3y^3Ws3
E3E_3E3y3y_3y3有关系,y3y_3y3s3s_3s3有关系(参考2.1中的公式)。
s3=tanh(Ux3+Ws2)s_3=tanh(Ux_3+Ws_2)s3=tanh(Ux3+Ws2)s3s_3s3s2s_2s2有关系,我们对s3s_3s3对W求偏导不能直接等于s2s_2s2,因为s2s_2s2也和W有关系。
s2=tanh(Ux2+Ws1)s_2=tanh(Ux_2+Ws_1)s2=tanh(Ux2+Ws1)

s2s_2s2s1s_1s1有关系…一直到0时刻。所以我们会把每个时刻的相关梯度值相加:∂s3∂W=∑k=03∂s3∂sk∂sk∂W\frac{\partial s_{3}}{\partial W}=\sum_{k=0}^{3} \frac{\partial s_{3}}{\partial s_{k}} \frac{\partial s_{k}}{\partial W}Ws3=k=03sks3Wsk

至于这里为什么要把每个时刻的梯度相加可以参考文档,这里直接就是说相加。还有一些解释是:因为分子是向量,分母是矩阵,需要拆开来求导。或者根本上来讲是因为求导公式,我暂时没弄明白这一步。

其中我们在计算∂s3∂s2\dfrac{\partial s_3}{\partial s_2}s2s3的时候需要使用链式法则计算:∂s3∂s1=∂s3∂s2∂s2∂s1∂s1∂s0\dfrac{\partial s_3}{\partial s_1}=\dfrac{\partial s_3}{\partial s_2}\dfrac{\partial s_2}{\partial s_1}\dfrac{\partial s_1}{\partial s_0}s1s3=s2s3s1s2s0s1

所以最终得到:∂E3∂W=∑k=03∂E3∂y^3∂y^3∂s3∂s3∂sk∂sk∂W=∑k=03∂E3∂y^3∂y^3∂s3(∏j=k+13∂sj∂sj−1)∂sk∂W\frac{\partial E_{3}}{\partial W}=\sum_{k=0}^{3} \frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}} \frac{\partial s_{3}}{\partial s_{k}} \frac{\partial s_{k}}{\partial W} =\sum_{k=0}^{3} \frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}}\left(\prod_{j=k+1}^{3} \frac{\partial s_{j}}{\partial s_{j-1}}\right) \frac{\partial s_{k}}{\partial W}WE3=k=03y^3E3s3y^3sks3Wsk=k=03y^3E3s3y^3j=k+13sj1sjWsk

看公式中有连乘的部分。当使用tanh作为激活函数的时候,由于导数值分别在0到1之间,随着时间的累计,小于1的数不断相城,很容易趋近于0。(另外一种解释:如果权重矩阵 W的范数也不很大,那么经过 𝑡−𝑘 次传播后,∂s3∂sk\dfrac{\partial s_3}{\partial s_k}sks3的范数会趋近于0,这也就导致了梯度消失。)

梯度消失带来的一个问题就是记忆力有限,离得越远的东西记住得越少。

4 LSTM

LSTM就是为了解决普通RNN中的梯度消失问题提出的。
LSTM提出了记忆细胞C,以及各种门。下图中的h与上面的S是相同含义,表示记忆。每个时刻的输出,在这里是没有画出来的。
假设现在有一个任务是根据已经读到的词,预测下一个词。例如输入法,生成诗词。

在这里插入图片描述

第1步:忘记门:从记忆细胞中丢弃一些信息
在这里插入图片描述

使用sigmoid函数,经过sigmoid之后得到一个概率值,描述每个部分有多少量可以通过。
ft=σ(Wf⋅[ht−1,xt]+bf)f_{t}=\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right)ft=σ(Wf[ht1,xt]+bf)

如果C中包含当前对象的性别属性,现在已经正确的预测了当前的名词。当我们看到另外一个新的对象的时候,我们希望忘记旧对象的性别属性。

第2步:更新什么新信息到记忆中
在这里插入图片描述

sigmoid决定什么值需要更新: it=σ(Wi⋅[ht−1,xt]+bi)i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right)it=σ(Wi[ht1,xt]+bi)
tanh层创建一个新的候选值向量(高三这一年学到的所有知识): C~t=tanh⁡(WC⋅[ht−1,xt]+bC)\tilde{C}_{t}=\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)C~t=tanh(WC[ht1,xt]+bC)

第3步:更新记忆细胞
在这里插入图片描述

把旧状态与ftf_tft相乘,丢弃掉我们确定需要丢弃的信息;
加上iti_tit*C~t\tilde{C}_{t}C~t,就是新的候选值,更新状态。
Ct=ft∗Ct−1+it∗C~tC_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}Ct=ftCt1+itC~t
Ct−1C_{t-1}Ct1是到高二以及之前的所有记忆,C~t\tilde{C}_{t}C~t高三这一年学到的所有知识。带着两部分应该留下的内容去高考。

在任务中就是希望把新看到对象的性别属性添加到C,而把旧对象的性别属性删除。

第4步,基于细胞状态得到输出
在这里插入图片描述

首先一个sigmoid层确定细胞状态的哪个部分的值将输出:ot=σ(Wo[ht−1,xt]+bo)o_{t}=\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]+b_{o}\right)ot=σ(Wo[ht1,xt]+bo)

接着用tanh处理细胞状态,输出我们确定输出的那部分,这部分是记忆用于下一时刻帮助做出决策的:ht=ot∗tanh⁡(Ct)h_{t}=o_{t} * \tanh \left(C_{t}\right)ht=ottanh(Ct)

在语言模型中,既然我当前看到了一个对象,这里可能输出一个动词信息,以备下一步需要用到。例如这里可能输出当前对象是单数还是复数,这样就知道下一个动词应该填写什么形式。

总结:
在这里插入图片描述

1:决定老细胞只留下哪部分ft=σ(Wf⋅[ht−1,xt]+bf)f_{t}=\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]+b_{f}\right)ft=σ(Wf[ht1,xt]+bf)
2: 决定新知识应该记住哪部分:it=σ(Wi⋅[ht−1,xt]+bi)i_{t}=\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]+b_{i}\right)it=σ(Wi[ht1,xt]+bi)
新学习到的知识:C~t=tanh⁡(WC⋅[ht−1,xt]+bC)\tilde{C}_{t}=\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)C~t=tanh(WC[ht1,xt]+bC)
3 更新细胞状态:Ct=ft∗Ct−1+it∗C~tC_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}Ct=ftCt1+itC~t
4 决定要输出哪部分:ot=σ(Wo[ht−1,xt]+bo)o_{t}=\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]+b_{o}\right)ot=σ(Wo[ht1,xt]+bo)
产生隐藏状态的输出:ht=ot∗tanh⁡(Ct)h_{t}=o_{t} * \tanh \left(C_{t}\right)ht=ottanh(Ct)

对比普通的RNN,输出ot=σ(VSt)o_t=\sigma\left(VS_t\right)ot=σ(VSt),St=tanh(Uxt+WSt−1)S_t=tanh(Ux_t+WS_{t-1})St=tanh(Uxt+WSt1),对于记忆StS_tSt是由之前记忆和新知识共同组成。加入细胞状态可以选择忘记一部分老知识和选择忘记一部分新知识。

在之前的求导过程中∂s3∂s1=∂s3∂s2∂s2∂s1∂s1∂s0\dfrac{\partial s_3}{\partial s_1}=\dfrac{\partial s_3}{\partial s_2}\dfrac{\partial s_2}{\partial s_1}\dfrac{\partial s_1}{\partial s_0}s1s3=s2s3s1s2s0s1,现在变为。。。。。

输出ot=σ(Vht)o_t=\sigma\left(Vh_t\right)ot=σ(Vht)
ht=ot∗tanh⁡(Ct)h_{t}=o_{t} * \tanh \left(C_{t}\right)ht=ottanh(Ct)
Ct=ft∗Ct−1+it∗C~t=ft∗Ct−1+it∗tanh⁡(WC⋅[ht−1,xt]+bC)C_{t}=f_{t} * C_{t-1}+i_{t} * \tilde{C}_{t}=f_{t} * C_{t-1}+i_t*\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]+b_{C}\right)Ct=ftCt1+itC~t=ftCt1+ittanh(WC[ht1,xt]+bC)
损失函数不变,还是令t=3,∂E3∂W=∂E3∂y^3∂y^3∂h3∂h3∂C3∂C3∂Wc\frac{\partial E_{3}}{\partial W}=\frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial C_3}\frac{\partial C_{3}}{\partial W_c}WE3=y^3E3h3y^3C3h3WcC3

要求∂C3∂Wc\dfrac{\partial C_3}{\partial W_c}WcC3,这样CtC_tCtWcW_cWc有关系,Ct−1C_{t-1}Ct1WcW_cWc有关系,两部分相加,对整个函数求导,就是对这两部分分别求导,再相加。与普通RNN的相乘
∂C3∂C1=∂C3∂C2+∂C2∂C1=?\dfrac{\partial C_3}{\partial C_1}=\dfrac{\partial C_3}{\partial C_2}+\dfrac{\partial C_2}{\partial C_1}=?C1C3=C2C3+C1C2=?

5 GRU

GRU是LSTM的变种之一。
在这里插入图片描述

GRU做的改变是:
1 将忘记门和输入门合并成一个门,称为更新门。
2 细胞状态和隐藏状态,也就是上面的C和hth_tht合并为一个hth_tht
这样GRU的参数就比标准LSTM要少,在很多情况下效果基本一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring学习(28):处理自动装配的歧义性

pox.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]51.基于ID的加密安全模型,描述IBE方案

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 在公钥密码学中&#xff0c;如果Alice想要给Bob发送一条消息&#xff0c;她需要Bob的公钥&#xff0c;一般来…

spring学习(29):xml配置规范

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

leetcode——背包问题汇总

本章来汇总一下leetcode中做过的背包问题&#xff0c;包括0-1背包和完全背包。 背包问题的通常形式为&#xff1a;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。求解将哪些物品装入背包里物品价值总和最大。0-1背包和…

spring学习(32):使用junit4测试

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

spring学习(33):id和name

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[高效时间管理] 番茄工作钟 windows版本

【背景】 2019年本人学会了记录每日时间&#xff08;将每日分割成半小时一段的时间&#xff09; &#xff0c;但似乎是为了完成而完成&#xff0c;效果不佳&#xff0c;手机端的番茄钟总是诱惑太多&#xff0c;就在准备tb计时器的时候&#xff0c;发现了宝藏软件。 个人整理知…

IDEA设置取消自动显示参数提示

IDEA设置取消自动显示参数提示 最近在使用IDEA的过程中&#xff0c;发现方法中一直显示形参名的提示&#xff0c;无法选中&#xff0c;也无法删除&#xff0c;基于不同人的使用习惯不同&#xff0c;有的人不喜欢这种提示&#xff0c;我也在网上寻找各种解决方案&#xff0c;由于…

spring学习(34):构造函数依赖注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

[高效时间管理]复盘篇

【背景】 2019年本人在公众号中阅读了《时间管理&#xff0c;这篇就够了》&#xff0c;学习了其中的内容并开始记录每日所做&#xff0c;偶尔晚上进行复盘&#xff0c;对督促学习和反思起到一定的作用&#xff0c;故向大家分享经验。 为什么要时间管理&#xff1f; 时间管理…

spring学习(35):c名称空间注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

spring学习(36):注入简单类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

spring学习(37):注入list类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

spring学习(38):注入set类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

spring学习(39):注入map类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

NanUI文档 - 如何实现C#与Javascript的相互通信

NanUI文档目录 NanUI简介开始使用NanUI打包并使用内嵌式的HTML/CSS/JS资源使用网页来设计整个窗口如何实现C#与Javascript的相互通信如何处理NanUI中的下载过程 - DonwloadHandler的使用(待更新。。。)如何处理NanUI中的弹窗过程 - LifeSpanHandler的使用(待更新。。。)如何控制…

spring学习(40):注入数组类型

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

PS教程:如何拼图调色出高大上的作品

Hello&#xff0c;小伙伴们&#xff0c;是不是每每看到一些创意海报&#xff0c;就苦于自己不会做&#xff0c;其实合成并不难&#xff0c;掌握原理与技法&#xff0c;接下来就是拼图调色啦&#xff01;首先我们先来看下最终的效果图&#xff0c;铛铛铛&#xff01; 下面我们就…

spring学习(41):属性注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

【JS】实时监控页面,input框数值自动求和

需求&#xff1a; 有一个页面需要将input框填入的各个费用自动相加&#xff0c;添加到“合计费用”里。 解决方案&#xff1a; 使用jquery的blur实践&#xff0c;每个费用的Input框检测到失去焦点时&#xff0c;将所有的input框数值相加求和&#xff0c;然后写入到“合计费用”…