PyTorch深度学习教程:RNN、GRU、LSTM与注意力机制详解
深度学习架构概述
在深度学习领域,不同的模块组合可以完成不同的功能。深度学习专家的核心能力之一就是设计适合特定任务的网络架构。就像早期程序员通过算法编写程序来指导计算机工作一样,深度学习将复杂功能分解为功能模块图(可能是动态的),这些模块的功能通过学习来确定。
正如我们在卷积网络中看到的,网络架构的设计至关重要。本文将重点介绍循环神经网络(RNN)及其变体,以及注意力机制等关键技术。
循环神经网络(RNN)基础
在卷积神经网络中,模块间的连接图不能有循环,存在至少部分顺序关系。而循环神经网络则允许循环连接的存在。
RNN的核心结构包含以下组件:
- $x(t)$:随时间变化的输入
- $\text{Enc}(x(t))$:生成输入表示的编码器
- $h(t)$:输入的表示
- $w$:可训练参数
- $z(t-1)$:前一个隐藏状态(上一步的输出)
- $z(t)$:当前隐藏状态
- $g$:可以是复杂神经网络的函数
- $\text{Dec}(z(t))$:生成输出的解码器
时间展开的RNN
将RNN在时间维度上展开后,我们可以看到输入是一个序列$x_1, x_2, \cdots, x_T$。在每个时间步t:
- 输入$x(t)$传递给编码器生成表示$h(x(t))$
- 该表示与前一步的隐藏状态$z(t-1)$一起传递给函数$G$,生成当前隐藏状态$z(t)$
- $z(t)$传递给解码器生成输出,并作为下一步的输入
这种展开后的网络没有循环,因此可以实现反向传播。值得注意的是,不同时间步的编码器、解码器和G函数共享相同的权重。
RNN的挑战
RNN面临两个主要问题:
-
梯度消失问题:在长序列中,梯度会在每个时间步乘以权重矩阵(转置)。如果权重矩阵中有小值,梯度范数会呈指数级减小。
-
梯度爆炸问题:如果有大的权重矩阵且循环层中的非线性不饱和,梯度会爆炸性增长,导致权重在更新时发散。
举例说明梯度消失问题:假设我们要检查C程序语法是否正确,网络需要记住括号和花括号的数量。但由于梯度消失,网络难以在长程序中保持这种计数信息。
RNN优化技巧
- 梯度裁剪:避免梯度爆炸,当梯度过大时进行裁剪
- 初始化策略:使用正交初始化等方法,使权重矩阵在一定程度上保持范数
乘法模块
与传统仅计算输入加权和不同,乘法模块先计算输入的乘积,再计算加权和。这种结构可以表示为:
$$ w_{ij} = u_{ij}^\top z = \sum_ku_{ijk}z_k $$
$$ s_i = w_{i}^\top x = \sum_j w_{ij}x_j $$
其中权重本身也是权重和输入的加权和,形成了一种超网络架构。
注意力机制
注意力机制允许神经网络将注意力集中在特定输入上而忽略其他输入。基本原理是:
- 输入多个向量$x_1, x_2, ...$
- 通过softmax计算权重$w_1, w_2, ...$(和为1)
- 输出为加权和$w_1x_1 + w_2x_2 + ...$
通过调整权重,系统可以选择关注不同的输入组合。注意力机制在现代NLP系统中至关重要,特别是在Transformer架构中。
门控循环单元(GRU)
GRU是解决RNN问题的有效方案,其结构包含:
- 更新门$z_t$:决定保留多少过去信息
- 重置门$r_t$:决定遗忘多少过去信息
- 候选隐藏状态:基于当前输入和重置门计算
GRU的数学表达式为:
$$ \begin{aligned} z_t &= \sigma_g(W_zx_t + U_zh_{t-1} + b_z) \ r_t &= \sigma_g(W_rx_t + U_rh_{t-1} + b_r) \ h_t &= z_t\odot h_{t-1} + (1- z_t)\odot\phi_h(W_hx_t + U_h(r_t\odot h_{t-1}) + b_h) \end{aligned} $$
其中$\odot$表示逐元素乘法。GRU通过门控机制有效控制了信息的流动。
长短期记忆网络(LSTM)
LSTM是比GRU更早提出的解决方案,通过构建记忆单元来保存过去信息。其核心组件包括:
- 遗忘门$f_t$:决定保留多少细胞状态
- 输入门$i_t$:决定更新多少细胞状态
- 输出门$o_t$:决定输出多少细胞状态
- 细胞状态$c_t$:长期记忆载体
LSTM的数学表达式为:
$$ \begin{aligned} f_t &= \sigma_g(W_fx_t + U_fh_{t-1} + b_f) \ i_t &= \sigma_g(W_ix_t + U_ih_{t-1} + b_i) \ o_t &= \sigma_o(W_ox_t + U_oh_{t-1} + b_o) \ c_t &= f_t\odot c_{t-1} + i_t\odot \tanh(W_cx_t + U_ch_{t-1} + b_c) \ h_t &= o_t \odot\tanh(c_t) \end{aligned} $$
虽然LSTM在NLP中广泛应用,但其流行度正在下降,逐渐被时序CNN和Transformer所取代。
序列到序列模型(Seq2Seq)
Seq2Seq模型采用编码器-解码器架构,两者通常都是多层LSTM。编码器处理输入序列,最后一个时间步输出整个句子的表示向量,解码器基于该向量生成目标语言文本。
传统Seq2Seq模型的局限性:
- 整个句子的意义需要压缩到编码器和解码器之间的单个隐藏状态中
- LSTM实际只能保留约20个词的信息
解决方案是双向LSTM(Bi-LSTM),通过两个方向运行的LSTM生成两个向量,有效扩展了记忆长度。
带注意力的Seq2Seq模型
带注意力的Seq2Seq模型不再需要将整个句子压缩到一个向量中,而是在每个时间步专注于原语言中的相关部分。注意力机制通过学习自动评分输入和输出的匹配程度,通过softmax归一化后计算加权和。
注意力机制彻底改变了神经机器翻译领域,并催生了Transformer架构,其中每一层神经元组都在实现某种注意力机制。
记忆网络
记忆网络受人类大脑中大脑皮层(长期记忆)和海马体(短期记忆)的启发。其核心是可寻址的联想记忆:
- 输入$x$与键$k_i$做点积
- 通过softmax得到系数
- 与值$v_i$加权求和得到输出
记忆网络的工作方式类似于计算机的CPU和内存交互,因此有人设想可以构建可微分计算机。Transformer本质上就是这种网络的组合,其中每组神经元都是这样的一个网络。
总结
本文详细介绍了PyTorch深度学习中RNN及其变体(GRU、LSTM)的原理和应用,以及注意力机制和记忆网络等关键技术。这些架构在处理序列数据、特别是自然语言处理任务中发挥着重要作用。随着技术的发展,Transformer等基于注意力机制的新架构正逐渐成为主流,但理解这些基础网络结构对于深度学习实践者仍然至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考