Transformers 架构自提出以来彻底改变了深度学习模型,特别是在自然语言处理领域。本文深入揭示 Transformer 背后的核心概念:注意力机制、编码器 - 解码器架构、多头注意力等,并通过 Python 代码片段展示其具体实现。
一、理解注意力机制
注意力机制是神经网络中一个迷人的概念,特别是在涉及 NLP 任务时。它就像给模型一个聚光灯,让它能够集中注意力在输入序列的某些部分,同时忽略其他部分,类似于人类理解句子时关注特定单词或短语的方式。
我们重点探讨一种特定类型的注意力机制——自注意力(Self-Attention),也称为内部注意力。当你阅读一句话时,大脑会自动突出显示重要的单词来理解意思。这就是自注意力的基本原理:使序列中的每个单词都能'关注'其他单词(包括自己),以更好地理解上下文。
二、自注意力是如何工作的?
以下是自注意力在一个简单示例中的工作原理:
1. 嵌入 (Embedding) 首先,模型将输入序列中的每个单词嵌入到一个高维向量表示中。这个嵌入过程允许模型捕捉单词之间的语义相似性。
2. 查询、键和值向量 (Query, Key, Value) 接下来,模型为序列中的每个单词计算三个向量:
- 查询向量 (Query):表示单词的查询,即模型在序列中寻找的内容。
- 键向量 (Key):表示单词的键,即序列中其他单词应该注意的内容。
- 值向量 (Value):表示单词的值,即单词对输出所贡献的信息。
3. 注意力分数 (Attention Scores) 一旦计算出 Q、K、V 向量,模型会为序列中的每一对单词计算注意力分数。这通常通过取查询向量和键向量的点积来实现,以评估单词之间的相似性。
4. SoftMax 归一化 然后,使用 softmax 函数对注意力分数进行归一化,以获得注意力权重。这些权重表示每个单词应该关注序列中其他单词的程度。注意力权重较高的单词被认为对正在执行的任务更为关键。
5. 加权求和 最后,使用注意力权重计算值向量的加权和。这产生了每个序列中单词的自注意力机制输出,捕获了来自其他单词的上下文信息。
下面是一个计算注意力分数的简单解释:
# 安装 PyTorch !pip install torch==2.2.1+cu121 # 导入库 import torch import torch.nn.functional as F # 示例输入序列 input_sequence = torch.tensor([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]]) # 生成 Key、Query 和 Value 矩阵的随机权重 random_weights_key = torch.randn(input_sequence.size(-1), input_sequence.size(-1)) random_weights_query = torch.randn(input_sequence.size(-1), input_sequence.size(-1)) random_weights_value = torch.randn(input_sequence.size(-1), input_sequence.size(-1)) # 计算 Key、Query 和 Value 矩阵 key = torch.matmul(input_sequence, random_weights_key) query = torch.matmul(input_sequence, random_weights_query) value = torch.matmul(input_sequence, random_weights_value) # 计算注意力分数 attention_scores = torch.matmul(query, key.T) / torch.sqrt(torch.tensor(query.size(-1), dtype=torch.float32)) # 使用 softmax 函数获得注意力权重 attention_weights = F.softmax(attention_scores, dim=-1) # 计算 Value 向量的加权和 output = torch.matmul(attention_weights, value) print("自注意力机制后的输出:") print(output)
三、Transformer 模型的基础
在我们深入探讨 Transformer 模型的复杂工作原理之前,让我们花点时间欣赏其开创性的架构。Transformer 模型通过引入围绕自注意力机制的新颖方法,重塑了自然语言处理(NLP)的格局。
1. 编码器 - 解码器架构 在 Transformer 的核心是其编码器 - 解码器架构——两个关键组件之间的共生关系,分别负责处理输入序列和生成输出序列。编码器和解码器中的每一层都包含相同的子层,包括自注意力机制和前馈网络。这种架构不仅有助于全面理解输入序列,而且能够生成上下文丰富的输出序列。


