静态词向量Embeding 模型
work2vec: 靠 "猜邻居" 学向量:
- 1 将物料中的所有词赋值初始值,定好维度和窗口大小(即中心词邻居个数,也是此次学习的上下文长度),比较常用的维度是(100/300)
- 2 CBOW(用邻居猜中心词)和Skip-gram(用中心词猜邻居),两种方法的区别:
- CBOW:用邻居猜中心词,语料小、高频词多,训练快,对高频词的向量效果好
- Skip-gram:用中心词猜邻居,语料大、低频词多,训练慢一点,但对低频词的向量效果更好
- CBOW 和 Skip-gram 是训练模式,二选一,看语料大小和词频选
- 比如 CBOW方法:
- ① 从句子里挑一个中心词(比如 "吃"),再圈出它的邻居词(比如 "我、爱、苹果",窗口为 3);
- ② 把 3 个邻居词的向量加起来作为加总向量,然后让窗口中的每一个词向量权重乘以加总向量得到概率值,再进行 softmax 处理(其实就是一个简单的神经网络)
- ③ 错误的话就使用反向传播,调整邻居词和中心词的向量,让下次猜得更准
- 3 简化游戏:如果每次都猜"中心词"那计算效率将会非常慢,所以可以"作弊":
- 1 负采样:只猜 "真邻居 vs 假邻居"
- 原来的麻烦:要让模型猜 "中心词是词汇表里的哪一个",比如词汇表有 1 万个词,就要算 1 万次得分,非常慢
- 作弊思路:不猜所有词,只挑几个词做对比:
- 选 1 个正样本:就是真实的中心词+真邻居(比如"爱" 是中心词, "我、吃" 作为真邻居);
- 选 5~20 个负样本:从词汇表里随机抽几个不相关的词,中心词+假邻居(比如"爱" 是中心词, "汽车、桌子" 作为假邻居);
- 让模型只做一件事:区分 "正样本是真邻居","负样本是假邻居"。
- 效果:不用算 1 万次,只算 1 次正样本 + 10 次负样本 = 11 次,速度直接提升几百倍。
- 2 层次 Softmax(Hierarchical Softmax):用 "二叉树" 少走路
- 原来的麻烦:Softmax 要遍历所有词算概率,词汇表越大越慢。
- 作弊思路:把词汇表排成一棵二叉树,猜词变成 "走树的路径":
- 树的叶子节点是所有词,根节点在最上面;
- 猜中心词时,不用一个个对比,而是从根节点开始:每走一步判断"中心词需要" "往左还是往右",直到走到目标词的叶子节点;有点类似二分法的理念
- 3 负采样和层次 Softmax 是提速工具,二选一或按场景搭配用;
- 1 负采样:只猜 "真邻居 vs 假邻居"
GloVe ( Global Vectors for Word Representation)
- 核心逻辑是 "统计整个语料中词与词的共现频率,用频率关系学向量",属于统计式模型。统计 "谁和谁经常一起出现"
- 遍历整个语料库,做一张 共现矩阵(像 Excel 表格):行和列都是词,单元格里的数字是 "这两个词在窗口内一起出现的次数";
- 比如表格里 "国王" 和 "王后" 的格子里是 100,"国王" 和 "苹果" 的格子里是 1------ 说明 "国王" 和 "王后" 关系近。
- 给统计结果 "加权"
- 太常见的词(比如 "的、了")和谁都能一起出现,统计结果不算数,所以给它们的次数 "打折";
- 出现次数太少的词(比如生僻词),统计结果不准,也打折 ------ 只重点关注 "出现次数适中" 的词对。
- 用统计结果 "学向量" -目标很简单:让 两个词向量的点积 ≈ ln(两个词共现次数); - 比如 "国王" 和 "王后" 的共现次数是 100,对数是 4.6,那就要让它们的向量点积≈4.6;
- 初始化所有词的随机向量,然后不断调整向量,直到向量点积满足这个目标
- 输出最终向量调整到误差足够小时,每个词的向量就学好了 ------ 因为用了全局统计,词的语义关系会更稳(比如 "国王 - 男人 + 女人 = 王后" 这种类比任务,GloVe 做得更准)。
FastText :
- 核心是 "给 Word2Vec 加了'字符级偏旁部首'",解决了 Word2Vec 处理生僻词、未登录词(没见过的词)的痛点,训练速度还更快(3-10 倍)。
- FastText 的关键创新是 字符级 n-gram 特征:
- 把每个单词拆成若干个字符片段(n-gram),比如单词 apple,取 n=3(3 个字符为一段),会拆成:#ap、app、ppl、ple、le#(加 # 是为了标记词的开头和结尾);
- 训练时,单词的向量 = 它所有字符片段的向量之和。
- 训练方式:和 Word2Vec 几乎一样,更快更强;
- 训练目标和:和Word2Vec 的 Skip-gram 完全相同:用中心词猜邻居词。
- 优势:
- 能处理生僻词 / 未登录词:就算遇到没见过的词,只要能拆成字符片段,就能用片段向量拼出这个词的向量;
- 训练速度更快:Facebook 做了工程优化,比 Word2Vec 快好几倍,适合超大规模语料;
- 优化 1:哈夫曼树 ------ 把高频词放在树的浅层(靠近根节点),低频词放在深层
- 优化 2:哈希表(Hash Table) ---- 把相似的 n-gram 片段映射到同一个向量空间,减少了重复计算和内存占用。
- 低资源语言友好:对小语种(语料少、生僻词多)特别友好,效果远超 Word2Vec。
- 额外技能:直接做文本分类
- FastText 除了能生成词向量,还能直接做文本分类(这是它和 Word2Vec/GloVe 的小区别):
- 分类时,把句子里所有词的向量加起来,得到句子向量;
- 再用一个简单的线性层 + Softmax,输出分类结果。
- 特点:分类速度极快,适合海量文本的快速分类任务(比如垃圾邮件识别,类比word2vec 中的负采样)。
动态词向量Embedding 模型:
-
ELMO(Embedding from Language Model),通过无监督预训练多层双向LSTM模型来学习带上下文信息的(Contextualized)单词表示。一种动态的,语境化的词向量表示方法,可以根据上下文语境来生成相应词的向量表示。
-
ELMO 的流程可以类比成:先学通用字典(预训练),再根据具体文章调整词义(任务适配)。
-
预训练阶段:用双向 LSTM 学 "通用词语义"(用海量无标注文本(比如全网的新闻、小说)训练一个 "双向语言模型",目标是让模型学会 "根据上下文猜词")
*- 输入层:把文本转成字符向量:
-
先把每个字符转成字符向量(比如用 CNN 提取字符特征);
-
再把一个词的所有字符向量合并,得到这个词的字符级初始向量。
-
- 核心层:堆叠多层双向 LSTM(这是 ELMO 的关键,用 多层双向 LSTM 逐层提取词的语义)
- 双向 LSTM:一个从左到右的 LSTM + 一个从右到左的 LSTM,两者独立计算,最后把结果"拼"起来。
- 底层双向 LSTM:学的是基础语义,比如词的字面意思、简单搭配(比如 "银行" 和 "钱" 的关联);
- 高层双向 LSTM:学的是深层语义,比如词在句子里的角色、上下文的逻辑关系(比如 "银行" 在句子里是 "地点宾语")
-
3 预训练目标:让双向 LSTM 学会 "根据上下文猜被遮住的词",正向反向都来一遍
-
4 整体 架构:CNN - BIG - LSTM
- 字符 CNN:把单词拆成字符,提取字符级特征,生成基础向量;像查字典先认单个字,解决生僻词、拼写错误问题
- 两层 Highway: 优化"字符向量"的传输,让有效特征更好地通过 给特征 "开绿色通道",减少信息损耗
- 具体方法:(依然是通过权重的方式来实现)
- 变换门(Transform Gate):决定 "多少特征需要被加工处理";
- 携带门(Carry Gate):决定 "多少原始特征可以直接通过"。
- 最终输出 = 加工后的特征 × 变换门 + 原始特征 × 携带门。
- 第一层 Highway 先过滤掉大部分明显的噪声;
- 第二层 Highway 再对剩下的特征做精细筛选;
- 具体方法:(依然是通过权重的方式来实现)
- 双层双向 LSTM 两层双向结构:(每层含前向 + 后向 LSTM,层间有残差连接),逐层提取上下文语义
- 在第一个双向 LSTM 中,是正向,方向分别生成出结果"拼接"到一起作为第一层初始输出的
- 在拼接后需要通过线性变换进行降维,因为拼接后维度升高了一倍,再通过残差+原始输出作为第二层的输入
- 但是第二层的输出就不需要降维和残差了,因为已经直接输出了,双向 RNN 的时候也是这样的
- 整体目标: 双向语言模型任务,最大化 "前向预测下一词、后向预测前一词" 的联合概率;让模型学会根据上下文精准猜词,掌握通用语义
- BIG:是因为双层双向 LSTM 每层隐藏单元 4096 个,投影维度 512,层间有残差连接,字符 CNN 用 2048 维卷积核
-
任务适配阶段 ------ 给具体任务生成动态词向量:
*- 提取多层词向量对于任务中的每一个词,从预训练好的模型里提取 3 类向量(使用的时候也一样产生的是三层向量):
-
e0:字符级初始向量(最底层,基础语义,上下文无关);
-
e1:第一层双向 LSTM 输出的向量(浅层上下文语义);
-
e2:第二层双向 LSTM 输出的向量(深层上下文语义)。
-
- 加权组合成 ELMO 向量:ELMO 会给这几层向量分配不同的权重(权重值根据具体任务调整),然后加权求和,得到最终的任务专属动态词向量:
- ELMO = γ * (s0 * e0 + s1 * e1 + s2 * e2)
- s0,s1,s2是权重(比如任务是文本分类,可能给高层向量 e2 更高权重;任务是词性标注,给底层向量 e1 更高权重);
- γ是一个缩放系数,用来调整 ELMO 向量的大小,适配任务模型。
-
优点:1 解决了静态词嵌入 "一词多义" 的核心痛点;2 预训练模型可以复用,在小数据任务上也能有好效果(比如小众领域的文本分类)。
-
缺点:1基于 LSTM,速度比后来的 Transformer 模型(比如 BERT)慢;2只是 "把多层向量加权组合",没有像 BERT 那样用自注意力机制更精准地捕捉上下文关联。
-
-
ELMo通过深度双向语言模型(biLM)进行训练,主要解决了两个问题:
- (1) 学习复杂词汇的语法和语义;
- (2) 学习复杂词汇不同语境下的不同语义;
-
一个简单的例子就是 "苹果"的词向量:
- 句子1:"我买了 1斤 苹果"
- 句子2:"我新买了 1个 苹果 X"
-
PS: ELMo在中文上确实会比word2vec好很多
静态句向量 Embedding 模型:
Doc2Vec 是 Word2Vec 的直接升级版(计算速度更慢):
-
核心目标是解决 "Word2Vec 只能生成词向量,没法直接生成句子 / 文档向量" 的痛点,简单说就是 "给整句话 / 整篇文章生成一个专属向量"
*- 核心思路:给文档加一个 "专属身份证"
- Word2Vec 的训练逻辑是 "用邻居词猜中心词"(Skip-gram)或 "用中心词猜邻居词"(CBOW),只关注词与词的关系。
- Doc2Vec 在 Word2Vec 的基础上,只做了一个关键改动:
- 给每一篇文档 / 每一个句子,分配一个独一无二的向量,叫 文档向量(Paragraph Vector),记为D;
- 训练时,把这个文档向量 D和句子里的词向量(比如 w1,w2)拼在一起,再去做 "猜词任务"。
- 训练方式:
- PV-DM(对应 CBOW)
- 逻辑:用 文档向量 + 上下文词向量,猜中心词;
- 特点:训练快,适合短文本(比如句子)。
- PV-DBOW(对应 Skip-gram)
- 逻辑:只用 文档向量,直接猜句子里的所有词;
- 特点:训练慢一点,但生成的文档向量质量更高,适合长文档(比如文章)。
- PV-DM(对应 CBOW)
- 文档向量的复用:训练时,同一篇文档里的所有句子,共享同一个文档向量
- 适用场景:
- 文档聚类:比如把相似的新闻分到同一类;
- 文本相似度计算:比如判断两篇论文是否抄袭;
- 短文本检索:比如根据用户输入的句子,匹配最相似的回复
InferSent:
-
核心目标是直接生成高质量的句子级向量,解决了早期 "词向量平均成句向量" 的粗糙问题,是 BERT 之前句子嵌入任务的主流方案。
*- 核心思路:用 "逻辑关系" 学句子语义
-
创新:基于 "自然语言推理(NLI)" 任务训练,简单说就是让模型学 "两句话之间的逻辑关系"
- 输入:一对句子(前提句 + 假设句)
- 任务:判断两者的关系是 3 类中的一种:
- 蕴含:前提能推出假设(比如前提 "猫抓老鼠",假设 "老鼠被猫抓")
- 矛盾:前提和假设相反(比如前提 "猫抓老鼠",假设 "老鼠抓猫")
- 中立:两者没关系(比如前提 "猫抓老鼠",假设 "今天下雨")
- 模型为了判断这 3 种关系,必须读懂句子的完整语义和逻辑,而不只是词的堆砌 ------ 这样训练出来的句子向量,自然就包含了语序、逻辑和完整语义。
-
- 模型结构:双向 LSTM + 句子编码:核心是 "双向 LSTM + 最大池化",
- 第一步:用双向 LSTM 提取词的上下文特征
- 先把句子里的每个词转成词向量(用 GloVe 预训练向量);
- 喂给双向 LSTM:从左到右 + 从右到左扫句子,给每个词生成包含上下文的特征向量;
- 这一步解决了 "语序丢失" 的问题,比如 "猫抓老鼠" 和 "老鼠抓猫" 会得到不同的词特征。
- 第二步:用最大池化生成固定长度的句子向量
- 双向 LSTM 输出的是 "词特征序列"(长度 = 句子长度),但不同句子长度不一样,没法直接比较;
- 用 最大池化:对每个特征维度,取所有词特征里的最大值,最终得到一个固定长度的句子向量;
- 通俗类比:从句子的所有词特征里,挑出 "最关键的语义信息",拼成句子的 "身份证"。
- 第三步:训练逻辑关系分类器
- 把前提句和假设句的向量拼接,再加上两者的 "差值""乘积" 等特征;喂给全连接层,训练成一个 3 分类模型(蕴含 / 矛盾 / 中立);训练完成后,去掉分类器,前面的 "双向 LSTM + 池化" 部分就成了一个句子向量生成器。
- 注:此处的双向 LSMT 可以类似elmo 中的双向,一样是拼接生成词向量结果,只是此处会进行最大池化拼接生成句子向量,再通过拼接不同的句子向量进行训练,训练好以后,就可以当成一个句子的向量生成器了,因为没有全连接层进行三分类处理
-
优势(对比早期方法)
- 比 "词向量平均""TF-IDF 向量" 好太多:能捕捉句子的逻辑和语序;
- 训练好的模型可以直接复用:不用针对每个任务重新训练,输入句子就能输出向量;
- 向量质量高:在句子相似度计算、文本聚类、语义检索等任务上,碾压早期方案。
-
适用场景
- 句子相似度计算(比如判断两句话意思是否一样);
- 文本聚类(比如把相似的评论分到一组);
- 语义检索(比如输入一句话,找数据库里最相似的句子)
-
和 Doc2Vec 的区别:
- InferSent:训练任务 基于 "句子逻辑关系" ,包含句子的逻辑和语义,侧重句子间的逻辑判断
- Doc2Vec:基于 "猜词任务" 训练(和 Word2Vec 一样),包含句子的词搭配和主题,侧重文档的主题聚类