摘要:本系列文章是原作者Rohit Patel的长篇雄文《Understanding LLMs from Scratch Using Middle School Math-A self-contained, full explanation to inner wor
专注LLM深度应用,关注我不迷路
本系列文章是原作者Rohit Patel的长篇雄文《Understanding LLMs from Scratch Using Middle School Math-A self-contained, full explanation to inner workings of an LLM》的深度学习与解读笔记。本篇是系列第五篇。我们强烈建议您在开始前阅读并理解前文)。
1. 一个简单的神经网络
2. 这些模型是如何被训练的?
3. 这些模型如何生成语言?
4. 嵌入(Embeddings)
5. 子词分词器(Sub-word Tokenizers)
6. 自注意力机制(Self-attention)
7. Softmax
8. 残差连接(Residual connections)
9. 层归一化(Layer Normalization)
10. Dropout
11. 多头注意力(Multi-head attention)
12. 位置嵌入(Positional embeddings)
13. GPT 架构
14. Transformer 架构
5
子词分词器
我们了解了嵌入就是把字符转化为一组多维数字(向量),以方便语言模型更好的处理,及捕捉语言的结构与语义。
但截至目前我们一直使用单个字符作为语言的基本构建块,这种方法有它的局限性:神经网络需要承担繁重的任务,它们需要理解一个字符序列(即单词)在彼此之间、以及与其他单词之间的关系。
如果不用字符而是直接为单词分配嵌入向量,让神经网络预测下一个单词会怎样呢?比如可以为每个单词(如“I”、“love”、“you”等)分配一个多维向量,然后将这些单词的向量输入神经网络,神经网络则负责预测下一个单词。这样会不会更好?
如果用“token”(相信你很熟悉这个词)来代表嵌入(即分配向量)的基本单位,那么之前模型使用单个字符作为token,现在我们则提出使用整个单词作为token。
让我们来细说这个问题。
先前的语言模型确实像牙牙学语的婴儿,以单个字符为单位学习。比如处理"cat"这个词,模型需要分别处理c、a、t三个字符的向量。这种方式看似简单,却让模型承担了过重的负担——它必须自行发现"c-a-t"组合起来代表猫,还要理解"c-a-t-s"中的s表示复数。
举个具体例子,当模型看到这两个句子时:
The cat sat on the mat.The cats ate the fish.如果用单个字符为单位处理,模型需要从零开始发现:
"cat"和"cats"共享前三个字符"sat"和"ate"都包含"at"但含义不同这种学习方式就像要求小学生通过笔画来理解文章主旨,效率极低。
现在尝试改用整词分词:为每个单词(如"cat"、"cats")分配独立向量。这显然可以大大简化学习任务!但也带来了新问题——比如英语有超过18万个单词,中文常用字词也超过大几万。想象一个需要管理10万种"文字基因"的模型,光是存储这些向量就要消耗海量资源!
更糟糕的是,整词分词割裂了词语间的天然联系。就像"猫"和"猫咪"在中文里明明有关联,模型却要当作完全不同的两个词来学习。这时,一个精妙的解决方案应运而生——子词分词。
子词分词的智慧,在于它像拼乐高一样拆解词语。比如:
"unhappy" → ["un", "happy"]"cats" → ["cat", "s"]"中文分词" → ["中", "文", "分", "词"](注:实际处理会更智能)这种拆解带来了三重优势:
共享零件,举一反三当模型学会"happy"表示开心,"un"表示否定,它就能自动理解"unhappy"、"unfriendly"等系列词汇,而不需要逐个记忆。这就像掌握"氵"偏旁后,能猜出"江""河""湖"都和水有关。应对生僻词
遇到"ChatGPT"这种新造词时,子词分词可以将其拆解为["Chat","G","P","T"],模型立即明白这与聊天程序相关。传统方法遇到新词就只能抓瞎。平衡效率与效果
主流子词分词器(如BERT用的WordPiece、GPT用的BPE)通常只保留3-5万个常用子词。对比整词分词的18万词库,存储量减少80%以上,却覆盖了更广泛的语言现象。
实际案例:
OpenAI的GPT-3使用BPE分词器后,即便面对网络俚语"LOLcats"也能游刃有余地拆解为["LOL","cat","s"],既理解这是搞笑猫图,又保持语法正确性。
一个优秀的分词器,就像语言模型的瑞士军刀,需要解决三大挑战:
1. 如何智能切割?
以"underground"为例,可能有多种切法:
分词器必须根据上下文选择正确拆分。这依赖统计学习:如果语料库中"under+ground"常一起出现,就优先保留这个组合。
2. 中文分词的特色
不同于英文的空格分隔,中文分词更具挑战。优秀的分词器要能区分:
这个过程就像制作压缩包——保留高频模式,舍弃低频组合,在压缩率与信息完整性间找到最佳平衡。
当我们把嵌入(embeddings)和子词分词(subword tokenization)结合起来,一个模型大体上可能是下面这样的,相比之前的区别是:
输入输出向量不再以单个字符来匹配生成,也不是以完整的单词(word)为单位,而是以子词(subword)为单位,这里的“单位”也就是我们熟知的“Token”。
从结绳记事到甲骨刻字,人类一直在寻找记录语言的最佳方式。子词分词器延续了这个古老智慧,用数字时代的密码本重新诠释语言本质。当我们将"人工智能"拆解为["人工","智能"]时,不仅为机器找到了理解语言的钥匙,也在提醒自己:最复杂的智慧,往往始于对基本元素的精妙组合。
理解了神经网络及语言模型的基础后,接下来的章节我们将开始涉及到那些让大语言模型(LLMs)具备如今这般强大能力的核心技术,敬请继续关注。
来源:AI大模型应用实践一点号