LLM 教程 4 —— 掌握 Transformer 模型和自注意力机制

  • 时间:2025-11-17 22:17 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:你将了解到两项改变自然语言处理(NLP)领域的重大技术:Transformer模型和自注意力机制。我们将一起探索它们如何用于语言建模——一项预测文本序列中下一个单词或词元的任务。1. 引言无论是机器翻译、文本摘要、文本生成还是语音识别,语言建模都扮演着核心角色。不过,传统的语言模型,像循环神经网络(RNN)和卷积神经网络(CNN),在处理长文本序列时显得力不从心。列如,RNN 容易遇到梯度消失或梯

LLM 教程 4 —— 掌握 Transformer 模型和自注意力机制

你将了解到两项改变自然语言处理(NLP)领域的重大技术:Transformer模型和自注意力机制。我们将一起探索它们如何用于语言建模——一项预测文本序列中下一个单词或词元的任务。

1. 引言

无论是机器翻译、文本摘要、文本生成还是语音识别,语言建模都扮演着核心角色。不过,传统的语言模型,像循环神经网络(RNN)和卷积神经网络(CNN),在处理长文本序列时显得力不从心。列如,RNN 容易遇到梯度消失或梯度爆炸的问题,使得它难以学习长期依赖关系;而 CNN 由于其固定的窗口大小,限制了它捕获全局上下文的能力。

Transformer模型 和 自注意力机制 采用了一种不同的方法,它们通过并行处理操作,能够捕捉序列中任意两个词元之间的关系,不管它们相隔多远。这使得它们能够更有效地学习单词之间的语义和语法关系。

本文中,我们会讲到:

  • Transformer架构 及其组成部分
  • 自注意力机制的工作原理
  • 多头注意力如何增强自注意力
  • 位置编码如何为输入添加位置信息
  • 编码器和解码器如何处理输入和输出序列
  • Transformer模型 的应用案例
  • Transformer模型面临的挑战和可能的解决方案

2. Transformer架构

Transformer模型 是由 Vaswani 等人在2017年提出的一种神经网络架构,专为处理序列到序列的任务设计,如机器翻译、文本摘要、文本生成等。Transformer模型 主要由两部分组成:编码器和解码器。编码器负责接收输入的词元序列并产生一系列隐藏状态,称为编码器输出;解码器则基于编码器的输出和目标词元序列来生成预测序列,即解码器输出。

与传统序列处理模型不同的是,Transformer 完全不依赖循环或卷积结构。它通过自注意力机制,使模型能够理解序列中任意两个词元间的联系,不论它们的距离有多远。此外,Transformer 通过位置编码来加入词元的位置信息,由于模型本身不具备识别顺序的能力。

相较于传统模型,Transformer 有诸多优点:它能并行处理序列,提高处理速度和扩展性;能更有效地捕捉词元间的长距离依赖,提高输出的质量和连贯性;并且能处理不同长度的输入输出序列,增强模型的灵活性和适用范围。

3. 自注意力机制

自注意力机制是 Transformer模型 的核心,使模型能够在不思考词元间距离的情况下,理解输入或输出序列中任意两个词元之间的关系。自注意力通过计算输入词元的加权和来工作,其中的权重由词元间的类似度或关联性决定。

简单来说,自注意力机制可以通过以下方式表述:

LLM 教程 4 —— 掌握 Transformer 模型和自注意力机制


将每个词元转换成查询(Q)、键(K)和值(V)三种形式的向量。模型通过计算查询向量与键向量的点积,来决定每个词元对其他词元的关注程度,然后这些关注度被用来加权相应的值向量,最终生成输出。

以句子 “The cat sat on the mat” 为例,如果我们想计算 “cat” 这个词元的自注意力输出,我们第一将每个词元映射为一个向量,然后通过自注意力机制计算,最终得到反映了整个句子上下文信息的 “cat” 的表明。

为了简化,我们假设查询、键和值矩阵是一样的,并且我们对向量使用以下值:

# 输入序列
    tokens = ["The", "cat", "sat", "on", "the", "mat"]


    # 嵌入向量
    vectors = [
        [0.1, 0.2, 0.3, 0.4], # The
        [0.5, 0.6, 0.7, 0.8], # cat
        [0.9, 1.0, 1.1, 1.2], # sat
        [1.3, 1.4, 1.5, 1.6], # on
        [1.7, 1.8, 1.9, 2.0], # the
        [2.1, 2.2, 2.3, 2.4]  # mat
    ]


    # 查询矩阵、键矩阵和值矩阵
    Q = K = V = [
        [0.1, 0.2, 0.3, 0.4], # The
        [0.5, 0.6, 0.7, 0.8], # cat
        [0.9, 1.0, 1.1, 1.2], # sat
        [1.3, 1.4, 1.5, 1.6], # on
        [1.7, 1.8, 1.9, 2.0], # the
        [2.1, 2.2, 2.3, 2.4]  # mat
    ]

要计算词元 “cat” 的自注意力输出,我们使用查询矩阵Q的第二行作为查询向量,并计算查询向量与键矩阵K的每一行的点积。这给我们以下的注意力分数:

# “cat” 的查询向量
    q = [0.5, 0.6, 0.7, 0.8]


    # 查询向量与每行键矩阵的点积 
    scores = [
        0.5 * 0.1 + 0.6 * 0.2 + 0.7 * 0.3 + 0.8 * 0.4, # The
        0.5 * 0.5 + 0.6 * 0.6 + 0.7 * 0.7 + 0.8 * 0.8, # cat
        0.5 * 0.9 + 0.6 * 1.0 + 0.7 * 1.1 + 0.8 * 1.2, # sat
        0.5 * 1.3 + 0.6 * 1.4 + 0.7 * 1.5 + 0.8 * 1.6, # on
        0.5 * 1.7 + 0.6 * 1.8 + 0.7 * 1.9 + 0.8 * 2.0, # the
        0.5 * 2.1 + 0.6 * 2.2 + 0.7 * 2.3 + 0.8 * 2.4  # mat
    ]


    # 注意力分数
    scores = [0.9, 2.2, 3.5, 4.8, 6.1, 7.4]

接下来,我们将注意力分数除以键的维度的平方根,这里是4。得到以下的缩放注意力分数:

# 键维度的平方根
    sqrt_dk = 2


    # 缩放注意力分数
    scaled_scores = [0.45, 1.1, 1.75, 2.4, 3.05, 3.7]

然后,我们对缩放注意力分数应用 softmax函数 来获得注意力权重。softmax函数 将分数标准化为概率分布,其中权重之和为1,分数越高,权重越高。这给我们以下的注意力权重:

# softmax函数
    def softmax(x):
        # 计算每个元素的指数 
        exp_x = [math.exp(e) for e in x]
        # 计算指数元素的和
        sum_exp_x = sum(exp_x)
        # 将每个元素除以和 
        return [e / sum_exp_x for e in exp_x]


    # 注意力权重
    weights = softmax(scaled_scores)


    # 注意力权重
    weights = [0.001, 0.004, 0.016, 0.054, 0.182, 0.743]

最后,我们将注意力权重与值矩阵 V 相乘以获得输出。输出是值向量的加权和,其中每个向量的权重由相应词元与查询词元的相关性或类似性决定。得到以下的输出:

# 输出
    output = [
        weights[0] * V[0][0] + weights[1] * V[1][0] + weights[2] * V[2][0] + weights[3] * V[3][0] + weights[4] * V[4][0] + weights[5] * V[5][0], # 第一个元素 
        weights[0] * V[0][1] + weights[1] * V[1][1] + weights[2] * V[2][1] + weights[3] * V[3][1] + weights[4] * V[4][1] + weights[5] * V[5][1], # 第二个元素
        weights[0] * V[0][2] + weights[1] * V[1][2] + weights[2] * V[2][2] + weights[3] * V[3][2] + weights[4] * V[4][2] + weights[5] * V[5][2], # 第三个元素
        weights[0] * V[0][3] + weights[1] * V[1][3] + weights[2] * V[2][3] + weights[3] * V[3][3] + weights[4] * V[4][3] + weights[5] * V[5][3]  # 第四个元素 
    ]


    # 输出
    output = [1.58, 1.68, 1.78, 1.88]

这是查询词元的注意力机制的最终输出。你可以对查询序列中的其他词元重复一样的过程,以获得完整的输出矩阵。

4. 多头注意力

多头注意力是自注意力机制的扩展,它允许模型同时从不同的表明子空间学习信息。通过将查询、键、值向量分割成多个较小的矩阵,称为头,然后分别进行自注意力计算,最后将所有头的输出合并起来。这样,模型不仅能够捕捉不同类型的信息,还能增强模型的学习能力和表达能力。多头注意力可以用以下公式表明:

LLM 教程 4 —— 掌握 Transformer 模型和自注意力机制


其中 h 是头的数量,WO、WiQ、WiK和WiV 分别是输出、查询、键和值的投影矩阵。投影矩阵是学习参数,允许模型将输入和输出向量投影到不同的子空间中。

多头注意力相比单头自注意力有几个优势。例如,多头注意力可以捕获词元之间不同的语义和句法关系,如主语-宾语、动词-宾语、名词-形容词等。多头注意力还可以增加模型的容量和表达性,由于它允许模型从输入和输出序列的多个表明中学习。多头注意力还可以提高模型的并行化和效率,由于它降低了每个头的维度,并允许模型并行处理头。

在 Transformer模型 中,多头注意力以三种不同的方式使用:编码器自注意力、解码器自注意力和编码器-解码器注意力。编码器自注意力允许编码器关注输入序列本身,解码器自注意力允许解码器关注输出序列本身,编码器-解码器注意力允许解码器关注编码器输出。这些不同类型的注意力协助模型更有效和准确地编码和解码输入和输出序列。

5. 位置编码

位置编码是一种技术,它将词元的位置信息添加到 Transformer模型 的输入中。位置编码是必要的,由于 Transformer模型 在其架构中不使用任何循环或卷积,因此没有任何固有的顺序或位置概念。位置编码协助模型学习输入或输出序列中词元的相对或绝对位置,这对于捕获词元之间的时间或空间关系很重大。

位置编码可以以不同的方式实现,例如使用学习的嵌入、正弦函数或相对位置。正弦位置编码是一种将词元的位置映射到一个大小为 dmodel 的向量的函数,其中 dmodel 是输入和输出向量的维度。正弦位置编码可以用以下公式表明:

LLM 教程 4 —— 掌握 Transformer 模型和自注意力机制


正弦位置编码可以用以下示例来说明。假设我们有一个输入序列由四个词元组成:“The cat sat on the mat”。我们想计算每个词元的位置编码。我们第一将每个词元嵌入到一个大小为 dmodel 的向量中,然后将位置编码向量添加到嵌入向量中。为了简化,我们假设 dmodel 是4,并且我们对嵌入向量使用以下值:

# 输入序列
    tokens = ["The", "cat", "sat", "on", "the", "mat"]


    # 嵌入向量
    vectors = [
        [0.1, 0.2, 0.3, 0.4], # The
        [0.5, 0.6, 0.7, 0.8], # cat
        [0.9, 1.0, 1.1, 1.2], # sat
        [1.3, 1.4, 1.5, 1.6], # on
        [1.7, 1.8, 1.9, 2.0], # the
        [2.1, 2.2, 2.3, 2.4]  # mat
    ]

为了计算每个词元的位置编码,我们使用正弦函数,其中位置和维度的值为:

# 每个词元的位置
    positions = [0, 1, 2, 3, 4, 5]


    # 每个向量的维度
    d_model = 4

得出一下的位置编码向量:

# 位置编码向量
    pe_vectors = [
        [0.0, 1.0, 0.0, 1.0], # PE(0, :)
        [0.84, 0.54, 0.09, 0.99], # PE(1, :)
        [0.91, -0.42, 0.18, 0.97], # PE(2, :)
        [0.14, -0.99, 0.27, 0.96], # PE(3, :)
        [-0.76, -0.65, 0.36, 0.94], # PE(4, :)
        [-0.96, 0.28, 0.45, 0.89]  # PE(5, :)
    ]

然后,我们将位置编码向量添加到嵌入向量中以获得每个词元的最终输入向量。得出以下的输入向量:

# 输入向量
    input_vectors = [
        [0.1, 1.2, 0.3, 1.4], # The + PE(0, :)
        [1.34, 1.14, 0.79, 1.79], # cat + PE(1, :)
        [1.81, 0.58, 1.28, 2.17], # sat + PE(2, :)
        [1.44, 0.41, 1.77, 2.56], # on + PE(3, :)
        [0.94, 1.15, 2.26, 2.94], # the + PE(4, :)
        [1.14, 2.48, 2.75, 3.29]  # mat + PE(5, :)
    ]

这些输入向量随后被送入 Transformer模型 的编码器,编码器使用多头注意力和其他组件来编码输入序列。

6. 编码器和解码器堆栈

编码器和解码器堆栈是处理输入和输出序列的 Transformer模型 的主要组件。编码器和解码器堆栈由多个层组成,每个层都有特定的功能和结构。编码器和解码器堆栈通过编码器-解码器注意力连接,这允许解码器关注编码器输出。

编码器堆栈由 N 个一样的层组成,其中 N 是一个超参数,决定了模型的深度。编码器堆栈的每个层有两个子层:一个多头自注意力子层和一个前馈神经网络子层。多头自注意力子层允许编码器关注输入序列本身,前馈神经网络子层对注意力子层的输出应用非线性变换。每个子层后面跟着一个残差连接和一个层归一化,这有助于稳定训练并避免梯度消失或爆炸问题。

解码器堆栈由 N 个一样的层组成,其中N与编码器堆栈一样。解码器堆栈的每个层有三个子层:一个遮蔽多头自注意力子层、一个编码器-解码器注意力子层和一个前馈神经网络子层。遮蔽多头自注意力子层允许解码器关注输出序列本身,但有一个遮蔽机制防止解码器关注未来的词元。编码器-解码器注意力子层允许解码器关注编码器输出,前馈神经网络子层对注意力子层的输出应用非线性变换。每个子层后面跟着一个残差连接和一个层归一化,与编码器堆栈一样。

编码器和解码器堆栈是 Transformer模型 的核心组件,它们编码和解码输入和输出序列。编码器和解码器堆栈使用多头注意力和位置编码来捕获词元的依赖关系和位置信息。编码器和解码器堆栈还使用残差连接和层归一化来改善模型的训练和性能。

7. Transformer模型 的应用

Transformer模型 是一种强劲且多才多艺的神经网络架构,可以应用于各种自然语言处理任务,如机器翻译、文本摘要、文本生成、语音识别等。Transformer模型 在许多基准测试和数据集上都取得了最先进的结果,并且激发了许多变种和扩展,如BERT、GPT、T5等。

Transformer模型 的一些应用示例包括:

  • 机器翻译:Transformer模型 可以将文本从一种语言翻译成另一种语言,通过编码源文本并解码目标文本来实现。可以处理多种语言和领域,并且能生成流畅且连贯的翻译。例如,谷歌翻译服务使用 Transformer模型 为超过100种语言提供快速准确的翻译。
  • 文本摘要:Transformer模型 可以将长文本摘要为更短的文本,通过从原始文本中提取或生成最重大的信息来实现。可以产生抽象或提取式的摘要,并且能适应不同的风格和格式。例如,PEGASUS模型 使用 Transformer模型 为各种领域和任务生成高质量的摘要,如新闻文章、科学论文、电子邮件等。
  • 文本生成:Transformer模型 可以从头开始或根据给定提示生成文本,通过学习文本的概率分布并从中采样来实现。可以生成逼真和多样的文本,并且可以控制文本的内容、风格和语气。例如,GPT-3模型使用 Transformer模型 为各种目的生成文本,如写作论文、创作故事、编写歌词等。
  • 语音识别:Transformer模型 可以从音频信号中识别语音,通过将音频信号转换为频谱图然后编码和解码来实现。可以处理噪声和复杂的语音,并且能以高准确度和速度将语音转录为文本。例如,Facebook 的 Wav2Vec 2.0模型 使用 Transformer模型 在几个语音识别基准测试中达到了最先进的结果,如LibriSpeech、Switchboard 和 Fisher。

这些只是Transformer模型的一些应用,还有更多的可能性和挑战,使用Transformer模型 进行自然语言处理。它是自然语言处理领域的一项突破和里程碑,它为研究和开发开辟了新的视野和机会。

8. Transformer模型 的挑战和局限

Transformer模型 是一种杰出且有影响力的神经网络架构,它彻底改变了自然语言处理领域。不过,它并不完美,它存在一些需要解决和克服的挑战和局限。其中一些挑战和局限包括:

  • 数据和计算需求:Transformer模型 需要大量的数据和计算资源来训练和微调。它有数百万或数十亿个参数,这使得它容易过拟合并且在小数据集或低资源数据集上表现不佳。Transformer模型 还消耗大量的内存和能源,这引发了环境和道德问题。例如,据估计,训练GPT-3模型产生了约284吨二氧化碳,相当于五辆普通汽车的终身排放量。
  • 可解释性和可说明性:Transformer模型 是一个黑盒,它会产生输出,但不会透露它产生输出的方式和缘由。它不会为其决策提供任何依据或推理,因此很难理解和信任它。也没有任何常识或世界知识,因此很容易产生无意义或矛盾的输出。例如,Transformer模型可能生成语法正确但语义或逻辑有缺陷的文本,如“A dog is a type of cat”或“I am a banana”。
  • 稳健性和泛化性:Transformer 模型对输入或任务的变化敏感且脆弱。它在面对嘈杂、对抗性或分布不均的数据时可能会失败或性能下降,这些数据可能包含拼写错误、错别字、俚语或生僻词。Transformer 模型 还可能难以适应或迁移到新的或不同的任务或领域,这些任务或领域可能需要不同的技能或知识例如,Transformer模型 可能在机器翻译上表现良好,但在文本摘要上表现不佳,反之亦然。
  • 安全性和公平性:Transformer 模型可能会生成有害或有偏见的输出,这可能会产生负面的社会和道德影响。Transformer 模型可能会生成具有攻击性、辱骂性、仇恨性或误导性的输出,这可能会伤害或误导用户或接收者。Transformer 模型还可能生成不公平、歧视性或刻板的输出,这可能会反映或放大数据或社会中的偏见或成见。例如,Transformer 模型可能会生成性别歧视、种族主义、恐同或仇外的输出,这可能会侵犯受影响群体的人权和尊严。

这些是 Transformer模型 的一些挑战和局限,还有更多需要探索和解决的问题。Transformer模型 是一种强劲且有前景的神经网络架构,但它也有一些缺点和风险需要思考和减轻。Transformer模型 不是万能药,需要改善和完善,以实现其全部潜力并造福社会。

9. 结论

在文中,您了解了 Transformer 模型和自注意力机制,这是近年来自然语言处理领域最重大的两项创新。您了解了 Transformer 模型和自注意力机制如何用于语言建模,即预测文本序列中的下一个单词或标记的任务。您还了解了 Transformer 架构及其组件的详细信息,例如自注意力机制、多头注意力、位置编码以及编码器和解码器堆栈。您还了解了 Transformer 模型的应用及其一些用例示例,例如机器翻译、文本摘要、文本生成和语音识别。您还了解了 Transformer 模型的挑战和局限性以及一些可能的解决方案。

Transformer 模型和自注意力机制是自然语言处理领域的突破和里程碑,为研究和发展开辟了新的视野和机遇。Transformer 模型和自注意力机制是强劲且通用的神经网络架构,可应用于各种自然语言处理任务,并在许多基准和数据集上取得了最先进的结果。Transformer 模型和自注意力机制也具有启发性和影响力,它们催生了许多变体和扩展,例如 BERT、GPT、T5 等。

如果您想了解有关 Transformer 模型和自注意力机制的更多信息,可以查看以下参考资料和资源:

  • Vaswani 等人最初介绍 Transformer 模型和自注意力机制的论文:[Attention Is All You Need] 。
  • Jay Alammar 撰写的教程通过插图和示例讲解了 Transformer 模型和自注意力机制:[The Illustrated Transformer]。
  • Lilian Weng 的一篇博文总结了 Transformer 模型以及其变体和扩展:[Transformer Neural Networks — Attention Mechanisms]。
  • Yannic Kilcher 制作的一段视频回顾了 Transformer 模型及其应用:[The Transformer: Attention is All You Need]。
  • Kyubyong Park 的 GitHub 在 TensorFlow 中实现 Transformer 模型的代码和数据:[Transformer]。


图片来源:Midjourney V6

prompt:AI is transforming industries across the globe

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Java lambda表达式用法介绍(2025-11-18 00:15)
【系统环境|】Java 函数式编程七: Lazy(2025-11-18 00:15)
【系统环境|】如何使用 C# 中的 Lambda 表达式(2025-11-18 00:14)
【系统环境|】不少Java程序员都觉得Lambda表达式很鸡肋,它到底有何用呢?(2025-11-18 00:14)
【系统环境|】英语网络非正规语言表达的自动识别与术语库构建(2025-11-18 00:13)
【系统环境|】COLING'22 | CogBERT:脑认知指导的预训练语言模型(2025-11-18 00:13)
【系统环境|】实战 | 基于序列标注的合同智能审核应用实践(2025-11-18 00:12)
【系统环境|】微软报告 Whisper Leak 侧信道攻击:能推断出人类与AI的对话内容(2025-11-18 00:12)
【系统环境|】用 Docker Compose 部署 Elasticsearch(ES)(2025-11-18 00:11)
【系统环境|】还不会Elasticsearch?看这些知识入门刚刚好(2025-11-18 00:11)
手机二维码手机访问领取大礼包
返回顶部