【深度学习】讲透一个强大算法模型,Transformer !!
仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
今儿咱们聊聊为什么需要Transformer,RNN和CNN处理序列任务的局限性在哪里~
首先聊聊RNN的问题,RNN(循环神经网络)在处理序列时,每一步的计算必须依赖上一时刻的输出,这就造成了处理长序列时计算缓慢,不能充分利用并行计算资源。
当序列很长时,信息需要跨越很多时间步传递,而RNN的梯度在回传过程中容易消失(或偶尔爆炸),因此对于句子中很远的词之间的关系,模型往往难以捕获。
CNN的话,通过滑动窗口(卷积核)来捕捉局部特征,但如果需要捕捉长距离的依赖关系,就需要叠加很多层或者使用扩张卷积。这会使得模型设计和调优变得复杂。
虽然卷积的平移不变性在某些任务上是优势,但对于语言或序列任务,单纯的平移不变并不能充分表示序列中词语之间位置和顺序的重要性。
Transformer模型通过自注意力(Self-Attention)机制,把序列中任意两个位置之间的依赖关系都考虑进来,而且可以一次性并行计算,大大加速了训练和推理过程。
简单来说,Transformer能够:
不受顺序计算的限制,全局捕获序列依赖;
并行化处理序列中所有元素;
自注意力让模型能够灵活地关注序列中任意重要信息,而不局限于固定大小的窗口。
RNN利用循环结构在序列中传播隐藏状态信息。对于给定的输入序列,RNN的基本更新公式:
其中:
为时刻的隐藏状态;
和分别为隐藏状态到隐藏状态、输入到隐藏状态的权重矩阵;
是非线性激活函数(例如);
是偏置项。
输出通常通过:
产生,其中为隐藏状态到输出的权重。
在反向传播过程中,对于某个时间步的损失,其梯度需要通过多次链式法则传回较早的时间步,具体来说:
当序列长度较大时,若权重矩阵的奇异值小于1,就会导致梯度指数级衰减(梯度消失);反之若大于1则可能梯度爆炸。这使得模型难以捕捉长距离依赖的信息。
CNN通过卷积操作捕捉局部特征。对于一维序列数据,卷积操作公式:
其中:
为卷积核参数,长度为;
为输入序列在相应位置的值;
为该位置的卷积结果。
固定感受野:一个单层卷积只能看到固定窗口内的信息。如果需要捕获跨越较长距离的信息,则需要叠加多层卷积或者设计扩张卷积,这样会带来更多的参数和更深的网络,设计与训练难度增加。
位置编码:卷积本质上是平移不变的,没有内在机制来捕捉位置信息,而在序列任务(如自然语言处理)中,词语的顺序和位置信息极为重要。因此,有时需要额外添加位置信息。
Transformer采用自注意力机制(Self-Attention)来建立序列中任意两个位置之间的依赖。无需像RNN那样逐步传递状态,也无需像CNN那样受限于局部窗口。
对于输入序列的每个位置,首先通过三个不同的线性变换得到查询(Query)、键(Key)和值(Value)向量:
其中为输入矩阵,为权重矩阵。
接着计算注意力分数:
其中:
是键向量的维度,作为缩放因子;
保证所有注意力权重为非负并归一化。
为了让模型在不同的子空间上学习不同的注意力分布,Transformer使用多头注意力机制:
其中每个的计算公式为:
是每个头的线性变换参数,是最终的输出变换矩阵。
Transformer除了自注意力层外,还使用前馈神经网络(Feed-ForwardNetwork,FFN):
每一层还会使用残差连接和层归一化(LayerNormalization),整个一层的输出为:
其中可以是自注意力或者FFN部分。
全局依赖:自注意力机制允许每个位置直接与其他所有位置交互,无论距离多远,因此可以捕获长距离依赖。
并行计算:不像RNN那样依赖上一时刻状态,所有的注意力计算可以同时进行,从而充分利用GPU的并行计算能力。
灵活的关注模式:模型可以根据任务需要动态调整注意力分配,而不受固定窗口或者固定序列顺序的限制。
在这个案例中,主要聚焦于Transformer的实现与优化,但也会简单讨论其他两种模型在相同任务下的局限性。
RNN局限性
顺序依赖:RNN每一步的计算必须依赖上一步的隐藏状态,无法并行化,导致长序列训练时间较长。
长距离依赖问题:在很长的序列中,梯度在不断传播过程中可能会消失或爆炸,导致模型难以捕获远距离信息。
CNN局限性
局部感受野固定:卷积层只能捕捉固定窗口内的局部信息,虽然可以通过堆叠多层来扩大感受野,但这会增加网络复杂度,而且并没有根本上改善捕获全局依赖的能力。
位置信息不足:CNN本质上具有平移不变性,对于需要依赖序列中元素顺序的任务,往往需要增加额外的位置编码。
为了解决上述问题,Transformer提出了自注意力机制,能够全局建模任意位置之间的依赖,并且可以并行计算。Transformer同时还利用多头注意力机制,使得模型在不同的子空间中学习多种表示,从而大大提升了序列任务(如自然语言处理、时间序列预测等)的建模能力。
DataSampleExample:展示一个样本的输入序列(20个时间步)和对应真实的下一个值(标记为TrueTarget)。此图用来说明数据生成的基本结构及正弦波的特性。
TrainingandTestingLossCurves:展示模型训练过程中训练损失与测试损失随epoch的变化情况。该图帮助我们评估模型是否在不断收敛,以及是否存在过拟合或欠拟合现象。
Comparison:Truevs.PredictedValues:比较一批样本中真实数值与模型预测数值的分布,直观反映模型预测精度及偏差情况。
AttentionWeightsHeatmap(Layer1Avg):展示Transformer第一层多头注意力机制计算的注意力权重热力图,反映模型在不同位置间的注意力分布,帮助理解模型捕获远距离依赖关系的能力。
网格搜索或随机搜索:针对关键参数(d_model、num_layers、n_heads、d_ff、dropout和learningrate)进行网格搜索,观察验证集上的误差变化。
观察学习曲线:绘制训练与验证损失曲线,分析是否存在过拟合或欠拟合现象。若验证损失与训练损失间差距较大,则说明可能过拟合,需要加强正则化或减少模型容量;若两者均收敛较慢,则考虑提高模型容量或增大学习率。
Warm-up策略:对于Transformer模型,常用warm-up策略,即先用较小的学习率训练若干个epoch,再逐步提高至设定值,这有助于稳定早期训练。调参时可以尝试不同的warm-up步长。
早停机制:结合earlystopping,设置在验证集上连续若干个epoch无明显下降时提前终止训练,以防止模型过拟合或浪费计算资源。
注意力权重可视化:通过可视化自注意力权重热力图,可以观察模型是否聚焦于关键时间步。如果注意力分布异常(如全部均匀分布或高度集中在某几个位置),可能需要调节模型层数或多头数,甚至调整残差连接和归一化的参数。
复现实验:多次复现实验结果,观察不同超参数组合对最终误差的敏感性,从而确定最佳参数范围。
到此,我们能够直观地理解Transformer是如何弥补RNN和CNN在序列任务中的不足,为处理更复杂的实际序列任务奠定了坚实的基础。
感觉有帮助的朋友可以收藏、点赞、转发起来!