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)
Logits = X * W + b

  • 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)转换为一个合理的概率分布。这个分布清晰地表示了模型认为下一个词是词表中每个词的概率

$Softmax(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{V} e^{z_j}}$

  • $z_i$是 Logits 向量中第 i 个位置的分数。

  • $V$是词表大小(vocab_size)。

  • $e^{z_i}$(指数函数)确保所有值为正。

  • 分母是所有值的指数和,起到归一化的作用,确保总和为 1。

8、案例串讲

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐