深度学习与自然语言处理教程(1) - 词向量、SVD分解与Word2Vec(NLP通关指南·完结)

词向量经典模型:从word2vec、glove、ELMo到BERT 前言 词向量技术将自然语言中的词转化为稠密的向量,相似的词会有相似的向量表示,这样的转化方便挖掘文字中词语和句子之间的特征。生成词向量的方法从一开始基于统计学的方法(共现矩阵、SVD分解)到基于不同结构的神经网络的语言模型方法。这里总结一下比较经典的语言模型方法:word2vec、glove、ELMo、BERT。 其中BERT是最新Google发表的模型,在11个经典的NLP任务中全面超越最佳模型... 阅读详情

ShowMeAI研究中心


词向量、SVD分解与Word2vec
本系列为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》的全套学习笔记,对应的课程视频可以在 这里 查看。

NLP介绍与词向量初步
ShowMeAI为CS224n课程的全部课件,做了中文翻译和注释,并制作成了GIF动图!点击 这里 查看“第1讲-NLP介绍与词向量初步”的课件注释与带学解读。更多资料获取方式见文末。


引言

CS224n是顶级院校斯坦福出品的深度学习与自然语言处理方向专业课程,核心内容覆盖RNN、LSTM、CNN、transformer、bert、问答、摘要、文本生成、语言模型、阅读理解等前沿内容。

本篇笔记对应斯坦福CS224n自然语言处理专项课程的第1个知识板块:NLP与词向量。首先介绍了自然语言处理(NLP)的概念及其面临的问题,进而介绍词向量和其构建方法(包括基于共现矩阵降维和Word2Vec)。

内容要点

  • 自然语言处理/Natural Language Processing(NLP)
  • 词向量/Word Vectors
  • SVD矩阵分解
  • Skip-gram
  • 负例采样
  • transformer
  • CBOW
  • 层次化softmax
  • Word2Vec

1.自然语言处理介绍

1.1 自然语言处理的特别之处

人类的语言有什么特别之处?人类语言是一个专门用来表达意义的系统,语言文字是上层抽象表征,NLP与计算机视觉或任何其他机器学习任务都有很大的不同。

大多数单词只是一个语言学以外的符号:单词是一个映射到所指(signified 想法或事物)的能指(signifier)。例如,“rocket”一词指的是火箭的概念,因此可以引申为火箭的实例。当我们使用单词和字母来表达符号时,也会有一些例外,例如“whoompaa”的使用。

最重要的是,这些语言的符号可以被编码成几种形式:声音、手势、文字等等,然后通过连续的信号传输给大脑;大脑本身似乎也能以一种连续的方式对这些信号进行解码。人们在语言哲学和语言学方面做了大量的工作来概念化人类语言,并将词语与其参照、意义等区分开来。

❐ Natural language is a discrete[离散的] / symbolic[符号的] / categorical[分类的] system.

1.2 自然语言处理任务

自然语言处理有不同层次的任务,从语言处理到语义解释再到语篇处理。自然语言处理的目标是通过设计算法使得计算机能够“理解”语言,从而能够执行某些特定的任务。不同的任务的难度是不一样的:

1) 简单任务

  • 拼写检查 Spell Checking
  • 关键词检索 Keyword Search
  • 同义词查找 Finding Synonyms

2) 中级任务

  • 解析来自网站、文档等的信息

3) 复杂任务

  • 机器翻译 Machine Translation
  • 语义分析 Semantic Analysis
  • 指代消解 Coreference
  • 问答系统 Question Answering

1.3 如何表征词汇

在所有的NLP任务中,第一个也是可以说是最重要的共同点是我们如何将单词表示为任何模型的输入。在这里我们不会讨论早期的自然语言处理工作是将单词视为原子符号 atomic symbols。

为了让大多数的自然语言处理任务能有更好的表现,我们首先需要了解单词之间的相似和不同。有了词向量,我们可以很容易地将其编码到向量本身中。

(本部分内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 自然语言处理与词嵌入)

2.词向量

使用词向量编码单词, N N N 维空间足够我们编码语言的所有语义,每一维度都会编码一些我们使用语言传递的信息。

简单的one-hot向量无法给出单词间的相似性,我们需要将维度 ∣ V ∣ \left | V \right | ∣V∣ 减少至一个低纬度的子空间,来获得稠密的词向量,获得词之间的关系。

3.基于SVD降维的词向量

(关于降维算法可以阅读ShowMeAI的机器学习教程文章图解机器学习 | 降维算法详解,也可以通过ShowMeAI的机器学习实战文章机器学习实战 | 机器学习特征工程最全解读关于降维的python应用方法)

基于词共现矩阵与SVD分解是构建词嵌入(即词向量)的一种方法。

  • 我们首先遍历一个很大的数据集和统计词的共现计数矩阵 X X X
  • 然后对矩阵 X X X 进行SVD分解得到 U S V T USV^T USVT
  • 再然后我们使用 U U U 的行来作为字典中所有词的词向量

接下来我们讨论一下矩阵 X X X 的几种选择。

3.1 词-文档矩阵

最初的解决方案是基于词-文档共现矩阵完成的。我们猜想相关连的单词在同一个文档中会经常出现:

  • 例如,“banks”,“bonds”,“stocks”,“moneys”等等,出现在一起的概率会比较高
  • 但是,“banks”,“octopus”,“banana”,“hockey”不大可能会连续地出现

我们根据这个情况来建立一个Word-Document矩阵, X X X 是按照以下方式构建:遍历数亿的文档和当词 i i i 出现在文档 j j j ,我们对 X i j X_{ij} Xij​ 加一。

这显然是一个很大的矩阵 R ∣ V ∣ × M \mathbb{R}^{ \left | V \right | \times M} R∣V∣×M ,它的规模是和文档数量 M M M 成正比关系。因此我们可以尝试更好的方法。

3.2 基于滑窗的词共现矩阵

全文档统计是一件非常耗时耗力的事情,我们可以进行调整对一个文本窗内的数据进行统计,计算每个单词在特定大小的窗口中出现的次数,得到共现矩阵 X X X 。

下面为一个简单示例,我们基于滑窗(前后长度为1)对文本进行共现矩阵的构建。

  • I enjoy flying.
  • I like NLP.
  • I like deep learning.

基于滑窗的词共现矩阵

❐ 使用单词共现矩阵:

  • 生成维度为 ∣ V ∣ × ∣ V ∣ \left | V \right |\times \left | V \right | ∣V∣×∣V∣ 的共现矩阵 X X X

  • 在 X X X 上应用SVD从而得到 X = U S V T X = USV^T X=USVT

  • 选择 U U U 前 k k k 行得到 k k k 维的词向量

  • ∑ i = 1 k σ i ∑ i = 1 ∣ V ∣ σ i \frac{\sum_{i=1}^{k} \sigma_i}{\sum_{i=1}^{ \left | V \right |} \sigma_i} ∑i=1∣V∣​σi​∑i=1k​σi​​ 表示第一个 k k k 维包含的方差量

3.3 应用SVD对共现矩阵降维

  • 我们对矩阵 X X X 使用SVD,观察奇异值(矩阵 S S S 上对角线上元素),根据方差百分比截断,留下前 k k k 个元素:

∑ i = 1 k σ i ∑ i = 1 ∣ V ∣ σ i \frac{\sum_{i=1}^{k} \sigma_i}{\sum_{i=1}^{ \left | V \right |} \sigma_i} ∑i=1∣V∣​σi​∑i=1k​σi​​

  • 然后取子矩阵 U 1 : ∣ V ∣ , 1 : k U_{1: \left | V \right |, 1:k} U1:∣V∣,1:k​ 作为词嵌入矩阵。这就给出了词汇表中每个词的 k k k 维表示。

对矩阵 X X X 使用SVD:

对矩阵 X 使用SVD

通过选择前 k k k 个奇异向量来降低维度:

通过选择前 k 个奇异向量来降低维度

前面提到的方法给我们提供了足够的词向量来编码语义和句法(part of speech)信息,但也带来了一些问题:

  • 矩阵的维度会经常发生改变(经常增加新的单词和语料库的大小会改变)
  • 矩阵会非常的稀疏,因为很多词不会共现
  • 矩阵维度一般会非常高 ≈ 1 0 6 × 1 0 6 \approx 10^6 \times 10^6 ≈106×106
  • 需要在 X X X 上加入一些技巧处理来解决词频的极剧的不平衡

❐ 基于SVD的方法的计算复杂度很高( m × n m \times n m×n 矩阵的计算成本是 O ( m n 2 ) O({mn}^2) O(mn2) ),并且很难合并新单词或文档。

对上述讨论中存在的问题存在以下的解决方法:

  • 忽略功能词,例如“the”,“he”,“has”等等
  • 使用ramp window,即根据文档中单词之间的距离对共现计数进行加权
  • 使用皮尔逊相关系数并将负计数设置为 0 0 0 ,而不是只使用原始计数

❐ 基于计数的方法可以有效地利用统计量,但下述基于迭代的方式可以在控制复杂度的情况下有效地在大语料库上构建词向量。

4.迭代优化算法 - Word2Vec

(本部分内容也可以参考ShowMeAI的对吴恩达老师课程的总结文章 深度学习教程 | 自然语言处理与词嵌入)

Word2Vec是一个迭代模型,该模型能够根据文本进行迭代学习,并最终能够对给定上下文的单词的概率对词向量进行编码呈现,而不是计算和存储一些大型数据集(可能是数十亿个句子)的全局信息。

这个想法是设计一个模型,该模型的参数就是词向量。然后根据一个目标函数训练模型,在每次模型的迭代计算误差,基于优化算法调整模型参数(词向量),减小损失函数,从而最终学习到词向量。

大家知道在神经网络中对应的思路叫“反向传播”,模型和任务越简单,训练它的速度就越快。

❐ 基于迭代的方法一次捕获一个单词的共现情况,而不是像SVD方法那样直接捕获所有的共现计数。

已经很多研究者按照这个思路测试了不同的方法。[Collobert et al., 2011] 设计的模型首先将每个单词转换为向量。对每个特定的任务(命名实体识别、词性标注等等),他们不仅训练模型的参数,同时也训练单词向量,计算出了非常好的词向量的同时取得了很好的性能。

一个非常有效的方法是Word2Vec。Word2Vec是google开源的软件包,包含以下核心内容:

  • 两个算法:continuous bag-of-words(CBOW)和skip-gram

    • CBOW是根据中心词周围的上下文单词来预测该词的词向量
    • skip-gram则相反,是根据中心词预测周围上下文的词的概率分布。
  • 两个训练方法:negative sampling和hierarchical softmax

    • Negative sampling通过抽取负样本来定义目标
    • hierarchical softmax通过使用一个有效的树结构来计算所有词的概率来定义目标

❐ Word2Vec依赖于语言学中一个非常重要的假设「分布相似性」,即相似的词有相似的上下文。

4.1 语言模型

我们先来了解一下语言模型。从一个例子开始:

我爱学习自然语言处理技术

一个好的语言模型会给这个句子很高的概率,因为在句法和语义上这是一个完全有效的句子。相似地,句子 自然学习爱处理语言我技术 会得到一个很低的概率,因为这是一个无意义的句子。

在数学上,我们可以称为对给定 n n n 个词的序列的概率是:

P ( w 1 , w 2 , ⋯   , w n ) P(w_1, w_2, \cdots, w_n) P(w1​,w2​,⋯,wn​)

在一元语言模型方法(Unigram model)中,我们假设单词的出现是完全独立的,从而分解概率

P ( w 1 , w 2 , ⋯   , w n ) = ∏ i = 1 n P ( w i ) P(w_1, w_2, \cdots, w_n)=\prod_{i=1}^{n} P(w_i) P(w1​,w2​,⋯,wn​)=i=1∏n​P(wi​)

严谨一点说,上述假设是不合理的,因为下一个单词是高度依赖于前面的单词序列的。如果使用上述的语言模型,可能会让一个无意义的句子具有很高的概率。所以我们让序列的概率取决于序列中的单词和其旁边的单词的成对概率。我们称之为bigram模型:

P ( w 1 , w 2 , ⋯   , w n ) = ∏ i = 2 n P ( w i ∣ w i − 1 ) P(w_1, w_2, \cdots, w_n)=\prod_{i=2}^{n} P(w_i \mid w_{i-1}) P(w1​,w2​,⋯,wn​)=i=2∏n​P(wi​∣wi−1​)

确实,只关心邻近单词还是有点简单,大家考虑连续的n个词共现会得到n-gram。但即使使用bigram都可以带来相对unigram显著的提升。考虑在词-词共现矩阵中,共现窗口为 1 1 1 ,我们基本上能得到这样的成对的概率。但是,这又需要计算和存储大量数据集的全局信息。

既然我们已经理解了如何考虑具有概率的单词序列,那么让我们观察一些能够学习这些概率的示例模型。

4.2 CBOW连续词袋模型

这一方法是把 {"我","爱","学习","自然语言处理","技术"} 作为上下文,希望从这些词中能够预测或者生成中心词 学习。这样的模型我们称之为continuous bag-of-words(CBOW)模型。

❐ CBOW是从上下文中预测中心词的方法,在这个模型中的每个单词,我们希望学习两个向量

  • v v v (输入向量,即上下文词)
  • u u u (输出向量,即中心词)

模型输入是one-hot形式的词向量表示。输入的one-hot向量或者上下文我们用 x ( c ) x^{(c)} x(c) 表示,输出用 y ( c ) y^{(c)} y(c) 表示。在CBOW模型中,因为我们只有一个输出,因此我们把 y y y 称为是已知中心词的的one-hot向量。

下面我们定义模型的未知参数。

我们创建两个矩阵, V ∈ R n × ∣ V ∣ \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} V∈Rn×∣V∣ 和 U ∈ R ∣ V ∣ × n \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} U∈R∣V∣×n 。其中:

  • n n n 是嵌入空间的任意维度大小

  • V \mathcal{V} V 是输入词矩阵,使得当其为模型的输入时, V \mathcal{V} V 的第 i i i 列是词 w i w_i wi​ 的 n n n 维嵌入向量,定义这个 n × 1 n \times 1 n×1 的向量为 v i v_i vi​

  • 相似地, U \mathcal{U} U 是输出词矩阵。当其为模型的输入时, U \mathcal{U} U 的第j行是词 w j w_{j} wj​ 的 n n n 维嵌入向量。我们定义 U \mathcal{U} U 的这行为 u j u_j uj​

  • 注意实际上对每个词 w i w_i wi​ 我们需要学习两个词向量(即输入词向量 v i v_i vi​ 和输出词向量 u i u_i ui​ )。

❐ 首先我们对CBOW模型作出以下定义:

  • w i w_i wi​ :词汇表 V V V 中的单词 i i i
  • V ∈ R n × ∣ V ∣ \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} V∈Rn×∣V∣ :输入词矩阵
  • v i v_i vi​ : V \mathcal{V} V 的第 i i i 列,单词 w i w_i wi​ 的输入向量表示
  • U ∈ R ∣ V ∣ × n \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} U∈R∣V∣×n :输出词矩阵
  • u i u_i ui​ : U \mathcal{U} U 的第 i i i 行,单词 w i w_i wi​ 的输出向量表示

我们将这个模型分解为以下步骤:

  • ① 我们为大小为 m m m 的输入上下文词汇,生成one-hot词向量 ( x ( c − m ) , ⋯   , x ( c − 1 ) , x ( c + 1 ) , ⋯   , x ( c + m ) ∈ R ∣ V ∣ ) (x^{(c-m)}, \cdots ,x^{(c-1)},x^{(c+1)}, \cdots ,x^{(c+m)}\in \mathbb{R}^{ \left | V \right |}) (x(c−m),⋯,x(c−1),x(c+1),⋯,x(c+m)∈R∣V∣)

  • ② 我们基于上述one-hot输入计算得到嵌入词向量 ( v c − m = V x ( c − m ) , v c − m + 1 = V x ( c − m + 1 ) , ⋯   , v c + m = V x ( c + m ) ∈ R n ) (v_{c-m}=\mathcal{V}x^{(c-m)},v_{c-m+1}=\mathcal{V}x^{(c-m+1)},\cdots ,v_{c+m}=\mathcal{V}x^{(c+m)}\in \mathbb{R}^{n}) (vc−m​=Vx(c−m),vc−m+1​=Vx(c−m+1),⋯,vc+m​=Vx(c+m)∈Rn) 。

  • ③ 对上述的词向量求平均值 v ^ = v c − m + v c − m + 1 + ⋯ + v c + m 2 m ∈ R n \widehat{v}=\frac{v_{c-m}+v_{c-m+1}+ \cdots +v_{c+m}}{2m}\in \mathbb{R}^{n} v =2mvc−m​+vc−m+1​+⋯+vc+m​​∈Rn 。

  • ④ 计算分数向量 z = U v ^ ∈ R ∣ V ∣ z = \mathcal{U}\widehat{v}\in \mathbb{R}^{ \left | V \right |} z=Uv ∈R∣V∣ 。相似的词对向量的点积值大,这会令相似的词更为靠近,从而获得更高的分数。

  • ⑤ 将分数通过softmax转换为概率 y ^ = s o f t m a x ( z ) ∈ R ∣ V ∣ \widehat{y}=softmax(z)\in \mathbb{R}^{ \left | V \right |} y ​=softmax(z)∈R∣V∣ 。

  • ⑥ 我们希望生成的概率 y ^ ∈ R ∣ V ∣ \widehat{y} \in \mathbb{R}^{ \left | V \right |} y ​∈R∣V∣ 与实际的概率 y ∈ R ∣ V ∣ y \in \mathbb{R}^{ \left | V \right |} y∈R∣V∣ (实际是one-hot表示)越接近越好(我们后续会构建交叉熵损失函数并对其进行迭代优化)。

❐ 这里softmax是一个常用的函数。它将一个向量转换为另外一个向量,其中转换后的向量的第 i i i 个元素是 e y ^ i ∑ k = 1 ∣ V ∣ e y ^ k \frac{e^{\widehat{y}_i}}{\sum_{k=1}^{ \left | V \right |}e^{\widehat{y}_k}} ∑k=1∣V∣​ey ​k​ey ​i​​ 。

因为该函数是一个指数函数,所以值一定为正数。

通过除以 ∑ k = 1 ∣ V ∣ e y ^ k \sum_{k=1}^{ \left | V \right |}e^{\widehat{y}_k} ∑k=1∣V∣​ey ​k​ 来归一化向量(使得 ∑ k = 1 ∣ V ∣ y ^ k = 1 \sum_{k=1}^{ \left | V \right |}\widehat{y}_k=1 ∑k=1∣V∣​y ​k​=1 )得到概率。

下图是CBOW模型的计算图示:

CBOW模型的计算图示

如果有 V \mathcal{V} V 和 U \mathcal{U} U ,我们知道这个模型是如何工作的,那我们如何更新参数,学习这两个矩阵呢?和所有的机器学习任务相似,我们会构建目标函数,这里我们会使用交叉熵 H ( y ^ , y ) H(\widehat{y}, y) H(y ​,y) 来构建损失函数,它也是信息论里提的度量两个概率分布的距离的方法。

(关于交叉熵可以参考ShowMeAI的图解AI数学基础教程中文章图解AI数学基础 | 信息论)

在离散情况下,使用交叉熵可以直观地得出损失函数的公式

H ( y ^ , y ) = − ∑ j = 1 ∣ V ∣ y j log ⁡ ( y ^ j ) H(\widehat{y}, y)=-\sum_{j=1}^{ \left | V \right |} y_{j} \log (\widehat{y}_{j}) H(y ​,y)=−j=1∑∣V∣​yj​log(y ​j​)

上面的公式中, y y y 是one-hot向量。因此上面的损失函数可以简化为:

H ( y ^ , y ) = − y j   l o g ( y ^ j ) H(\widehat{y}, y)= - y_{j}\,log(\widehat{y}_{j}) H(y ​,y)=−yj​log(y ​j​)

c c c 是正确词的one-hot向量的索引。如果我们精准地预测 y ^ c = 1 \widehat{y}_{c}=1 y ​c​=1,可以计算此时 H ( y ^ , y ) = − 1   l o g ( 1 ) = 0 H(\widehat{y}, y)=-1\,log(1)=0 H(y ​,y)=−1log(1)=0 。因此,对于完全准确的预测,我们不会面临任何惩罚或者损失。

我们考虑一个相反的情况,预测非常差并且标准答案 y ^ c = 0.01 \widehat{y}_{c}=0.01 y ​c​=0.01 。进行相似的计算可以得到损失函数值 H ( y ^ , y ) = − 1   l o g ( 0.01 ) = 4.605 H(\widehat{y}, y)=-1\,log(0.01)=4.605 H(y ​,y)=−1log(0.01)=4.605 ,这表示目前损失较大,和标准答案差距较大。

从上面的例子可以看出,对于概率分布,交叉熵为我们提供了一个很好的距离度量。因此我们的优化目标函数公式为:

m i n i m i z e J = − log ⁡ P ( w c ∣ w c − m , ⋯   , w c − 1 , w c + 1 , ⋯   , w c + m ) = − log ⁡ P ( u c ∣ v ^ ) = − log ⁡ exp ⁡ ( u c T v ^ ) ∑ j = 1 ∣ V ∣ exp ⁡ ( u j T v ^ ) = − u c T v ^ + log ⁡ ∑ j = 1 ∣ V ∣ exp ⁡ ( u j T v ^ ) \begin{aligned} minimize J &=-\log P(w_{c} \mid w_{c-m}, \cdots, w_{c-1}, w_{c+1}, \cdots, w_{c+m}) \\ &=-\log P(u_{c} \mid \widehat{v}) \\ &=-\log \frac{\exp (u_{c}^{T} \widehat{v})}{\sum_{j=1}^{|V|} \exp (u_{j}^{T} \widehat{v})} \\ &=-u_{c}^{T} \widehat{v}+\log \sum_{j=1}^{|V|} \exp (u_{j}^{T} \widehat{v}) \end{aligned} minimizeJ​=−logP(wc​∣wc−m​,⋯,wc−1​,wc+1​,⋯,wc+m​)=−logP(uc​∣v )=−log∑j=1∣V∣​exp(ujT​v )exp(ucT​v )​=−ucT​v +logj=1∑∣V∣​exp(ujT​v )​

我们使用SGD(随机梯度下降)来更新所有相关的词向量 u c u_{c} uc​ 和 v j v_j vj​ 。
(关于SGD等优化算法可以参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 神经网络优化算法)

❐ 当 y ^ = y \widehat{y} = y y ​=y 时, y ^ ↦ H ( y ^ , y ) \widehat{y} \mapsto H(\widehat{y}, y) y ​↦H(y ​,y) 为最小值。如果我们找到一个 y ^ \widehat{y} y ​ 使得 H ( y ^ , y ) H(\widehat{y}, y) H(y ​,y) 接近最小值,那么 y ^ ≈ y \widehat{y} \approx y y ​≈y 。这意味着我们的模型非常善于根据上下文预测中心词!

❐ 为了学习向量(矩阵 U U U 和 V V V ),CBOW定义了一个损失函数,衡量它在预测中心词方面的表现。然后,我们通过更新矩阵 U U U 和 V V V 随机梯度下降来优化损失函数。

❐ SGD对一个窗口计算梯度和更新参数:

U n e w ← U o l d − α ∇ U J \mathcal{U}_{new} \leftarrow \mathcal{U}_{old} -\alpha \nabla_{\mathcal{U}} J Unew​←Uold​−α∇U​J

V o l d ← V o l d − α ∇ V J \mathcal{V}_{old} \leftarrow \mathcal{V}_{old}-\alpha \nabla_{\mathcal{V}} J Vold​←Vold​−α∇V​J

4.3 Skip-Gram模型

Skip-Gram模型与CBOW大体相同,但模型对于输入输出 x x x 和 y y y 进行了交换,即CBOW中的 x x x 现在是 y y y , y y y 现在是 x x x 。输入的one-hot向量(中心词)我们表示为 x x x ,输出向量为 y ( j ) y^{(j)} y(j) 。我们定义的 V \mathcal{V} V 和 U \mathcal{U} U 是和CBOW一样的。

❐ Skip-Gram模型:在给定中心词的情况下预测周围的上下文词。

下面我们来具体拆解一下Skip-Gram模型,首先我们定义一些符号标记

  • w i w_i wi​ :词汇表 V V V 中的单词 i i i

  • V ∈ R n × ∣ V ∣ \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} V∈Rn×∣V∣ :输入词矩阵

  • v i v_i vi​ : V \mathcal{V} V 的第 i i i 列,单词 w i w_i wi​ 的输入向量表示

  • U ∈ R ∣ V ∣ × n \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} U∈R∣V∣×n :输出词矩阵

  • u i u_i ui​ : U \mathcal{U} U 的第 i i i 行,单词 w i w_i wi​ 的输出向量表示

Skip-Gram的工作方式可以拆解为以下步骤:

  • ① 生成中心词的one-hot向量 x ∈ R ∣ V ∣ x\in \mathbb{R}^{ \left | V \right |} x∈R∣V∣

  • ② 我们对中心词计算得到词嵌入向量 v c = V x ∈ R ∣ V ∣ v_{c}=\mathcal{V}x\in \mathbb{R}^{ \left | V \right |} vc​=Vx∈R∣V∣

  • ③ 生成分数向量 z = U v c z = \mathcal{U}v_{c} z=Uvc​

  • ④ 将分数向量转化为概率, y ^ = s o f t m a x ( z ) \widehat{y}=softmax(z) y ​=softmax(z) 注意 y ^ c − m , ⋯   , y ^ c − 1 , y ^ c + 1 , ⋯   , y ^ c + m \widehat{y}_{c-m},\cdots,\widehat{y}_{c-1},\widehat{y}_{c+1},\cdots,\widehat{y}_{c+m} y ​c−m​,⋯,y ​c−1​,y ​c+1​,⋯,y ​c+m​ 是每个上下文词出现的概率

  • ⑤ 我们希望我们生成的概率向量匹配真实概率 y ( c − m ) , ⋯   , y ( c − 1 ) , y ( c + 1 ) , ⋯   , y ( c + m ) y^{(c-m)}, \cdots ,y^{(c-1)},y^{(c+1)}, \cdots ,y^{(c+m)} y(c−m),⋯,y(c−1),y(c+1),⋯,y(c+m) ,one-hot向量是实际的输出

和CBOW模型一样,我们需要生成一个目标函数来评估这个模型。与CBOW模型的一个主要的不同是我们引用了一个朴素的贝叶斯假设来拆分概率。这是一个很强(朴素)的条件独立假设。换而言之,给定中心词,所有输出的词是完全独立的(即公式1至2行)

m i n i m i z e J = − log ⁡ P ( w c − m , ⋯   , w c − 1 , w c + 1 , ⋯   , w c + m ∣ w c ) = − log ⁡ ∏ j = 0 , j ≠ m 2 m P ( w c − m + j ∣ w c ) = − log ⁡ ∏ j = 0 , j ≠ m 2 m P ( u c − m + j ∣ v c ) = − log ⁡ ∏ j = 0 , j ≠ m 2 m exp ⁡ ( u c − m + j T v c ) ∑ k = 1 ∣ V ∣ exp ⁡ ( u k T v c ) = − ∑ j = 0 , j ≠ m 2 m u c − m + j T v c + 2 m log ⁡ ∑ k = 1 ∣ V ∣ exp ⁡ ( u k T v c ) \begin{aligned} minimize J &= -\log P(w_{c-m}, \cdots, w_{c-1}, w_{c+1}, \cdots, w_{c+m} \mid w_{c}) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} P(w_{c-m+j} \mid w_{c}) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} P(u_{c-m+j} \mid v_{c}) \\ &=-\log \prod_{j=0, j \neq m}^{2 m} \frac{\exp (u_{c-m+j}^{T} v_{c})}{\sum_{k=1}^{ \left | V \right |} \exp (u_{k}^{T} v_{c})} \\ &=-\sum_{j=0, j \neq m}^{2 m} u_{c-m+j}^{T} v_{c}+2 m \log \sum_{k=1}^{ \left | V \right |} \exp (u_{k}^{T} v_{c}) \end{aligned} minimizeJ​=−logP(wc−m​,⋯,wc−1​,wc+1​,⋯,wc+m​∣wc​)=−logj=0,j=m∏2m​P(wc−m+j​∣wc​)=−logj=0,j=m∏2m​P(uc−m+j​∣vc​)=−logj=0,j=m∏2m​∑k=1∣V∣​exp(ukT​vc​)exp(uc−m+jT​vc​)​=−j=0,j=m∑2m​uc−m+jT​vc​+2mlogk=1∑∣V∣​exp(ukT​vc​)​

通过这个目标函数(损失函数),我们可以计算出与未知参数相关的梯度,并且在每次迭代中通过SGD来更新它们。

注意:

J = − ∑ j = 0 , j ≠ m 2 m log ⁡ P ( u c − m + j ∣ v c ) = ∑ j = 0 , j ≠ m 2 m H ( y ^ , y c − m + j ) J =-\sum_{j=0, j \neq m}^{2 m} \log P(u_{c-m+j} \mid v_{c}) =\sum_{j=0, j \neq m}^{2 m} H(\widehat{y}, y_{c-m+j}) J=−j=0,j=m∑2m​logP(uc−m+j​∣vc​)=j=0,j=m∑2m​H(y ​,yc−m+j​)

  • 其中 H ( y ^ , y c − m + j ) H(\widehat{y},y_{c-m+j}) H(y ​,yc−m+j​) 是向量 y ^ \widehat{y} y ​ 的概率和one-hot向量 y c − m + j y_{c-m+j} yc−m+j​ 之间的交叉熵。

❐ 只有一个概率向量 y ^ \widehat{y} y ​ 是被计算的。Skip-Gram对每个上下文单词一视同仁:该模型计算每个单词在上下文中出现的概率,而与它到中心单词的距离无关。

下图为Skip-Gram模型的计算图示:

Skip-Gram模型的计算图示

4.4 负例采样

我们再回到需要优化的目标函数上,我们发现在词表很大的情况下,对 ∣ V ∣ \left | V \right | ∣V∣ 的求和计算量是非常大的。任何的更新或者对目标函数的评估都要花费 O ( ∣ V ∣ ) O( \left | V \right |) O(∣V∣) 的时间复杂度。一个简单的想法是不去直接计算,而是去求近似值。

❐ 因为softmax标准化要对对所有分数求和,CBOW和Skip Gram的损失函数J计算起来很昂贵!

在每一个训练的时间步,我们不去遍历整个词汇表,而仅仅是抽取一些负样例。我们对噪声分布 P n ( w ) P_n(w) Pn​(w) “抽样”,这个概率是和词频的排序相匹配的。

Mikolov在论文《Distributed Representations of Words and Phrases and their Compositionality》中提出了负采样。虽然负采样是基于Skip-Gram模型,但实际上是对一个不同的目标函数进行优化。

考虑一组词对 ( w , c ) (w,c) (w,c) ,这组词对是训练集中出现过的中心词和上下文词吗?我们通过 P ( D = 1 ∣ w , c ) P(D=1\mid w,c) P(D=1∣w,c) 表示 ( w , c ) (w,c) (w,c) 在语料库出现过, P ( D = 0 ∣ w , c ) P(D=0\mid w,c) P(D=0∣w,c) 表示 ( w , c ) (w,c) (w,c) 在语料库中没有出现过。

这是一个二分类问题,我们基于sigmoid函数建模:

P ( D = 1 ∣ w , c , θ ) = σ ( v c T v w ) = 1 1 + e ( − v c T v w ) P(D=1 \mid w, c, \theta)=\sigma(v_c^{T} v_w)=\frac{1}{1+e^{(-v_c^{T} v_w)}} P(D=1∣w,c,θ)=σ(vcT​vw​)=1+e(−vcT​vw​)1​

❐ sigmoid函数是softmax的二分类版本,可用于建立概率模型: σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1​

sigmoid函数

现在,我们建立一个新的目标函数,如果中心词和上下文词确实在语料库中,就最大化概率 P ( D = 1 ∣ w , c ) P(D=1\mid w,c) P(D=1∣w,c) ,如果中心词和上下文词确实不在语料库中,就最大化概率 P ( D = 0 ∣ w , c ) P(D=0\mid w,c) P(D=0∣w,c) 。

(这就是逻辑回归对于二分类的处理思路,相关内容可以参考ShowMeAI的机器学习教程文章图解机器学习 | 逻辑回归算法详解)
我们对这两个概率采用一个简单的极大似然估计的方法(这里我们把 θ \theta θ 作为模型的参数,在我们的例子是 V \mathcal{V} V 和 U \mathcal{U} U )

θ = argmax ⁡ θ ∏ ( w , c ) ∈ D P ( D = 1 ∣ w , c , θ ) ∏ ( w , c ) ∈ D ~ P ( D = 0 ∣ w , c , θ ) = argmax ⁡ θ ∏ ( w , c ) ∈ D P ( D = 1 ∣ w , c , θ ) ∏ ( w , c ) ∈ D ~ ( 1 − P ( D = 1 ∣ w , c , θ ) ) = argmax ⁡ θ ∑ ( w , c ) ∈ D log ⁡ P ( D = 1 ∣ w , c , θ ) + ∑ ( w , c ) ∈ D ~ log ⁡ ( 1 − P ( D = 1 ∣ w , c , θ ) ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ 1 1 + exp ⁡ ( − u w T v c ) + ∑ ( w , c ) ∈ D ~ log ⁡ ( 1 − 1 1 + exp ⁡ ( − u w T v c ) ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ 1 1 + exp ⁡ ( − u w T v c ) + ∑ ( w , c ) ∈ D ~ log ⁡ ( 1 1 + exp ⁡ ( u w T v c ) ) \begin{aligned} \theta &=\underset{\theta}{\operatorname{argmax}} \prod_{(w, c) \in D} P(D=1 \mid w, c, \theta) \prod_{(w, c) \in \widetilde{D}} P(D=0 \mid w, c, \theta) \\ &=\underset{\theta}{\operatorname{argmax}} \prod_{(w, c) \in D} P(D=1 \mid w, c, \theta) \prod_{(w, c) \in \widetilde{D}}(1-P(D=1 \mid w, c, \theta)) \\ &=\underset{\theta}{\operatorname{argmax}} \sum_{(w, c) \in D} \log P(D=1 \mid w, c, \theta)+\sum_{(w, c) \in \widetilde{D}} \log (1-P(D=1 \mid w, c, \theta)) \\ &=\arg \max _{\theta} \sum_{(w, c) \in D} \log \frac{1}{1+\exp (-u_{w}^{T} v_{c})}+\sum_{(w, c) \in \widetilde{D}} \log (1-\frac{1}{1+\exp (-u_{w}^{T} v_{c})}) \\ &=\arg \max _{\theta} \sum_{(w, c) \in D} \log \frac{1}{1+\exp (-u_{w}^{T} v_{c})}+\sum_{(w, c) \in \widetilde{D}} \log (\frac{1}{1+\exp (u_{w}^{T} v_{c})}) \end{aligned} θ​=θargmax​(w,c)∈D∏​P(D=1∣w,c,θ)(w,c)∈D ∏​P(D=0∣w,c,θ)=θargmax​(w,c)∈D∏​P(D=1∣w,c,θ)(w,c)∈D ∏​(1−P(D=1∣w,c,θ))=θargmax​(w,c)∈D∑​logP(D=1∣w,c,θ)+(w,c)∈D ∑​log(1−P(D=1∣w,c,θ))=argθmax​(w,c)∈D∑​log1+exp(−uwT​vc​)1​+(w,c)∈D ∑​log(1−1+exp(−uwT​vc​)1​)=argθmax​(w,c)∈D∑​log1+exp(−uwT​vc​)1​+(w,c)∈D ∑​log(1+exp(uwT​vc​)1​)​

这里最大化似然函数等同于最小化负对数似然:

J = − ∑ ( w , c ) ∈ D log ⁡ 1 1 + exp ⁡ ( − u w T v c ) − ∑ ( w , c ) ∈ D ~ log ⁡ ( 1 1 + exp ⁡ ( u w T v c ) ) J=-\sum_{(w, c) \in D} \log \frac{1}{1+\exp (-u_{w}^{T} v_{c})}-\sum_{(w, c) \in \widetilde{D}} \log (\frac{1}{1+\exp (u_{w}^{T} v_{c})}) J=−(w,c)∈D∑​log1+exp(−uwT​vc​)1​−(w,c)∈D ∑​log(1+exp(uwT​vc​)1​)

注意 D ~ \widetilde{D} D 是“假的”或者“负的”语料。例如我们有句子类似 自然学习爱处理语言我技术 ,这种无意义的句子出现时会得到一个很低的概率。我们可以从语料库中随机抽样词汇构建负样例 D ~ \widetilde{D} D 。

对于Skip-Gram模型,我们对给定中心词 c c c 来观察的上下文单词 c − m + j c-m+j c−m+j 的新目标函数为

− log ⁡ σ ( u c − m + j T ⋅ v c ) − ∑ k = 1 K log ⁡ σ ( − u ~ k T ⋅ v c ) -\log \sigma(u_{c-m+j}^{T} \cdot v_{c})-\sum_{k=1}^{K} \log \sigma(-\tilde{u}_{k}^{T} \cdot v_{c}) −logσ(uc−m+jT​⋅vc​)−k=1∑K​logσ(−u~kT​⋅vc​)

对CBOW模型,我们对给定上下文向量 v ^ = v c − m + v c − m + 1 + ⋯ + v c + m 2 m \widehat{v}=\frac{v_{c-m}+v_{c-m+1}+ \cdots +v_{c+m}}{2m} v =2mvc−m​+vc−m+1​+⋯+vc+m​​ 来观察中心词 u c u_{c} uc​ 的新的目标函数为:

− l o g   σ ( u c T ⋅ v ^ ) − ∑ k = 1 K l o g   σ ( − u ~ k T ⋅ v ^ ) -log\,\sigma(u_{c}^{T}\cdot \widehat{v})-\sum_{k=1}^{K}log\,\sigma(-\widetilde{u}_{k}^{T}\cdot \widehat{v}) −logσ(ucT​⋅v )−k=1∑K​logσ(−u kT​⋅v )

在上面的公式中, { u ~ k ∣ k = 1 , ⋯   , K } \{\widetilde{u}_{k}\mid k=1, \cdots ,K\} {u k​∣k=1,⋯,K} 是从 P n ( w ) P_{n}(w) Pn​(w) 中抽样的词汇。关于计算选择某个词作为负样本的概率,可以使用随机选择。但论文作者给出了如下效果更好的公式:

p ( w i ) = f ( w i ) 3 4 ∑ j = 0 m f ( w j ) 3 4 p(w_i) = \frac{f(w_i)^{\frac{3}{4}}}{\sum^m_{j=0}f(w_j)^{\frac{3}{4}}} p(wi​)=∑j=0m​f(wj​)43​f(wi​)43​​

公式中, f ( w i ) f(w_i) f(wi​) 代表语料库中单词 w i w_i wi​ 出现的频率。上述公式更加平滑,能够增加低频词的选取可能。

4.5 层次化Softmax

Mikolov 在论文《Distributed Representations of Words and Phrases and their Compositionality》中提出了 hierarchical softmax(层次化softmax),相比普通的softmax这是一种更有效的替代方法。在实际中,hierarchical softmax 对低频词往往表现得更好,负采样对高频词和较低维度向量表现得更好。

❐ Hierarchical softmax 使用一个二叉树来表示词表中的所有词。树中的每个叶结点都是一个单词,而且只有一条路径从根结点到叶结点。在这个模型中,没有词的输出表示。相反,图的每个节点(根节点和叶结点除外)与模型要学习的向量相关联。单词作为输出单词的概率定义为从根随机游走到单词所对应的叶的概率。计算成本变为 O ( l o g ( ∣ V ∣ ) ) O(log ( \left | V \right |)) O(log(∣V∣)) 而不是 O ( ∣ V ∣ ) O( \left | V \right |) O(∣V∣) 。

在这个模型中,给定一个向量 w i w_i wi​ 的下的单词 w w w 的概率 p ( w ∣ w i ) p(w\mid w_i) p(w∣wi​) ,等于从根结点开始到对应w的叶结点结束的随机漫步概率。这个方法最大的优势是计算概率的时间复杂度仅仅是 O ( l o g ( ∣ V ∣ ) ) O(log( \left | V \right |)) O(log(∣V∣)) ,对应着路径的长度。

❐ 下图是 Hierarchical softmax 的二叉树示意图:

Hierarchical Softmax 二叉树示意图

让我们引入一些概念。令 L ( w ) L(w) L(w) 为从根结点到叶结点 w w w 的路径中节点数目。例如,上图中的 L ( w 2 ) L(w_2) L(w2​) 为3。我们定义 n ( w , i ) n(w,i) n(w,i) 为与向量 v n ( w , i ) v_{n(w,i)} vn(w,i)​ 相关的路径上第 i i i 个结点。因此 n ( w , 1 ) n(w,1) n(w,1) 是根结点,而 n ( w , L ( w ) ) n(w,L(w)) n(w,L(w)) 是 w w w 的父节点。现在对每个内部节点 n n n ,我们任意选取一个它的子节点,定义为 c h ( n ) ch(n) ch(n) (一般是左节点)。然后,我们可以计算概率为

p ( w ∣ w i ) = ∏ j = 1 L ( w ) − 1 σ ( [ n ( w , j + 1 ) = c h ( n ( w , j ) ) ] ⋅ v n ( w , j ) T v w i ) p(w \mid w_i)=\prod_{j=1}^{L(w)-1} \sigma([n(w, j+1)=ch(n(w, j))] \cdot v_{n(w, j)}^{T} v_{w_i}) p(w∣wi​)=j=1∏L(w)−1​σ([n(w,j+1)=ch(n(w,j))]⋅vn(w,j)T​vwi​​)

其中

[ x ] = { 1  if  x  is true  − 1  otherwise  [x]=\left\{\begin{array}{ll}{1} & {\text { if } x \text { is true }} \\ {-1} & {\text { otherwise }}\end{array}\right. [x]={1−1​ if x is true  otherwise ​

这个公式看起来非常复杂,我们来展开讲解一下。

  • 首先,我们将根据从根节点 ( n ( w , 1 ) ) (n(w,1)) (n(w,1)) 到叶节点 ( w ) (w) (w) 的路径的形状(左右分支)来计算相乘的项。如果我们假设 c h ( n ) ch(n) ch(n) 一直都是 n n n 的左节点,然后当路径往左时 [ n ( w , j + 1 ) = c h ( n ( w , j ) ) ] [n(w,j+1)=ch(n(w,j))] [n(w,j+1)=ch(n(w,j))] 的值返回1,往右则返回0。

  • 此外, [ n ( w , j + 1 ) = c h ( n ( w , j ) ) ] [n(w,j+1)=ch(n(w,j))] [n(w,j+1)=ch(n(w,j))] 提供了归一化的作用。在节点 n n n 处,如果我们将去往左和右节点的概率相加,对于 v n T v w i v_{n}^{T}v_{w_i} vnT​vwi​​ 的任何值则可以检查, σ ( v n T v w i ) + σ ( − v n T v w i ) = 1 \sigma(v_{n}^{T} v_{w_i})+\sigma(-v_{n}^{T} v_{w_i})=1 σ(vnT​vwi​​)+σ(−vnT​vwi​​)=1 。归一化也保证了 ∑ w = 1 ∣ V ∣ P ( w ∣ w i ) = 1 \sum_{w=1}^{ \left | V \right |}P(w\mid w_i)=1 ∑w=1∣V∣​P(w∣wi​)=1 ,和普通的softmax是一样的。

  • 最后我们计算点积来比较输入向量 v w i v_{w_i} vwi​​ 对每个内部节点向量 v n ( w , j ) T v_{n(w,j)}^{T} vn(w,j)T​ 的相似度。下面我们给出一个例子。以上图中的 w 2 w_2 w2​ 为例,从根节点要经过两次左边的边和一次右边的边才到达 w 2 w_2 w2​ ,因此

p ( w 2 ∣ w i ) = p ( n ( w 2 , 1 ) , left ) ⋅ p ( n ( w 2 , 2 ) , left ) ⋅ p ( n ( w 2 , 3 ) ,  right  ) = σ ( v n ( w 2 , 1 ) T v w i ) ⋅ σ ( v n ( w 2 , 2 ) T v w i ) ⋅ σ ( − v n ( w 2 , 3 ) T v w i ) \begin{aligned} p(w_2 \mid w_i) &=p(n(w_2, 1), \text {left}) \cdot p(n(w_2, 2), \text {left}) \cdot p(n(w_2, 3), \text { right }) \\ &=\sigma(v_{n(w_2, 1)}^{T} v_{w_i}) \cdot \sigma(v_{n(w_2, 2)}^{T} v_{w_i}) \cdot \sigma(-v_{n(w_2, 3)}^{T} v_{w_i}) \end{aligned} p(w2​∣wi​)​=p(n(w2​,1),left)⋅p(n(w2​,2),left)⋅p(n(w2​,3), right )=σ(vn(w2​,1)T​vwi​​)⋅σ(vn(w2​,2)T​vwi​​)⋅σ(−vn(w2​,3)T​vwi​​)​

我们训练模型的目标是最小化负的对数似然 − l o g   P ( w ∣ w i ) -log\,P(w\mid w_i) −logP(w∣wi​) 。不是更新每个词的输出向量,而是更新更新二叉树中从根结点到叶结点的路径上的节点的向量。

该方法的速度由构建二叉树的方式确定,并将词分配给叶节点。Mikolov在论文《Distributed Representations of Words and Phrases and their Compositionality》中使用的是哈夫曼树,在树中分配高频词到较短的路径。

5.基于python gensim工具库构建词向量

在python中可以很简单地基于Gensim工具库构建和使用词向量,提供了most_similar、doesnt_match等应用API。我们可以对most_similar进行封装,输出三元组的类比结果,代码如下

model = KeyedVectors.load_word2vec_format(word2vec_glove_file)
model.most_similar('banana')
def analogy(x1, x2, y1):
    result = model.most_similar(positive=[y1, x2], negative=[x1])
    return result[0][0]
analogy('japan', 'japanese', 'australia')
model.doesnt_match("breakfast cereal dinner lunch".split())

6.拓展阅读

Word2Vec Tutorial - The Skip-Gram Model

6.1 任务示例

我们将训练一个带有单个隐藏层的简单神经网络来执行某个任务,但是我们实际上并没有将这个神经网络用于我们训练它的任务。相反,目标实际上只是学习隐藏层的权重,这实际上是我们试图学习的“单词向量”。这一技巧也在无监督的特征学习常用。训练一个auto-encoder从而在隐藏层中压缩输入向量并在输出层将隐藏层向量解压缩得到输入向量。训练完成后,去除输出层,只是用隐藏层。

下图是从源文本中抽取样本的过程

从源文本中抽取样本的过程

下图是网络架构图
网络架构图
如果两个不同的单词具有非常相似的“上下文”(即它们周围可能出现的单词是相似的),那么我们的模型需要为这两个单词输出非常相似的结果。网络为这两个单词输出类似的上下文预测的一种方式是判断单词向量是否相似。因此,如果两个单词具有相似的上下文,那么我们的网络就会为这两个单词学习相似的单词向量!

  • Efficient Estimation of Word Representations in Vector Space(original word2vec paper)
  • Distributed Representations of Words and Phrases and their Compositionality (negative sampling paper)

7.参考资料

ShowMeAI 深度学习与自然语言处理教程(完整版)

ShowMeAI 斯坦福NLP名课 CS224n带学详解(20讲·完整版)

ShowMeAI系列教程精选推荐

学习笔记:深度学习(5)——词向量的相关概念 BERT等预训练模型预备学习知识。 阅读详情

相关推荐

深度学习——NLP中词的表示方法&word embedding&word2vec

一直有点没明白标题中三者的关系,在此记录下来自己查阅之后的看法,有不对的地方,请大家指正,谢谢! 关于NLP中,有各种不同的表达,如:词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系? 希望写完这篇文章后,自己能清楚地理清他们之间的关系。 https://blog.youkuaiyun.com...

Gloria的博客 5907

词向量发展史-共现矩阵-SVD-NNLM-Word2Vec-Glove-ELMo

话不多说,直接上干货。 首先介绍相关概念: 词嵌入:把词映射为实数域上向量的技术也叫词嵌入(word embedding)。 词向量的分类表示: 一、共现矩阵        通过统计一个事先指定大小的窗口内的word共现次数,以word周边的共现词的次数做为当前word的vector。具体来说,我们通过从大量的语料文本中构建一个共现矩阵来定义word representation。 ...

m0_37565948的博客 1万+

词向量(Word Embedding)

一、词的表示 在自然语言处理任务中,首先需要考虑词如何在计算机中表示。通常,有两种表示方式:one-hot representation和distribution representation。简而言之,词向量技术是将词转化成为稠密向量,并且对于相似的词,其对应的词向量也相近。 1.1 离散表示(one-hot representation) 传统的基于规则或基于统计的自然语义处理方法将单词看作一...

qq_36134437的博客 5160

Python共生矩阵对比奇异值分解 (SVD)和词嵌入

词嵌入 词嵌入是转换成数字的文本。同一文本可能有不同的数字表示。 许多机器学习算法和几乎所有深度学习架构都无法处理原始形式的字符串或纯文本。 它们需要数字作为输入来执行任何类型的工作,从广义上讲是分类、回归等。 不同类型的词嵌入可以大致分为两类: 基于频率的嵌入 我们在这一类下遇到的向量一般有三类:计数向量、TF-IDF向量、具有固定上下文窗口的共生矩阵。 基于预测的嵌入 我们在这个类别下通常会遇到两种类型的向量:连续的词袋(CBOW)、Skip-Gram。 本文,我们将关注具有固定上下文窗口的共生矩阵。

跨学科知识视角展现 1156

从Word2Vec的辉煌看共现矩阵:被忽略的NLP词向量奠基技术

本文探讨了共现矩阵(Co-Occurrence Matrix)与SVD在NLP词向量技术中的奠基作用,揭示了这一被低估的统计方法在现代自然语言处理中的独特价值。通过分析共现矩阵的数学本质、SVD降维技巧及其与Word2Vec的内在联系,文章为读者提供了构建高效词向量系统的实践指南,特别适合领域特定语料和低资源语言场景。

weixin_42620913的博客 361

NLP进阶之(六)Word2Vec+FastText+Glove

NLP进阶之(六)Word2Vec+FastText+Glove1. WordEmbedding(seq2seq)1.4 负采样1.1 编码器1.2 解码器1.3 模型训练1.4 参考文献2. 注意力机制(Attention)2.1 注意力机制背景2.2 计算背景变量2.3 矢量化计算2.4 更新隐藏状态3. 小结3.1 参考链接 1. WordEmbedding(seq2seq) NLP之前的章...

qq_35495233的博客 1755

SVD分解——>潜在语义分析LSA(I)——>概率性潜在语义分析PLSA(I)

SVD分解 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等。两个向量正交的意思是两个向量的内积为 0。 正定矩阵:如果对于所有的非零实系数向量 zzz,都有zTAz>0z^TAz>0zTAz>0,则称矩阵AAA是正定的。正定矩阵的行列式必然大于 0,所有特征值也必然 > 0。相对应的,半正

十三 3882

【NLP】词向量

Word2Vec 本质上也是一个神经语言模型,但是它的目标并不是语言模型本身,而是词向量;因此,其所作的一系列优化,都是为了更快更好的得到词向量。,因为 FastText 使用了字符级的 N-gram 向量作为额外的特征,使其能够对。如果根据经验公式,是不需要这么大的,比如 200W 词表的词向量维度只需要。虽然 SG 模型用中心词做特征,上下文词做类标,但实际上两者的地位是等价的。只要未登录词能被已知的 n-grams 组合,就能得到该词的词向量。,以词表中词作为叶子节点,各词的出现频率作为权重——共。

sikh_0529的博客 1718

c++svd算法_词向量学习算法 Glove

常见的词嵌入算法有基于矩阵分解的方法和基于浅层窗口的方法,Glove 结合了这两类方法的优点生成词向量。基于矩阵分解的方法可以有效地利用全局信息,但是在大数据集上速度慢;而基于浅层窗口的方法对于词汇类比任务效果较好,训练速度快,但是不能有效利用全局信息。1. 词嵌入算法 Word Embedding在上一篇文章《词表征学习—Word2Vec 嵌入算法》中,主要介绍了词嵌入算法 Word2Vec。与...

weixin_42401137的博客 554

在VScode中配置Python开发环境(详细图片文字结合)

需要用到的软件下载包在官网里找一下,在window下的点击安装就行了;找一个3.8到3.10版本差不多都完善跟的上;

m0_72811193的博客 1599

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖与web.xml配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5的完整流程,包括依赖改造、web.xml配置降级等关键步骤。通过实战案例和避坑指南,帮助开发者高效完成国产中间件适配,确保项目平稳运行。特别针对Tomcat依赖排除和BES适配器选择提供了专业建议。

weixin_30689307的博客 742

95、自然语言处理svd词向量

import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like","enjoy","deep","learning","NLP","flying","."] X = np.array([[0,2,1,0,0,0,0,0], [2,0,0,1,...

aihaotan8299的博客 402

H3C无线控制器AC与第三方认证系统集成实现企业级Portal短信认证方案

本文详细阐述了如何将H3C无线控制器(AC)与第三方认证系统集成,构建企业级Portal短信认证方案。该方案通过手机号作为临时凭证,实现了访客网络的实名追溯、权限控制与专业体验。文章深入解析了方案原理、H3C AC的关键配置步骤、第三方系统对接要点及短信网关选型避坑指南,为企业提升网络安全管理与访客服务质量提供了完整、可行的实战指导。

a3b4c5的博客 196

【笔记3-2】CS224N课程笔记+作业参考代码 - 词向量表示 word2vec

CS224N(二)Word VectorsHow to represent meaning of wordsWord2vecDerivations of gradient CS224n:深度学习的自然语言处理(2017年冬季)1080p https://www.bilibili.com/video/av28030942/ How to represent meaning of words me...

cindy_1102的博客 6797

DCDC: 前馈电容优化环路稳定性的设计与验证方法

本文深入探讨了DCDC转换器中前馈电容对环路稳定性的优化设计与验证方法。通过分析前馈电容的作用原理、选型计算和实验验证,详细介绍了如何利用穿越频率和相位裕度等关键参数提升系统性能。文章还提供了实用的设计经验和问题排查技巧,帮助工程师在实际应用中实现DCDC转换器的最佳稳定性。

weixin_42531516的博客 441

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 674

【NLP】词向量:从word2vec、glove、ELMo到BERT详解!

目前,词向量(又叫词嵌入word embedding)已经成为NLP领域各种任务的必备一步,而且随着bert elmo,gpt等预训练模型的发展,词向量演变为知识表示方法,但其本质思想不变。学习各种词向量训练原理可以很好地掌握NLP各种方法。生成词向量的方法有很多种,本文重点介绍word2vec,glove和bert。 各种词向量的特点: One-hot:维度灾难 and 语义鸿沟;...

Nieson2012的专栏 4399

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2886

word2vec原理(一): 词向量、CBOW与Skip-Gram模型基础

word2vec原理(一): CBOW与Skip-Gram模型基础 word2vec原理(二):基于Hierarchical Softmax的模型 word2vec原理(三): 基于Negative Sampling的模型 目录 1. 词向量基础 1.1One-Hot 编码(独热编码) 1.2 分布式表示:词向量/词嵌入 1.3 词向量可视化 1.4 用词嵌入做迁移学习 2. ...

满腹的小不甘 1万+

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

QGIS004:【05矢量属性表】-保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段

摘要:QGIS矢量属性表工具箱包括保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段等选项,本文介绍各选项的基本操作。

qq_31762031的博客 2312

NLP的发展历程

文章目录一、第一阶段(地上爬)1、传统统计语言模型:n-gram2、 n-gram 存在的三个缺点二、第二阶段(爬上第一阶梯)1.NNLM(Neural Net Language Model)--铺垫2.NNLM优化----铺垫3.word2vec---突破4.word2vec---发展三、第三阶段(爬上第二阶梯)1.ELMo--铺垫2.GPT--曙光3.bert--突破4.bert--发展 转载来源:https://zhuanlan.zhihu.com/p/143473222 介绍bert之前我们先来看一

hwaust2020的博客 2241

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从单词到向量-自然语言处理NLP

-译文,原文链接:Word to Vectors — Natural Language Processing 为什么NLP比较难? 计算机以清晰、准确并且通常是结构化的程序语言与人类交互。然而,人类的语言通常不是那么清晰。有同义词、反义词、反义词还有一些单词在用做名词和动词会表现出不同的含义。这些字词在自然语言中具有上下文相关的意义,人类可以理解和区分它们,而机器则不能。这就是使NLP成为AI中最...

weixin_37775555的博客 1159

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

点击上方,选择星标或置顶,每天给你送干货!阅读大概需要15分钟跟随小博主,每天进步一丢丢作者:JayLou,NLP算法工程师知乎专栏:高能NLP之路地址:https://...

zandaoguang的博客 1087

NLP中的词向量总结与实战:从one-hot到bert

离散表示 One-hot独热表示法 NLP 中最常用、最传统的词特征表示方式是采用One-Hot 编码,即每一个词特征都被表示成一个很长的向量,其长度等于词表大小,当前词对应位置为1,其他位置为0。 但是这种表示方式存在显而易见的问题: 不同词之间总是正交的,无法衡量不同词之间的相似关系。 只能反映每个词是否出现,但无法突出词之间重要性的区别。 BOW词袋表示法 在One-Hot 表示...

Kaiyuan_sjtu的博客 3410

词向量:开启自然语言处理的奇妙之旅

在词类比任务中,GloVe 常常能表现出比 Word2Vec 更优越的性能。对于 “China - Beijing + Washington = USA” 这样的类比推理,GloVe 能够更准确地得出结果,因为它利用了全局统计信息,对词汇间的语义关系把握得更加准确。在文本相似度计算任务中,GloVe 生成的词向量也能更精确地衡量文本之间的语义相似度。然而,GloVe 模型也有一定的局限性。由于。

2201_76024043的博客 893
上一篇: 大厂技术实现 | 行业解决方案系列教程
下一篇: 斯坦福NLP名课带学详解 | CS224n 第1讲 - NLP介绍与词向量初步(NLP通关指南·完结)
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值