
你将了解到两项改变自然语言处理(NLP)领域的重大技术:Transformer模型和自注意力机制。我们将一起探索它们如何用于语言建模——一项预测文本序列中下一个单词或词元的任务。
无论是机器翻译、文本摘要、文本生成还是语音识别,语言建模都扮演着核心角色。不过,传统的语言模型,像循环神经网络(RNN)和卷积神经网络(CNN),在处理长文本序列时显得力不从心。列如,RNN 容易遇到梯度消失或梯度爆炸的问题,使得它难以学习长期依赖关系;而 CNN 由于其固定的窗口大小,限制了它捕获全局上下文的能力。
Transformer模型 和 自注意力机制 采用了一种不同的方法,它们通过并行处理操作,能够捕捉序列中任意两个词元之间的关系,不管它们相隔多远。这使得它们能够更有效地学习单词之间的语义和语法关系。
本文中,我们会讲到:
Transformer模型 是由 Vaswani 等人在2017年提出的一种神经网络架构,专为处理序列到序列的任务设计,如机器翻译、文本摘要、文本生成等。Transformer模型 主要由两部分组成:编码器和解码器。编码器负责接收输入的词元序列并产生一系列隐藏状态,称为编码器输出;解码器则基于编码器的输出和目标词元序列来生成预测序列,即解码器输出。
与传统序列处理模型不同的是,Transformer 完全不依赖循环或卷积结构。它通过自注意力机制,使模型能够理解序列中任意两个词元间的联系,不论它们的距离有多远。此外,Transformer 通过位置编码来加入词元的位置信息,由于模型本身不具备识别顺序的能力。
相较于传统模型,Transformer 有诸多优点:它能并行处理序列,提高处理速度和扩展性;能更有效地捕捉词元间的长距离依赖,提高输出的质量和连贯性;并且能处理不同长度的输入输出序列,增强模型的灵活性和适用范围。
自注意力机制是 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]这是查询词元的注意力机制的最终输出。你可以对查询序列中的其他词元重复一样的过程,以获得完整的输出矩阵。
多头注意力是自注意力机制的扩展,它允许模型同时从不同的表明子空间学习信息。通过将查询、键、值向量分割成多个较小的矩阵,称为头,然后分别进行自注意力计算,最后将所有头的输出合并起来。这样,模型不仅能够捕捉不同类型的信息,还能增强模型的学习能力和表达能力。多头注意力可以用以下公式表明:

其中 h 是头的数量,WO、WiQ、WiK和WiV 分别是输出、查询、键和值的投影矩阵。投影矩阵是学习参数,允许模型将输入和输出向量投影到不同的子空间中。
多头注意力相比单头自注意力有几个优势。例如,多头注意力可以捕获词元之间不同的语义和句法关系,如主语-宾语、动词-宾语、名词-形容词等。多头注意力还可以增加模型的容量和表达性,由于它允许模型从输入和输出序列的多个表明中学习。多头注意力还可以提高模型的并行化和效率,由于它降低了每个头的维度,并允许模型并行处理头。
在 Transformer模型 中,多头注意力以三种不同的方式使用:编码器自注意力、解码器自注意力和编码器-解码器注意力。编码器自注意力允许编码器关注输入序列本身,解码器自注意力允许解码器关注输出序列本身,编码器-解码器注意力允许解码器关注编码器输出。这些不同类型的注意力协助模型更有效和准确地编码和解码输入和输出序列。
位置编码是一种技术,它将词元的位置信息添加到 Transformer模型 的输入中。位置编码是必要的,由于 Transformer模型 在其架构中不使用任何循环或卷积,因此没有任何固有的顺序或位置概念。位置编码协助模型学习输入或输出序列中词元的相对或绝对位置,这对于捕获词元之间的时间或空间关系很重大。
位置编码可以以不同的方式实现,例如使用学习的嵌入、正弦函数或相对位置。正弦位置编码是一种将词元的位置映射到一个大小为 dmodel 的向量的函数,其中 dmodel 是输入和输出向量的维度。正弦位置编码可以用以下公式表明:

正弦位置编码可以用以下示例来说明。假设我们有一个输入序列由四个词元组成:“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模型 的编码器,编码器使用多头注意力和其他组件来编码输入序列。
编码器和解码器堆栈是处理输入和输出序列的 Transformer模型 的主要组件。编码器和解码器堆栈由多个层组成,每个层都有特定的功能和结构。编码器和解码器堆栈通过编码器-解码器注意力连接,这允许解码器关注编码器输出。
编码器堆栈由 N 个一样的层组成,其中 N 是一个超参数,决定了模型的深度。编码器堆栈的每个层有两个子层:一个多头自注意力子层和一个前馈神经网络子层。多头自注意力子层允许编码器关注输入序列本身,前馈神经网络子层对注意力子层的输出应用非线性变换。每个子层后面跟着一个残差连接和一个层归一化,这有助于稳定训练并避免梯度消失或爆炸问题。
解码器堆栈由 N 个一样的层组成,其中N与编码器堆栈一样。解码器堆栈的每个层有三个子层:一个遮蔽多头自注意力子层、一个编码器-解码器注意力子层和一个前馈神经网络子层。遮蔽多头自注意力子层允许解码器关注输出序列本身,但有一个遮蔽机制防止解码器关注未来的词元。编码器-解码器注意力子层允许解码器关注编码器输出,前馈神经网络子层对注意力子层的输出应用非线性变换。每个子层后面跟着一个残差连接和一个层归一化,与编码器堆栈一样。
编码器和解码器堆栈是 Transformer模型 的核心组件,它们编码和解码输入和输出序列。编码器和解码器堆栈使用多头注意力和位置编码来捕获词元的依赖关系和位置信息。编码器和解码器堆栈还使用残差连接和层归一化来改善模型的训练和性能。
Transformer模型 是一种强劲且多才多艺的神经网络架构,可以应用于各种自然语言处理任务,如机器翻译、文本摘要、文本生成、语音识别等。Transformer模型 在许多基准测试和数据集上都取得了最先进的结果,并且激发了许多变种和扩展,如BERT、GPT、T5等。
Transformer模型 的一些应用示例包括:
这些只是Transformer模型的一些应用,还有更多的可能性和挑战,使用Transformer模型 进行自然语言处理。它是自然语言处理领域的一项突破和里程碑,它为研究和开发开辟了新的视野和机会。
Transformer模型 是一种杰出且有影响力的神经网络架构,它彻底改变了自然语言处理领域。不过,它并不完美,它存在一些需要解决和克服的挑战和局限。其中一些挑战和局限包括:
这些是 Transformer模型 的一些挑战和局限,还有更多需要探索和解决的问题。Transformer模型 是一种强劲且有前景的神经网络架构,但它也有一些缺点和风险需要思考和减轻。Transformer模型 不是万能药,需要改善和完善,以实现其全部潜力并造福社会。
在文中,您了解了 Transformer 模型和自注意力机制,这是近年来自然语言处理领域最重大的两项创新。您了解了 Transformer 模型和自注意力机制如何用于语言建模,即预测文本序列中的下一个单词或标记的任务。您还了解了 Transformer 架构及其组件的详细信息,例如自注意力机制、多头注意力、位置编码以及编码器和解码器堆栈。您还了解了 Transformer 模型的应用及其一些用例示例,例如机器翻译、文本摘要、文本生成和语音识别。您还了解了 Transformer 模型的挑战和局限性以及一些可能的解决方案。
Transformer 模型和自注意力机制是自然语言处理领域的突破和里程碑,为研究和发展开辟了新的视野和机遇。Transformer 模型和自注意力机制是强劲且通用的神经网络架构,可应用于各种自然语言处理任务,并在许多基准和数据集上取得了最先进的结果。Transformer 模型和自注意力机制也具有启发性和影响力,它们催生了许多变体和扩展,例如 BERT、GPT、T5 等。
如果您想了解有关 Transformer 模型和自注意力机制的更多信息,可以查看以下参考资料和资源:
图片来源:Midjourney V6
prompt:AI is transforming industries across the globe