大模型处理Token流程
Token
│
▼
Embedding
│
▼
Layer1
│
▼
Layer2
│
▼
...
│
▼
LayerNEmbedding——把文字变成计算机能够理解的向量
大语言模型本身并不认识:
Go
Rust
Python对于模型来说,这些只是字符串。
因此第一步就是:把 Token 转换成数字向量(Embedding)。
例如:
Go经过 Embedding 后,可能变成:
[0.21, -0.83, 1.52, ..., 0.44]这个向量可能有:
- 768 维
- 2048 维
- 4096 维
具体取决于模型。
这里的每一个数字都没有固定的人类意义,它们共同表示了这个 Token 的语义特征。
因此,Embedding 就是把离散的 Token 映射到连续的向量空间。这一步通常也叫:向量化。
Layer——不断加工这个向量
很多人第一次看到:
Layer1
↓
Layer2
↓
Layer3都会觉得:
为什么不直接算一次?
原因其实和人类思考问题很像。
假设一句话:
Go supports goroutines.第一次阅读时,我们可能只能知道:"Go" 是一个词。
再读一遍,知道:"goroutines" 和 "Go" 有关系。
继续分析,知道:"supports" 表示支持关系。
再进一步,理解:整句话是在描述 Go 的并发能力。
模型也是类似的。
每经过一层,它都会对当前向量进行进一步加工,让它包含更多、更丰富的语义信息。
因此,Layer 的作用并不是重新表示 Token,而是不断丰富 Token 的表示能力。
一层 Layer 里面到底做了什么?
虽然 Transformer Layer 内部有不少组件,但核心可以理解为两步。
第一部分:Attention
Attention 会回答一个问题:
当前 Token 应该关注哪些历史 Token?
例如:Go supports goroutines. ,计算:goroutines 时,模型可能会重点关注:Go ,而不是:supports 。
于是,Attention 会根据 Query、Key、Value,计算出 Attention Weight,然后融合其它 Token 的信息。
这一过程让模型能够理解:Token 与 Token 之间的关系。
第二部分:Feed Forward Network(FFN)
Attention 得到新的向量之后,并不会直接输出。还会经过一个前馈神经网络(Feed Forward Network)。
它可以理解成:对刚刚融合的信息进一步加工。
例如,Attention 已经知道:
Go
↓
goroutines关系很强。
FFN 则进一步提取:
- 是否属于编程语言?
- 是否与并发相关?
- 是否与上下文一致?
最终输出新的向量。
因此,一层 Layer 实际上就是:
输入向量
↓
Attention(理解上下文关系)
↓
FFN(提取更高层语义)
↓
输出新的向量为什么需要很多层?
你也许会有疑问:一层 Attention 不够吗?
实际上,不同层负责的信息并不一样。
虽然没有绝对界限,但大量研究发现:
前面的层更关注:
- 拼写
- 词法
- 局部关系
中间层开始理解:
- 短语
- 语法
- 句法结构
后面层逐渐形成:
- 语义
- 推理
- 知识关联
也就是说:模型是在不断"抽象"。
这和 CNN 很类似:
- 前几层识别边缘。
- 中间识别眼睛。
- 最后识别人脸。
Transformer 也是:每一层都建立在上一层的基础上,不断形成更高层次的语义表示。
RoLingG | 博客
评论(0)