在上一篇文章中,我们一口气介绍了LSTM、Word2Vec、GloVe、ELMo等四种模型的技术发展,以及每种模型的优缺点与应用场景,全文超过一万字,显得冗长且繁杂,在下文部分我们将分开介绍Transformer、BERT、GPT1/GPT2/GPT3/ChatGPT等模型的技术发展和相关应用场景等,本文将主要介绍Transformer模型。在整理AIGC系列的的文章内容时,根据成都深度智谷科技有限公司、深度人工智能教育机构的成老师提供的帮助,以及知识查询,完成了该系列目前的内容,后续内容还会继续寻求帮助持续更新。
Transformer(变压器模型)
Transformer模型是Vaswani等人于2017年发布的论文“Attention is All You Need”一文中提出的。Transformer是一种革命性的模型,它在自然语言处理(NLP)等任务上取得了巨大的成功,并在其他领域也得到了广泛应用。
Transformer模型的设计解决了传统循环神经网络(RNN)和卷积神经网络(CNN)在处理长序列数据时的一些限制。其中,最重要的特性是自注意力机制(Self-Attention)和多头注意力机制(Multi-Head Attention)。Transformer 模型通过自注意力机制(self-attention)来建立输入序列中不同位置之间的依赖关系,从而有效地捕捉序列中的长程依赖关系。
Transformer和以往的语言模型最大的区别就是在注意力和位置编码上的区别,并且消除了传统循环神经网络中的瓶颈,允许并行计算,从而加快了训练速度,并且能够更好地处理长序列数据。由于其出色的表现和高效的训练方式,Transformer成为了NLP任务中的主流模型,并对其他领域也产生了重要影响。

下面是对 Transformer 模型主要模块结构的概述:
1. 自注意力机制:
自注意力机制是一种基于注意力机制的技术,用于计算输入数据序列中每个位置与其他位置的相关性权重。这使得模型能够在无需固定窗口大小的情况下,动态地学习每个位置与其他位置的关联程度。

Transformer 模型中的自注意力机制(Self-Attention)是该模型的关键组成部分之一,用于捕捉输入序列中不同位置之间的相关性。自注意力机制通过计算查询(query)、键(key)和值(value)之间的相似度来动态地学习每个位置与其他位置的依赖关系。以下是自注意力机制的基本原理:
1.1. 查询、键和值:
- 对于给定的输入序列,自注意力机制使用线性变换将其映射为查询(Q)、键(K)和值(V)的表示。即输入数据中的每个序列根据计算自注意力的不同阶段,分别担任了查询向量(Q)、键向量(K)和值向量(V)
- 查询表示了需要关注的位置或内容,键表示序列中的所有位置,值表示每个位置的特征表示。

1.2. 相似度计算:
- 自注意力机制通过计算查询和键之间的相似度来确定每个查询与键的相关程度。常用的相似度计算方法是点积(Dot Product)或缩放的点积(Scaled Dot Product)。
- 相似度计算可以量化查询与键之间的关联性,从而为每个位置分配一个权重,用于加权求和值的表示。

1.3. 注意力权重:
- 相似度计算的结果经过 softmax 函数进行归一化,得到注意力权重。注意力权重表示了每个位置与其他位置的关联程度。

- 注意力权重决定了在值的表示中,每个位置对最终输出的贡献程度。
1.4. 加权求和:
- 将注意力权重与值进行加权求和,得到每个位置的加权表示。这样,模型可以根据查询的内容自动选择与之相关的键值对。

- 加权求和的结果即为自注意力机制的输出,它是基于整个输入序列的上下文感知的表示。
1.5. 多头注意力:
- 为了增加模型的表达能力和学习不同关注方面的能力,Transformer 模型采用了多头注意力机制。它通过将自注意力机制应用于多组不同的查询、键和值来进行并行计算。
- 每个注意力头都学习到了不同的查询关注点,从而提供了多个不同的注意力表示。最后,多头注意力的结果通过线性变换和拼接操作进行融合,得到最终的自注意力输出。

下面是基于深度学习框架Pytorch实现的多头自注意力的代码模块:
import torch
import torch.nn as nn
class MultiheadSelfAttention(nn.Module):
def __init__(self, d_model, num_heads):
super(MultiheadSelfAttention, self).__init__()
self.d_model = d_model # 模型向量的维度
self.num_heads = num_heads # 多头数量
# 定义Q、K、V的线性变换
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
# 定义输出线性变换
self.W_o = nn.Linear(d_model, d_model)
def forward(self, x):
# 获取输入的批次大小和序列长度
batch_size, seq_len, d_model = x.size()
# 通过线性变换得到Q、K、V
q = self.W_q(x)
k = self.W_k(x)
v = self.W_v(x)
#分成多头:将Q、K、V进行维度变换
q = q.view(batch_size * self.num_heads, seq_len, d_model // self.num_heads)
k = k.view(batch_size * self.num_heads, seq_len, d_model // self.num_heads)
v = v.view(batch_size * self.num_he
Transformer模型详解:自注意力、编码解码结构与位置编码

最低0.47元/天 解锁文章
9万+

被折叠的 条评论
为什么被折叠?



