• 《动手学深度学习 Pytorch版》 8.4 循环神经网络


    8.4.1 无隐状态的神经网络

    对于无隐藏装态的神经网络来说,给定一个小批量样本 X ∈ R n × d \boldsymbol{X}\in\mathbb{R}^{n\times d} XRn×d,则隐藏层的输出 H ∈ R n × h \boldsymbol{H}\in\mathbb{R}^{n\times h} HRn×h 通过下式计算:

    H = ϕ ( X W x h + b h ) \boldsymbol{H}=\phi(\boldsymbol{XW}_{xh}+\boldsymbol{b}_h) H=ϕ(XWxh+bh)

    • ϕ \phi ϕ 是隐藏层的激活函数
    • n n n 是批量大小
    • d d d 是输入维度
    • W x h ∈ R d × h \boldsymbol{W}_{xh}\in\mathbb{R}^{d\times h} WxhRd×h 是隐藏层权重
    • b h ∈ R 1 × h \boldsymbol{b}_h\in\mathbb{R}^{1\times h} bhR1×h 是偏置参数
    • h h h 是隐藏层数目。

    接下来将隐藏变量 H \boldsymbol{H} H 作为输出层的输入:

    O = H W h q + b q \boldsymbol{O}=\boldsymbol{HW}_{hq}+\boldsymbol{b}_q O=HWhq+bq

    • O ∈ R n × q \boldsymbol{O}\in\mathbb{R}^{n\times q} ORn×q 是输出变量
    • H W h q ∈ R h × q \boldsymbol{HW}_{hq}\in\mathbb{R}^{h\times q} HWhqRh×q 是权重参数
    • b q ∈ R 1 × q \boldsymbol{b}_q\in\mathbb{R}^{1\times q} bqR1×q 是输出层的偏置参数。

    如果是分类问题,则可以用 s o f t m a x ( O ) softmax(\boldsymbol{O}) softmax(O) 计算输出的概率分布,此处无需多言。

    8.4.2 有隐状态的循环神经网络

    引入隐状态后,情况就完全不同了。具体地说,当前时间步隐藏变量由当前时间步的输入与前一个时间步的隐藏变量一起计算得出:

    H t = ϕ ( X t W x h + H t − 1 W h h + b h ) \boldsymbol{H}_t=\phi(\boldsymbol{X}_t\boldsymbol{W}_{xh}+\boldsymbol{H}_{t-1}\boldsymbol{W}_{hh}+\boldsymbol{b}_h) Ht=ϕ(XtWxh+Ht1Whh+bh)

    • X t ∈ R n × d \boldsymbol{X}_t\in\mathbb{R}^{n\times d} XtRn×d 是时间步 t t t 的小批量输入
    • H t ∈ R n × h \boldsymbol{H}_t\in\mathbb{R}^{n\times h} HtRn×h 是时间步 t t t 的隐藏变量
    • H t − 1 \boldsymbol{H}_{t-1} Ht1 是前一个时间步的隐藏变量
    • W h h ∈ R h × h \boldsymbol{W}_{hh}\in\mathbb{R}^{h\times h} WhhRh×h 是权重参数

    由于在当前时间步中,隐状态使用的定义与前一个时间步中使用的定义相同,因此此计算是循环的(recurrent)。于是基于循环计算的隐状态神经网络被命名为循环神经网络(recurrent neural network)。

    对于时间步 t t t,输出层的输出类似于多层感知机中的计算:

    O t = H t W h q + b q \boldsymbol{O}_t=\boldsymbol{H}_t\boldsymbol{W}_{hq}+\boldsymbol{b}_q Ot=HtWhq+bq

    在不同的时间步,循环神经网络也总是使用这些模型参数。因此,循环神经网络的参数开销不会随着时间步的增加而增加。

    在这里插入图片描述

    import torch
    from d2l import torch as d2l
    
    • 1
    • 2
    X, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
    H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
    torch.matmul(X, W_xh) + torch.matmul(H, W_hh)
    
    • 1
    • 2
    • 3
    tensor([[-0.9743,  0.4619, -0.7949,  0.3287],
            [ 5.9413,  2.1961,  0.6053,  0.1704],
            [-1.0903, -0.2396, -1.0930, -0.8530]])
    
    • 1
    • 2
    • 3
    torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))
    
    • 1
    tensor([[-0.9743,  0.4619, -0.7949,  0.3287],
            [ 5.9413,  2.1961,  0.6053,  0.1704],
            [-1.0903, -0.2396, -1.0930, -0.8530]])
    
    • 1
    • 2
    • 3

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

    以 “machine” 为例:

    在这里插入图片描述

    8.4.4 困惑度(Perplexity)

    我们使用困惑度来评估模型。

    一个更好的语言模型应该能让我们更准确地预测下一个词元,所以我们可以通过一个序列中所有的 n n n 个词元的 交叉熵损失的平均值 来衡量:

    1 n ∑ t = 1 n − log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) \frac{1}{n}\sum^n_{t=1}-\log{P(x_t|x_{t-1},\dots,x_1)} n1t=1nlogP(xtxt1,,x1)

    由于历史原因,自然语言处理的科学家更喜欢使用困惑度(perplexity)的。简而言之,它是上式的指数:

    exp ⁡ ( − 1 n ∑ t = 1 n log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) ) \exp\left(-\frac{1}{n}\sum^n_{t=1}\log{P(x_t|x_{t-1},\dots,x_1)}\right) exp(n1t=1nlogP(xtxt1,,x1))

    练习

    (1)如果我们使用循环神经网络来预测文本序列中的下一个字符,那么任意输出所需的维度是多少?

    啥叫“任意输出”?输出应该和输入是一个形状。


    (2)为什么循环神经网络可以基于文本序列中所有先前的词元,在某个时间步表示当前词元的条件概率?

    因为每个时间步的输入都有上一个时间步的输出。


    (3)如果基于一个长序列进行反向传播,梯度会发生什么状况?

    更容易出现梯度消失或者梯度爆炸。


    (4)与本节中描述的语言模型相关的问题有哪些?

    略。

  • 相关阅读:
    OpenCV-Python实战(2) —— 使用OpenCV的绘图功能创建OpenCV的徽标
    【最佳实践】京东小程序-LBS业务场景的性能提升
    阿里云服务器配置怎么选择?几核几G?带宽系统盘怎么选?
    10 | 多态
    每天五分钟机器学习:神经网络和支持向量机的基础——感知机模型
    [附源码]java毕业设计电影影评网
    嵌入式Linux driver开发实操(十八):Linux音频ALSA开发
    【Hack The Box】Linux练习-- Luanne
    Ctfshow web入门 代码审计篇 web301-web310 详细题解 全
    王道数据结构C语言双链表基本操作实现
  • 原文地址:https://blog.csdn.net/qq_43941037/article/details/133785255