Embedding 模型word2vec/glove/fasttext/elmo/doc2vec/infersent学习总结

静态词向量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 是提速工具,二选一或按场景搭配用;

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 学 "通用词语义"(用海量无标注文本(比如全网的新闻、小说)训练一个 "双向语言模型",目标是让模型学会 "根据上下文猜词")
      *

      1. 输入层:把文本转成字符向量:
      • 先把每个字符转成字符向量(比如用 CNN 提取字符特征);

      • 再把一个词的所有字符向量合并,得到这个词的字符级初始向量。

        1. 核心层:堆叠多层双向 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 维卷积核
    • 任务适配阶段 ------ 给具体任务生成动态词向量:
      *

      1. 提取多层词向量对于任务中的每一个词,从预训练好的模型里提取 3 类向量(使用的时候也一样产生的是三层向量):
      • e0:字符级初始向量(最底层,基础语义,上下文无关);

      • e1:第一层双向 LSTM 输出的向量(浅层上下文语义);

      • e2:第二层双向 LSTM 输出的向量(深层上下文语义)。

        1. 加权组合成 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 只能生成词向量,没法直接生成句子 / 文档向量" 的痛点,简单说就是 "给整句话 / 整篇文章生成一个专属向量"
    *

    1. 核心思路:给文档加一个 "专属身份证"
    • Word2Vec 的训练逻辑是 "用邻居词猜中心词"(Skip-gram)或 "用中心词猜邻居词"(CBOW),只关注词与词的关系。
    • Doc2Vec 在 Word2Vec 的基础上,只做了一个关键改动:
      • 给每一篇文档 / 每一个句子,分配一个独一无二的向量,叫 文档向量(Paragraph Vector),记为D;
      • 训练时,把这个文档向量 D和句子里的词向量(比如 w1,w2)拼在一起,再去做 "猜词任务"。
    • 训练方式:
      • PV-DM(对应 CBOW)
        • 逻辑:用 文档向量 + 上下文词向量,猜中心词;
        • 特点:训练快,适合短文本(比如句子)。
      • PV-DBOW(对应 Skip-gram)
        • 逻辑:只用 文档向量,直接猜句子里的所有词;
        • 特点:训练慢一点,但生成的文档向量质量更高,适合长文档(比如文章)。
    • 文档向量的复用:训练时,同一篇文档里的所有句子,共享同一个文档向量
    • 适用场景:
      • 文档聚类:比如把相似的新闻分到同一类;
      • 文本相似度计算:比如判断两篇论文是否抄袭;
      • 短文本检索:比如根据用户输入的句子,匹配最相似的回复

InferSent:

  • 核心目标是直接生成高质量的句子级向量,解决了早期 "词向量平均成句向量" 的粗糙问题,是 BERT 之前句子嵌入任务的主流方案。
    *

    1. 核心思路:用 "逻辑关系" 学句子语义
    • 创新:基于 "自然语言推理(NLI)" 任务训练,简单说就是让模型学 "两句话之间的逻辑关系"

      • 输入:一对句子(前提句 + 假设句)
      • 任务:判断两者的关系是 3 类中的一种:
      • 蕴含:前提能推出假设(比如前提 "猫抓老鼠",假设 "老鼠被猫抓")
      • 矛盾:前提和假设相反(比如前提 "猫抓老鼠",假设 "老鼠抓猫")
      • 中立:两者没关系(比如前提 "猫抓老鼠",假设 "今天下雨")
      • 模型为了判断这 3 种关系,必须读懂句子的完整语义和逻辑,而不只是词的堆砌 ------ 这样训练出来的句子向量,自然就包含了语序、逻辑和完整语义。
      1. 模型结构:双向 LSTM + 句子编码:核心是 "双向 LSTM + 最大池化",
      • 第一步:用双向 LSTM 提取词的上下文特征
        • 先把句子里的每个词转成词向量(用 GloVe 预训练向量);
        • 喂给双向 LSTM:从左到右 + 从右到左扫句子,给每个词生成包含上下文的特征向量;
        • 这一步解决了 "语序丢失" 的问题,比如 "猫抓老鼠" 和 "老鼠抓猫" 会得到不同的词特征。
      • 第二步:用最大池化生成固定长度的句子向量
        • 双向 LSTM 输出的是 "词特征序列"(长度 = 句子长度),但不同句子长度不一样,没法直接比较;
        • 用 最大池化:对每个特征维度,取所有词特征里的最大值,最终得到一个固定长度的句子向量;
        • 通俗类比:从句子的所有词特征里,挑出 "最关键的语义信息",拼成句子的 "身份证"。
      • 第三步:训练逻辑关系分类器
        • 把前提句和假设句的向量拼接,再加上两者的 "差值""乘积" 等特征;喂给全连接层,训练成一个 3 分类模型(蕴含 / 矛盾 / 中立);训练完成后,去掉分类器,前面的 "双向 LSTM + 池化" 部分就成了一个句子向量生成器。
        • 注:此处的双向 LSMT 可以类似elmo 中的双向,一样是拼接生成词向量结果,只是此处会进行最大池化拼接生成句子向量,再通过拼接不同的句子向量进行训练,训练好以后,就可以当成一个句子的向量生成器了,因为没有全连接层进行三分类处理
    • 优势(对比早期方法)

      • 比 "词向量平均""TF-IDF 向量" 好太多:能捕捉句子的逻辑和语序;
      • 训练好的模型可以直接复用:不用针对每个任务重新训练,输入句子就能输出向量;
      • 向量质量高:在句子相似度计算、文本聚类、语义检索等任务上,碾压早期方案。
    • 适用场景

      • 句子相似度计算(比如判断两句话意思是否一样);
      • 文本聚类(比如把相似的评论分到一组);
      • 语义检索(比如输入一句话,找数据库里最相似的句子)
    • 和 Doc2Vec 的区别:

      • InferSent:训练任务 基于 "句子逻辑关系" ,包含句子的逻辑和语义,侧重句子间的逻辑判断
      • Doc2Vec:基于 "猜词任务" 训练(和 Word2Vec 一样),包含句子的词搭配和主题,侧重文档的主题聚类
相关推荐
胡萝卜3.08 小时前
深入C++可调用对象:从function包装到bind参数适配的技术实现
开发语言·c++·人工智能·机器学习·bind·function·包装器
Echo_NGC22378 小时前
【KL 散度】深入理解 Kullback-Leibler Divergence:AI 如何衡量“像不像”的问题
人工智能·算法·机器学习·散度·kl
愤怒的可乐8 小时前
从零构建大模型智能体:OpenAI Function Calling智能体实战
人工智能·大模型·智能体
XiaoMu_0018 小时前
基于深度学习的农作物叶片病害智能识别与防治系统
人工智能·深度学习
CoderYanger8 小时前
C.滑动窗口-求子数组个数-越长越合法——3325. 字符至少出现 K 次的子字符串 I
c语言·数据结构·算法·leetcode·职场和发展·哈希算法·散列表
potato_15548 小时前
Windows11系统安装Isaac Sim和Isaac Lab记录
人工智能·学习·isaac sim·isaac lab
sin_hielo8 小时前
leetcode 3606
数据结构·算法·leetcode
测试人社区-千羽8 小时前
48小时攻克测试岗——闪电面试极速备战手册
人工智能·python·opencv·面试·职场和发展·单元测试·压力测试
独自归家的兔8 小时前
大模型通义千问3-VL-Plus - 视觉推理(在线视频)
人工智能·计算机视觉