【AI】深度学习——循环神经网络

神经元不仅接收其他神经元的信息,也能接收自身的信息。

循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络,可以更方便地建模长时间间隔的相关性

常用的参数学习可以为BPTT。当输入序列比较长时,其计算时间和空间要求随时间线性增长,可以使用带截断的BPTT,只计算固定时间间隔内的梯度回传

RNN可以近似任何非线性动力系统及图灵机,但会存在梯度爆炸和小时问题,也即长程依赖问题。从模型角度的改进,最有效改进方法为引入门控机制,如GNU和LSTM网络,也可以使用时钟循环神经网络、乘法RNN以及引入注意力机制

LSTM 网络是目前为止最成功的循环神经网络模型,通过引入线性连接来缓解长程依赖问题,成功应用在很多领域,如语音识别、机器翻译、语音模型以及文本生成。人们不断尝试对其进行改进来寻找最优结构,比如减少门的数量、提高并行能力等

LSTM的线性连接和门控机制能有效避免梯度消失问题,也运用于深层前馈网络中,如残差网络和告诉网络,都是引入线性训练非常深的卷积网络。对于循环网络,这种机制也可以运用于非时间维度上

RNN还可以轻易扩展为两种更广义的网络模型:递归神经网络和图网络

递归神经网络是一种在有向无环图上的简单的图网络,比较有名的图网络模型包括图卷积网络(Graph Convolutional Network,GCN),图注意力网络(Graph Attention Network,GAT)、消息传递神经网络(Message Passing Neural Network,MPNN)

文章目录

    • 2.1 模型
      • 2.1.1 给网络增加记忆能力
        • 延时神经网络
        • 有外部输入的非线性自回归模型
          • 自回归模型(AR)
          • 有外部输入的非线性自回归模型
        • 循环神经网络
          • 应用
      • 2.1.2 简单循环网路
        • SRN
        • 循环神经网络的计算能力
          • 循环神经网络的通用近似定理
          • 图灵完备
      • 2.1.3 应用到机器学习
        • 序列到类别模式
        • 同步的序列到序列模式
          • 异步的序列到序列模式
    • 2.2 学习
    • 2.3 模型改进
      • 2.3.1 改进方案
        • 梯度爆炸
        • 梯度消失
      • 2.3.2 基于门控的循环神经网络
        • 门控机制
        • 门控循环单元网络
        • 长短期记忆网络
          • 记忆
          • 参数更新
          • LSTM网络的变体
    • 2.4 扩展形式
      • 2.4.1 深层循环神经网络
        • 堆叠循环神经网络
        • 双向循环神经网络
      • 2.4.2 扩展到图结构
        • 递归神经网络
        • 图神经网络
    • 2.5 应用
        • 生成语言模型
        • 作词机
        • 机器翻译
        • 看图说话
        • 写字
        • 对话系统

2.1 模型

  • 给神经网络增加记忆功能
  • 循环神经网络
  • 应用到机器学习

2.1.1 给网络增加记忆能力

为了处理时序数据,并利用其历史信息,需要让网络具有短期记忆能力

  • 前馈网络是一种静态网络,不具备记忆能力
延时神经网络

利用历史信息建立一个额外的延时单元。用于存储网络的历史信息(输入、输出、隐状态)

TDNN (延时神经网络)

在这里插入图片描述

在前馈网络的非输出层都增加一个延时器,记录神经元的最近几次活性值

在第 t t t 时刻,第 l l l 层神经元的活性值依赖于同一时刻的输上一层的输出 h t ( l − 1 ) h_{t}^{(l-1)} ht(l1) 与第 l − 1 l-1 l1 层的最近 K K K 个历史信息(活性值)
h t ( l ) = f ( h t ( l − 1 ) , h t − 1 ( l − 1 ) , ⋯ , h t − K ( l − 1 ) ) h_t^{(l)}=f\left(h_t^{(l-1)},h_{t-1}^{(l-1)},\cdots,h_{t-K}^{(l-1)}\right) ht(l)=f(ht(l1),ht1(l1),,htK(l1))
其中, h t ( l ) ∈ R M l h_t^{(l)}\in \R^{M_l} ht(l)RMl 表示第 l l l 层神经元在时刻 t t t 的活性值, M l M_l Ml 为第 l l l 层神经元的数量

延时神经网络在时间维度上共享权值,以降低参数数量。因此对于序列输入来讲,延时神经网络就相当于卷积神经网络。

有外部输入的非线性自回归模型
自回归模型(AR)

AutoRegressive Model:用一个变量 h t h_t ht 的历史信息来预测自己

h t = w 0 + ∑ k = 1 K w k h t − k + ε t h_t=w_0+\sum\limits_{k=1}^Kw_kh_{t-k}+\varepsilon_t ht=w0+k=1Kwkhtk+εt

其中 K K K 为超参数, w 0 , w 1 , ⋯ , w K w_0,w_1,\cdots,w_K w0,w1,,wK 为可学习参数, ε t ∼ N ( 0 , σ 2 ) \varepsilon_t\sim \mathcal{N}(0,\sigma^2) εtN(0,σ2) 为第 t t t 时刻的噪声, σ 2 \sigma^2 σ2 与时间无关

有外部输入的非线性自回归模型

Nonlinear AutoRegressive with Exogenous Inputs Model,NARX:是自回归模型的扩展,在每个时刻 t t t 都有一个外部输入 x t x_t xt ,产生一个输出 h t h_t ht

h t = f ( x t , x t − 1 , ⋯ , x t − K x , h t − 1 , h t − 2 , ⋯ , h t − K y ) h_t=f\left(x_t,x_{t-1},\cdots,x_{t-K_x},h_{t-1},h_{t-2},\cdots,h_{t-K_y}\right) ht=f(xt,xt1,,xtKx,ht1,ht2,,htKy)

其中, f ( ⋅ ) f(\cdot) f() 表示非线性函数,可以是一个前馈网络

  • K x K_x Kx K y K_y Ky 为超参数

在这里插入图片描述

循环神经网络

Recurrent Neural Network,RNN:通过使用带自反馈的神经元,能够处理任意长度的时序数据

  • 区别递归神经网络:RecNN,Recursive Neural Network

在这里插入图片描述

  • 延时器记录神经元的最近几次活性值

给定一个输入序列 x 1 : T = ( x 1 , x 2 , ⋯ , x t , ⋯ , x T ) x_{1:T}=(x_1,x_2,\cdots,x_t,\cdots,x_T) x1:T=(x1,x2,,xt,,xT)
h t = f ( h t − 1 , x t ) h_t=f(h_{t-1},x_t) ht=f(ht1,xt)
其中 h 0 = 0 h_0=0 h0=0 f ( ⋅ ) f(\cdot) f() 为一个非线性函数,可以是一个前馈网络

  • 隐藏层的活性值 h t h_t ht ,也称为状态或隐状态

循环神经网络具有短期记忆能力,相当于存储装置

应用

循环神经网络比前馈神经网络更符合生物神经网络的结构

  • 作为输入-输出映射:机器学习模型
  • 存储器:联想记忆模型

循环神经网络被广泛应用于语音识别、语言模型以及自然语言的生成等任务上

2.1.2 简单循环网路

SRN

在这里插入图片描述

令向量 x t ∈ R M x_t\in \R^M xtRM 表示在时刻 t t t 时网络的输入, h t ∈ R D h_t\in \R^D htRD 表示隐藏层状态(隐藏层神经元活性值), h t h_t ht 不仅和当前时刻的输入 x t x_t xt 相关,也和上一时刻的隐藏层状态 h t − 1 h_{t-1} ht1 相关
Z t = U h t − 1 + W x t + b h t = f ( Z t ) Z_t=Uh_{t-1}+Wx_t+b\\ h_t=f(Z_t) Zt=Uht1+Wxt+bht=f(Zt)
SRN是一个非常简单的循环神经网络,只有一个隐藏层

  • 在一个两层的前馈神经网络中,连接仅存在于相邻的(输出)层与(隐藏)层之间,隐藏层结点间是无连接的

  • SRN增加了隐藏层到隐藏层的反馈连接

SRN是一个既深又短的网络

  • 时间维度深:梯度爆炸/消失问题
  • 非时间维度短:增加模型复杂度
循环神经网络的计算能力

完全连接的循环神经网络,输入为 x t x_t xt ,输出为 y t y_t yt
h t = f ( U h t − 1 + W x t + b ) y ^ t = V h t h_t=f(Uh_{t-1}+Wx_t+b)\\ \hat{y}_t=Vh_t ht=f(Uht1+Wxt+b)y^t=Vht

  • h h h 为隐状态, f ( ⋅ ) f(\cdot) f() 为非线性激活函数, U , W , b , V U,W,b,V U,W,b,V 为网络超参数
循环神经网络的通用近似定理

循环神经网络的通用近似定理:如果一个完全连接的循环神经网络有足够数量的 s i g m o d sigmod sigmod 型隐藏神经元,它可以以任意的准确率去近似任何一个非线性动力系统

  • 动力系统:系统状态按一定的规律随时间变化的系统

    指用一个函数来描述一个给定的状态空间中的所有点随时间的变化情况

s t = g ( s t − 1 , x t ) y t = o ( s t ) s_t=g(s_{t-1},x_t)\\ y_t=o(s_t) st=g(st1,xt)yt=o(st)

其中, s t s_t st 为每个时刻的隐状态, g ( ⋅ ) g(\cdot) g() 是可测的状态转换函数, x t x_t xt 为某时刻的外部输入, o ( ⋅ ) o(\cdot) o() 为连续输出函数,且对状态空间的紧致性没有限制

在这里插入图片描述

理论上,循环神经网络可以近似任意的非线性动力系统

  • 前馈神经网络可以近似任何函数

  • 循环神经网络可以模拟任何程序

图灵完备

图灵完备:所有的图灵机都可以被一个由使用 s i g m o d sigmod sigmod 型激活函数的神经元构成的全连接循环网络来进行模拟

图灵完备指一种数据操作规则,可以实现图灵机的所有功能,解决所有可计算问题

在这里插入图片描述

2.1.3 应用到机器学习

循环神经网络可以应用到很多不同类型的机器学习任务,分为三种模式:

  • 序列到类别模式
  • 同步的序列到序列模式
  • 异步的序列到序列模式
序列到类别模式

主要用于序列数据的分类问题:输入为序列,输出为类别

如:语言的情感分类

在这里插入图片描述

序列样本 x 1 : T = ( x 1 , ⋯ , x T ) x_{1:T}=(x_1,\cdots,x_T) x1:T=(x1,,xT) 为一个长度为 T T T 的序列,输出为一个类别 y ∈ { 1 , ⋯ , C } y\in \{1,\cdots,C\} y{1,,C} ,将样本按不同时刻输入到RNN中,得到不同时刻的隐状态 h 1 , ⋯ , h T h_1,\cdots,h_T h1,,hT ,将 h T h_T hT 作为整个序列的最终表示,输入给分类器 g ( ⋅ ) g(\cdot) g() 进行分类
y ^ = g ( h T ) \hat{y}=g(h_T) y^=g(hT)

  • 其中 g ( ⋅ ) g(\cdot) g() 可以是简单的线性分类器(Logistic)或者复杂的分类器(多层前馈神经网络)

在这里插入图片描述

除了将最后时刻的状态作为整个序列的表示外(正常模式),还可以对整个序列的平均状态作为整个序列的表示(平均采样模式)
y ^ = g ( 1 T ∑ t = 1 T ) \hat{y}=g\left(\frac{1}{T}\sum\limits_{t=1}^T\right) y^=g(T1t=1T)

同步的序列到序列模式

主要用于 序列标注 任务,即每一时刻的输入和输出一一对应,输入序列和输出序列的长度相同

输入为序列样本 x 1 : T = ( x 1 , ⋯ , x T ) x_{1:T}=(x_1,\cdots,x_T) x1:T=(x1,,xT) ,输出为序列 y 1 : T = ( y 1 , ⋯ , y T ) y_{1:T}=(y_1,\cdots,y_T) y1:T=(y1,,yT) 。样本按不同时刻输入到RNN中,得到不同时刻的隐状态 h 1 , ⋯ , h T h_1,\cdots,h_T h1,,hT ,每个时刻的隐状态 h t h_t ht 代表了当前时刻和历史信息,并输入给分类器 g ( ⋅ ) g(\cdot) g() 得到当前时刻的标签 y ^ t \hat{y}_t y^t
y ^ t = g ( h t ) , ∀ t ∈ [ 1 , T ] \hat{y}_t=g(h_t),\forall t\in [1,T] y^t=g(ht),t[1,T]
在这里插入图片描述

应用

  • 词性标注问题:中文分词

    在这里插入图片描述

  • 信息抽取:从无结构的文本中抽取结构化的信息,形成知识

    在这里插入图片描述

异步的序列到序列模式

编码器-解码器模型:输入序列和输出序列不需要有严格的对应关系,也不需要保持长度相同

输入为长度为 T T T 的序列样本 x 1 : T = ( x 1 , ⋯ , x T ) x_{1:T}=(x_1,\cdots,x_T) x1:T=(x1,,xT) ,输出为长度为 M M M 的序列 y 1 : M = ( y 1 , ⋯ , x M ) y_{1:M}=(y_1,\cdots,x_M) y1:M=(y1,,xM)

一般通过 先编码后半解码 的方式实现

先将样本 x x x 按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码 h T h_T hT 。然后再使用另一个循环神经网络(解码器)得到输出序列 y ^ 1 : M \hat{y}_{1:M} y^1:M

在这里插入图片描述

  • EOS表示输入序列结束

h t = f 1 ( h t − 1 , x t ) ∀ t ∈ [ 1 , T ] h T + 1 = f 2 ( h T + t − 1 , y ^ t − 1 ) ∀ t ∈ [ 1 , M ] y ^ t = g ( h T + t ) ∀ t ∈ [ 1 , M ] \begin{aligned} &h_t=f_1(h_{t-1},x_t)&\quad \forall t\in [1,T]\\ &h_{T+1}=f_2(h_{T+t-1},\hat{y}_{t-1})&\quad \forall t\in [1,M]\\ &\hat{y}_t=g(h_{T+t})&\quad \forall t\in [1,M] \end{aligned} ht=f1(ht1,xt)hT+1=f2(hT+t1,y^t1)y^t=g(hT+t)t[1,T]t[1,M]t[1,M]

  • g ( ⋅ ) g(\cdot) g() 为分类器
  • y ^ t \hat{y}_t y^t 为预测输出
  • 解码器通常使用非线性的自回归模型,每一时刻输入为上一时刻的预测结果 y ^ t − 1 \hat{y}_{t-1} y^t1

应用

如:机器翻译,输入为源语言的单词序列,输出为目标语言的单词序列

  • 在这里插入图片描述

2.2 学习

  • 参数学习
  • 如何解决长程依赖问题

2.2.1 参数学习

循环神经网络的参数可以通过梯度下降的方法来学习

给定一个训练样本 ( x , y ) (x,y) (x,y) ,其中输入为序列样本 x 1 : T = ( x 1 , ⋯ , x T ) x_{1:T}=(x_1,\cdots,x_T) x1:T=(x1,,xT) 为长度是 T T T 的输入序列, y 1 : T = ( y 1 , ⋯ , y T ) y_{1:T}=(y_1,\cdots,y_T) y1:T=(y1,,yT) 的标签序列,即在每个时刻 t t t,都有一个有监督信息 y t y_t yt
Z t = U h t − 1 + W x t + b h t = f ( Z t ) y ^ t = g ( h t ) \begin{aligned} &Z_t=Uh_{t-1}+Wx_t+b\\ &h_t=f(Z_t)\\ &\hat{y}_t=g(h_t) \end{aligned} Zt=Uht1+Wxt+bht=f(Zt)y^t=g(ht)

  • 循环神经网络中存在一个递归调用的函数 f ( ⋅ ) f(\cdot) f()

时刻 t t t 的损失函数为
L t = L ( y t , y ^ t ) = L ( y t , g ( h t ) ) \mathcal{L}_t=\mathcal{L}(y_t,\hat{y}_t)=\mathcal{L}(y_t,g(h_t)) Lt=L(yt,y^t)=L(yt,g(ht))

  • g ( h t ) g(h_t) g(ht) 为第 t t t 时刻的输出, L \mathcal{L} L 为可微分的损失函数,如交叉熵, g ( ⋅ ) g(\cdot) g() 为分类器

整个序列的损失函数为
L = ∑ t = 1 T L t \mathcal{L}=\sum\limits_{t=1}^T\mathcal{L}_{t} L=t=1TLt

关于参数 U U U 的梯度为
∂ L ∂ U = ∑ t = 1 T ∂ L t ∂ U \frac{\partial \mathcal{L}}{\partial U}=\sum\limits_{t=1}^T\frac{\partial \mathcal{L}_t}{\partial U} UL=t=1TULt

随时间反向传播算法

Back Propagation Through Time,BPTT

将循环神经网络看做一个展开的多层前馈网络,即每个时刻看做前馈网络的每一层。为了计算方便,所有层的参数都是共享的

计算偏导数 ∂ L t ∂ u i j \frac{\partial \mathcal{L}_t}{\partial u_{ij}} uijLt

因为参数 U U U 和隐藏层在每个时刻 k ( 1 ≤ k ≤ t ) k(1\le k\le t) k(1kt) 的净输入 Z k = U h k − 1 + W x k + b Z_k=Uh_{k-1}+Wx_k+b Zk=Uhk1+Wxk+b 有关, x k ∈ R M , h k ∈ R D ⇒ Z k ∈ R D , W ∈ R D × M x_k\in \R^M,h_k\in \R^D\Rightarrow Z^k\in \R^D,W\in \R^{D\times M} xkRM,hkRDZkRD,WRD×M ,所以
∂ L t ∂ u i j = ∑ k = 1 t ∂ Z k ∂ u i j ∂ L t ∂ Z k \frac{\partial \mathcal{L}_t}{\partial u_{ij}}=\sum\limits_{k=1}^t\frac{\partial Z_k}{\partial u_{ij}}\frac{\partial \mathcal{L}_t}{\partial Z_k} uijLt=k=1tuijZkZkLt

U = ( u 11 u 12 ⋯ u 1 D u 21 u 22 ⋯ u 2 D ⋮ ⋮ ⋱ ⋮ u D 1 u D 2 ⋯ u D D ) ∈ R D × D h k − 1 ( h ( k − 1 , 1 ) h ( k − 1 , 2 ) ⋮ h ( k − 1 , D ) ) ∈ R D × 1 可见 u i j 仅与 [ h k − 1 ] j 有关 U=\left(\begin{matrix} u_{11}&u_{12}&\cdots&u_{1D}\\ u_{21}&u_{22}&\cdots&u_{2D}\\ \vdots&\vdots&\ddots&\vdots\\ u_{D1}&u_{D_2}&\cdots&u_{DD} \end{matrix} \right)\in \R^{D\times D}\\ h_{k-1}\left(\begin{matrix} h_{(k-1,1)}\\ h_{(k-1,2)}\\ \vdots\\ h_{(k-1,D)} \end{matrix}\right)\in \R^{D\times1}\\ 可见 u_{ij} 仅与[h_{k-1}]_j有关 U= u11u21uD1u12u22uD2u1Du2DuDD RD×Dhk1 h(k1,1)h(k1,2)h(k1,D) RD×1可见uij仅与[hk1]j有关

  • ∂ z k ∂ u i j ∈ R \frac{\partial z_k}{\partial u_{ij}}\in\R uijzkR :由于分母布局,除了第 i i i 个为 [ h k − 1 ] j [h_{k-1}]_j [hk1]j 外,其余全为0,即

    在这里插入图片描述

  • 误差项计算 δ t , k \delta_{t,k} δt,k

    误差项 δ t , k = Δ ∂ L t ∂ Z k \delta_{t,k}\overset{\Delta}{=}\frac{\partial \mathcal{L}_t}{\partial Z_k} δt,k=ΔZkLt 为第 t t t 时刻的损失对第 t t t 时刻的隐藏神经网络的净输入 Z k Z_k Zk 的导数
    δ t , k = ∂ L t ∂ Z k = ∂ h k ∂ Z k ∂ Z k + 1 ∂ h k ∂ L t ∂ Z k + 1 = d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 ∈ R D \begin{aligned} \delta_{t,k}&=\frac{\partial \mathcal{L}_t}{\partial Z_k}\\ &=\frac{\partial h_k}{\partial Z_k}\frac{\partial Z_{k+1}}{\partial h_k}\frac{\partial \mathcal{L}_t}{\partial Z_{k+1}}\\ &=diag(f'(Z_k))U^T\delta_{t,k+1}\in\R^{D} \end{aligned} δt,k=ZkLt=ZkhkhkZk+1Zk+1Lt=diag(f(Zk))UTδt,k+1RD

合并计算 ∂ L t ∂ u i j \frac{\partial \mathcal{L}_t}{\partial u_{ij}} uijLt
∂ L t ∂ u i j = ∑ k = 1 t h k − 1 T d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 = ∑ k = 1 t [ δ t , k ] i [ h k − 1 ] j = ∑ k = 1 t [ d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 ] i [ h k − 1 ] j \begin{aligned} \frac{\partial \mathcal{L}_t}{\partial u_{ij}}&=\sum\limits_{k=1}^th^T_{k-1}diag(f'(Z_k))U^T\delta_{t,k+1}\\ &=\sum\limits_{k=1}^t[\delta_{t,k}]_i[h_{k-1}]_j\\ &=\sum\limits_{k=1}^t\left[diag(f'(Z_k))U^T\delta_{t,k+1}\right]_i[h_{k-1}]_j \end{aligned} uijLt=k=1thk1Tdiag(f(Zk))UTδt,k+1=k=1t[δt,k]i[hk1]j=k=1t[diag(f(Zk))UTδt,k+1]i[hk1]j

计算 ∂ L t ∂ U \frac{\partial \mathcal{L}_t}{\partial U} ULt

∂ L t ∂ U = ∑ k = 1 t δ t , k h k − 1 T \frac{\partial \mathcal{L}_t}{\partial U}=\sum\limits_{k=1}^t\delta_{t,k}h_{k-1}^T ULt=k=1tδt,khk1T

在这里插入图片描述

参数梯度

∂ L ∂ U = ∑ t = 1 T ∑ k = 1 t δ t , k h k − 1 T = ∑ t = 1 T ∑ k = 1 t [ d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 ] h k − 1 T ∂ L ∂ W = ∑ t = 1 T ∑ k = 1 t δ t , k x k T = ∑ t = 1 T ∑ k = 1 t [ d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 ] x k T ∂ L ∂ b = ∑ t = 1 T ∑ k = 1 t δ t , k = ∑ t = 1 T ∑ k = 1 t d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 \frac{\partial \mathcal{L}}{\partial U}=\sum\limits_{t=1}^T\sum\limits_{k=1}^t\delta_{t,k}h_{k-1}^T=\sum\limits_{t=1}^T\sum\limits_{k=1}^t[diag(f'(Z_k))U^T\delta_{t,k+1}]h_{k-1}^T\\ \frac{\partial \mathcal{L}}{\partial W}=\sum\limits_{t=1}^T\sum\limits_{k=1}^t\delta_{t,k}x_{k}^T=\sum\limits_{t=1}^T\sum\limits_{k=1}^t[diag(f'(Z_k))U^T\delta_{t,k+1}]x_{k}^T\\ \frac{\partial \mathcal{L}}{\partial b}=\sum\limits_{t=1}^T\sum\limits_{k=1}^t\delta_{t,k}=\sum\limits_{t=1}^T\sum\limits_{k=1}^tdiag(f'(Z_k))U^T\delta_{t,k+1} UL=t=1Tk=1tδt,khk1T=t=1Tk=1t[diag(f(Zk))UTδt,k+1]hk1TWL=t=1Tk=1tδt,kxkT=t=1Tk=1t[diag(f(Zk))UTδt,k+1]xkTbL=t=1Tk=1tδt,k=t=1Tk=1tdiag(f(Zk))UTδt,k+1

在BPTT算法中,参数的梯度需要在一个完整的前向计算和反向计算后才能得到并进行参数更新

实时循环学习算法

Real-Time Recurrent Learning,RTRL:通过前向传播的方式来计算梯度

假设循环神经网络中第 t t t 时刻的状态为 h t h_{t} ht

h t = f ( Z t ) = f ( U h t − 1 + W x t + b ) = f ( U f ( U h t − 2 + W x t + b ) + W x t + b ) \begin{aligned} h_{t}&=f(Z_{t})=f(Uh_{t-1}+Wx_{t}+b)\\ &=f(Uf(Uh_{t-2}+Wx_{t}+b)+Wx_{t}+b) \end{aligned} ht=f(Zt)=f(Uht1+Wxt+b)=f(Uf(Uht2+Wxt+b)+Wxt+b)

  • 所以, U U U h t − 1 h_{t-1} ht1 都与 u i j u_{ij} uij 相关

关于 u i j u_{ij} uij 的偏导数为
∂ h t ∂ u i j = ∂ Z t ∂ u i j ∂ h t ∂ Z t = ( ∂ U ∂ u i j h t − 1 + ∂ h t − 1 ∂ u i j U T ) ∂ h t ∂ Z t = ( I i ( [ h t − 1 ] j ) + ∂ h t − 1 ∂ u i j U T ) d i a g ( f ′ ( Z t ) ) = ( I i ( [ h t − 1 ] j ) + ∂ h t − 1 ∂ u i j U T ) ⊙ ( f ′ ( Z t ) ) T \begin{aligned} \frac{\partial h_{t}}{\partial u_{ij}}&=\frac{\partial Z_{t}}{\partial u_{ij}}\frac{\partial h_{t}}{\partial Z_{t}}=\left(\frac{\partial U}{\partial u_{ij}}h_{t-1}+\frac{\partial h_{t-1}}{\partial u_{ij}}U^T\right)\frac{\partial h_{t}}{\partial Z_{t}}\\ &=\left(I_i([h_{t-1}]_j)+\frac{\partial h_{t-1}}{\partial u_{ij}}U^T\right)diag\left(f'(Z_{t})\right)\\ &=\left(I_i([h_{t-1}]_j)+\frac{\partial h_{t-1}}{\partial u_{ij}}U^T\right)\odot \left(f'(Z_{t})\right)^T \end{aligned} uijht=uijZtZtht=(uijUht1+uijht1UT)Ztht=(Ii([ht1]j)+uijht1UT)diag(f(Zt))=(Ii([ht1]j)+uijht1UT)(f(Zt))T

  • I i ( x ) I_{i}(x) Ii(x) 除了第 i i i 行为 x x x 外,其余都是0

RTRL算法从第一个时刻开始,除了计算循环神经网络的隐状态外,还需要依次向前计算偏导 h 1 u i j , h 2 u i j , h 3 u i j , ⋯ \frac{h_1}{u_{ij}},\frac{h_2}{u_{ij}},\frac{h_3}{u_{ij}},\cdots uijh1,uijh2,uijh3,

t t t 时刻存在监督信息,其损失函数为 L t \mathcal{L}_t Lt ,可得损失函数关于参数 u i j u_{ij} uij 的偏导数
L t ∂ u i j = ∂ h t ∂ u i j ∂ L t ∂ h t \frac{\mathcal{L}_t}{\partial u_{ij}}=\frac{\partial h_t}{\partial u_{ij}}\frac{\partial \mathcal{L}_t}{\partial h_t} uijLt=uijhthtLt
这样就可以实时计算损失函数关于参数 U U U 的梯度,并更新参数。 W , b W,b W,b 同理

BTPP&RTRL

二者都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则计算梯度

循环神经网络中,一般网络输出维度低于输入维度,BTPP的计算量会更小,但BPTT需要保存所有时刻的中间梯度,空间复杂度较高

RTRL算法不需要梯度回传,因此非常适合用于在线学习和无限序列的任务中

2.2.2 长程依赖问题

在BPTT算法中,将误差项展开

在这里插入图片描述

δ t , k = d i a g ( f ′ ( Z k ) ) U T δ t , k + 1 = ∏ τ = k t − 1 ( d i a g ( f ′ ( Z τ ) ) U T ) ⏟ γ δ t , t = γ t − k δ t , t \begin{aligned} \delta_{t,k}&=diag(f'(Z_k))U^T\delta_{t,k+1}\\ &=\prod\limits_{\tau=k}^{t-1}\underbrace{\left(diag(f'(Z_\tau))U^T\right)}_{\gamma}\delta_{t,t}\\ &=\gamma^{t-k}\delta_{t,t} \end{aligned} δt,k=diag(f(Zk))UTδt,k+1=τ=kt1γ (diag(f(Zτ))UT)δt,t=γtkδt,t
γ > 1 \gamma>1 γ>1 ,当 t − k → ∞ t-k\rightarrow \infty tk 时, γ t − k → ∞ \gamma^{t-k}\rightarrow \infty γtk

  • t − k t-k tk 间隔比较大时,梯度也变得很大,造成系统不稳定,称为梯度爆炸问题

γ < 1 \gamma<1 γ<1 ,当 t − k → ∞ t-k\rightarrow \infty tk 时, γ t − k → 0 \gamma^{t-k}\rightarrow 0 γtk0

  • t − k t-k tk 间隔比较大时,梯度将变得很小,出现梯度消失问题

  • 在循环神经网络中,梯度消失不是指 L t ∂ U \frac{\mathcal{L}_t}{\partial U} ULt 消失,而是由于 γ t − k → 0 ⇒ δ t , k → 0 ⇒ ∂ L t ∂ h k → 0 \gamma^{t-k}\rightarrow 0\Rightarrow \delta_{t,k}\rightarrow 0\Rightarrow \frac{\partial \mathcal{L}_t}{\partial h_k}\rightarrow 0 γtk0δt,k0hkLt0 的梯度消失了
    L t ∂ U = ∑ k = 1 t δ t , k h k − 1 T \frac{\mathcal{L}_t}{\partial U}=\sum\limits_{k=1}^t\delta_{t,k}h_{k-1}^T ULt=k=1tδt,khk1T
    L t ∂ U \frac{\mathcal{L}_t}{\partial U} ULt 是求和得到的,为0的项不影响

    参数 U U U 的更新主要靠当前时刻 t t t 和几个相邻状态 k k k 来更新,长距离的状态对参数 U U U 是没有影响的

虽然简单循环网络理论上可以建立长时间间隔的状态之间的依赖关系,但由于梯度爆炸或梯度消失问题,实际上只能学习到短期的依赖关系

简单的神经网络很难建模长距离的依赖关系,称为 长程依赖问题

2.3 模型改进

由于循环神经网络使用的非线性激活函数为 L o g i s t i c Logistic Logistic 函数或 T a n h Tanh Tanh 函数,其导数值都小于1,并且权重矩阵 ∥ U ∥ \Vert U\Vert U 也不会太大,因此如果时间间隔 t − k t-k tk 过大, δ t , k \delta_{t,k} δt,k 会趋于0,因而经常出现梯度消失问题

  • GRU与LSTM
  • 深层循环神经网络

2.3.1 改进方案

最直接的方法就是选取合适的参数,同时使用非饱和的激活函数,尽量使 γ = Δ d i a g ( f ′ ( Z τ ) ) U T ≈ 1 \gamma\overset{\Delta}{=}diag(f'(Z_\tau))U^T\approx1 γ=Δdiag(f(Zτ))UT1 ,但过于依赖调参经验,限制了模型的广泛使用。有效的方法是改进模型或优化方法来缓解梯度下降或梯度爆炸问题

梯度爆炸
  • 权重衰减:通过给参数加 L 1 L_1 L1 L 2 L_2 L2 范数的正则化项来限制参数的取值范围,从而使得 γ ≤ 1 \gamma\le 1 γ1
  • 梯度截断:当梯度的模大于一定阈值时,将它截断为一个较小的数
梯度消失
  • 优化算法:下一章内容

  • 改变模型:如令 U = I U=I U=I ,同时令 ∂ h t ∂ h t − 1 = I \frac{\partial h_{t}}{\partial h_{t-1}}=I ht1ht=I

    γ = Δ d i a g ( f ′ ( Z τ ) ) U T = 1 \gamma\overset{\Delta}{=}diag(f'(Z_\tau))U^T=1 γ=Δdiag(f(Zτ))UT=1 时,只有 d i a g ( f ′ ( Z τ ) ) diag(f'(Z_\tau)) diag(f(Zτ)) U U U 同时为 I I I ,才能保证 γ = 1 \gamma=1 γ=1 d i a g ( f ′ ( Z τ ) ) = I ⟺ ∂ h t ∂ h t − 1 = f ′ × U = f ′ = I diag(f'(Z_\tau))=I\iff \frac{\partial h_t}{\partial h_{t-1}}=f'\times U=f'=I diag(f(Zτ))=Iht1ht=f×U=f=I
    h t = f ( Z t ) = f ( U h t − 1 + W x t + b ) h_{t}=f(Z_{t})=f(Uh_{t-1}+Wx_{t}+b) ht=f(Zt)=f(Uht1+Wxt+b)

模型修改为
h t = h t − 1 + g ( x t ; θ ) = h t − 1 + σ ( W x t + b ) \begin{aligned} h_t&=h_{t-1}+g(x_t;\theta)\\ &=h_{t-1}+\sigma(Wx_t+b) \end{aligned} ht=ht1+g(xt;θ)=ht1+σ(Wxt+b)

  • g ( ⋅ ) g(\cdot) g() 为非线性函数, θ \theta θ 为参数

h t h_t ht h t − 1 h_{t-1} ht1 为线性依赖关系,且权重系数为 I I I ,这样可以消除梯度爆炸或梯度消失问题。

但同时丢失了神经元在反馈边上的非线性激活性质

在这里插入图片描述

因此将模型进一步修改为
h t = h t − 1 + g ( x t , h t − 1 ; θ ) = h t − 1 + σ ( U h t − 1 + W x t + b ) \begin{aligned} h_t&=h_{t-1}+g(x_t,h_{t-1};\theta)\\ &=h_{t-1}+\sigma(Uh_{t-1}+Wx_t+b) \end{aligned} ht=ht1+g(xt,ht1;θ)=ht1+σ(Uht1+Wxt+b)

  • 类似与残差网络的形式

同样,在计算梯度时,仍存在梯度爆炸问题

  • Z k = U h t − 1 + W x t + b , ( 1 ≤ k ≤ t ) Z_k=Uh_{t-1}+Wx_t+b,(1\le k\le t) Zk=Uht1+Wxt+b,(1kt) ,BPTT算法中,计算误差项 δ t , k = L t ∂ Z k \delta_{t,k}=\frac{\mathcal{L}_t}{\partial Z_k} δt,k=ZkLt 仍可能梯度过大,导致梯度爆炸问题

此外,还存在 记忆容量 问题:随着 h t h_t ht 的不断累计存储,会发生饱和线性。假设 g ( ⋅ ) g(\cdot) g() L o g i s t i c Logistic Logistic 函数,随时间 t t t 的增长, h t h_t ht 会变得越来越大,从而导致 h h h 变得饱和。随着记忆单元存储的内容越来越多,其(“随机”)丢失的信息也越来越多

2.3.2 基于门控的循环神经网络

为改善长程依赖问题,使用一种基于 残差网络思想 的模型修改方法,但梯度爆炸、记忆容量问题仍存在,通过引入门控机制进一步改进模型

  • 门控机制:控制信息的累计速度(有选择地加入新信息,并选择地遗忘之前累计的信息)。

这类网络称为 基于门控的循环神经网络 (Gated RNN)

门控机制

在数字电路中, 为一个二值变量 { 0 , 1 } \{0,1\} {0,1}

  • 0 0 0 表示关闭状态,不允许任何信息通过
  • 1 1 1 表示开放状态,允许所有信息通过
门控循环单元网络

引入一个更新门来控制当前状态需要从历史状态中保留多少信息(不经过非线性变换),以及需要从候选状态中接收多少新信息
h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ g ( x t , h t − 1 ; θ ) h_t=z_t\odot h_{t-1}+(1-z_t)\odot g(x_t,h_{t-1};\theta) ht=ztht1+(1zt)g(xt,ht1;θ)
其中, z t ∈ [ 0 , 1 ] D z_t\in [0,1]^D zt[0,1]D更新门
z t = σ ( U z h t − 1 + W z x t + b z ) z_t=\sigma(U_zh_{t-1}+W_zx_t+b_z) zt=σ(Uzht1+Wzxt+bz)
GRU网络用一个门来控制输入和遗忘之间的平衡

  • z t = 0 z_t=0 zt=0 时,当前状态 h t h_t ht 和前一时刻的状态 h t − 1 h_{t-1} ht1 之间为非线性关系
  • z t = 1 z_t=1 zt=1 时,当前状态 h t h_t ht 和前一时刻的状态 h t − 1 h_{t-1} ht1 之间为线性关系

在 GRU 中,函数 g ( x t , h t − 1 ; θ ) g(x_t,h_{t-1};\theta) g(xt,ht1;θ) 定义为
h ~ t = Δ tanh ⁡ [ U h ( r t ⊙ h t − 1 ) + W h x t + b h ] \tilde{h}_t\overset{\Delta}{=}\tanh\left[U_h(r_t\odot h_{t-1})+W_hx_t+b_h\right] h~t=Δtanh[Uh(rtht1)+Whxt+bh]

  • tanh ⁡ ( ) \tanh() tanh() 斜率较大,不容易发生梯度消失问题

  • r t ∈ [ 0 , 1 ] D r_t\in [0,1]^D rt[0,1]D 为重置门,用于控制 候选状态 h ~ t \tilde{h}_t h~t 的计算是否依赖上一时刻的状态 h t − 1 h_{t-1} ht1

    r t = σ ( U r h t − 1 + W r x t + b r ) r_t=\sigma(U_rh_{t-1}+W_rx_t+b_r) rt=σ(Urht1+Wrxt+br)

    • r t = 0 r_t=0 rt=0 ,候选状态 h ~ t = tanh ⁡ ( W h x t + b ) \tilde{h}_t=\tanh(W_hx_t+b) h~t=tanh(Whxt+b) 之和当前输入 x t x_t xt 有关,和历史状态无关
    • r t = 1 r_t=1 rt=1 ,候选状态 h ~ t = tanh ⁡ ( U h h t − 1 + W h x t + b ) \tilde{h}_t=\tanh(U_hh_{t-1}+W_hx_t+b) h~t=tanh(Uhht1+Whxt+b) 和当前输入 x t x_t xt 与历史状态 h t − 1 h_{t-1} ht1 都相关,与 简单循环神经网络 一致

综上,
h t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ h ~ t = z t ⊙ h t − 1 + ( 1 − z t ) ⊙ tanh ⁡ [ U h ( r t ⊙ h t − 1 ) + W h x t + b h ] \begin{aligned} h_t&=z_t\odot h_{t-1}+(1-z_t)\odot \tilde{h}_t\\ &=z_t\odot h_{t-1}+(1-z_t)\odot\tanh\left[U_h(r_t\odot h_{t-1})+W_hx_t+b_h\right]\\ \end{aligned} ht=ztht1+(1zt)h~t=ztht1+(1zt)tanh[Uh(rtht1)+Whxt+bh]
其中, z t = σ ( U z h t − 1 + W z x t + b z ) , r t = σ ( U r h t − 1 + W r x t + b r ) ∈ [ 0 , 1 ] z_t=\sigma(U_zh_{t-1}+W_zx_t+b_z),r_t=\sigma(U_rh_{t-1}+W_rx_t+b_r)\in [0,1] zt=σ(Uzht1+Wzxt+bz),rt=σ(Urht1+Wrxt+br)[0,1]

  • z t = 0 , r t = 1 z_t=0,r_t=1 zt=0,rt=1 时,GRU网络退化为 简单循环网络 h t = tanh ⁡ ( U h h t − 1 + W h x t + b ) h_t=\tanh(U_hh_{t-1}+W_hx_t+b) ht=tanh(Uhht1+Whxt+b)
  • z t = 0 , r t = 0 z_t=0,r_t=0 zt=0,rt=0 时,当前状态 h t h_t ht 只和当前输入 x t x_t xt 有关 h t = tanh ⁡ ( W h x t + b ) h_{t}=\tanh(W_hx_t+b) ht=tanh(Whxt+b)
  • z t = 1 z_t=1 zt=1 ,当前状态等于上一时刻状态,与当前输入 h t − 1 h_{t-1} ht1 无关

在这里插入图片描述

长短期记忆网络

Long Short-Term Memory Network,LSTM:有效解决简单循环神经网络的长程依赖问题

引入新的内部状态 c t ∈ R D c_t\in \R^D ctRD 进行线性的循环信息传递,记录了到当前时刻为止的历史信息,同时非线性地将信息给隐藏层 h t ∈ R D h_t\in \R^D htRD
c ~ t = tanh ⁡ ( U c h t − 1 + W c x t + b c ) c t = f t ⊙ c t − 1 + i t ⊙ c ~ t h t = o t ⊙ tanh ⁡ ( c t ) \begin{aligned} \tilde{c}_t&=\tanh(U_ch_{t-1}+W_cx_t+b_c)\\ c_t&=f_t\odot c_{t-1}+i_t\odot \tilde{c}_t\\ h_t&=o_t\odot \tanh(c_t) \end{aligned} c~tctht=tanh(Ucht1+Wcxt+bc)=ftct1+itc~t=ottanh(ct)

  • 遗忘门 f t ∈ [ 0 , 1 ] D f_t\in[0,1]^D ft[0,1]D :控制上一时刻的内部状态 c t − 1 c_{t-1} ct1 遗忘多少信息
    i t = σ ( U i h t − 1 + W i x t − 1 + b i ) i_t=\sigma(U_ih_{t-1}+W_ix_{t-1}+b_i) it=σ(Uiht1+Wixt1+bi)

  • 输入门 i t ∈ [ 0 , 1 ] D i_t\in [0,1]^D it[0,1]D :控制当前输入状态 c t ~ \tilde{c_t} ct~ 有多少信息保存
    f t = σ ( U f h t − 1 + W f x t − 1 + b f ) f_t=\sigma(U_fh_{t-1}+W_fx_{t-1}+b_f) ft=σ(Ufht1+Wfxt1+bf)
    c ~ t \tilde{c}_t c~t 仍和上一时刻的历史信息有关

  • 输出门 o t ∈ [ 0 , 1 ] D o_t\in [0,1]^D ot[0,1]D :控制当前时刻的内部状态 c t c_t ct 有多少信息需要输出给外部状态 h t h_t ht
    o t = σ ( U o h t − 1 + W o x t − 1 + b o ) o_t=\sigma(U_oh_{t-1}+W_ox_{t-1}+b_o) ot=σ(Uoht1+Woxt1+bo)

LSTM网络中的门是一种软门,取值在 ( 0 , 1 ) (0,1) (0,1) 之间,表示允许信息以一定比例通过

在这里插入图片描述

  • f t = 0 , i t = 1 f_t=0,i_t=1 ft=0,it=1 时,记忆单元将历史信息清空,并将候选状态 c t ~ \tilde{c_t} ct~ 写入

  • f t = 1 , i t = 0 f_t=1,i_t=0 ft=1,it=0 时,记忆单元将上一时刻的外部状态,不再写入新的信息

通过LSTM循环单元,整个网络可以建立较长距离的时序依赖关系
[ c ~ t o t i t f t ] = [ tanh ⁡ σ σ σ ] ( W [ x t h t − 1 ] + b ) c t = f t ⊙ c t − 1 + i t ⊙ c ~ t h t = o t ⊙ tanh ⁡ ( c t ) \left[\begin{matrix} \tilde{c}_t\\ o_t\\ i_t\\f_t \end{matrix} \right]=\left[\begin{matrix} \tanh\\ \sigma\\ \sigma\\ \sigma \end{matrix} \right]\left( W\left[ \begin{matrix} x_t\\ h_{t-1} \end{matrix} \right]+b \right)\\ c_t=f_t\odot c_{t-1}+i_t\odot \tilde{c}_t\\ h_t=o_t\odot\tanh(c_t) c~totitft = tanhσσσ (W[xtht1]+b)ct=ftct1+itc~tht=ottanh(ct)
其中, x t ∈ R M x_t\in \R^M xtRM 为当前时刻的输入, W ∈ R 4 D × ( M + D ) W\in\R^{4D\times (M+D)} WR4D×(M+D) b ∈ R 4 D b\in \R^{4D} bR4D 为网络参数

记忆

循环神经网络的隐状态 h t h_t ht 存储了历史信息,可以看做一种 记忆

在简单循环网络中,隐状态每个时刻都会被重写,因此可以看做一种 短期记忆
Z t = U h t − 1 + W x t + b h t = f ( Z t ) y ^ t = g ( h t ) \begin{aligned} &Z_t=Uh_{t-1}+Wx_t+b\\ &h_t=f(Z_t)\\ &\hat{y}_t=g(h_t) \end{aligned} Zt=Uht1+Wxt+bht=f(Zt)y^t=g(ht)
长期记忆 可以看作网络参数,隐含了从训练数据中学到的经验,其更新周期要慢于短期记忆

在LSTM网络中,记忆单元 c c c 可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定时间间隔

  • 记忆单元 c c c 中保存的信息的生命周期要长于短期周期 h h h ,又远远短于长期记忆,称为 长短期记忆
参数更新

在LSTM网络中,过小的值会使得遗忘门的值较小,意味着前一时刻大部分信息都被丢掉了,这样网络很难捕捉长距离的依赖信息,并且相邻时间间隔的梯度变得非常小,导致梯度消失问题

在LSTM中,参数初始值一般设置比较大, b f b_f bf 设为 1 1 1 2 2 2

LSTM网络的变体

无遗忘门的LSTM
c t = c t − 1 + i t ⊙ c ~ t c_t=c_{t-1}+i_t\odot\tilde{c}_t ct=ct1+itc~t
记忆单元 c c c 会不断增大,当输入序列的长度非常大时,记忆单元容量会饱和

peephole连接
i t = σ ( U i h t − 1 + W i x t + V i c t − 1 + b i ) f t = σ ( U f h t − 1 + W f x t + V f c t − 1 + b f ) o t = σ ( U o h t − 1 + W o x t + V o c t − 1 + b o ) i_t=\sigma(U_ih_{t-1}+W_ix_t+V_ic_{t-1}+b_i)\\ f_t=\sigma(U_fh_{t-1}+W_fx_t+V_fc_{t-1}+b_f)\\ o_t=\sigma(U_oh_{t-1}+W_ox_t+V_oc_{t-1}+b_o) it=σ(Uiht1+Wixt+Vict1+bi)ft=σ(Ufht1+Wfxt+Vfct1+bf)ot=σ(Uoht1+Woxt+Voct1+bo)
其中 V i , V f , V o V_i,V_f,V_o Vi,Vf,Vo 为对角矩阵

耦合输入门和遗忘门

LSTM网络中输入门和遗忘门有些互补关系,为减小冗余与LSTM计算复杂度,将这两个门合并
c t = ( 1 − i t ) ⊙ c t − 1 + i t ⊙ c ~ t c_t=(1-i_t)\odot c_{t-1}+i_t\odot\tilde{c}_t ct=(1it)ct1+itc~t

2.4 扩展形式

  • 深层循环神经网络
  • 扩展到图结构

2.4.1 深层循环神经网络

RNN在时间维度上,长时间间隔的状态之间的路径很长,即在时间维度上很深

RNN在同一时刻网络输入到输出之间的路径 x t → y t x_t\rightarrow y_t xtyt 很短,即在非时间维上很短

增加循环网络的深度主要是增加同一时刻网络输入到输出的路径,如增加输入到隐状态 x t → h t x_t\rightarrow h_t xtht 以及隐状态到输出 h t → y t h_t\rightarrow y_t htyt 之间路径的深度

堆叠循环神经网络

(Stacked Recurrent Neural Network):也称循环多层感知器

定义 h t ( l ) h^{(l)}_t ht(l) 为在时刻 t t t 时第 l l l 层的隐状态
h t ( l ) = f ( U ( l ) h t − 1 ( l ) + W ( l ) h t ( l − 1 ) + b ( l ) ) h_t^{(l)}=f(U^{(l)}h_{t-1}^{(l)}+W^{(l)}h_t^{(l-1)}+b^{(l)}) ht(l)=f(U(l)ht1(l)+W(l)ht(l1)+b(l))

  • 其中, h t ( 0 ) = x t h_t^{(0)}=x_t ht(0)=xt

在这里插入图片描述

双向循环神经网络

一个时刻的输出不但和过去时刻的信息有关,也和后续时刻的信息有关

  • 比如给定一个句子,其中一个词的词性由它的上下文决定,即包含左右两边的信息

(Bidirectional Recurrent Neural Network,Bi-RNN):由两层循环神经网络组成,输入相同,只是信息传递方向不同,输出与每个时刻的前向信息与后向信息都有关

在这里插入图片描述

h t ( 1 ) = f ( U ( 1 ) h t − 1 ( 1 ) + W ( 1 ) x t + b ( 1 ) ) h t ( 2 ) = f ( U ( 2 ) h t + 1 ( 2 ) + W ( 2 ) x t + b ( 2 ) ) h t = h t ( 1 ) ⊕ h t ( 2 ) h_t^{(1)}=f(U^{(1)}h_{t-1}^{(1)}+W^{(1)}x_t+b^{(1)})\\ h_t^{(2)}=f(U^{(2)}h_{t+1}^{(2)}+W^{(2)}x_t+b^{(2)})\\ h_t=h^{(1)}_t\oplus h_t^{(2)} ht(1)=f(U(1)ht1(1)+W(1)xt+b(1))ht(2)=f(U(2)ht+1(2)+W(2)xt+b(2))ht=ht(1)ht(2)

2.4.2 扩展到图结构

循环神经网络将每个时刻的隐状态 h t h_t ht 看过一个节点,在时间维度上这些节点构成一个链式结构,将 消息传递 的思想扩展到树、图结构上

递归神经网络

在循环神经网络的 有向无环图 (树) 上的扩展

在这里插入图片描述

对于一个节点 h t h_t ht 接收来自父节点集合 π t \pi_t πt 中所有节点的消息,并更新自己状态
h i = f ( h π i ) h_i=f(h_{\pi_i}) hi=f(hπi)
其中, h π i h_{\pi_i} hπi 表示集合 π i \pi_i πi 中所有节点状态的拼接, f ( ⋅ ) f(\cdot) f() 是一个和节点位置无关的非线性函数
h 1 = σ ( W [ x 1 x 2 ] + b ) h 1 = σ ( W [ x 3 x 4 ] + b ) h 3 = σ ( W [ h 1 h 2 ] + b ) y = g ( W ′ h 3 + b ′ ) h_1=\sigma\left( W\left[\begin{matrix} x_1\\x_2 \end{matrix} \right]+b \right)\\ h_1=\sigma\left( W\left[\begin{matrix} x_3\\x_4 \end{matrix} \right]+b \right)\\ h_3=\sigma\left( W\left[\begin{matrix} h_1\\h_2 \end{matrix} \right]+b \right)\\ y=g(W'h_3+b') h1=σ(W[x1x2]+b)h1=σ(W[x3x4]+b)h3=σ(W[h1h2]+b)y=g(Wh3+b)
当递归神经网络退化为线性序列结构,等价于简单循环神经网络

在这里插入图片描述

应用

自然语言的句法结构

  • 在这里插入图片描述

递归神经网络主要用于建模自然句子的语义,给定一个句子的语法结构,可以使用递归神经网络来按照句法的组合关系来合成一个句子的语义。句子的短语成分又可以是一些子成分,即短语的语义都可以由其子成分语义组合而来,进而整合成整句的语义

在这里插入图片描述

p 1 = f ( W [ b c ] ) p 2 = f ( W [ a p 1 ] ) p_1=f\left(W\left[ \begin{matrix} b\\c \end{matrix} \right]\right)\\ p_2=f\left(W\left[ \begin{matrix} a\\p_1 \end{matrix} \right]\right) p1=f(W[bc])p2=f(W[ap1])
同样,也可以用门控机制改进递归神经网络中的长程依赖问题

  • 树结构的长短期记忆模型
图神经网络

在实际应用中,很多数据是图结构的,比如知识图谱、社交网络、分子网络等。但前馈网络和反馈网络很难处理图结构的数据

图神经网络是(GNN)将消息传递的思想扩展到图结构数据上的神经网络

在这里插入图片描述

对于任意的图结构 G ( V , ε ) G(\mathcal{V},\varepsilon) G(V,ε) V \mathcal{V} V 表示节点集合, ε \varepsilon ε 表示边集

两个节点间的边表示节点间的依赖关系。节点间的依赖可以有向,也可以无向

图中,每个节点 v v v 都可以用一组神经元来表示其状态 h ( v ) h^{(v)} h(v) ,初始状态为输入特征 x ( v ) x^{(v)} x(v)

每个节点接收来自邻接节点的消息,并更新自己的状态
m t ( v ) = ∑ u ∈ N ( v ) f ( h t − 1 ( v ) , h t − 1 ( u ) , e ( u , v ) ) h t ( v ) = g ( h t − 1 ( v ) , m t ( v ) ) m_t^{(v)}=\sum\limits_{u\in \mathcal{N}(v)}f\left(h_{t-1}^{(v)},h_{t-1}^{(u)},e^{(u,v)}\right)\\ h_t^{(v)}=g\left(h_{t-1}^{(v)},m_t^{(v)}\right) mt(v)=uN(v)f(ht1(v),ht1(u),e(u,v))ht(v)=g(ht1(v),mt(v))
N ( v ) \mathcal{N}(v) N(v) 表示结点 v v v 的邻居, e ( u , v ) e^{(u,v)} e(u,v) 表示从节点 h ( u ) h^{(u)} h(u) h ( v ) h^{(v)} h(v) 方向上的输入特征

上述为同步描述,

对于有向图来说,使用异步更新方式效率高(循环神经网络或递归神经网络),在整个图更新 T T T 次后,通过一个读出函数得到整个网络的表示
o t = g ( { h T ( v ) ∣ v ∈ V } ) o_t=g\left(\{h_T^{(v)}\vert v\in \mathcal{V}\}\right) ot=g({hT(v)vV})

2.5 应用

生成语言模型

自然语言理解:一个句子的可能性,合理性

在这里插入图片描述

作词机
机器翻译

传统统计学习机器翻译

在这里插入图片描述

基于序列到序列的机器翻译

在这里插入图片描述

  • 一个RNN用来编码
  • 一个RNN用来解码
看图说话

在这里插入图片描述

写字

在这里插入图片描述
在这里插入图片描述

对话系统

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

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

相关文章

【数字IC设计】DC自动添加门控时钟

简介 数字电路的动态功耗主要是由于寄存器翻转带来的&#xff0c;为了降低芯片内部功耗&#xff0c;门控时钟的方案应运而生。作为低功耗设计的一种方法&#xff0c;门控时钟是指在数据无效时将寄存器的时钟关闭&#xff0c;以此来降低动态功耗。 在下图中&#xff0c;展示了…

【自然语言处理】— 隐马尔可夫模型详解、例解

【自然语言处理】— 隐马尔可夫模型 【自然语言处理】— 隐马尔可夫模型引例隐马尔可夫模型概念隐马尔可夫模型的关键隐马尔可夫模型的数学表示隐含状态与观测结果状态转移矩阵观测概率矩阵初始状态概率向量 小结 【自然语言处理】— 隐马尔可夫模型 引例 假设有三种不同的骰…

17 - 并发容器的使用:识别不同场景下最优容器

在并发编程中&#xff0c;我们经常会用到容器。今天我要和你分享的话题就是&#xff1a;在不同场景下我们该如何选择最优容器。 1、并发场景下的 Map 容器 假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下&#xff0c;我们是用一个哈希表…

【UBOOT】1-使用与烧写

​一、uboot简介 1&#xff09;uboot是一个裸机程序&#xff0c;比较复杂 2&#xff09;最主要的作用是引导Linux内核启动&#xff1b; 初始化DDR&#xff1b; 因为Linux是运行在DDR里面的&#xff1b;而Linux镜像&#xff08;zImage或uImagedtb&#xff09;一般存放在SD EMM…

理解LoadRunner,基于此工具进行后端性能测试的详细过程(下)

5、录制并增强虚拟用户脚本 从整体角度看&#xff0c;用LoadRunner 开发虚拟用户脚本主要包括下面四步骤&#xff1a; 识别测试应用使用的协议 录制脚本 完善录制得到的脚本 验证脚本的正确性 识别被测应用使用的协议 如果明确知道了被测系统所采用的协议&#xff0c;可…

网卡介绍篇

目录 1.什么是网卡&#xff1f; 2.网卡的演进 3.网卡的主要功能 4.服务器网卡介绍 5.服务器网卡的分类 6.网卡接口介绍 7.业界网卡主流厂商 8.SmartNIC概念介绍 9.SmartNIC产业发展趋势 10.SmartNIC实现 10-1.实现形式 10-2.SmartNIC不同实现技术对比 11.Mellanox…

怎么把flac音频变为mp3?

怎么把flac音频变为mp3&#xff1f;FLAC音频格式在许多平台和应用程序中都得到支持和应用。FLAC音频格式被广泛支持和应用。许多平台、设备和应用程序都支持FLAC格式&#xff0c;如Windows、macOS和Linux操作系统、各种音乐播放器软件、智能手机和平板电脑、在线音乐平台和流媒…

python+django学生选课管理系统_wxjjv

1&#xff09;前台&#xff1a;首页、课程信息、校园论坛、校园公告、个人中心、后台管理。 &#xff08;2&#xff09;管理员&#xff1a;首页、个人中心、学生管理、教师管理课、程信息管理、课程分类管理、选课信息管理、作业信息管理、提交作业管理、学生成绩管理、校园论…

Linux常见的指令合集

Linux指令合集 认识linuxlinux基础指令1.pwd 命令2. ls 命令3.cd 命令4. man 命令5. grep 命令6. ps 命令7. kill 命令8. netstat 命令9. date 查看当前系统时间10. echo 打印选项 -e linux文件操作指令1. mkdir 命令2. rmdir 命令3. touch 命令4. rm 命令5. mv 命令6. cp 命令…

ImgPlus:基于CodeFormer的图片增强

背景 最近参与了华为云开发者大会AI赛道&#xff0c;做了一个AI图片增强作品&#xff0c;本片文章来简单介绍一下。 正文 作品名称&#xff1a;ImgPlus 赛题技术领域选择&#xff1a; AI&#xff0c;图片增强 使用技术名称&#xff1a; CodeFormer&#xff0c;ECS&#xff0…

Puppeteer结合测试工具jest使用(四)

Puppeteer结合测试工具jest使用&#xff08;四&#xff09; Puppeteer结合测试工具jest使用&#xff08;四&#xff09;一、简介二、与jest结合使用&#xff0c;集成到常规测试三、支持其他的几种四、总结 一、简介 Puppeteer是一个提供自动化控制Chrome或Chromium浏览器的Node…

session认证

目录 前言 http协议的无状态性 session的工作原理 在express中使用session认证 在session中存数据 在session中取数据 清空session 结尾 前言 session是一种记录客户状态的机制&#xff0c;客户端浏览器法访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录…

WLAN 无线案例(华为AC控制器配置模板)

实验说明&#xff1a; 无线用户VLAN 30 192.168.30.0/24 AP和AC用VLAN 20 192.168.20.0/24 有线网段 VLAN 10 192.168.10.0/24 步骤一&#xff1a;全网互通 sw1&#xff1a; sysname sw1 # vlan batch 10 20 30 # dhcp enable # ip pool 20 gateway-list 192.168.20.1…

JAVA学习(6)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

UDP与TCP协议

很抱歉&#xff0c;我之前写好的UDP与TCP文章不小心被删了&#xff0c;所以&#xff0c;这篇文章只有一半&#xff0c;后面我会尽快补全。 在完成HTTPS的学习后&#xff0c;我们就完成了应用层的所有讲解&#xff0c;下面我们开始讲解传输层&#xff0c;这一层常用的协议为TCP…

MySQL的index merge(索引合并)导致数据库死锁分析与解决方案 | 京东云技术团队

背景 在DBS-集群列表-更多-连接查询-死锁中&#xff0c;看到9月22日有数据库死锁日志&#xff0c;后排查发现是因为mysql的优化-index merge&#xff08;索引合并&#xff09;导致数据库死锁。 定义 index merge(索引合并)&#xff1a;该数据库查询优化的一种技术&#xff0…

JOSEF约瑟 漏电继电器 JD1-200 工作电压:380V 孔径:45mm 50~500mA

JD1系列漏电继电器 系列型号 JD1-100漏电继电器 JD1-200漏电继电器 JD1-250漏电继电器 JD1系列漏电继电器原为分体式固定式安装&#xff0c;为适应现行安装场合需要&#xff0c;上海约瑟继电器厂在产品原JD1一体式漏电继电器基础上进行产品升级&#xff0c;开发出现在较为…

从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

目录 代码结构headbodyscript 调试 代码 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta name"viewport" content"initial-scale1.0, user-scalable…

黑马JVM总结(三十四)

&#xff08;1&#xff09;JMM概述 &#xff08;2&#xff09;JMM-原子性-synchronized java内存模型是如何保证原子性的呢&#xff0c;它是通过synchroized关键字&#xff0c;来达到这个目的的 第一个线程来了进入同步代码块之后&#xff0c;把这个对象加上锁了&#xff0c;…

LockSupport-LockSupport是什么及等待唤醒机制对比

4.2 LockSupport是什么 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语&#xff0c;其中park()和unpack()而作用分别是 阻塞线程和解除阻塞线程. 4.3 线程等待唤醒机制 4.3.1 三种让线程等待和唤醒的方法 方式一&#xff1a;使用Object中的wait()方法让线程等待&a…