(pytorch-深度学习)循环神经网络

循环神经网络

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

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

不含隐藏状态的神经网络

一个含单隐藏层的多层感知机
  • 给定样本数为nnn、输入个数(特征数或特征向量维度)为ddd的小批量数据样本X∈Rn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}XRn×d。设隐藏层的激活函数为ϕ\phiϕ,那么隐藏层的输出H∈Rn×h\boldsymbol{H} \in \mathbb{R}^{n \times h}HRn×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}WxhRd×h,隐藏层偏差参数 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bhR1×hhhh为隐藏单元个数。上式相加的两项形状不同,因此将按照广播机制相加

  • 隐藏变量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}ORn×q, 输出层权重参数Whq∈Rh×q\boldsymbol{W}_{hq} \in \mathbb{R}^{h \times q}WhqRh×q, 输出层偏差参数bq∈R1×q\boldsymbol{b}_q \in \mathbb{R}^{1 \times q}bqR1×q如果是分类问题,我们可以使用softmax(O)\text{softmax}(\boldsymbol{O})softmax(O)来计算输出类别的概率分布。

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

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

  • 与多层感知机不同的是,这里我们保存上一时间步的隐藏变量Ht−1\boldsymbol{H}_{t-1}Ht1,并引入一个新的权重参数Whh∈Rh×h\boldsymbol{W}_{hh} \in \mathbb{R}^{h \times h}WhhRh×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=ϕ(XtWxh+Ht1Whh+bh)

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

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

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

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

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

循环神经网络的参数包括

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

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

在这里插入图片描述

  • 在时间步ttt,隐藏状态的计算可以看成是将输入Xt\boldsymbol{X}_tXt和前一时间步隐藏状态Ht−1\boldsymbol{H}_{t-1}Ht1连结后输入一个激活函数为ϕ\phiϕ的全连接层。
  • 该全连接层的输出就是当前时间步的隐藏状态Ht\boldsymbol{H}_tHt
  • 模型参数为Wxh\boldsymbol{W}_{xh}WxhWhh\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}XtWxh+Ht1Whh的计算等价于Xt\boldsymbol{X}_tXtHt−1\boldsymbol{H}_{t-1}Ht1连结后的矩阵乘以Wxh\boldsymbol{W}_{xh}WxhWhh\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}XtWxh+Ht1Whh=[xtHt1][WxhWhh]

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)。因为不同字符的个数远小于不同词的个数(对于英文尤其如此),所以字符级循环神经网络的计算通常更加简单。

《动手学深度学习》

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

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

相关文章

(pytorch-深度学习)使用pytorch框架nn.RNN实现循环神经网络

使用pytorch框架nn.RNN实现循环神经网络 首先,读取周杰伦专辑歌词数据集。 import time import math import numpy as np import torch from torch import nn, optim import torch.nn.functional as Fimport sys sys.path.append("..") device torch.d…

(pytorch-深度学习)通过时间反向传播

通过时间反向传播 介绍循环神经网络中梯度的计算和存储方法,即通过时间反向传播(back-propagation through time)。 正向传播和反向传播相互依赖。正向传播在循环神经网络中比较直观,而通过时间反向传播其实是反向传播在循环神经…

(pytorch-深度学习)门控循环单元(GRU)

门控循环单元(GRU) 循环神经网络中的梯度计算 当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题。通常由于这个原因,循环神经网络在…

(pytorch-深度学习)长短期记忆(LSTM)

长短期记忆(LSTM) LSTM 中引入了3个门,即 输入门(input gate)遗忘门(forget gate)输出门(output gate)以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细…

(pytorch-深度学习)深度循环神经网络

深度循环神经网络 循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。 下图演示了一个有LLL个隐藏层的深度循环神经网络,每个隐藏状态不断传递至当前层的…

(pytorch-深度学习)双向循环神经网络

双向循环神经网络 一般,我们认为循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信息通过隐藏状态从前往后传递。 有时候,当前时间步也可能由后面时间步决定。 例如,当我们写下一个句子时&…

pytorch实现梯度下降、随机梯度下降-图像直观展示

深度学习与优化算法原理 优化函数与深度学习 在一个深度学习问题中,通常需要预先定义一个损失函数。有了损失函数以后,使用优化算法试图将其最小化。 在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function…

小批量随机梯度下降

小批量随机梯度下降 在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降(batch gradient descent)。 随机梯度下降在每次迭代中只随机采样一个样本来计算梯度。可以在每轮迭代中随机均匀采样…

动量法解决梯度下降的一些问题

动量法 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向,因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变…

深度学习AdaGrad算法

AdaGrad算法 在一般的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。 例如,假设目标函数为fff,自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤,该向量中每一个元素在迭代时都使…

深度学习优化算法:RMSProp算法

RMSProp算法 在AdaGrad算法中,因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代…

深度学习优化算法-AdaDelta算法

AdaDelta算法 除了RMSProp算法以外,另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。 不一样的是,AdaDelta算法没有学习率这个超参数。 它通过使用有关自变量更新量平方的指数加权移动平均的项来替代…

深度学习优化算法-Adam算法

Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。Adam算法可以看做是RMSProp算法与动量法的结合。 算法内容 Adam算法使用了动量变量vt\boldsymbol{v}_tvt​和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st\boldsymbol{s}_…

深度学习-计算机视觉--图像增广

图像增广 大规模数据集是成功应用深度神经网络的前提。图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。 图像增广的另一种解释是,随机改…

pytorch深度学习-微调(fine tuning)

微调(fine tuning) 首先举一个例子,假设我们想从图像中识别出不同种类的椅子,然后将购买链接推荐给用户。一种可能的方法是先找出100种常见的椅子,为每种椅子拍摄1,000张不同角度的图像,然后在收集到的图像…

c语言封闭曲线分割平面_高手的平面课堂:8种常用的设计排版方式,告别通宵加班...

重复、对比、对齐以及亲密性是传统平面排版的四大原则,即将元素重复运用(包括颜色、形状、材质、字体、空间关系等)以增加画面的条理性和整体性;避免页面上的元素形态与关系构建过于相似;画面上的每一元素都应该与另一个元素存在某种视觉联系…

我的世界java版和基岩版对比_基岩版Beta1.11.0.1发布

本帖来自好游快爆-我的世界精选推荐原帖作者:好游快爆用户3302482我的世界基岩版1.11.0.1测试版发布了,Minecraft基岩版1.11仍未发布,1.11.0.1为测试版本,Beta版本可能不稳定,并不代表最终版本质量,请在加入测试版之前…

机器人电焊电流电压怎么调_【华光】HG1000型电焊机现场校准仪

机器简介HG-1000型电焊机现场校准仪是依据检定规程JJG124-2005《电流表、电压表、功率表和电阻表检定规程》、JJG(航天)38-1987《直流标准电流源检定规程》、JJG(航天)51-1999《交流标准电流源检定规程》的要求而设计的校准设备。主要用来校验各种用电焊机(如交流手…

循环机换变速箱油教程_变速箱油用循环机换还是重力换更好?一次讲清楚,新手司机学学...

现在换变速箱油有些只要几百块钱,有些要一两千,之所以差价这么大是因为这里面涉及到换变速箱油时用什么方法去换油的问题。目前比较常见换油法是重力换油法和循环换油法。重力换油法就跟平时换机油是一样的,把变速箱底部的螺丝拧开之后让油滴…

pytorch深度学习-机器视觉-目标检测和边界框简介

机器视觉之目标检测和边界框简介 在图像分类任务里,我们假设图像里只有一个主体目标,并关注如何识别该目标的类别。然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体…