【机器学习】(32)—— Embedding 串讲

文章目录

    • 1. 前面几篇分别讲了什么
    • 2. 表格场景
    • 3. 多维空间
    • 4. 向量来源
    • 5. 提交前检查
    • 6. 常见误区
    • 7. 和前面篇章关系
    • 8. 术语速查
    • 9. 延伸阅读
    • 10. 小结与下一主题

摘要:第 29~31 篇分别讲了为何需要 Embedding、嵌入空间里距离意味着什么,以及向量可以从哪些途径得到。本文不引入新公式,把这三篇串成可对照的备忘:什么时候上 Embedding、表格里怎么接、词表与维数注意什么,并预告下一主题——语言模型与更长上下文。


1. 前面几篇分别讲了什么

第 17 篇的 One-Hot 在词表较小时很合适。品牌、车型、用户 ID 这类水平很多时,稀疏向量会把后续全连接撑得很肥,也几乎表达不了「谁和谁更像」。Embedding 相关三篇补的就是这块。

篇次大概讲了什么
29One-Hot 在高基数下的问题;Embedding 查表与参数量
30嵌入空间、距离 / 余弦、任务依赖;静态嵌入及局限
31降维、联合训练、预训练;静态与上下文嵌入的差别

贯穿示例仍是汽车:品牌走离散 ID,重量与马力走数值特征,目标可以是油耗回归或是否高效。换了表示方式,划分、防泄漏和验证集选参的要求没有换。

若刚读完 29~31,本文可当复习;若手头正好有高基数类别要进模型,也可先对照第 5 节的核对项,再决定 One-Hot 还是 Embedding。


2. 表格场景

高基数类别接到预测模型时,一条常见路径是:

切分 train / val / test → 只在训练集上建词表(含 UNK 策略) → 品牌 ID → Embedding(d 维) → 与标准化后的数值特征拼接 → MLP / 线性层 → 油耗相关目标 → 用验证集选 d、正则、是否早停

与第 28 篇神经网络串讲相同的部分:先切分再fit;测试集少碰;类别不平衡时别只看准确率。

Embedding 多出来的部分:要决定词表与UNK、嵌入维d dd、以及多个类别字段时各用一张表再拼接。水平很少时,继续 One-Hot 往往更简单,不必为了「用上 Embedding」而用。

多个类别字段时(品牌、车身类型、销售区域等),常见做法是各自一张嵌入表,查出向量后与数值特征一起拼接。不必强行把所有离散字段塞进同一张超大表;字段语义不同,分开学通常更清楚,也便于对某一字段单独调d dd

One-HotEmbedding
向量长度V VVd ≪ V d\ll VdV
相似性输入里几乎看不出训练后可反映远近
更适合词表小词表大、且有监督信号
主要负担后续V × N V\times NV×N权重V × d V\times dV×d+ 后续d × N d\times Nd×N

3. 多维空间

第 30 篇的核心可以压成几条:

  • 每个类别是d dd维空间中的一个点
  • 欧氏距离或余弦刻画相对相似,没有跨任务通用的绝对阈值
  • 真实轴通常不能按「甜度」「价位」直接命名;教学用的 1D/2D 图只为直觉
  • 嵌入依赖任务:油耗任务下的近邻,不必等于「是否家用」任务下的近邻
  • 静态词嵌入一词一点,多义场景会不够用;上下文嵌入随句子变化

抽出嵌入表做近邻检查,适合发现「全挤成一团」或「邻居完全乱」这类异常,不能代替验证集上的业务指标。样本量小、品牌极多时,近邻本身也不稳定。

分析近邻时,前后使用的距离定义要一致:有的流程先把向量归一化再比余弦,有的直接比欧氏距离。尺度变了,数值阈值不能沿用。二维投影(若做了)只是观察工具,投影会损失信息,不能当成嵌入质量的最终证明。


4. 向量来源

路径何时更常考虑
降维(如 PCA)已有高维词袋 / 数值,需要压缩;或作对照基线
联合训练表格高基数 + 有标签;汽车品牌最常见起点
预训练再接入文本等有大规模语料;可冻结或微调

汽车品牌 ID:优先联合训练。只有车评等自由文本、且多义明显时,再考虑上下文嵌入或预训练语言模型。降维得到的坐标不一定贴合油耗损失,应用验证集与可学习 Embedding 比较,而不是默认 PCA 更好。

比较时尽量只改一项:同一划分、同一数值预处理、同一输出头,分别试 One-Hot、PCA 压缩与可学习 Embedding,再看验证集。这样更容易判断收益是否来自表示方式本身。


5. 提交前检查

[ ] 词表水平数已估计;很小则考虑 One-Hot,很大再上 Embedding [ ] 词表与 UNK 只在训练集确定;验证 / 测试只变换 [ ] 嵌入维 d 用验证集选过;不是盲目加大 [ ] 品牌嵌入与数值特征拼接方式正确 [ ] 验证损失与业务指标一起看;必要时做近邻抽查 [ ] 测试集未参与调 d / 调结构 [ ] (可选)与 One-Hot 或逻辑回归基线对比过

若验证集上 Embedding 并不比 One-Hot 更好,可以维持更简单的编码。表示方式是手段,指标才是目的。

d dd的试探范围不必一次拉得很开。汽车数据若只有数千行,可先在8 8816 161632 3232这类取值上比较;验证集没有明显差异时,优先选更小的d dd,减少过拟合与算力。嵌入表很大时,也可以对低频品牌并入UNK,避免大量只出现一两次的行占满容量。

概念示意:

emb=embedding_table[brand_id]# (batch, d)x=concat([emb,weight_scaled,hp_scaled],-1)y_hat=model(x)

6. 常见误区

情况说明
词表很小仍强行 Embedding收益有限,维护成本上升
全表先建词表再切分泄漏
把某一任务的嵌入当成通用品牌坐标换任务常需重训或微调
只看近邻好看,不看验证指标近邻是辅助
静态与上下文分不清静态一词一点;上下文随句而变
d dd越大越好过拟合与算力都会涨
有了 Embedding 就忽略输出头与划分第 27、28 篇的要求仍在

第 26 篇里非线性可分靠浅层网络,第 29 篇里高基数靠 Embedding,解决的是不同瓶颈:前者是决策边界形状,后者是离散输入的维数与相似性。两者可以同时出现在一个模型里——品牌嵌入后,仍可用带 ReLU 的隐藏层拟合更弯曲的油耗关系。


7. 和前面篇章关系

主题相关篇与 Embedding 的关系
类别词表与 One-Hot17词表小用 One-Hot;词表大再考虑嵌入
划分、泄漏、验证18、19、22词表与 UNK 必须训练集拟合
过拟合与早停21、26、28嵌入参数多,同样需要正则与早停
输出头27嵌入只改输入;分类 / 回归头规则不变
神经网络结构23~26嵌入向量当作普通稠密特征往后传

可以把 Embedding 看成输入侧的可学习编码层,而不是一套独立于专栏前半部分的新学科。旧纪律仍然约束新模块。例如:品牌嵌入训得再好,若输出层在互斥三分类上误用了多个独立 Sigmoid,优化目标仍然不对。

实践里也常见「先逻辑回归 + One-Hot 基线,再换 Embedding + 浅层 MLP」的对比。基线能说明任务难度与数据质量;若基线已经很好,上复杂表示的必要性会下降。


8. 术语速查

术语含义
高基数类别水平很多的离散特征
Embedding将离散 ID 映为d dd维稠密向量
嵌入空间这些向量所在的d dd维空间
静态嵌入每个词 / ID 全局一个向量
上下文嵌入同一词随上下文可对应不同向量
UNK未见或低频类别的占位
联合训练嵌入表与下游网络共用任务损失更新

9. 延伸阅读

资源适合看什么
专栏第 29 篇动机与查表
专栏第 30 篇空间与静态嵌入
专栏第 31 篇获取路径
专栏第 17 篇One-Hot 基础
专栏第 28 篇神经网络单元串讲

10. 小结与下一主题

Embedding 这几篇可以概括为:

  1. 词表很大时,用短稠密向量代替超长 One-Hot,减轻后续权重并保留学相似性的可能。
  2. 向量落在嵌入空间里,远近由任务与数据塑造;轴多半不可直接命名。
  3. 表格场景优先联合训练;降维与预训练是另外的来源;多义文本再考虑上下文嵌入。

本单元到此先告一段落。后面讨论序列与语言模型时,会默认已经熟悉:稀疏 One-Hot 的问题、查表得到稠密向量、空间中的相对相似性,以及联合训练与预训练的差别。若这些内容还有些模糊,可以把第 29~31 篇按「动机 → 空间 → 来源」再过一遍会比较省事。

下一主题会进入语言模型:在词或子词序列上,模型如何利用上下文估计下一个词(或某一位置的词)出现的可能,以及为什么需要比 N-gram、简单固定窗口更长的上下文。Embedding 仍会作为输入侧的要素出现,但讨论重心会从「单个离散 ID」转到「整段序列」。

汽车例子也会扩展:除了品牌 ID,还可能涉及车评文本、故障描述等序列输入——那时会用到本单元的嵌入概念,以及后面的序列建模工具。

系列导航

  • 上一篇:【机器学习】(31)—— 如何得到 Embedding
  • 下一篇(预告):语言模型在预估什么:从上下文到下一词

如果本篇对你有帮助,欢迎点赞、收藏、关注博主,机器学习专栏持续更新中,下次更新不迷路。