循环神经网络

在nnn元语法中,时间步ttt的词wtw_twt​基于前面所有词的条件概率只考虑了最近时间步的n−1n-1n−1个词。如果要考虑比t−(n−1)t-(n-1)t−(n−1)更早时间步的词对wtw_twt​的可能影响,需要增大nnn。
这样模型参数的数量将随之呈指数级增长。

循环神经网络并非刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息

不含隐藏状态的神经网络

一个含单隐藏层的多层感知机
  • 给定样本数为nnn、输入个数(特征数或特征向量维度)为ddd的小批量数据样本X∈Rn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}X∈Rn×d。设隐藏层的激活函数为ϕ\phiϕ,那么隐藏层的输出H∈Rn×h\boldsymbol{H} \in \mathbb{R}^{n \times h}H∈Rn×h计算为

H=ϕ(XWxh+bh),\boldsymbol{H} = \phi(\boldsymbol{X} \boldsymbol{W}_{xh} + \boldsymbol{b}_h),H=ϕ(XWxh​+bh​),

其中隐藏层权重参数Wxh∈Rd×h\boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h}Wxh​∈Rd×h,隐藏层偏差参数 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bh​∈R1×h,hhh为隐藏单元个数。上式相加的两项形状不同,因此将按照广播机制相加

  • 隐藏变量H\boldsymbol{H}H作为输出层的输入,且设输出个数为qqq(如分类问题中的类别数),输出层的输出为

O=HWhq+bq,\boldsymbol{O} = \boldsymbol{H} \boldsymbol{W}_{hq} + \boldsymbol{b}_q,O=HWhq​+bq​,

其中输出变量O∈Rn×q\boldsymbol{O} \in \mathbb{R}^{n \times q}O∈Rn×q, 输出层权重参数Whq∈Rh×q\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}Whq​∈Rh×q, 输出层偏差参数bq∈R1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}bq​∈R1×q。如果是分类问题,我们可以使用softmax(O)\text{softmax}(\boldsymbol{O})softmax(O)来计算输出类别的概率分布。

含隐藏状态的循环神经网络

考虑输入数据存在时间相关性,假设Xt∈Rn×d\boldsymbol{X}_t \in \mathbb{R}^{n \times d}Xt​∈Rn×d是序列中时间步ttt的小批量输入,Ht∈Rn×h\boldsymbol{H}_t \in \mathbb{R}^{n \times h}Ht​∈Rn×h是该时间步的隐藏变量。

  • 与多层感知机不同的是,这里我们保存上一时间步的隐藏变量Ht−1\boldsymbol{H}_{t-1}Ht−1​,并引入一个新的权重参数Whh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}Whh​∈Rh×h,该参数用来描述在当前时间步如何使用上一时间步的隐藏变量。
  • 具体来说,时间步ttt的隐藏变量的计算由当前时间步的输入和上一时间步的隐藏变量共同决定:
    Ht=ϕ(XtWxh+Ht−1Whh+bh)\boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol{b}_h)Ht​=ϕ(Xt​Wxh​+Ht−1​Whh​+bh​)

与多层感知机相比,这里多了了Ht−1Whh\boldsymbol{H}{t-1} \boldsymbol{W}{hh}Ht−1Whh一项。

由上式中相邻时间步的隐藏变量Ht\boldsymbol{H}tHt和Ht−1\boldsymbol{H}{t-1}Ht−1之间的关系可知,这里的隐藏变量能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。因此,该隐藏变量也称为隐藏状态

  • 由于隐藏状态在当前时间步的定义使用了上一时间步的隐藏状态,上式的计算是循环的。使用循环计算的网络即循环神经网络(recurrent neural network)

循环神经网络有很多种不同的构造方法。含上式所定义的隐藏状态的循环神经网络是极为常见的一种。在时间步ttt,输出层的输出和多层感知机中的计算类似:

Ot=HtWhq+bq\boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_qOt​=Ht​Whq​+bq​

循环神经网络的参数包括

  • 隐藏层的权重Wxh∈Rd×h\boldsymbol{W}_{xh} \in \mathbb{R}^{d \times h}Wxh​∈Rd×h、Whh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}Whh​∈Rh×h和偏差 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bh​∈R1×h
  • 输出层的权重Whq∈Rh×q\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}Whq​∈Rh×q和偏差bq∈R1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}bq​∈R1×q。
  • 即便在不同时间步,循环神经网络也始终使用这些模型参数。因此,循环神经网络模型参数的数量不随时间步的增加而增长

下图展示了循环神经网络在3个相邻时间步的计算逻辑。

  • 在时间步ttt,隐藏状态的计算可以看成是将输入Xt\boldsymbol{X}_tXt​和前一时间步隐藏状态Ht−1\boldsymbol{H}_{t-1}Ht−1​连结后输入一个激活函数为ϕ\phiϕ的全连接层。
  • 该全连接层的输出就是当前时间步的隐藏状态Ht\boldsymbol{H}_tHt​
  • 模型参数为Wxh\boldsymbol{W}_{xh}Wxh​与Whh\boldsymbol{W}_{hh}Whh​的连结,偏差为bh\boldsymbol{b}_hbh​。当前时间步ttt的隐藏状态Ht\boldsymbol{H}_tHt​将参与下一个时间步t+1t+1t+1的隐藏状态Ht+1\boldsymbol{H}_{t+1}Ht+1​的计算,并输入到当前时间步的全连接输出层。

隐藏状态中XtWxh+Ht−1Whh\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}Xt​Wxh​+Ht−1​Whh​的计算等价于Xt\boldsymbol{X}_tXt​与Ht−1\boldsymbol{H}_{t-1}Ht−1​连结后的矩阵乘以Wxh\boldsymbol{W}_{xh}Wxh​与Whh\boldsymbol{W}_{hh}Whh​连结后的矩阵。

我们用一个具体的例子来验证这一点。

  • 首先,我们构造矩阵X、W_xh、H和W_hh,它们的形状分别为(3, 1)、(1, 4)、(3, 4)和(4, 4)。
  • 将X与W_xh、H与W_hh分别相乘,再把两个乘法运算的结果相加,得到形状为(3, 4)的矩阵。
import torchX, W_xh = torch.randn(3, 1), torch.randn(1, 4)
H, W_hh = torch.randn(3, 4), torch.randn(4, 4)
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
  • 将矩阵X和H按列(维度1)连结,连结后的矩阵形状为(3, 5)。可见,连结后矩阵在维度1的长度为矩阵X和H在维度1的长度之和(1+41+41+4)。

  • 然后,将矩阵W_xh和W_hh按行(维度0)连结,连结后的矩阵形状为(5, 4)。最后将两个连结后的矩阵相乘,得到与上面代码输出相同的形状为(3, 4)的矩阵。

总结为:
XtWxh+Ht−1Whh=[xtHt−1]∗[WxhWhh]\boldsymbol{X}_t \boldsymbol{W}_{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh}=\begin{bmatrix} x_t &H_{t-1}\end{bmatrix}*\begin{bmatrix} W_{xh} \\ W_{hh}\end{bmatrix}Xt​Wxh​+Ht−1​Whh​=[xt​​Ht−1​​]∗[Wxh​Whh​​]

torch.matmul(torch.cat((X, H), dim=1), torch.cat((W_xh, W_hh), dim=0))

应用:基于字符级循环神经网络的语言模型

应用循环神经网络来构建一个语言模型

设小批量中样本数为1,文本序列为“想”“要”“有”“直”“升”“机”。

下图演示了如何使用循环神经网络基于当前和过去的字符来预测下一个字符。

在训练时

  • 对每个时间步的输出层输出使用softmax运算
  • 然后使用交叉熵损失函数来计算它与标签的误差。

由于隐藏层中隐藏状态的循环计算,时间步3的输出O3\boldsymbol{O}_3O3​取决于文本序列“想”“要”“有”。 由于训练数据中该序列的下一个词为“直”,时间步3的损失将取决于该时间步基于序列“想”“要”“有”生成下一个词的概率分布与该时间步的标签“直”。

因为每个输入词是一个字符,因此这个模型被称为字符级循环神经网络(character-level recurrent neural network)。因为不同字符的个数远小于不同词的个数(对于英文尤其如此),所以字符级循环神经网络的计算通常更加简单。

《动手学深度学习》

(pytorch-深度学习)循环神经网络相关推荐

  1. MLK | 一文理清深度学习循环神经网络

    MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,内容主要来自于<百面机器学习>一书,结合自己的经验与思考做的一些总结 ...

  2. 深度学习 --- 循环神经网络RNN详解(BPTT)

    今天开始深度学习的最后一个重量级的神经网络即RNN,这个网络在自然语言处理中用处很大,因此需要掌握它,同时本人打算在深度学习总结完成以后就开始自然语言处理的总结,至于强化学习呢,目前不打算总结了,因为 ...

  3. 深度学习 循环神经网络RNN

    循环神经网络简介: 循环神经网络(Recurrent Neural Networks)是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的. 它与D ...

  4. 深度学习---循环神经网络RNN详解(LSTM)

    上一节我们详细讲解了RNN的其中一个学习算法即BPTT,这个算法是基于BP的,只是和BP不同的是在反向传播时,BPTT的需要追溯上一个时间的权值更新,如下图,当前时刻是s(t),但是反向传播时,他需要 ...

  5. 深度学习--循环神经网络(Recurrent Neural Network)

    RNN(Recurrent Neural Network)是怎么来的? 一些应用场景,比如说写论文,写诗,翻译等等. 既然已经学习过神经网络,深度神经网络,卷积神经网络,为什么还要学习RNN? 首先我 ...

  6. 深度学习-循环神经网络(RNN)

    作者: 明天依旧可好 QQ交流群: 807041986 注:关于深度学习的相关问题,若本文未涉及可在下方留言告诉我,我会在文章中进行补充的. 原文链接:https://mtyjkh.blog.csdn ...

  7. 15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)【LP自然语言处理涉及到深度学习和神经网络的介绍、 Pytorch、 RNN自然语言处理】 笔记

    15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)[LP自然语言处理涉及到深度学习和神经网络的介绍. Pytorch. RNN自然语言处理] 笔记 教程与代码地址 P1 机器学习与 ...

  8. Pytorch深度学习(一):前馈神经网络(FNN)

    Pytorch深度学习(一):前馈神经网络(FNN) 参考B站课程:<PyTorch深度学习实践>完结合集 传送门:<PyTorch深度学习实践>完结合集 一.线性模型: 已知 ...

  9. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  10. 《PyTorch 深度学习实践》第10讲 卷积神经网络(基础篇)

    文章目录 1 卷积层 1.1 torch.nn.Conv2d相关参数 1.2 填充:padding 1.3 步长:stride 2 最大池化层 3 手写数字识别 该专栏内容为对该视频的学习记录:[&l ...

最新文章

  1. Spring的任务调度和邮件发送
  2. 避免重复造轮子,我们去哪找FPGA IP或是HDL功能模块?
  3. Java客户端操作elasticsearch--查询索引库
  4. FFmpeg学习(0)——使用ffmpeg视频切片并加密
  5. Java-经典排序算法(二)——快速排序
  6. 216.组合总和III
  7. python 幂次方_python次方运算
  8. PDF可以转换成CAD图纸吗?
  9. m1也能用的视频无损放大软件:topaz video enhance ai mac版
  10. 词性标注 python
  11. GDT、LDT和IDT
  12. 虚拟机安装python3_虚拟机如何安装python
  13. python包和库的区别_python中模块、包、库的区别和使用
  14. python毕设代做_怎么用python做毕设?
  15. 把软件装进U盘,真正做到即插即用
  16. 弹性盒子 -- flex
  17. Java项目:SSM汽车维修管理系统源码
  18. MQTT - 消息队列遥测传输协议
  19. 类模板中的友元,友元类
  20. Pytorch基础操作 —— 6. 如何使用自定义数据集

热门文章

  1. Linux的实际操作:文件目录类的实用指令(echo head tail)
  2. ai人工智能python开发_Python才是人工智能AI的首选编程语言,你值得拥有……
  3. oracle 布尔盲注,Oracle基于延时的盲注总结
  4. mac笔记本怎么外接显示屏_win to go的安装与Macbook pro外接eGPU开启
  5. ultraos win10启动盘_UltraISO制作U盘启动安装MSDN原版Win10系统教程 - SDN系统库
  6. 【学习笔记】《Go 指南》
  7. php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件
  8. 查看linux系统的sp,查看linux系统版本命令
  9. catia测量工具小尺子在哪_小区垃圾桶旁捡来旧茶几,老爸巧手改成沙发,邻居一个劲问哪买的...
  10. 电容的q值计算公式_在设计电路中电容容量大小、耐压等级选取详解 (转)