文章目录

  • 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 模仿小四写文章(生成文本序列)

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​+WSt−1​),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}St−1​和高三这一年老师能交给我们的知识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​+VSt−1​+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}_tSt​,U[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​)=−yt​logy^​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^​)​=t∑​Et​(yt​,y^​t​)=−∑yt​logy^​t​​

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

假设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}∂W∂E3​​=∂y^​3​∂E3​​∂s3​∂y^​3​​∂W∂s3​​
E3E_3E3​和y3y_3y3​有关系,y3y_3y3​和s3s_3s3​有关系(参考2.1中的公式)。
而s3=tanh(Ux3+Ws2)s_3=tanh(Ux_3+Ws_2)s3​=tanh(Ux3​+Ws2​),s3s_3s3​和s2s_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_2s2​和s1s_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}∂W∂s3​​=k=0∑3​∂sk​∂s3​​∂W∂sk​​

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

其中我们在计算∂s3∂s2\dfrac{\partial s_3}{\partial s_2}∂s2​∂s3​​的时候需要使用链式法则计算:∂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}∂s1​∂s3​​=∂s2​∂s3​​∂s1​∂s2​​∂s0​∂s1​​

所以最终得到:∂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}∂W∂E3​​=k=0∑3​∂y^​3​∂E3​​∂s3​∂y^​3​​∂sk​∂s3​​∂W∂sk​​=k=0∑3​∂y^​3​∂E3​​∂s3​∂y^​3​​⎝⎛​j=k+1∏3​∂sj−1​∂sj​​⎠⎞​∂W∂sk​​

看公式中有连乘的部分。当使用tanh作为激活函数的时候,由于导数值分别在0到1之间,随着时间的累计,小于1的数不断相城,很容易趋近于0。(另外一种解释:如果权重矩阵 W的范数也不很大,那么经过

深度学习04-RNN相关推荐

  1. 你有哪些深度学习(rnn、cnn)调参的经验?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 你有哪些deep learning(rnn.cnn)调参的经验? ...

  2. [深度学习]理解RNN, GRU, LSTM 网络

    Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...

  3. 深度学习 《RNN模型》

    前言: 前几篇博文里面我们学习了传统的BP神经网络,你可以称为她是全连接的网络,也可以称之为DNN(denisty nextwork),也学习了卷积神经网络,在卷积神经网络里面还学习了池化等结构,并且 ...

  4. 深度学习基础 | RNN家族全面解析

    作者 | Chilia 整理 | NewBeeNLP 首先,请阅读先修知识:深度学习基础 | 从Language Model到RNN 1. 梯度消失和梯度爆炸 1.1 梯度消失 [定义]当很多的层都用 ...

  5. 动手学习深度学习 04:多层感知机

    文章目录 01 多层感知机 1.感知机 总结 2.多层感知机 2.1.隐藏层 2.1.1 线性模型可能会出错 2.1.2 在网络中加入隐藏层 2.1.3 从线性到非线性 2.1.4 通用近似定理 3. ...

  6. 从零实现深度学习框架——RNN从理论到实战【理论】

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.

  7. 深度学习-使用RNN生成诗

    代码连链接 这里稍微更改了下<深度学习框架PyTorch:入门与实践>里的demo,去掉稍微繁琐和多次训练的部分,只保留了比较核心的生成连接诗和藏头诗两部分(比较渣太复杂了看不懂). 目标 ...

  8. 深度学习之RNN、LSTM、GRU篇

    写在前面,作为RNN篇学习的记录 参考1:https://blog.csdn.net/mpk_no1/article/details/72875185 参考2:https://blog.csdn.ne ...

  9. July深度学习之RNN循环神经网络

    RNN循环神经网络 一.简介 首先,为什么有BP神经网络和CNN,还要提出RNN? 因为传统的神经网络,包括CNN,它的输入和输出是互相独立的.但有些时候,后续的输出和前面的内容是相关的.比如,我是中 ...

  10. 13.深度学习之RNN进阶-1

    13.1 通过时间反向传播 13.1.1 BPTT算法推导 BPTT(back-propagation through time)算法是常用的训练RNN的方法. 需要寻优的参数有三个,分别是U.V.W ...

最新文章

  1. react antd form 表单清空
  2. nginx+uwsgi+django1.6 配置过程
  3. 【LSTM】基于LSTM网络的人脸识别算法的MATLAB仿真
  4. ABAP 向上取整和向下取整 CEIL FLOOR
  5. 如何实现一个符合泊松分布的即时消息发生器?
  6. 命令行cd到_前端(只)需要掌握这些命令行(就还行了)
  7. C++复习总结(涵盖所有C++基本考点)!
  8. 极度偷懒 - 实现算命程序中tabcontrol的“美化”
  9. 阿里云前端周刊 - 第 15 期
  10. 如何告别脂肪肝?要注意什么?
  11. 答题小程序/刷题微信小程序/考试小程序2.0版本(新增代理,团购,题目导入,数据导出等功能,THINKPHP后台)
  12. 微软手机远程桌面使用
  13. Linux如何一键配置网络ip?
  14. python的对文档密码的简单破解
  15. 来自我的网易博客的文章
  16. FPGA:ov7725摄像头通过VGA/HDMI显示RGB565格式的图像
  17. 做软件产品有哪种商业模式?
  18. TO DO ... ...
  19. 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】
  20. 没文档也要扒源码让 ShardingSphere 支持 openGauss SCRAM 前端认证

热门文章

  1. 酒厂选址(codevs 1507)
  2. jquery中邮箱地址 URL网站地址正则验证实例代码
  3. css - clearfix-清除浮动
  4. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
  5. 动态表格数据序号从1开始_EXCEL对面的表姐看过来,你真的会给表格添加序号吗?...
  6. springboot : Failed to decode downloaded font 和 OTS parsing error
  7. JavaScript之继承模式,命名空间,对象枚举
  8. 为什么只推荐入主流版本华强北耳机?
  9. Android 获取光线强弱,开启闪光灯,关闭闪光灯
  10. Android 多线程实现异步执行demo,线程池使用demo