大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。
知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。
【专栏介绍】:
欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能!【大模型篇】更多阅读:
【大模型篇】万字长文从OpenAI到DeepSeek:大模型发展趋势及原理解读
【大模型篇】目前主流 AI 大模型体系全解析:架构、特点与应用
【大模型篇 】 Grok-3 与 DeepSeek 的技术架构与性能分析
【大模型篇】速读版DeepSeek核心技术解密:与 GPT-4、Claude、LLaMA 技术路线差异对比分析
==========本文分上中下篇,阅读时间约半小时 =========
==所有代码均能调试通=
零基础通关 Transformer 架构(上篇)
引子:为什么翻译软件突然会"读上下文"了?
一、 经典方法回顾
2016年你用谷歌翻译《哈利波特》中的句子:“The wizard who lived in the cupboard under the stairs for eleven years finally received his Hogwarts letter.”(在楼梯间碗柜里住了十一年的巫师终于收到了霍格沃茨来信),可能得到"住在楼梯下碗柜里十一年的魔术师终于收到了猪头酒吧来信"这样令人捧腹的错误。但在2017年后,翻译质量突然有了质的飞跃——这背后正是Transformer架构带来的革命性突破。
(图1:图:自2006年成立以来,Google翻译模型的BLEU得分。)
1.1 传统翻译模型的"记忆困境"
要理解Transformer的突破性,我们先看早期翻译系统的两大缺陷:
缺陷一:短时记忆综合征
传统循环神经网络(RNN, Recurrent Neural Network)就像逐字抄写的文员,处理长句子时会忘记开头内容。假设要翻译:
The scientist who proposed the theory of relativity in 1905, later awarded the Nobel Prize in 1921, revolutionized modern physics.
当翻译到"revolutionized"时,传统模型可能已忘记主语是"Einstein"还是"Newton"。
缺陷二:单线程思维局限
卷积神经网络(CNN, Convolutional Neural Network)虽然能并行处理,但像戴着固定尺寸眼镜看世界。当遇到俚语"raining cats and dogs"时,可能直译为"下猫狗雨"而不知其"倾盆大雨"的比喻义。
▼ 传统模型瓶颈对比表
模型类型 | 处理方式 | 优点 | 缺点 |
---|---|---|---|
RNN | 顺序处理 | 能捕捉序列关系 | 计算慢、易丢失长程信息 |
CNN | 局部窗口 | 并行计算 | 难以捕获全局依赖 |
1.2 破局者Transformer的三大创新
Google Brain团队在2017年论文《Attention Is All You Need》中提出全新架构,其核心创新点犹如给AI装上了"思维增强套装":
创新一:全局注意力透镜
每个单词都能与其他所有单词建立联系,如同在文字间架起高速公路。当处理"it"时,能自动关联到前文的主语。
创新二:并行计算引擎
抛弃顺序处理方式,像工厂流水线同时加工所有零件。处理100个单词的句子,速度比RNN快10倍以上。
创新三:位置感知系统
通过数学编码标记每个单词的位置,解决了并行计算带来的顺序混乱问题。即使打乱输入顺序,仍能正确理解语义。
python
import matplotlib.pyplot as plt
import numpy as np
# 定义函数来获取位置编码
def get_positional_encoding(max_len, d_model):
# 创建表示位置的数组,形状为(max_len, 1)
position = np.arange(max_len)[:, np.newaxis]
# 计算用于位置编码的除数项
div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
# 创建全零的位置编码数组,形状为(max_len, d_model)
pe = np.zeros((max_len, d_model))
# 对于偶数位置的编码,使用正弦函数计算
pe[:, 0::2] = np.sin(position * div_term)
# 对于奇数位置的编码,使用余弦函数计算
pe[:, 1::2] = np.cos(position * div_term)
# 返回位置编码
return pe
# 创建一个图形,设置图形大小
plt.figure(figsize=(10, 6))
# 绘制位置编码的热力图,使用'viridis'颜色映射
plt.imshow(get_positional_encoding(50, 128), cmap='viridis')
# 设置图形标题为"Positional Encoding Heatmap"
plt.title("Positional Encoding Heatmap")
# 设置x轴标签为"Embedding Dimension"
plt.xlabel("Embedding Dimension")
# 设置y轴标签为"Word Position"
plt.ylabel("Word Position")
# 添加颜色条
plt.colorbar()
# 显示图形
plt.show()
二、Transformer核心机制解密
2.1 自注意力机制:语言的量子纠缠
注意力公式的三重境界
基础版注意力公式:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
拆解说明:
- Q(Query) :当前处理的单词(如句子中的动词)
- K(Key) :所有单词的"身份证"
- V(Value) :单词的实际含义
- 缩放因子 d k \sqrt{d_k} dk:防止点积过大导致梯度消失
# 自注意力机制实现
import torch
import torch.nn.functional as F
# 定义缩放点积注意力函数
def scaled_dot_product_attention(q, k, v, mask=None):
# 计算查询(q)和键(k)的矩阵乘法,得到注意力分数矩阵
matmul_qk = torch.matmul(q, k.transpose(-2, -1))
# 获取键(k)的最后一个维度的大小,用于后续的缩放操作
dk = k.size()[-1]
# 对注意力分数进行缩放,除以键向量维度的平方根
scaled_attention = matmul_qk / torch.sqrt(torch.tensor(dk))
# 如果存在掩码(mask),用于在计算注意力时屏蔽某些位置
if mask is not None:
# 将掩码位置对应的注意力分数设置为极大负数,这样在后续的softmax操作中这些位置的概率会趋近于0
scaled_attention += (mask * -1e9)
# 对缩放后的注意力分数进行softmax操作,得到注意力权重
attention_weights = F.softmax(scaled_attention, dim=-1)
# 根据注意力权重和值(v)向量计算输出
output = torch.matmul(attention_weights, v)
# 返回计算得到的输出和注意力权重
return output, attention_weights
# 示例:3个单词,4维嵌入
# 随机生成查询向量,形状为(1, 3, 4),表示1个样本,3个单词,每个单词的嵌入维度为4
q = torch.rand(1, 3, 4)
# 随机生成键向量,形状为(1, 3, 4)
k = torch.rand(1, 3, 4)
# 随机生成值向量,形状为(1, 3, 4)
v =<