Transformer架构基础理论
把一段文字,变成一组Token,这叫做词元化(Tokenization),也叫分词子词(subword)词元化,例如:"subword"这个词,可以拆分成"sub"和"word"两个子词"encoded"可以拆解为"encod"+"ed""encoding"可以拆解为“encod"+"ing'在OpenAl的官网上,1000Tokens大概是750个英文单词上下500个汉字上下,可以使用OpenA
1、Transformer 整个框架结构

2、Tokenization - 文本变成Token
2.1 词元化概念
概念:把一段文字,变成一组Token,这叫做词元化(Tokenization),也叫分词
子词(subword)词元化,例如:
"subword"这个词,可以拆分成"sub"和"word"两个子词
"encoded"可以拆解为"encod"+"ed"
"encoding"可以拆解为“encod"+"ing'
在OpenAl的官网上,1000Tokens大概是750个英文单词上下500个汉字上下,可以使用OpenAI开源的tiktoken尝试一下词元化的过程
链接:https://github.com/openai/tiktoken
import tiktoken
encoding = tiktoken.get_encoding("cl100k_base")
tokens = encoding.encode("海南麒麟瓜")
print(tokens) # 输出tokens的ID
print(len(tokens)) # 输出token数量
print(encoding.decode([56235, 59563, 165, 118, 240, 165, 118, 253, 163, 241, 250]))
print([encoding.decode_single_token_bytes(token) for token in [56235, 59563, 165, 118, 240, 165, 118, 253, 163, 241, 250]])
"""
前两个 token 对应完整汉字:
b'\xe6\xb5\xb7' 是汉字 "海" 的 UTF-8 编码。
b'\xe5\x8d\x97' 是汉字 "南" 的 UTF-8 编码。
后续 token 对应单个字节,这些字节是剩余汉字 "麒麟瓜" 的 UTF-8 编码片段:
"麒" 的 UTF-8 编码是 \xe9\xba\x92,但被拆成了三个 token: b'\xe9', b'\xba', b'\x92'。
"麟" 的 UTF-8 编码是 \xe9\xba\x9f,但被拆成了三个 token: b'\xe9', b'\xba', b'\x9f'。
"瓜" 的 UTF-8 编码是 \xe7\x93\x9c,但被拆成了三个 token: b'\xe7', b'\x93', b'\x9c'。
"""
输出结果:
2.2 Token词表
概念:Token 词表(Token Vocabulary) 是一个查找表或映射字典。它定义了 tokenizer(分词器)所能理解的所有基本单位(token),并为每一个单位分配一个唯一的整数编号,这个编号称为 token ID。
可以把它想象成一本巨大的“字典”:
-
键(Key):token ID(一个整数)
-
值(Value):token 所代表的一段文本(通常以字节形式存储)
Token就类似于字典,一个汉字可以词元化为一个或多个Token
2020年的GPT-3,Token词表:50257个Token
2023年的GPT-4,Token词表100256个Token
2024年的Llama3,Token词表:128000个Token
Token化非常有利于减少词表的数量(Token的总数少于文字的总数)
3、Embedding - Token变成向量
3.1 向量的概念和作用
1维向量:坐标[3],一维空间中的一个点
2维向量:坐标[2,5],二维空间中的一个点
3维向量:坐标[-1,4,-2.5 ],三维空间中的一个点
3.2 Embedding
概念:从技术角度来说,Embedding 是一种将高维稀疏的数据(如文本、图像、音频等)映射到低维稠密向量空间的技术。
专门把Token映射到新的数学空间
每个Token都能通过Embedding模型映射到新的数学空间中的一个点(向量)
4、Positional Encoding -在向量中加入位置信息
5、Encoder&Decoder-深度理解语义
6、Linear-生成“下一个字”的权重分布
6.1 Linear的概念和作用
Linear(线性层)是神经网络的一个基本组件。它充当一个“投影器”或“投票器”,任务是将解码器输出的、富含高维语义信息的向量,映射(投影)到整个目标词表(Vocabulary)所在的空间中。
-
输入:解码器最后一个层输出的向量序列。每个向量(例如维度是
d_model = 512
或768
)代表模型为下一个要生成的词所计算出的抽象表示。 -
输出:对于输入序列中的每一个位置,线性层都会输出一个长度等于词表大小(vocab_size) 的向量。这个向量中的每一个数值,代表了模型认为“下一个词是词表中对应词”的原始分数(Raw Score),也称为 Logits。
6.2 数学原理
从数学上讲,线性层做的就是一次仿射变换(Affine Transformation):
-
X
:输入向量,形状为[batch_size, seq_len, d_model]
。 -
W
:权重矩阵,形状为[d_model, vocab_size]
。这是线性层需要学习的参数。 -
b
:偏置向量,形状为[vocab_size]
。 -
Logits
:输出向量,形状为[batch_size, seq_len, vocab_size]
。
可以这样理解:权重矩阵 W
的每一列都可以看作目标词表中一个特定词的“模板向量”。线性层计算输入向量 X
和每一个“模板向量”的相似度(通过点乘),相似度越高,分数(Logit)就越高。偏置 b
则代表每个词固有的“偏好分”。
假设我们的目标词表只有 4 个词:["我", "爱", "苹果", <end>]
,模型维度 d_model=2
。
解码器为下一个词输出的抽象向量是 [0.5, 1.5]
。
线性层的权重矩阵 W
可能是:W = [[1.0, 0.5, -1.0, 2.0], # 对应 "我" 的模板
[0.5, 1.0, -0.5, 0.0]] # 对应 "爱" 的模板
(实际上模板向量是列向量,这里为方便理解按行写)
计算 Logits:"我" 的分数 = 0.5*1.0 + 1.5*0.5 = 0.5 + 0.75 = 1.25
"爱" 的分数 = 0.5*0.5 + 1.5*1.0 = 0.25 + 1.5 = 1.75
"苹果" 的分数 = 0.5*(-1.0) + 1.5*(-0.5) = -0.5 - 0.75 = -1.25
<end> 的分数 = 0.5*2.0 + 1.5*0.0 = 1.0 + 0 = 1.0
所以,输出的 Logits 向量是 [1.25, 1.75, -1.25, 1.0]
。模型认为下一个词是“爱”的可能性最高(1.75分),其次是“我”(1.25分)。
7、Softmax-将权重分布转换成概率分布
7.1 Softmax概念与功能
神经网络最后一层,Softmax 层的功能是将 Linear 层输出的原始分数(Logits)转换为一个合理的概率分布。这个分布清晰地表示了模型认为下一个词是词表中每个词的概率。
-
是 Logits 向量中第
i
个位置的分数。 -
是词表大小(vocab_size)。
-
(指数函数)确保所有值为正。
-
分母是所有值的指数和,起到归一化的作用,确保总和为 1。
8、案例串讲
更多推荐
所有评论(0)