独热编码能区分词,却看不出谁和谁像。
词嵌入,就是给每个词一张能比较远近的「语义地图坐标」。
词表很小,比如只有 4 个词:我、爱、苹果、香蕉。
两个向量几乎正交——内积是 0。机器会以为它们毫无关系,尽管都是水果。
分类牌 / 门牌号
能说「是谁」,不能说「像谁」
语义地图上的坐标
相近的词会聚在一起
把嵌入矩阵想成一本《词 → 密码》字典:每个词占一行,每行是一串小数(比如 4 个,真实常是 300 个)。
独热编码不是内容,只是地址:告诉电脑「翻到第几页」。翻出来的那一行小数,才是词嵌入。
苹果 = [0,0,1,0]
只负责定位
可训练的密码本
词数 × 维度
[0.2, −0.1, 0.5, …]
稠密语义坐标
词表:我、爱、苹果。嵌入维度先用 4(方便手算):
| 词 | 维1(示意) | 维2 | 维3 | 维4 |
|---|---|---|---|---|
| 我 | 0.1 | 0.4 | −0.2 | 0.3 |
| 爱 | 0.2 | −0.5 | 0.1 | 0.8 |
| 苹果 | 0.6 | 0.1 | 0.7 | −0.1 |
「爱」的独热是 [0, 1, 0]。点乘矩阵时:
直接「取第 i 行」不好求导;写成矩阵乘法,梯度能流回整本密码本,训练才能改数字。框架里的 nn.Embedding 底层其实是高效查表,但数学上等价于独热点乘。
语言学家说:You shall know a word by the company it keeps——看一个词常和谁一起出现,就知道它大概是什么意思。
「苹果」常挨着「吃、甜、水果」;「手机」常挨着「屏幕、充电」。词嵌入就是用数学把这种共现规律压进向量里。
密码本一开始全是乱数
根据上下文猜中间词(或反过来)
面临同类填空题的词,向量被拉近
训练时,它们经常出现在相似的「填空题」里(「__熟了」「吃__」)。猜错会改密码本里对应那一行;改来改去,两行数字就越来越像——空间距离就近了。
嵌入维度,就是每个词向量有多长。太短装不下细节,太长又贵又容易记噪声。
像只用「高矮胖瘦」形容人
苹果和香蕉可能挤成一团
业界常见平衡点
Word2Vec 经典是 300 维
参数暴增、易过拟合
算力和内存都更贵
维度是语义的放大镜:太低模糊,太高费钱。大众记住「几十到几百维的稠密小数」就够用了。
把嵌入矩阵想成一张全班同一套问卷:
同一坐标轴,不同得分
水果在这列都偏高
你的直觉很对:若处理不好,多列可能学成同一个特征。正常训练靠三件事拉开分工:
起点不同,打破对称;全零初始化才会必然「串」
不同词对同一列的正负压力互相拉扯,列变成通用标尺
语义角度很多时,各列会分工;维度过大反而可能冗余
你可以试试:点选一个词,看独热如何「取出」嵌入行;再选两个词比相似度;最后在二维地图上看谁和谁抱团。
下面的维度名(食物 / 科技…)只是教学示意;真实训练不会自动贴这种标签。
点乘嵌入矩阵后,取出的稠密向量:
轮流点选:一次定蓝色词 A,一次定橙色词 B(余弦相似度越接近 1 越像)。
下一步:点选词 A(蓝色)
把 4 维向量压到平面上看:水果、科技、王室会自然分堆。
能区分「是谁」,不能表达「像谁」;又高又稀。
低维稠密小数;相近的词在空间里抱团。
独热点乘嵌入矩阵,本质取出对应那一行。
列是全局标尺,行是词的独有得分;靠上下文练出来。