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 一样),包含句子的词搭配和主题,侧重文档的主题聚类
相关推荐
小白说大模型16 小时前
Prompt 工程的数学直觉:Embedding 空间中的 Prompt 优化的底层原理
人工智能·mysql·prompt·embedding
独码侠18 小时前
Dify 知识库索引(中):打开源码,拆穿关于“经济索引”的三个谣言
后端·python·django·embedding·知识库·索引·dify
仙女修炼史6 天前
word2Vec理解(下):本质理解
人工智能·自然语言处理·word2vec
0566466 天前
agent学习Day23——文件上传与 Embedding 语义检索
python·学习·embedding
ShallWeL8 天前
【机器学习】(32)—— Embedding 串讲
人工智能·机器学习·embedding
ShallWeL8 天前
【机器学习】(31)—— 如何得到 Embedding
人工智能·机器学习·embedding
denggun123459 天前
大大模型 如何通过 本地排雷 远端GPU
python·embedding·pip
ShallWeL12 天前
【机器学习】(30)—— 嵌入空间
人工智能·神经网络·机器学习·embedding
孙启超12 天前
【AI应用开发】 RAG篇(四):Prompt 工程与进阶技术
人工智能·llm·embedding·rag·向量化·chunking·文档切分
Cachel wood13 天前
hands-on-modern-rl:动手学强化学习 贝尔曼方程
开发语言·网络·python·学习·embedding