马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Transformer 先容
Transformer 是当代人工智能天生内容(AIGC)范畴,尤其是自然语言处置惩罚(NLP)和盘算机视觉(CV)中的核心模子架构。它由 Vaswani 等人在 2017 年论文《Attention is All You Need》中提出,彻底改变了深度学习的范式,驱动了 ChatGPT、BERT、DALL·E 等前沿应用的诞生。
一. Transformer 的背景与意义
在 Transformer 出现之前,NLP 任务主要依赖循环神经网络(RNN)及其变种(如 LSTM 和 GRU)。这些模子按序次处置惩罚数据,存在以下问题:
- 盘算效率低:序列处置惩罚无法并行化,练习大规模数据耗时。
- 长间隔依赖问题:RNN 难以捕获句子中远间隔单词之间的关系(如“本日天气很好,所以我决定……去公园”中的“天气”和“公园”)。
Transformer 引入了 注意力机制(Attention),完全摒弃了 RNN 的序列处置惩罚方式,依靠 自注意力(Self-Attention) 捕获序列中恣意两个位置的关系。这使得 Transformer:
- 高效:支持并行盘算,适合 GPU/TPU 加速。
- 强大:能捕获长间隔依赖,性能远超 RNN。
- 通用:不但实用于 NLP,还扩展到图像、音频等多模态任务。
二. Transformer 的核心架构
Transformer 是一个基于编码器-解码器(Encoder-Decoder)结构的模子,常用于序列到序列(Seq2Seq)任务(如机器翻译)。它的架构可以分为以下几个关键部分:
2.1 输入嵌入(Input Embedding)
- 作用:将输入的单词(或子词、token)转化为固定维度的向量。
- 细节:
- 利用词嵌入(如 Word2Vec 或随机初始化的嵌入矩阵)。
- 为了让模子区分单词的位置,加入位置编码(Positional Encoding),因为 Transformer 不像 RNN 那样有自然的序列序次。
- 位置编码可以是固定的(如正弦/余弦函数)或可学习的参数。
2.2 编码器(Encoder)
- 构成:由 N 层(通常 6 层或更多)相同的编码器模块堆叠而成,每一层包含:
- 多头自注意力机制(Multi-Head Self-Attention):
- 盘算输入序列中每个 token 与其他 token 的关系。
- “多头”表现并行盘算多个注意力分布,捕获不同语义关系。
- 前馈神经网络(Feed-Forward Neural Network, FFN):
- 对每个 token 的表现进行非线性变换。
- 通常是两层全连接网络,中间有激活函数(如 ReLU 或 GELU)。
- 残差连接与层归一化(Add & Norm):
- 每子层(自注意力和 FFN)后添加残差连接(输入与输出相加)。
- 利用层归一化(Layer Normalization)稳定练习。
- 作用:将输入序列编码为上下文相关的表现。
2.3 解码器(Decoder)
- 构成:同样由 N 层解码器模块构成,每一层包含:
- 掩码多头自注意力(Masked Multi-Head Self-Attention):
- 为了防止“看到将来”,解码时只关注当前及之前的 token(常用于自回归天生)。
- 多头注意力(Encoder-Decoder Attention):
- 解码器关注编码器的输出,捕获输入与输出之间的关系。
- 前馈神经网络(FFN):
- 残差连接与层归一化:
- 作用:根据编码器的输出和当前天生的内容,逐步天生目标序列。
2.4 输出层
- 作用:将解码器的输出转化为终极预测(如单词概率分布)。
- 细节:
- 利用线性层将解码器输出映射到词汇表巨细。
- 应用 Softmax 函数得到每个 token 的概率。
三. 核心机制:注意力机制(Attention)
注意力机制是 Transformer 的灵魂,尤其是 自注意力(Self-Attention)。以下是它的原理和实现:
3.1 自注意力的盘算
- 输入:一个序列的嵌入向量(如单词的向量表现)。
- 步骤:
- 天生查询、键、值(Query, Key, Value):
- 对每个 token 的向量,通过线性变换天生三个向量:Q(查询)、K(键)、V(值)。
- 假设输入向量维度为 (d_{model}),则 Q、K、V 的维度通常也是 (d_{model})。
- 盘算注意力分数:
- 通过点积盘算 Q 和 K 的相似度: Score = Q ⋅ K T \text{Score} = Q \cdot K^T Score=Q⋅KT。
- 为了避免数值过大,缩放点积: Scaled Score = Q ⋅ K T d k \text{Scaled Score} = \frac{Q \cdot K^T}{\sqrt{d_k}} Scaled Score=dk Q⋅KT,其中 d k d_k dk是 K 的维度。
- 应用 Softmax 得到注意力权重: Attention Weights = Softmax ( Scaled Score ) \text{Attention Weights} = \text{Softmax}(\text{Scaled Score}) Attention Weights=Softmax(Scaled Score)。
- 加权求和:
- 用注意力权重对 V 进行加权求和: Attention ( Q , K , V ) = Attention Weights ⋅ V \text{Attention}(Q, K, V) = \text{Attention Weights} \cdot V Attention(Q,K,V)=Attention Weights⋅V。
- 输出:每个 token 的新表现,融合了整个序列的上下文信息。
3.2 多头注意力(Multi-Head Attention)
- 原理:
- 将 Q、K、V 分成多个子空间(“头”),分别盘算自注意力。
- 每个头关注不同的语义或关系(如语法、语义、位置)。
- 末了将多头的输出拼接并通过线性变换整合。
- 优势:
- 加强模子表达本领,捕获复杂依赖关系。
- 类似卷积神经网络中的多通道。
3.3 掩码注意力(Masked Attention)
- 用途:在解码器中防止模子看到将来的 token。
- 实现:在盘算注意力分数时,将将来的位置置为负无穷(Softmax 后权重为 0)。
四. Transformer 的优势与局限
4.1 优势
- 并行化:不像 RNN 按序处置惩罚,Transformer 可以一次性处置惩罚整个序列,练习速度快。
- 长间隔依赖:自注意力机制能捕获恣意两个 token 之间的关系,适合长序列。
- 模块化:编码器和解码器可单独利用,机动性高。
- 通用性:实用于翻译、文本天生、图像处置惩罚(Vision Transformer)等任务。
4.2 局限
- 盘算复杂度高:
- 自注意力机制的复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n 是序列长度。
- 对于超长序列(如文档或高分辨率图像),内存需求大。
- 必要大量数据:
- Transformer 依赖大规模数据集和预练习(如 BERT、GPT)。
- 缺乏显式序列信息:
- 完全依赖位置编码,某些任务可能不如 RNN 直观。
五. Transformer 的变体与应用
Transformer 的提出催生了众多变体,广泛应用于 AIGC 范畴:
5.1 NLP 范畴的变体
- BERT(Bidirectional Encoder Representations from Transformers):
- 仅利用编码器,双向建模,适公道解任务(如文本分类、问答)。
- 通过掩码语言模子(MLM)预练习。
- GPT(Generative Pre-trained Transformer):
- 仅利用解码器,单向自回归天生,适合文本天生任务。
- GPT-3、ChatGPT 等是其代表。
- T5(Text-to-Text Transfer Transformer):
- 将全部 NLP 任务统一为文本到文本的格式,编码器-解码器结构。
5.2 视觉范畴的变体
- Vision Transformer (ViT):
- 将图像切分为小块(patch),像 token 一样输入 Transformer。
- 在图像分类、目标检测等范畴表现出色。
- Swin Transformer:
- 引入分层结构和局部注意力,优化盘算效率,适合高分辨率图像。
5.3 多模态范畴
- CLIP:结合 Transformer 处置惩罚图像和文本,实现跨模态任务。
- DALL·E:基于 Transformer 天生图像,广泛用于 AIGC 图像天生。
5.4 其他范畴
- AlphaCode:用于代码天生。
- Speech Transformer:语音识别和合成。
六. Transformer 在 AIGC 中的作用
在 AIGC(人工智能天生内容)范畴,Transformer 是核心技术:
- 文本天生:ChatGPT、Grok 等通过 Transformer 天生自然语言对话。
- 图像天生:DALL·E、Stable Diffusion 的埋伏空间建模依赖 Transformer 变体。
- 多模态天生:Sora(视频天生)等模子结合 Transformer 处置惩罚多模态数据。
- 个性化内容:推荐体系、创意写作、广告天生等都利用 Transformer 的强大建模本领。
七. Transformer 架构的深入剖析
为了更深入理解 Transformer,我们进一步拆解其核心组件,结合数学原理和代码实现。
7.1 输入处置惩罚:嵌入与位置编码
- 词嵌入(Word Embedding):
- 输入的 token 被映射为 d m o d e l d_{model} dmodel-维向量(常见值如 512 或 768)。
- 嵌入矩阵 E ∈ R ∣ V ∣ × d m o d e l E \in \mathbb{R}^{|V| \times d_{model}} E∈R∣V∣×dmodel(其中 ∣ V ∣ |V| ∣V∣ 是词汇表巨细)通过练习学习。
- 位置编码(Positional Encoding):
- Transformer 没有 RNN 的序列性,必须显式注入位置信息。
- 原始论文利用固定正弦/余弦函数:
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i / d m o d e l ) , P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i / d m o d e l ) PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i / d_{model}}}\right), \quad PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i / d_{model}}}\right) PE(pos,2i)=sin(100002i/dmodelpos),PE(pos,2i+1)=cos(100002i/dmodelpos)
其中 p o s pos pos 是 token 的位置, i i i是维度索引。
- 优点:固定函数支持恣意长序列,周期性便于捕获相对位置。
- 当代模子(如 RoPE)利用可学习的动态位置编码。
代码示例:位置编码实现
- import torch
- import torch.nn as nn
- import math
- class PositionalEncoding(nn.Module):
- def __init__(self, d_model, max_len=5000):
- super().__init__()
- pe = torch.zeros(max_len, d_model)
- position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
- div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
- pe[:, 0::2] = torch.sin(position * div_term)
- pe[:, 1::2] = torch.cos(position * div_term)
- pe = pe.unsqueeze(0) # Shape: (1, max_len, d_model)
- self.register_buffer('pe', pe)
- def forward(self, x):
- # x: (batch_size, seq_len, d_model)
- return x + self.pe[:, :x.size(1), :]
复制代码 7.2 编码器:多头自注意力与前馈网络
- 多头自注意力(Multi-Head Self-Attention):
- 每个头独立盘算注意力,公式为:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
- 多头机制:
- 输入向量分割为 h h h 个子空间( h h h 通常为 8 或 12)。
- 每个头的 Q h , K h , V h ∈ R d m o d e l / h Q_h, K_h, V_h \in \mathbb{R}^{d_{model}/h} Qh,Kh,Vh∈Rdmodel/h。
- 终极输出拼接并通过线性层:
[
\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O
]
- 缩放点积(Scaled Dot-Product)避免数值过大, d k \sqrt{d_k} dk 是键向量的维度。
- 前馈网络(FFN):
- 每层编码器对每个 token 独立应用:
FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2
- W 1 ∈ R d m o d e l × d f f W_1 \in \mathbb{R}^{d_{model} \times d_{ff}} W1∈Rdmodel×dff, W 2 ∈ R d f f × d m o d e l W_2 \in \mathbb{R}^{d_{ff} \times d_{model}} W2∈Rdff×dmodel, d f f d_{ff} dff 通常是 d model d_{\text{model}} dmodel 的 4 倍(如 2048)。
- 残差连接与层归一化:
- 残差连接: x + Sublayer ( x ) x + \text{Sublayer}(x) x+Sublayer(x)。
- 层归一化:
LayerNorm ( x ) = x − μ σ 2 + ϵ ⋅ γ + β \text{LayerNorm}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta LayerNorm(x)=σ2+ϵ x−μ⋅γ+β
其中 μ , σ \mu, \sigma μ,σ 是均值和方差, γ , β \gamma, \beta γ,β 是可学习参数。
代码示例:多头自注意力
- class MultiHeadAttention(nn.Module):
- def __init__(self, d_model, num_heads):
- super().__init__()
- assert d_model % num_heads == 0
- self.d_k = d_model // num_heads
- self.num_heads = num_heads
- self.q_linear = nn.Linear(d_model, d_model)
- self.k_linear = nn.Linear(d_model, d_model)
- self.v_linear = nn.Linear(d_model, d_model)
- self.out_linear = nn.Linear(d_model, d_model)
- def forward(self, q, k, v, mask=None):
- batch_size = q.size(0)
- # Linear transformations and split into heads
- q = self.q_linear(q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
- k = self.k_linear(k).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
- v = self.v_linear(v).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
- # Scaled dot-product attention
- scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
- if mask is not None:
- scores = scores.masked_fill(mask == 0, -1e9)
- attn = torch.softmax(scores, dim=-1)
- context = torch.matmul(attn, v)
- # Concatenate heads and project
- context = context.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k)
- return self.out_linear(context)
复制代码 7.3 解码器:掩码注意力与交织注意力
- 掩码自注意力:
- 确保天生第 t t t个 token 时,只关注前 t − 1 t-1 t−1 个 token。
- 通过上三角掩码实现:
mask i , j = { 1 , if j ≤ i 0 , otherwise \text{mask}_{i,j} = \begin{cases} 1, & \text{if } j \leq i \\ 0, & \text{otherwise} \end{cases} maski,j={1,0,if j≤iotherwise
- 交织注意力(Encoder-Decoder Attention):
- 解码器的 Q Q Q来自解码器自身, K , V K, V K,V 来自编码器输出。
- 允许解码器关注输入序列的上下文。
- FFN 和归一化:与编码器划一。
代码示例:Simple Transformer Model
- class Transformer(nn.Module):
- def __init__(self, d_model, num_heads, num_layers, d_ff):
- super().__init__()
- self.encoder_layers = nn.ModuleList([
- nn.ModuleDict({
- 'mha': MultiHeadAttention(d_model, num_heads),
- 'ffn': nn.Sequential(nn.Linear(d_model, d_ff), nn.ReLU(), nn.Linear(d_ff, d_model)),
- 'norm1': nn.LayerNorm(d_model),
- 'norm2': nn.LayerNorm(d_model)
- }) for _ in range(num_layers)
- ])
- self.pos_encoder = PositionalEncoding(d_model)
- def forward(self, src, mask=None):
- src = self.pos_encoder(src)
- for layer in self.encoder_layers:
- attn_output = layer['mha'](src, src, src, mask)
- src = layer['norm1'](src + attn_output)
- ffn_output = layer['ffn'](src)
- src = layer['norm2'](src + ffn_output)
- return src
复制代码 八. 数学与优化细节
8.1 注意力机制的数学推导
- 点积注意力:
- 假设输入 X ∈ R n × d m o d e l X \in \mathbb{R}^{n \times d_{model}} X∈Rn×dmodel,其中 (n) 是序列长度。
- 通过线性变换天生:
Q = X W Q , K = X W K , V = X W V Q = XW_Q, \quad K = XW_K, \quad V = XW_V Q=XWQ,K=XWK,V=XWV
其中 W Q , W K , W V ∈ R d model × d k W_Q, W_K, W_V \in \mathbb{R}^{d_{\text{model}} \times d_k} WQ,WK,WV∈Rdmodel×dk。
- 注意力分数:
A = softmax ( Q K T d k ) ∈ R n × n A = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) \in \mathbb{R}^{n \times n} A=softmax(dk QKT)∈Rn×n
- 输出:
Z = A V ∈ R n × d v Z = AV \in \mathbb{R}^{n \times d_v} Z=AV∈Rn×dv
- 多头扩展:
- 每个头盘算:
head i = Attention ( X W Q i , X W K i , X W V i ) \text{head}_i = \text{Attention}(XW_{Q_i}, XW_{K_i}, XW_{V_i}) headi=Attention(XWQi,XWKi,XWVi)
- 拼接:
Z = Concat ( head 1 , … , head h ) W O Z = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O Z=Concat(head1,…,headh)WO
8.2 盘算复杂度
- 自注意力: O ( n 2 ⋅ d model ) O(n^2 \cdot d_{\text{model}}) O(n2⋅dmodel),因盘算 Q K T QK^T QKT必要 n × n n \times n n×n 次操纵。
- 前馈神经网络(FFN): O ( n ⋅ d model ⋅ d f f ) O(n \cdot d_{\text{model}} \cdot d_{ff}) O(n⋅dmodel⋅dff),对每个 token 独立盘算。
- 优化方向:
- 希罕注意力(比方,Longformer):将 n 2 n^2 n2 的复杂度降低到 O ( n ⋅ k ) O(n \cdot k) O(n⋅k)。
- 线性注意力(比方,Performer):利用核方法进行近似,将复杂度降低到 O ( n ) O(n) O(n)。
- FlashAttention:优化 GPU 内存访问,加快练习速度。
8.3 练习与正则化
- Dropout:应用于注意力权重和前馈神经网络(通常为 0.1)以防止过拟合。
- 学习率预热:最初线性增加学习率,以使大型模子的练习更加稳定。
- 标签平滑:避免预测时过分自信,进步模子的泛化本领。
九. 人工智能天生内容(AIGC)中的 Transformer:优化与扩展
在人工智能天生内容(AIGC)范畴,Transformer 已进行了大量优化,以处置惩罚天生任务:
9.1 预练习与微调
- 预练习:
- BERT:掩码语言模子(MLM)预测随机掩码的标记。
- GPT:自回归语言模子预测下一个标记。
- T5:具有多样化预练习任务的统一文本到文本框架。
- 微调:
- 针对特定任务(比方,对话、翻译)调整参数。
- 当代方法,如低秩适应(LoRA)微调低秩矩阵,节省盘算资源。
9.2 高效的 Transformer
- LLaMA(Meta AI):为研究目的进行了优化练习。
- Mistral:专家肴杂(MoE)结构动态选择子网络,降低推理本钱。
- FlashAttention-2:基于硬件的优化最小化内存利用。
9.3 多模态 Transformer
- CLIP:联合练习图像和文本的 Transformer,用于跨模态任务。
- DALL·E 3:将 Transformer 与扩散模子相结合,用于高质量图像天生。
- Sora:扩展 Transformer 用于视频天生,处置惩罚时间序列。
代码示例:简单的文本天生(基于解码器)
- class SimpleDecoder(nn.Module):
- def __init__(self, vocab_size, d_model, num_heads, num_layers):
- super().__init__()
- self.embedding = nn.Embedding(vocab_size, d_model)
- self.transformer = Transformer(d_model, num_heads, num_layers, d_ff=2048)
- self.output_layer = nn.Linear(d_model, vocab_size)
- def forward(self, tgt, mask=None):
- x = self.embedding(tgt)
- x = self.transformer(x, mask)
- return self.output_layer(x)
- # 用法示例
- vocab_size, d_model, num_heads, num_layers = 10000, 512, 8, 6
- model = SimpleDecoder(vocab_size, d_model, num_heads, num_layers)
- input_ids = torch.randint(0, vocab_size, (1, 10)) # 模拟输入
- logits = model(input_ids)
复制代码 十. 高级应用与挑战
10.1 人工智能天生内容(AIGC)中的挑战
- 天生划一性:在长文本或图像中保持逻辑连贯性。
- 盘算本钱:大型模子(比方,GPT-4)必要数十亿个参数,使得推理本钱高昂。
- 伦理问题:天生的内容可能涉及版权、偏差或错误信息。
10.2 优化方向
- 模子压缩:知识蒸馏(比方,DistilBERT)或量化(比方,INT8 推理)。
- 肴杂架构:将 Transformer 与卷积神经网络(CNNs)相结合(比方,ConvNeXt)以进步效率。
- 自适应盘算:动态调整盘算(比方,提前退出机制)。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|