对计算机来说,“초파리”(果蝇)从一开始就是数字。每个字符都有一个规定好的编号(Unicode),这个编号以字节的形式存储。要把文本送进神经网络,需要把句子切分成词元(token),给每个词元编号,再把编号变成承载含义的向量(嵌入),并加上顺序信息。本页用一个只有 36 句的小型韩语语料库,亲手计算每一个步骤。
韩文音节编号 = 0xAC00 + (初声 × 21 + 中声) × 28 + 终声Unicode 标准第 3.12 节
按字符切分,词元会太多;按单词切分,又无法处理没见过的词。BPE 在语料库中反复把最常相邻出现的两个片段合并成一个,从而找到两者之间的折中。
BPE 合并 60 次后,把语料库中出现的词元收集起来就构成词表。每个词元都会得到词表中的格子编号。词表中没有的词元会得到“未知”编号。
编号 54 和 55 虽然相邻,但含义毫无关系。所以要给每个编号配上一个多维向量,目标是让用法相似的词拥有相近的坐标。这里用“在同一句中前后 ±2 个位置内共同出现的次数”,为 55 个词各做了一个 8 维向量。
“经常一起出现的词相似,含义也相似”这一想法由来已久。把词与文档的出现表用奇异值分解压缩、找出隐藏语义结构的潜在语义分析(LSA)是具有代表性的早期方法 [R2]。本页对词与词共同出现的次数表取 log(1 + 次数),再用特征值分解提取出 8 维。如今的语言模型则把嵌入作为“预测下一个词元”训练的一部分一起学习。第 5 节的位置信息也是加到这个向量上的。
如果把词元不分顺序地装进袋子里计数(词袋),顺序就消失了。韩语的助词会标明词的角色,所以语序改变时含义常常不变,但并非总是如此。
文本 → 词元 → 编号 → 向量(+位置)→ Transformer(3-8)→ 下一个词元的概率。最简单的语言模型只看前一个词来统计下一个词。我们用这个语料库亲手算一算,再看看 Transformer 多做了什么。
两段代码都只使用 Colab 默认安装的库。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
不借助库,计算 Unicode·UTF-8、韩文字母公式、BPE 的学习与应用、词元编号、由共现次数构成的嵌入,以及基于前一个词的概率。想换成自己的数据,就修改 CORPUS。
用实务中常用的库把句子转换成“句子 × 词元”矩阵,比较按词切分与按字符片段切分,并用 TF-IDF 和潜在语义分析查找相似的句子。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”时,所选代码会一并附在提示词后面。把〔 〕里的内容换成自己的情况即可。
AI 的回答只是起点。它提出的论文·数值·库函数务必对照原文和官方文档核实。如果在竞赛·论文中借助了 AI,请按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线相同的词典。整个系列使用统一的写法。点击章节名可跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。果蝇·大脑类比标注了强度。直接 有证据表明实际在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比失灵之处 |
|---|---|---|---|
| Unicode | 给全世界的字符分配的身份证号 | 无 | 编号只用于区分字符,并不能说明字符之间有多相似 |
| BPE | 把经常一起使用的词做成缩略语(“초파리”作为一个整体) | 无 | 缩略语是人根据含义创造的,而 BPE 只看次数来合并,也会产生与含义无关的片段 |
| 词元编号 | 图书馆藏书的索书号 | 无 | 索书号按主题聚在一起,而词元编号只是按字母顺序或出现顺序排列 |
| 嵌入 | 地图上的坐标:相邻的街区彼此相似 | 部分 果蝇的蘑菇体用多个凯尼恩细胞的激活模式(向量)来表示气味 | 蘑菇体把气味广泛分散开,使之容易区分(稀疏),而嵌入则把信息紧凑地装进几百维中。生成方法也不同 |
| 词袋 | 把句子剪成单词卡片装进信封 | 无 | 从信封里取出卡片,也无法知道原来的顺序。韩语中,助词卡片能提供部分线索 |
| 下一个词元的概率 | 在词语接龙中猜下一个词 | 部分 有研究表明,大脑也会预测接下来的语音 | 大脑的预测与含义、情境和身体经验交织在一起,而模型只靠字符片段的统计来计算 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片参考资料
这是面向讲师、实务 OJT 负责人和辅导老师的教学指南。时间为预估值,请根据实际课堂调整。
| 对象 | 想处理客户咨询、评论、文档等文本数据的大学生和从业者;好奇语言模型如何接收文本的人 |
|---|---|
| 先修知识 | 向量和余弦相似度的概念。了解 3-8 的位置信息会让第 5·6 节更容易理解 |
| 学习目标 | ① 说明字符 → Unicode → 字节的过程 ② 说明 BPE 构建词元词表的过程以及处理未见过的词的方法 ③ 说明编号、嵌入、位置信息各自为什么必要 |
| 预计时间 | 阅读 35~45 分钟 · 演示 20 分钟 · Colab 实践 25 分钟(代码 1 15 分钟,代码 2 10 分钟) |
导入 5 分钟(第 1 节 表情符号 4 字节)→ 第 2 节 BPE 15 分钟 → 第 3·4 节 15 分钟 → 第 5 节 dog bites man 5 分钟 → 第 6 节 5 分钟 → 检测题 5 分钟。
用本团队文档中的 30 句话构建语料库 15 分钟 → 修改代码 1 的 CORPUS,重新计算 BPE 和嵌入 30 分钟 → 用代码 2 查找相似的咨询 25 分钟 → 讨论“未知”词元与个人信息处理 20 分钟。
入门者只讲第 1·2·4 节。中级学员先手工做三次 BPE 合并(统计词频 → 找出最常见的组合),再与第 2 节的规则列表对照。
| 章节 | 停下来提问的问题 | 操作提示 |
|---|---|---|
| 1 Unicode | “字符数相同,为什么存储大小不同?” | 按韩语句子 → “Hello 초파리” → 表情符号句子的顺序 |
| 2 词元切分 | “为什么韩语词尾‘한다’最先被合并?” | 0 → 60 次,接着演示含未见过的词的句子 |
| 3 词元编号 | “54 号比 5 号大,这有意义吗?” | 在“AI가 꽃을 본다”(AI 看花)中指出“未知”词元 |
| 4 嵌入 | “从没教过‘昆虫’,为什么昆虫会聚在一起?” | 按 초파리는(果蝇)→ 신경망은(神经网络)的顺序比较邻居的性质 |
| 5 位置信息 | “韩语语序很自由,为什么还需要位置信息?” | 依次点击三种比较 |
| 6 模型处理 | “只看前一个词的模型有什么弱点?” | 比较“초파리는”(果蝇)和“꿀벌은”(蜜蜂)的概率 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 词元 = 单词 | 词元是由语料库决定的片段,可能是字符,可能是单词,也可能介于两者之间 | 第 2 节 |
| 一个韩文字符占 1 字节 | 在 UTF-8 中,韩文音节占 3 字节 | 第 1 节 |
| 词元编号相近,含义也相近 | 编号只是词表中的格子位置,含义装在嵌入里 | 第 3·4 节 |
| 嵌入相近就是同义词 | 经常搭配使用的词也会变得相近。“相似”的含义取决于构建方法 | 第 4 节“신경망은” |
| 模型像人一样理解文本 | 模型用编号和向量计算下一个词元的概率。是否“理解”是另一个需要单独讨论的问题 | 第 6 节 |
0xAC00 + (0 × 21 + 0) × 28 + 1 = 0xAC01.
韩文 3 个字 × 3 + 空格 1 + 表情符号 4 = 14 字节。
对语料库中的所有单词,统计相邻两个片段组成的对,并按该单词出现的次数累加。把次数最多的对合并成一个。
按词切分时,它不在词表中,整个词变成“未知”。用 BPE 时,它会像 ["초파리", "들", "이"] 这样切成已知的片段。
两者都是 {dog:1, bites:1, man:1},完全相同。要区分顺序,需要位置信息。
在代码 1 的 CORPUS 中加入“나비는 꽃을 좋아한다”(蝴蝶喜欢花)和“나비는 날개가 있다”(蝴蝶有翅膀)后重新运行。查看与“나비는”(蝴蝶)最接近的词,并结合第 4 节的说明写出原因。
把代码 1 的 bpe_train 中的合并次数依次改为 10·30·60·100,把词表大小和每句平均词元数整理成表格。说明词表大小与词元数之间的权衡,并写出如果是业务文档会选哪个值及其依据。
| 入门者 | 第 1 节的字母公式和第 3 节即使跳过,也不会打断整体流程 |
|---|---|
| 进阶 | 让学员调查并比较 BPE 以外的其他词元切分方法(Unigram 语言模型、基于形态素分析器的方法)。所调查的论文要查阅原文确认 |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学综论)· STEP [K-Digital] 人工智能自然语言处理(与本篇直接相关)· STEP [K-Digital] 金融科技数据分析基础(与 3-6 相关) |
| 讲师用资料 | 检测题的评分标准和作业参考答案见 教师用答案页面(3-5) |
你已经读完了「3-5 文本」篇。研究室的成员们各用一句话为你总结。