首页 短视频

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型

分类:短视频
字数: (4888)
阅读: (9077)
内容摘要:深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型,

注意力机制(Attention Mechanism)和 Transformer 模型是现代深度学习,特别是自然语言处理(NLP)领域的重要基石。不少同学在学习李宏毅老师的机器学习课程时,对第 16 讲的 Attention 机制理解存在一些困惑。本文将深入剖析 Attention 机制的底层原理,并结合 Transformer 模型进行实战讲解,帮助大家彻底掌握这一关键技术。

问题场景重现:传统Seq2Seq模型的瓶颈

传统的 Seq2Seq 模型,如基于 RNN 或 LSTM 的编码器-解码器架构,在处理长序列时面临着一个显著的瓶颈:信息压缩。编码器需要将整个输入序列压缩成一个固定长度的上下文向量(context vector),然后解码器再基于这个向量生成输出序列。当输入序列过长时,这个固定长度的上下文向量难以完整地捕捉输入序列的所有信息,导致解码器性能下降,出现“遗忘”现象。这就是著名的长程依赖问题

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型

底层原理深度剖析:Attention机制的精髓

Attention 机制的核心思想是:允许解码器在生成每个输出 token 时,动态地关注输入序列的不同部分。具体来说,Attention 机制会为输入序列的每个 token 计算一个“注意力权重”,表示该 token 对当前输出的重要性。然后,将输入序列的 token 按照注意力权重进行加权求和,得到一个上下文向量,作为解码器的输入。

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型

Attention机制的计算过程

  1. 计算注意力权重
    • 首先,使用 query (解码器当前状态) 和 key (编码器输出的每个状态) 计算相似度得分。常用的相似度函数包括点积(Dot Product)、余弦相似度(Cosine Similarity)等。
    • 然后,对相似度得分进行 softmax 归一化,得到注意力权重。
  2. 计算上下文向量
    • 将输入序列的每个 token (value) 按照注意力权重进行加权求和,得到上下文向量。

公式表示如下:

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型
score(query, key) = query^T * key  // 点积
attention_weights = softmax(score(query, keys))
context_vector = sum(attention_weights * values)

Attention机制的优势

  • 解决了长程依赖问题:解码器可以根据当前需要,动态地关注输入序列的任何部分,从而避免了信息压缩带来的损失。
  • 可解释性强:通过可视化注意力权重,可以直观地了解解码器在生成每个输出 token 时,关注了输入序列的哪些部分。

Transformer模型:Attention机制的集大成者

Transformer 模型完全基于 Attention 机制,摒弃了传统的 RNN 和 CNN 结构。它由编码器(Encoder)和解码器(Decoder)两部分组成,每一部分都由多个相同的层堆叠而成。

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型

Transformer的核心组件

  • Multi-Head Attention:将 query, key, value 分别通过多个线性变换投影到不同的子空间,在每个子空间中进行 Attention 计算,最后将多个子空间的 Attention 结果拼接起来。这样做可以捕捉到更丰富的特征信息。
  • Positional Encoding:由于 Transformer 模型没有 RNN 的时序结构,需要通过位置编码来引入位置信息。常用的位置编码方式包括正弦余弦函数等。
  • Feed Forward Network:对每个 token 的表示进行非线性变换,增加模型的表达能力。
  • 残差连接和层归一化:有助于缓解梯度消失问题,加速模型训练。

代码示例:PyTorch实现简单的Attention机制

import torch
import torch.nn as nn
import torch.nn.functional as F

class Attention(nn.Module):
    def __init__(self, hidden_size):
        super(Attention, self).__init__()
        self.hidden_size = hidden_size
        self.attn = nn.Linear(self.hidden_size * 2, hidden_size) #  query和key的合并输入
        self.v = nn.Parameter(torch.rand(hidden_size)) # 可学习的权重向量

    def forward(self, hidden, encoder_outputs):
        seq_len = encoder_outputs.size(1)

        # 重复hidden向量,使其维度与encoder_outputs一致
        hidden_repeated = hidden.repeat(seq_len, 1, 1).transpose(0, 1)

        # 计算注意力权重
        attn_weights = torch.tanh(self.attn(torch.cat((hidden_repeated, encoder_outputs), dim=2)))
        attn_weights = attn_weights.squeeze(2)
        attn_weights = torch.matmul(attn_weights, self.v) # 使用权重向量v
        attn_weights = F.softmax(attn_weights, dim=1)

        # 计算上下文向量
        context = torch.bmm(attn_weights.unsqueeze(1), encoder_outputs).squeeze(1)

        return context, attn_weights

# 示例使用
attention = Attention(hidden_size=256)
hidden = torch.randn(1, 1, 256) # decoder的隐藏状态
encoder_outputs = torch.randn(1, 10, 256) # encoder的输出
context, attn_weights = attention(hidden, encoder_outputs)
print(context.shape, attn_weights.shape)

实战避坑经验总结

  • 梯度消失/爆炸问题:Transformer 模型层数较深,容易出现梯度消失/爆炸问题。可以尝试使用梯度裁剪、Layer Normalization 等技巧来缓解。
  • 计算资源需求:Transformer 模型的计算复杂度较高,需要大量的 GPU 资源。可以尝试使用混合精度训练、梯度累积等技巧来降低显存占用。
  • 超参数调优:Transformer 模型有很多超参数需要调整,如学习率、dropout 率、attention head 数量等。可以使用网格搜索、贝叶斯优化等方法进行超参数调优。

结合实际应用:Nginx 反向代理与Transformer模型部署

在实际应用中,我们可以利用 Nginx 作为反向代理服务器,将用户的请求转发到部署了 Transformer 模型的后端服务器。Nginx 可以提供负载均衡、高可用性等功能,从而提高系统的性能和可靠性。同时,Nginx 的高并发连接数处理能力,也能保证模型在高流量下的稳定运行。宝塔面板可以方便地管理 Nginx 的配置,包括 SSL 证书、反向代理规则等。

深度解析李宏毅机器学习笔记16:Attention机制与Transformer模型

转载请注明出处: 代码搬运工

本文的链接地址: http://m.acea2.store/blog/629221.SHTML

本文最后 发布于2026-04-22 21:31:59,已经过了5天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 夜猫子 1 天前
    文章结构清晰,从问题到原理再到实践,非常适合学习!
  • 榴莲控 3 天前
    讲的太透彻了,一下子就理解了Attention机制的原理!
  • 修仙党 3 天前
    请问一下,Multi-Head Attention中的head数量一般设置为多少比较合适?