引言

序列(sequence\text {sequence}

Slot Filling\text {Slot Filling}(槽填充)任务

网络记忆能力

延时神经网络(Time Delay Neural Network TDNN):建立一个额外的延时单元,用来存储历史信息(可以包括输入、输出、隐状态等)。

ht(l)=f(ht(l1),ht1(l1),,htK(l1))\boldsymbol{h}_t^{(l)}=f\left(\boldsymbol{h}_t^{(l-1)}, \boldsymbol{h}_{t-1}^{(l-1)}, \cdots, \boldsymbol{h}_{t-K}^{(l-1)}\right)

自回归模型( Autoregressive Model AR):用变量的历史信息来预测自己。

yt=w0+k=1Kwkytk+ϵt\boldsymbol{y}_t=w_0+\sum_{k=1}^K w_k \boldsymbol{y}_{t-k}+\epsilon_t

有外部输入的非线性自回归模型(Nonlinear Autoregressive with Exogenous Inputs Model NARX):自回归模型的拓展,每个时刻都有一个外部输入。

yt=f(xt,xt1,,xtKx,yt1,yt2,,ytKy)\boldsymbol{y}_t=f\left(\boldsymbol{x}_t, \boldsymbol{x}_{t-1}, \cdots, \boldsymbol{x}_{t-K_x}, \boldsymbol{y}_{t-1}, \boldsymbol{y}_{t-2}, \cdots, \boldsymbol{y}_{t-K_y}\right)

循环神经网络

循环神经网络(Recurrent Neural Network,RNN):由输入串、一个隐藏层和一个输出层组成。

  1. 输入序列:x1:T=(x1,x2,,xt,,xT)x_{1: T}=\left(x_1, x_2, \ldots, x_t, \ldots, x_T\right)
  2. 更新隐藏层的活性值:ht=f(ht1,xt)\boldsymbol{h}_t=f\left(\boldsymbol{h}_{t-1}, \boldsymbol{x}_t\right)

zt=Uht1+Wxt+bht=f(zt)}ht=f(Uht1+Wxt+b)\left.\begin{array}{rl} \boldsymbol{z}_t & =\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_t+\boldsymbol{b} \\ \boldsymbol{h}_t & =f\left(\boldsymbol{z}_t\right) \end{array}\right\} \boldsymbol{h}_t=f\left(\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_t+\boldsymbol{b}\right)

h0\boldsymbol{h}_0 初始化为 00 向量

  • 基础的神经网络只在层与层之间建立权连接
  • 循环神经网络不同之处在于层内部的神经元在时间维度也建立权连接

隐状态 ht\boldsymbol{h}_t

  1. 进一步处理得到每个时间步的输出 yty_t
  2. 下一个时间步的输入

举例:假如需要判断用户的说话意图(问天气、问时间、设置闹钟……),用户说了一句“What time is it?"\text {“What time is it?"}

  1. 分词:

What time is it ?

  1. What” 作为 RNN 的输入,得到输出 O1\mathrm{O}_1

  2. "time"作为 RNN 的输入(基于第 2 步),得到输出 O2\mathrm{O}_2

  3. "is"作为 RNN 的输入(基于第 3 步),得到输出 O3\mathrm{O}_3

  4. "it"作为 RNN 的输入(基于第 4 步),得到输出 O4\mathrm{O}_4

  5. "?"作为 RNN 的输入(基于第 5 步),得到输出 O5\mathrm{O}_5

短期记忆问题

RNN 序列模型应用时的几种形式:

  • many to one
  • one to many
  • many to many 同步
  • many to many 异步

Many to One 模型

  • 输入为一串文字,输出为分类类别(新闻分类)

  • 输入一整篇文章,输出文章作者的情绪(情感分类)

One to Many 模型

  • 输入为一张图片,输出为图片的文字描述
  • 输入为一种类型,输出为一系列的音符(即一首曲子)

Many to Many 模型(同步)

输入和输出的序列个数相同,如输入为视频序列,输出为每一帧对应的标签;词性标注。

Many to Many 模型(异步)

输入和输出的序列个数不同,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

总结

双向循环神经网络

双向循环神经网络( Bidirectional Recurrent Neural Network Bi RNN ):由两层循环神经网络组成,输入相同,信息传递的方向不同。

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)\begin{aligned} \boldsymbol{h}_t^{(1)} & =f\left(\boldsymbol{U}^{(1)} \boldsymbol{h}_{t-1}^{(1)}+\boldsymbol{W}^{(1)} \boldsymbol{x}_t+\boldsymbol{b}^{(1)}\right) \\ \boldsymbol{h}_t^{(2)} & =f\left(\boldsymbol{U}^{(2)} \boldsymbol{h}_{t+1}^{(2)}+\boldsymbol{W}^{(2)} \boldsymbol{x}_t+\boldsymbol{b}^{(2)}\right) \\ \boldsymbol{h}_t & =\boldsymbol{h}_t^{(1)} \oplus \boldsymbol{h}_t^{(2)} \end{aligned}

正向计算和反向计算不共享权重。

循环神经网络的训练

循环神经网络的参数可以通过梯度下降方法来进行学习沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。

以随机梯度下降法为例:对于任意一个 many to many\text {many to many} 同步的样本。

  • 输入:x1:T=(x1,,xT)\boldsymbol{x}_{1: T}=\left(\boldsymbol{x}_1, \cdots, \boldsymbol{x}_T\right)
  • 输出:y1:T=(y1,,yT)y_{1: T}=\left(y_1, \cdots, y_T\right)
  • 任意时刻的损失函数:Lt=L(yt,g(ht))\mathcal{L}_t=\mathcal{L}\left(y_t, g\left(\boldsymbol{h}_t\right)\right)
  • 整个序列的损失函数:L=t=1TLt\mathcal{L}=\sum_{t=1}^T \mathcal{L}_t

整个序列的损失函数关于参数的梯度:LU=t=1TLtU\frac{\partial \mathcal{L}}{\partial \boldsymbol{U}}=\sum_{t=1}^T \frac{\partial \mathcal{L}_t}{\partial \boldsymbol{U}}

zt=Uht1+Wxt+bht=f(zt)}ht=f(Uht1+Wxt+b)\left.\begin{array}{rl} \boldsymbol{z}_t & =\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_t+\boldsymbol{b} \\ \boldsymbol{h}_t & =f\left(\boldsymbol{z}_t\right) \end{array}\right\} \boldsymbol{h}_t=f\left(\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_t+\boldsymbol{b}\right)

BPTT\text {BPTT} 算法

定义误差项 δt,k=Ltzk\delta_{t, k}=\frac{\partial \mathcal{L}_t}{\partial z_k}:第 tt 时刻的损失对第 kk 时刻隐藏神经层的净输入 zkz_k 的导数

δt,k=Ltzk=hkzkzk+1hkLtzk+1=diag(f(zk))Uδt,k+1=τ=kt1(diag(f(zτ))U)δt,t\delta_{t, k}=\frac{\partial \mathcal{L}_t}{\partial \boldsymbol{z}_k}=\frac{\partial \boldsymbol{h}_k}{\partial \boldsymbol{z}_k} \frac{\partial \boldsymbol{z}_{k+1}}{\partial \boldsymbol{h}_k} \frac{\partial \mathcal{L}_t}{\partial \boldsymbol{z}_{k+1}}=\operatorname{diag}\left(f^{\prime}\left(\boldsymbol{z}_k\right)\right) \boldsymbol{U}^{\top} \delta_{t, k+1}=\prod_{\tau=k}^{t-1}\left(\operatorname{diag}\left(f^{\prime}\left(\boldsymbol{z}_\tau\right)\right) \boldsymbol{U}^{\top}\right) \delta_{t, t}

LtU=k=1tδt,khk1\frac{\partial \mathcal{L}_t}{\partial \boldsymbol{U}}=\sum_{k=1}^t \delta_{t, k} \boldsymbol{h}_{k-1}^{\top}

即:

δt,kγtkδt,t\delta_{t, k} \cong \gamma^{t-k} \delta_{t, t}

>>γ>1tk\gamma>1 , t-k \rightarrow \infty ,间隔比较大时,会产生梯度爆炸。

>>γ<1tk\gamma<1 , t-k \rightarrow \infty ,间隔比较大时,会产生梯度消失。

长程依赖问题

RNN 梯度消失:LtU=k=1tδt,khk1\frac{\partial \mathcal{L}_t}{\partial \boldsymbol{U}}=\sum_{k=1}^t \delta_{t, k} \boldsymbol{h}_{k-1}^{\top},权重数组 UU 的最终梯度是各个时刻的梯度之和。

RNN 总的梯度是不会消失的 。 其梯度消失的真正含义是:梯度被近距离梯度主导,导致模型难以学习远距离的依赖关系。这也是原始 RNN 无法处理长距离依赖的原因 。

梯度爆炸:收到 NaN\text {NaN} 错误;设置一个梯度阈值,当梯度超过这个阈值时直接截取。

梯度消失:

  • 合理的初始化权重值:初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
  • 使用 ReLU\text {ReLU} 代替 Logistic\text {Logistic}Tanh\text {Tanh} 作为激活函数。
  • 使用其他结构的 RNNs:
    • 长短时记忆网络(LTSM)
    • Gated Recurrent Unit(GRU)

长短期记忆网络(LSTM)

Long Short Term Memory network(LSTM):一种特殊的 RNN 网络,该网络设计出来是为了解决长程依赖问题 。除了原始的隐状态 ht\boldsymbol{h}_t 外,增加了一个新的状态 ct\boldsymbol{c}_t ,称为单元/细胞状态(cell state), 让它来保存长期的状态。

标准 RNN 按时间维度展开:

ht=f(Uht1+Wxt+b)\boldsymbol{h}_t=f\left(\boldsymbol{U} \boldsymbol{h}_{t-1}+\boldsymbol{W} \boldsymbol{x}_t+\boldsymbol{b}\right)

LSTM 沿时间维度展开:

ct=ftct1+itc~tht=ottanh(ct)\begin{gathered} \boldsymbol{c}_t=\boldsymbol{f}_t \odot \boldsymbol{c}_{t-1}+\boldsymbol{i}_t \odot \tilde{\boldsymbol{c}}_t \\ \\ \boldsymbol{h}_t=\boldsymbol{o}_t \odot \tanh \left(\boldsymbol{c}_t\right) \end{gathered}

除了 hth_t 在随时间流动,单元状态 ctc_t 也在随时间流动,单元状态 ctc_t 就代表着长期记忆。

细胞状态

门控开关

LSTM 的关键是如何控制细胞状态 ctRD\boldsymbol{c}_t \in \mathbb{R}^D 和隐状态 htRD\boldsymbol{h}_{\boldsymbol{t}} \in \mathbb{R}^D

使用三个控制门开关包括:

  • ft[0,1]D\boldsymbol{f}_t \in[0,1]^D:负责如何继续保存细胞状态 Ct1RD\boldsymbol{C}_{t-1} \in \mathbb{R}^D(保存长期记忆)
  • it[0,1]D\boldsymbol{i}_t \in[0,1]^D:负责如何把即时信息输入到细胞状态 CtRD\boldsymbol{C}_t \in \mathbb{R}^D(添加新的记忆)
  • ot[0,1]D\mathbf{o}_t \in[0,1]^D:负责控制如何把细胞状态 CtRD\boldsymbol{C}_t \in \mathbb{R}^D用于当前输出隐状态 htRD\boldsymbol{h}_{\boldsymbol{t}} \in \mathbb{R}^D(使用记忆内容)

门控机制

使用两个门来控制单元状态 C\boldsymbol{C}

  • 遗忘门(Forget Gate):决定上一时刻的单元状态 ct1\boldsymbol{c}_{t-1} 有多少保留到当前时刻的单元状态 ct\boldsymbol{c}_t
  • 输入门(Input Gate):决定了当前时刻网络的输入 [ht1,xt]\left[\mathbf{h}_{t-1}, \mathbf{x}_t\right] 有多少添加到当前时刻的单元状态 ct\boldsymbol{c}_t

输出门(Output Gate):控制当前时刻的单元状态 ct\boldsymbol{c}_t 有多少输出到当前时刻网络的输出 ht\mathbf{h}_t

遗忘门——记忆保留

ft=σ(Wfxt+Ufht1+bf)\boldsymbol{f}_t=\sigma\left(\boldsymbol{W}_f \boldsymbol{x}_t+\boldsymbol{U}_f \boldsymbol{h}_{t-1}+\boldsymbol{b}_f\right)

遗忘门 ftf_t:自适应地决定网络记住多少前一步的内容,同时受到前一步的隐状态和当前时间步新的输入的影响。

输入门——记忆增加

c~t=tanh(Wcxt+Ucht1+bc)it=σ(Wixt+Uiht1+bi)\begin{gathered} \tilde{\boldsymbol{c}}_t=\tanh \left(\boldsymbol{W}_c \boldsymbol{x}_t+\boldsymbol{U}_c \boldsymbol{h}_{t-1}+\boldsymbol{b}_c\right) \\ \\ \boldsymbol{i}_t=\sigma\left(\boldsymbol{W}_i \boldsymbol{x}_t+\boldsymbol{U}_i \boldsymbol{h}_{t-1}+\boldsymbol{b}_i\right) \end{gathered}

候选状态 c~t\tilde{c}_t:记录到当前时刻的所有信息。

细胞状态更新

ct=ftct1+itc~t\boldsymbol{c}_t=\boldsymbol{f}_t \odot \boldsymbol{c}_{t-1}+\boldsymbol{i}_t \odot \tilde{\boldsymbol{c}}_t

输入门 iti_t:自适应地决定网络要将多少新的信息存入细胞状态,同时受到前一步的隐状态和当前时间步新的输入的影响。

  • 遗忘门控制:保存很久之前的内容
  • 输入门控制:避免当前无关紧要的内容

输出门——记忆使用

ot=σ(Woxt+Uoht1+bo)ht=ottanh(ct)\begin{gathered} \boldsymbol{o}_t=\sigma\left(\boldsymbol{W}_o \boldsymbol{x}_t+\boldsymbol{U}_o \boldsymbol{h}_{t-1}+\boldsymbol{b}_o\right) \\ \\ \boldsymbol{h}_t=\boldsymbol{o}_t \odot \tanh \left(\boldsymbol{c}_t\right) \end{gathered}

输出门 oto_t:自适应地决定网络要将细胞状态的多少内容作为输出。同时受到前一步的隐状态和当前时间步新的输入的影响。

小结

  1. 遗忘门 ftf_tft=σ(Wfxt+Ufht1+bf)\boldsymbol{f}_t=\sigma\left(\boldsymbol{W}_f \boldsymbol{x}_t+\boldsymbol{U}_f \boldsymbol{h}_{t-1}+\boldsymbol{b}_f\right)
  2. 输入门 iti_tit=σ(Wixt+Uiht1+bi)\boldsymbol{i}_t=\sigma\left(\boldsymbol{W}_i \boldsymbol{x}_t+\boldsymbol{U}_i \boldsymbol{h}_{t-1}+\boldsymbol{b}_i\right)
  3. 输出门 oto_tot=σ(Woxt+Uoht1+bo)\boldsymbol{o}_t=\sigma\left(\boldsymbol{W}_o \boldsymbol{x}_t+\boldsymbol{U}_o \boldsymbol{h}_{t-1}+\boldsymbol{b}_o\right)
  4. 候选细胞状态 c~t\tilde{\boldsymbol{c}}_tc~t=tanh(Wcxt+Ucht1+bc)\tilde{\boldsymbol{c}}_t=\tanh \left(\boldsymbol{W}_c \boldsymbol{x}_t+\boldsymbol{U}_c \boldsymbol{h}_{t-1}+\boldsymbol{b}_c\right)

tt 时刻的中间输出:

  • ct=ftct1+itc~t\boldsymbol{c}_t=\boldsymbol{f}_t \odot \boldsymbol{c}_{t-1}+\boldsymbol{i}_t \odot \tilde{\boldsymbol{c}}_t
    • ht=ottanh(ct)\boldsymbol{h}_t=\boldsymbol{o}_t \odot \tanh \left(\boldsymbol{c}_t\right)

门控循环神经网络(GRU)

GRU(Gate Recurrent Unit):一种 比 RNN 可以更有效处理长期依赖,比 LSTM 结构更简单的循环神经网络。

在 GRU 中只有两个门:更新门和重置门,将单元状态和输出合并为一个状态。

重置门 rr(Reset Gate):控制候选状态的计算是否依赖于上一时刻的状态。

更新门 zz(Update Gate) :控制当前状态需要从历史状态中保留多少信息(不经过非线性变换),以及需要从候选状态中接受多少新信息;

小结

  1. 重置门 rtr_trt=σ(Wrxt+Urht1+br)\boldsymbol{r}_t=\sigma\left(\boldsymbol{W}_r \boldsymbol{x}_t+\boldsymbol{U}_r \boldsymbol{h}_{t-1}+\boldsymbol{b}_r\right)
  2. 更新门 ztz_tzt=σ(Wzxt+Uzht1+bz)\boldsymbol{z}_t=\sigma\left(\boldsymbol{W}_z \boldsymbol{x}_t+\boldsymbol{U}_z \boldsymbol{h}_{t-1}+\boldsymbol{b}_z\right)

tt 时刻的中间输出:

  • h~t=tanh(Whxt+Uh(rtht1)+bh)\tilde{\boldsymbol{h}}_t=\tanh \left(\boldsymbol{W}_h \boldsymbol{x}_t+\boldsymbol{U}_h\left(\boldsymbol{r}_t \odot \boldsymbol{h}_{t-1}\right)+\boldsymbol{b}_h\right)
    • ht=ztht1+(1zt)h~t\boldsymbol{h}_t=\boldsymbol{z}_t \odot \boldsymbol{h}_{t-1}+\left(1-\boldsymbol{z}_t\right) \odot \tilde{\boldsymbol{h}}_t

深层循环神经网络

深度:定义为网络中信息传递路径长度 ,循环神经网络是既深又浅的网络。

  • 深网络 :把循环网络按时间展开,长时间间隔的状态之间的路径很长
  • 浅网络 :同一时刻网络输入到输出之间的路径 xtytx_t \rightarrow y_t 非常浅

增加加循环神经网络的深度可以增强循环神经网络的能力:增加同一时刻网络输入到输出的路径 xtyt\boldsymbol{x}_t \rightarrow \boldsymbol{y}_t

  • 增加隐状态到输出的路径深度:htyt\boldsymbol{h}_t \rightarrow \boldsymbol{y}_t
  • 增加输入到隐状态的路径深度:xtht\boldsymbol{x}_t \rightarrow \boldsymbol{h}_t

堆叠循环神经网络(Stacked Recurrent Neural Network,SRNN):即把多个循环网络堆叠起来。

ht(l)=f(U(l)ht1(l)+W(l)ht(l1)+b(l))ht(0)=xt\boldsymbol{h}_t^{(l)}=f\left(\boldsymbol{U}^{(l)} \boldsymbol{h}_{t-1}^{(l)}+\boldsymbol{W}^{(l)} \boldsymbol{h}_t^{(l-1)}+\boldsymbol{b}^{(l)}\right) \quad \boldsymbol{h}_t^{(0)}=\boldsymbol{x}_t

序列数据处理方法讨论

  • 循环神经网络:为了捕获数据的长期依赖,引入门控机制。
  • 一维卷积神经网络:
    • Causal Convolution\text {Causal Convolution}
    • Dilated Convolution\text {Dilated Convolution}
  • 注意力机制
    • RNN + attention\text {RNN + attention}
    • only attention—Transformer\text {only attention—Transformer}

一维卷积神经网络(CNN --> TCN)

因果卷积 膨胀卷积
强调前后数据的因果关系 强调数据的长期依赖关系

注意力机制

RNN + attention\text {RNN + attention}:自适应地为不同时间步的数据分配不同的权重。

only attention, Transformer\text {only attention, Transformer}:一种直接将任意两个时间步的信息关联起来的方式。

几种序列处理方法对比