One-Hot 编码介绍#
One-Hot 是早期 NLP 领域用来表示词向量的解决方案,现在已经不流行了。本篇我们来详细介绍一下 One-Hot 编码,并清晰地解释它和 Tokenizer 之间的关系。
1. 什么是 One-Hot 编码?#
One-Hot 编码是一种将分类变量表示为二进制向量的方法。这里的“分类变量”是指其值来自于一个有限的、不连续的集合(例如:“猫”、“狗”、“鸟”;“北京”、“上海”、“广州”)。
核心思想: 对于每一个可能的类别,我们都创建一个与类别总数长度相同的向量。在这个向量中:
- 只有一个位置是
1(“热”的)。 - 所有其他位置都是
0(“冷”的)。
这个“热”的位置就唯一地代表了该类别。
2. One-Hot 编码的工作原理#
假设我们有一个变量“动物”,它有三个可能的类别:猫、狗、鸟。
步骤1:定义词汇表
首先,我们列出所有可能的类别,形成一个词汇表。假设我们按字母顺序排列:
[猫, 狗, 鸟] -> 对应的索引为 [0, 1, 2]
步骤2:创建 One-Hot 向量 对于每一个类别,我们创建一个长度为 3(因为总共有 3 个类别)的向量。
- “猫”:在索引 0 的位置为 1。
[1, 0, 0]
- “狗”:在索引 1 的位置为 1。
[0, 1, 0]
- “鸟”:在索引 2 的位置为 1。
[0, 0, 1]
另一个例子:城市
词汇表:[北京, 上海, 广州, 深圳] -> 索引 [0, 1, 2, 3]
上海->[0, 1, 0, 0]深圳->[0, 0, 0, 1]
3. One-Hot 编码的优缺点#
优点:
- 解决类别无序性问题:对于很多机器学习算法,如果简单地将类别编码为整数(如
猫=0, 狗=1, 鸟=2),模型会错误地认为这些数字之间存在大小或顺序关系(鸟 > 狗 > 猫)。One-Hot 编码将所有类别放在平等的地位上,消除了这种潜在的误解。 - 简单直观:实现和理解起来都非常容易。
缺点:
- 维度灾难:如果类别数量非常多(比如有 10,000 个不同的单词),那么 One-Hot 向量的维度就会非常高(10,000 维)。这会导致计算和存储成本急剧上升。
- 向量稀疏:生成的向量中几乎全是 0,只有一个 1。这种高稀疏性会浪费大量内存,且对于某些模型来说信息密度很低。
- 无法表达语义关系:从向量本身来看,
[1,0,0](猫)、[0,1,0](狗)和[0,0,1](鸟)之间的“距离”是相等的(例如,计算余弦相似度都为 0)。这意味着它无法表达“猫和狗都是哺乳动物”这种语义上的相似性。
4. One-Hot 编码与 Tokenizer 的关系#
现在我们来回答核心问题:One-Hot 编码和 Tokenizer 有关系吗?
答案是:有密切的、前后承接的关系,但它们在 NLP 流水线中扮演着完全不同的角色。
你可以将它们理解为 “上下游” 的关系:
第一步:Tokenizer(分词器)
- 任务:将原始文本转换成令牌。
- 输入:一个字符串。例如:
“I love cats.” - 输出:一个令牌列表。例如(使用一个简单的词汇表
{“I”: 0, “love”: 1, “cat”: 2, “s”: 3, “.”: 4}):[“I”, “love”, “cat”, “s”, “.”]-> 对应的 ID 是[0, 1, 2, 3, 4]
- 作用:Tokenizer 完成了从人类可读的文本到模型可处理的离散符号(ID) 的转换。
第二步:One-Hot 编码(或更现代的替代品)
- 任务:将令牌 ID 转换成数值向量。
- 输入:Tokenizer 输出的 ID 列表。例如:
[0, 1, 2, 3, 4] - 输出:一个向量序列。
- 对于 ID
0(“I”):[1, 0, 0, 0, 0](假设词汇表大小为5) - 对于 ID
1(“love”):[0, 1, 0, 0, 0] - 对于 ID
2(“cat”):[0, 0, 1, 0, 0] - … 以此类推。
- 对于 ID
- 作用:将离散的符号转换为一种数值表示形式,以便输入给数学模型(如神经网络)。
它们的关系可以类比为:
- Tokenizer 像是编译器的“词法分析器”,它把源代码(文本)拆分成一个个单词(令牌)。
- One-Hot 编码像是给每个单词分配一个唯一的“座位号”(一个超大的、只有一个座位的礼堂),但这个座位号体系非常低效。
5. 在现代 NLP 中的演变#
虽然 One-Hot 编码在概念上非常重要,并且是理解词表示的基础,但它几乎不再被用于现代深度学习模型中了。
为什么? 正如缺点中提到的,当词汇表达到 5万、10万 甚至更大时,使用 5万维的稀疏向量在计算上是不可行的。
现代替代方案:嵌入层
取而代之的是 “嵌入层”。
- 工作原理:嵌入层是一个可学习的查找表。它将每个令牌 ID(比如
2代表 “cat”)映射到一个低维、稠密的向量中(比如 300 维或 768 维)。 - 输入:Tokenizer 输出的 ID 列表
[0, 1, 2, 3, 4] - 输出:一个稠密向量序列。
- 对于 ID
2(“cat”),不再是[0,0,1,0,0,...](50000维),而可能是[0.2, -0.5, 0.8, ..., 0.1](300维)。
- 对于 ID
- 巨大优势:
- 维度大幅降低:从数万维降到几百维,计算效率极高。
- 蕴含语义信息:这些稠密向量是通过模型在海量数据上学习得到的。语义相近的单词(如“猫”和“狗”),它们的向量在空间中的距离也会很近。这使得模型能够理解语言的内在规律。
总结#
| 特性 | One-Hot 编码 | Tokenizer |
|---|---|---|
| 角色 | 表示层 | 预处理层 |
| 输入 | 令牌 ID | 原始文本字符串 |
| 输出 | 高维稀疏二进制向量 | 令牌序列 / ID 序列 |
| 目的 | 将离散符号数值化 | 将文本拆分成离散符号 |
| 现代地位 | 概念基础,但极少直接使用 | 不可或缺的核心组件 |
一句话概括关系: Tokenizer 把文本变成数字 ID,而 One-Hot 编码是(在概念上)将这些 ID 转换成向量的一种古老且低效的方法,现已被更强大的嵌入层所取代。
One-Hot 与 Embedding 的关系#
One-Hot 编码 和 Embedding 都是为了解决同一个问题:如何将离散的符号(如单词)表示为计算机可以处理的数值形式。但它们采用了截然不同的哲学和方法。
我们可以用一个非常形象的比喻来理解它们的关系:
One-Hot 编码像是给每个单词分配一个唯一的、独立的“身份证号”(在一个超大的国家里),而 Embedding 则是为每个单词绘制一幅精细的“肖像画”,这幅画包含了它的性格、爱好、社会关系等所有特征。
下面我们从多个维度来详细对比它们的关系。
1. 概念对比:从“身份ID”到“特征肖像”#
| 特性 | One-Hot 编码 | Embedding |
|---|---|---|
| 核心思想 | 表示身份:用一个唯一的、独立的标识符来代表一个词。 | 表示特征:用一个低维的、稠密的向量来刻画一个词的语义和语法特征。 |
| 向量维度 | 高维:维度等于词汇表大小 V。例如,5万个词就是5万维。 | 低维:维度是固定的、较小的值 D。例如 300维、768维,与词汇表大小无关。 |
| 向量稀疏性 | 极度稀疏:向量中只有一个元素是1,其余全是0。 | 完全稠密:向量中每个元素都是一个有意义的实数(通常是浮点数)。 |
| 语义表达 | 无法表达语义:所有向量相互正交,点积为0。无法表示“猫”和“狗”之间的相似性。 | 可以捕捉语义:通过训练,语义相近的词(如“猫”和“狗”)在向量空间中的位置也很接近。 |
直观示例:
假设词汇表只有三个词:[国王, 王后, 苹果]
One-Hot 编码:
国王->[1, 0, 0]王后->[0, 1, 0]苹果->[0, 0, 1]- 从向量看,
国王和王后的距离,与国王和苹果的距离是相等的。这不符合我们的语言常识。
Embedding(假设我们学习到了一个2维向量):
国王->[0.8, 0.5]王后->[0.75, 0.6]苹果->[-0.1, -0.9]- 从向量看,
国王和王后的向量非常接近,而它们都与苹果相距甚远。这捕捉到了语义关系。
2. 技术实现关系:Embedding 是 One-Hot 的一个“智能压缩层”#
在神经网络的实现中,Embedding 层在数学上可以被看作是对 One-Hot 编码向量进行的一次高效线性变换。
这个过程是这样的:
- 输入:一个词的 Token ID(例如
“猫”的 ID 是253)。 - One-Hot 编码(概念上):模型在内部先将这个 ID 概念性地转换为一个 One-Hot 向量。
253->[0, 0, ..., 1, ..., 0](一个 50000 维的向量,只有第253位是1)。
- 嵌入层操作:嵌入层本质上是一个大小为
V x D的矩阵(查找表),其中 V 是词汇表大小,D 是嵌入维度。- 当这个 One-Hot 向量与嵌入矩阵相乘时,由于 One-Hot 向量只有一个1,这个矩阵乘法就退化成了一个简单的查找操作:直接取出嵌入矩阵的第
253行。
- 当这个 One-Hot 向量与嵌入矩阵相乘时,由于 One-Hot 向量只有一个1,这个矩阵乘法就退化成了一个简单的查找操作:直接取出嵌入矩阵的第
- 输出:得到的正是
“猫”词的 D 维嵌入向量。[0, 0, ..., 1, ..., 0](50000D) ×Embedding Matrix(50000x300) =猫的向量(300D)
所以,关键点在于:
- 我们从不需要实际在内存中创建那个巨大的、稀疏的 One-Hot 向量。
- 嵌入层通过一个查找表 高效地实现了从
ID到稠密向量的映射。 - 从概念上讲,Embedding 是 One-Hot 编码的“下一代”或“智能升级”。它解决了 One-Hot 编码的所有主要缺陷。
3. 为什么 Embedding 如此强大?#
Embedding 的强大之处在于,它的向量值不是预先设定好的,而是从数据中学习得到的。
在模型训练过程中,通过完成诸如“预测下一个词”或“判断句子相似性”等任务,模型会不断地调整嵌入矩阵中的数值。这个过程使得:
- 语义相似性:意思相近的词,它们的向量在空间中的方向也相近。
- 例如:
向量(快乐) ≈ 向量(高兴)
- 例如:
- 语义关系:词与词之间特定的关系可以通过向量运算来捕捉。
- 经典的例子:
向量(国王) - 向量(男人) + 向量(女人) ≈ 向量(王后) 向量(巴黎) - 向量(法国) + 向量(德国) ≈ 向量(柏林)
- 经典的例子:
- 上下文信息:像 BERT 这样的模型生成的嵌入是上下文相关的,同一个词在不同句子中会有不同的向量表示,从而包含了更丰富的语义信息。
- 例如:
“我今天要去银行取钱”和“这条河的南岸有一个银行”中的“银行”会有不同的嵌入向量。
- 例如:
总结:演进与替代关系#
| 方面 | One-Hot 编码 | Embedding |
|---|---|---|
| 历史角色 | 基石与概念起点:定义了如何将符号数值化。 | 现代标准与实践:建立在 One-Hot 概念之上的、更先进的表示方法。 |
| 关系本质 | 孤立的“身份证” | 富含信息的“肖像画” |
| 技术关系 | Embedding 在数学上可以视为对 One-Hot 向量的一个稠密化、降维的线性变换。 | |
| 现代应用 | 主要用于教学、概念理解,或在一些传统的机器学习模型(如逻辑回归)中处理类别特征。 | 所有深度学习 NLP 模型的标配和核心组件。 |
结论: One-Hot 编码是 Embedding 的“原始形态”和“概念前身”。在深度学习的背景下,Embedding 已经全面取代了 One-Hot 编码,因为它以一种计算高效的方式,将离散符号转化为了富含语义信息的稠密向量,从而为模型理解语言提供了强大的基础。