嵌入模型核心思想:符号与向量的碰撞
这一章我打算聊聊嵌入模型最底层的逻辑。很多初学者上来就调参,结果模型怎么训都不收敛。其实问题不在参数,而是没搞懂嵌入到底在做什么。
符号表示 vs 向量表示
知识图谱里最常见的表示方式就是符号。你看一个三元组(阿司匹林,治疗,头痛),这里每个词都是一个符号。符号表示有个问题——计算机不认识“阿司匹林”这三个字,它只认识一个唯一ID。
符号表示的本质:每个实体对应一个one-hot向量。假设有10万个实体,向量长度就是10万,只有1位是1,其余全是0。
举个例子,我用代码模拟一下这个感觉:
# 符号表示:one-hot编码
阿司匹林 = [0, 0, 0, 1, 0, ..., 0] # 长度 100000
布洛芬 = [0, 0, 0, 0, 1, ..., 0] # 长度 100000
头痛 = [0, 0, 0, 0, 0, ..., 1] # 长度 100000
你一眼就能看出问题:阿司匹林和布洛芬明明是同类药,但在这个向量空间里,它们之间的距离跟阿司匹林和头痛的距离一样。模型学不到“语义相似”这个概念。
向量表示就完全不同了。我们把每个实体映射成一个稠密向量,比如128维:
# 向量表示:嵌入向量
阿司匹林 = [0.23, -0.45, 0.12, ..., 0.87] # 长度 128
布洛芬 = [0.21, -0.44, 0.15, ..., 0.85] # 长度 128
头痛 = [-0.12, 0.33, -0.67, ..., 0.02] # 长度 128
你注意看——阿司匹林和布洛芬的向量数值很接近,因为它们都是NSAID类药物。头痛的向量就差得远一些。这就是向量表示的核心优势:语义相似的实体在向量空间中距离更近。
嵌入的本质——映射到低维连续空间
说白了,嵌入就是一场降维。把高维的符号空间(几万维)压缩到低维的连续空间(几十到几百维)。这个压缩过程必须保留语义关系。
我在项目中遇到过一种情况:药品知识图谱里有150万个实体,如果用one-hot表示,光存储就将近10GB。嵌入到200维后,存储降到不到500MB。但真正的收益不在存储,而在于模型能学到药品之间的内在联系。
嵌入维度怎么选? 我的经验:实体数量在1万以内,100维左右就够了。50万以上,至少256维起步。但这不是绝对的,还得看任务复杂度。
映射过程可以想象成这样:
符号空间(100000维) 嵌入空间(128维)
[0,0,1,0,...] ——→ [0.23, -0.45, ...]
[0,1,0,0,...] ——→ [0.21, -0.44, ...]
[1,0,0,0,...] ——→ [0.15, -0.33, ...]
这个映射矩阵W就是我们要训练的参数。训练的目标是什么?让语义关系正确的三元组,在嵌入空间里满足特定的几何约束。
平移距离与语义相似性
这是TransE系列模型的灵魂。核心思想很简单:如果(h, r, t)是一个正确的三元组,那么h + r ≈ t。换句话说,头实体向量加上关系向量,应该约等于尾实体向量。
我举个药物领域的例子:
# 理想情况:h + r ≈ t
h(阿司匹林) + r(治疗) ≈ t(头痛)
[0.23, -0.45] + [0.10, 0.30] ≈ [0.33, -0.15]
这个“≈”怎么衡量?通常用L1或L2距离。距离越小,说明这个三元组越合理。
我曾经踩过一个坑:以为距离越小越好,结果模型把所有实体和关系都学到原点附近去了。为什么?因为损失函数没加正则化,模型找到的“捷径”就是把所有向量都压缩到零附近。这个教训我记了很久。
语义相似性在这里体现为:如果两个实体经常出现在相似的关系中,它们的嵌入向量就会靠得很近。比如“布洛芬”和“阿司匹林”都在“治疗”关系下连接“头痛”“发热”“炎症”,那它们的向量在空间里就会逐渐靠近。
注意:平移距离假设关系是简单的线性变换。实际知识图谱中很多关系不是这样。比如“导致”关系,h(吸烟)+ r(导致)≈ t(肺癌),这个平移假设勉强成立。但“副作用”关系呢?一个药可能有多种副作用,一个副作用也可能由多种药引起。这时单纯平移就不够用了,需要用更复杂的模型。
下面这张图把本章的核心逻辑串起来了:
我学到的关键教训
这几年调过的嵌入模型不下50个,有些经验值得分享:
- 维度不是越高越好。我见过有人上来就开500维,结果训练慢得离谱,效果还没128维好。小图谱用大维度,就是过拟合。
- 关系建模比实体建模更难。实体之间的关系类型复杂,有些是1-1,有些是N-M。平移距离只适合简单关系。
- 损失函数的选择直接决定训练质量。我一开始用margin-based loss,默认margin=1。后来发现药品知识图谱里很多关系边界模糊,改成margin=0.5甚至0.3,效果反而提升了。
总结一下:嵌入的本质是用低维连续向量表示高维离散符号,几何上要求正确三元组满足h + r ≈ t。这个简单假设支撑了大部分知识图谱嵌入工作。理解了这些,后面调参才不会走偏。