作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/36
本文地址:http://www.showmeai.tech/article-detail/230
申明:版权所有,转载请分割平台与作者并注明出处

珍藏ShowMeAI查看更多精彩内容


本系列为斯坦福CS224n《自然语言解决与深度学习(Natural Language Processing with Deep Learning)》的全套学习笔记,对应的课程视频能够在 这里 查看。


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 \) 维空间足够咱们编码语言的所有语义,每一维度都会编码一些咱们应用语言传递的信息。

简略的one-hot向量无奈给出单词间的相似性,咱们须要将维度 \( \left | V \right | \) 缩小至一个低纬度的子空间,来取得浓密的词向量,取得词之间的关系。

3.基于SVD降维的词向量

(对于降维算法能够浏览ShowMeAI的机器学习教程文章图解机器学习 | 降维算法详解,也能够通过ShowMeAI的机器学习实战文章机器学习实战 | 机器学习特色工程最全解读对于降维的python利用办法)

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

  • 咱们首先遍历一个很大的数据集和统计词的共现计数矩阵 \( X \)
  • 而后对矩阵 \( X \) 进行SVD合成失去 \( USV^T \)
  • 再而后咱们应用 \( U \) 的行来作为字典中所有词的词向量

接下来咱们讨论一下矩阵 \( X \) 的几种抉择。

3.1 词-文档矩阵

最后的解决方案是基于词-文档共现矩阵实现的。咱们猜测相干连的单词在同一个文档中会经常出现:

  • 例如,“banks”,“bonds”,“stocks”,“moneys”等等,呈现在一起的概率会比拟高
  • 然而,“banks”,“octopus”,“banana”,“hockey”不大可能会间断地呈现

咱们依据这个状况来建设一个Word-Document矩阵, \( X \) 是依照以下形式构建:遍历数亿的文档和当词 \( i \) 呈现在文档 \( j \) ,咱们对 \( X_{ij} \) 加一。

这显然是一个很大的矩阵 \( \mathbb{R}^{ \left | V \right | \times M} \) ,它的规模是和文档数量 \( M \) 成正比关系。因而咱们能够尝试更好的办法。

3.2 基于滑窗的词共现矩阵

全文档统计是一件十分耗时耗力的事件,咱们能够进行调整对一个文本窗内的数据进行统计,计算每个单词在特定大小的窗口中呈现的次数,失去共现矩阵 \( X \) 。

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

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

应用单词共现矩阵

  • 生成维度为 \( \left | V \right |\times \left | V \right | \) 的共现矩阵 \( X \)
  • 在 \( X \) 上利用SVD从而失去 \( X = USV^T \)
  • 抉择 \( U \) 前 \( k \) 行失去 \( k \) 维的词向量
  • \( \frac{\sum_{i=1}^{k} \sigma_i}{\sum_{i=1}^{ \left | V \right |} \sigma_i} \) 示意第一个 \( k \) 维蕴含的方差量

3.3 利用SVD对共现矩阵降维

  • 咱们对矩阵 \( X \) 应用SVD,察看奇怪值(矩阵 \( S \) 上对角线上元素),依据方差百分比截断,留下前 \( k \) 个元素:

$$\frac{\sum_{i=1}^{k} \sigma_i}{\sum_{i=1}^{ \left | V \right |} \sigma_i}$$

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

对矩阵 \( X \) 应用SVD

通过抉择前 \( k \) 个奇怪向量来升高维度

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

  • 矩阵的维度会常常产生扭转(常常减少新的单词和语料库的大小会扭转)
  • 矩阵会十分的稠密,因为很多词不会共现
  • 矩阵维度个别会十分高 \( \approx 10^6 \times 10^6 \)
  • 须要在 \( X \) 上退出一些技巧解决来解决词频的极剧的不均衡
❐ 基于SVD的办法的计算复杂度很高( \( m \times n \) 矩阵的计算成本是 \( O({mn}^2) \) ),并且很难合并新单词或文档。

对上述探讨中存在的问题存在以下的解决办法

  • 疏忽性能词,例如“the”,“he”,“has”等等
  • 应用ramp window,即依据文档中单词之间的间隔对共现计数进行加权
  • 应用皮尔逊相关系数并将负计数设置为 \( 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 \) 个词的序列的概率是:

$$P(w_1, w_2, \cdots, w_n)$$

在一元语言模型办法(Unigram model)中,咱们假如单词的呈现是齐全独立的,从而合成概率

$$P(w_1, w_2, \cdots, w_n)=\prod_{i=1}^{n} P(w_i)$$

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

$$P(w_1, w_2, \cdots, w_n)=\prod_{i=2}^{n} P(w_i \mid w_{i-1})$$

的确,只关怀邻近单词还是有点简略,大家思考间断的n个词共现会失去n-gram。但即便应用bigram都能够带来绝对unigram显著的晋升。思考在词-词共现矩阵中,共现窗口为 \( 1 \) ,咱们基本上能失去这样的成对的概率。然而,这又须要计算和存储大量数据集的全局信息。

既然咱们曾经了解了如何思考具备概率的单词序列,那么让咱们察看一些可能学习这些概率的示例模型。

4.2 CBOW间断词袋模型

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

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

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

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

上面咱们定义模型的未知参数

咱们创立两个矩阵, \( \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} \) 和 \( \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} \) 。其中:

  • \( n \) 是嵌入空间的任意维度大小
  • \( \mathcal{V} \) 是输出词矩阵,使得当其为模型的输出时, \( \mathcal{V} \) 的第 \( i \) 列是词 \( w_i \) 的 \( n \) 维嵌入向量,定义这个 \( n \times 1 \) 的向量为 \( v_i \)
  • 类似地, \( \mathcal{U} \) 是输入词矩阵。当其为模型的输出时, \( \mathcal{U} \) 的第j行是词 \( w_{j} \) 的 \( n \) 维嵌入向量。咱们定义 \( \mathcal{U} \) 的这行为 \( u_j \)
  • 留神实际上对每个词 \( w_i \) 咱们须要学习两个词向量(即输出词向量 \( v_i \) 和输入词向量 \( u_i \) )。

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

  • \( w_i \) :词汇表 \( V \) 中的单词 \( i \)
  • \( \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} \) :输出词矩阵
  • \( v_i \) : \( \mathcal{V} \) 的第 \( i \) 列,单词 \( w_i \) 的输出向量示意
  • \( \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} \) :输入词矩阵
  • \( u_i \) : \( \mathcal{U} \) 的第 \( i \) 行,单词 \( w_i \) 的输入向量示意

咱们将这个模型合成为以下步骤

  • ① 咱们为大小为 \( m \) 的输出上下文词汇,生成one-hot词向量 \( (x^{(c-m)}, \cdots ,x^{(c-1)},x^{(c+1)}, \cdots ,x^{(c+m)}\in \mathbb{R}^{ \left | V \right |}) \)
  • ② 咱们基于上述one-hot输出计算失去嵌入词向量 \( (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}) \) 。
  • ③ 对上述的词向量求平均值 \( \widehat{v}=\frac{v_{c-m}+v_{c-m+1}+ \cdots +v_{c+m}}{2m}\in \mathbb{R}^{n} \) 。
  • ④ 计算分数向量 \( z = \mathcal{U}\widehat{v}\in \mathbb{R}^{ \left | V \right |} \) 。类似的词对向量的点积值大,这会令类似的词更为凑近,从而取得更高的分数。
  • ⑤ 将分数通过softmax转换为概率 \( \widehat{y}=softmax(z)\in \mathbb{R}^{ \left | V \right |} \) 。
  • ⑥ 咱们心愿生成的概率 \( \widehat{y} \in \mathbb{R}^{ \left | V \right |} \) 与理论的概率 \( y \in \mathbb{R}^{ \left | V \right |} \) (理论是one-hot示意)越靠近越好(咱们后续会构建穿插熵损失函数并对其进行迭代优化)。
这里softmax是一个罕用的函数。它将一个向量转换为另外一个向量,其中转换后的向量的第 \( i \) 个元素是 \( \frac{e^{\widehat{y}_i}}{\sum_{k=1}^{ \left | V \right |}e^{\widehat{y}_k}} \) 。

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

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

下图是CBOW模型的计算图示

如果有 \( \mathcal{V} \) 和 \( \mathcal{U} \) ,咱们晓得这个模型是如何工作的,那咱们如何更新参数,学习这两个矩阵呢?和所有的机器学习工作类似,咱们会构建指标函数,这里咱们会应用穿插熵 \( H(\widehat{y}, y) \) 来构建损失函数,它也是信息论里提的度量两个概率分布的间隔的办法。

(对于穿插熵能够参考ShowMeAI的图解AI数学基础教程中文章图解AI数学根底 | 信息论

在离散状况下,应用穿插熵能够直观地得出损失函数的公式

$$H(\widehat{y}, y)=-\sum_{j=1}^{ \left | V \right |} y_{j} \log (\widehat{y}_{j}) $$

下面的公式中, \( y \) 是one-hot向量。因而下面的损失函数能够简化为:

$$H(\widehat{y}, y)= - y_{j}\,log(\widehat{y}_{j})$$

\( c \) 是正确词的one-hot向量的索引。如果咱们精准地预测 \( \widehat{y}_{c}=1 \) ,能够计算此时 \( H(\widehat{y}, y)=-1\,log(1)=0 \) 。因而,对于齐全精确的预测,咱们不会面临任何惩办或者损失。

咱们思考一个相同的状况,预测十分差并且标准答案 \( \widehat{y}_{c}=0.01 \) 。进行类似的计算能够失去损失函数值 \( H(\widehat{y}, y)=-1\,log(0.01)=4.605 \) ,这示意目前损失较大,和标准答案差距较大。

从下面的例子能够看出,对于概率分布,穿插熵为咱们提供了一个很好的间隔度量。因而咱们的优化指标函数公式为:

$$\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}$$

咱们应用SGD(随机梯度降落)来更新所有相干的词向量 \( u_{c} \) 和 \( v_j \) 。
(对于SGD等优化算法能够参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 神经网络优化算法

❐ 当 \( \widehat{y} = y \) 时, \( \widehat{y} \mapsto H(\widehat{y}, y) \) 为最小值。如果咱们找到一个 \( \widehat{y} \) 使得 \( H(\widehat{y}, y) \) 靠近最小值,那么 \( \widehat{y} \approx y \) 。这意味着咱们的模型十分长于依据上下文预测中心词!

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

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

\( \mathcal{U}_{new} \leftarrow \mathcal{U}_{old} -\alpha \nabla_{\mathcal{U}} J \)

\( \mathcal{V}_{old} \leftarrow \mathcal{V}_{old}-\alpha \nabla_{\mathcal{V}} J \)

4.3 Skip-Gram模型

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

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

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

  • \( w_i \) :词汇表 \( V \) 中的单词 \( i \)
  • \( \mathcal{V}\in \mathbb{R}^{n\times \left | V \right |} \) :输出词矩阵
  • \( v_i \) : \( \mathcal{V} \) 的第 \( i \) 列,单词 \( w_i \) 的输出向量示意
  • \( \mathcal{U}\in \mathbb{R}^{ \left | V \right |\times n} \) :输入词矩阵
  • \( u_i \) : \( \mathcal{U} \) 的第 \( i \) 行,单词 \( w_i \) 的输入向量示意

Skip-Gram的工作形式能够拆解为以下步骤

  • ① 生成中心词的one-hot向量 \( x\in \mathbb{R}^{ \left | V \right |} \)
  • ② 咱们对中心词计算失去词嵌入向量 \( v_{c}=\mathcal{V}x\in \mathbb{R}^{ \left | V \right |} \)
  • ③ 生成分数向量 \( z = \mathcal{U}v_{c} \)
  • ④ 将分数向量转化为概率, \( \widehat{y}=softmax(z) \) 留神 \( \widehat{y}_{c-m},\cdots,\widehat{y}_{c-1},\widehat{y}_{c+1},\cdots,\widehat{y}_{c+m} \) 是每个上下文词呈现的概率
  • ⑤ 咱们心愿咱们生成的概率向量匹配实在概率 \( y^{(c-m)}, \cdots ,y^{(c-1)},y^{(c+1)}, \cdots ,y^{(c+m)} \) ,one-hot向量是理论的输入

和CBOW模型一样,咱们须要生成一个指标函数来评估这个模型。与CBOW模型的一个次要的不同是咱们援用了一个奢侈的贝叶斯假如来拆分概率。这是一个很强(奢侈)的条件独立假如。换而言之,给定中心词,所有输入的词是齐全独立的(即公式1至2行)

$$\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}$$

通过这个指标函数(损失函数),咱们能够计算出与未知参数相干的梯度,并且在每次迭代中通过SGD来更新它们。

留神:

$$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})$$

  • 其中 \( H(\widehat{y},y_{c-m+j}) \) 是向量 \( \widehat{y} \) 的概率和one-hot向量 \( y_{c-m+j} \) 之间的穿插熵。
❐ 只有一个概率向量 \( \widehat{y} \) 是被计算的。Skip-Gram对每个上下文单词厚此薄彼:该模型计算每个单词在上下文中呈现的概率,而与它到核心单词的间隔无关。

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

4.4 负例采样

咱们再回到须要优化的指标函数上,咱们发现在词表很大的状况下,对 \( \left | V \right | \) 的求和计算量是十分大的。任何的更新或者对指标函数的评估都要花费 \( O( \left | V \right |) \) 的工夫复杂度。一个简略的想法是不去间接计算,而是去求近似值。

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

在每一个训练的工夫步,咱们不去遍历整个词汇表,而仅仅是抽取一些负样例。咱们对噪声散布 \( P_n(w) \) “抽样”,这个概率是和词频的排序相匹配的。

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

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

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

$$P(D=1 \mid w, c, \theta)=\sigma(v_c^{T} v_w)=\frac{1}{1+e^{(-v_c^{T} v_w)}}$$

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

当初,咱们建设一个新的指标函数,如果中心词和上下文词的确在语料库中,就最大化概率 \( P(D=1\mid w,c) \) ,如果中心词和上下文词的确不在语料库中,就最大化概率 \( P(D=0\mid w,c) \) 。

(这就是逻辑回归对于二分类的解决思路,相干内容能够参考ShowMeAI的机器学习教程文章图解机器学习 | 逻辑回归算法详解
咱们对这两个概率采纳一个简略的极大似然预计的办法(这里咱们把 \( \theta \) 作为模型的参数,在咱们的例子是 \( \mathcal{V} \) 和 \( \mathcal{U} \) )

$$\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}$$

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

$$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})})$$

留神 \( \widetilde{D} \) 是“假的”或者“负的”语料。例如咱们有句子相似 天然学习爱解决语言我技术 ,这种无意义的句子呈现时会失去一个很低的概率。咱们能够从语料库中随机抽样词汇构建负样例 \( \widetilde{D} \) 。

对于Skip-Gram模型,咱们对给定中心词 \( c \) 来察看的上下文单词 \( c-m+j \) 的新指标函数为

$$-\log \sigma(u_{c-m+j}^{T} \cdot v_{c})-\sum_{k=1}^{K} \log \sigma(-\tilde{u}_{k}^{T} \cdot v_{c})$$

对CBOW模型,咱们对给定上下文向量 \( \widehat{v}=\frac{v_{c-m}+v_{c-m+1}+ \cdots +v_{c+m}}{2m} \) 来察看中心词 \( u_{c} \) 的新的指标函数为:

$$-log\,\sigma(u_{c}^{T}\cdot \widehat{v})-\sum_{k=1}^{K}log\,\sigma(-\widetilde{u}_{k}^{T}\cdot \widehat{v})$$

在下面的公式中, \( {\widetilde{u}_{k}\mid k=1, \cdots ,K} \) 是从 \( P_{n}(w) \) 中抽样的词汇。对于计算抉择某个词作为负样本的概率,能够应用随机抉择。但论文作者给出了如下成果更好的公式:

$$p(w_i) = \frac{f(w_i)^{\frac{3}{4}}}{\sum^m_{j=0}f(w_j)^{\frac{3}{4}}}$$

公式中, \( f(w_i) \) 代表语料库中单词 \( w_i \) 呈现的频率。上述公式更加平滑,可能减少低频词的选取可能。

4.5 层次化Softmax

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

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

在这个模型中,给定一个向量 \( w_i \) 的下的单词 \( w \) 的概率 \( p(w\mid w_i) \) ,等于从根结点开始到对应w的叶结点完结的随机散步概率。这个办法最大的劣势是计算概率的工夫复杂度仅仅是 \( O(log( \left | V \right |)) \) ,对应着门路的长度。

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

让咱们引入一些概念。令 \( L(w) \) 为从根结点到叶结点 \( w \) 的门路中节点数目。例如,上图中的 \( L(w_2) \) 为3。咱们定义 \( n(w,i) \) 为与向量 \( v_{n(w,i)} \) 相干的门路上第 \( i \) 个结点。因而 \( n(w,1) \) 是根结点,而 \( n(w,L(w)) \) 是 \( w \) 的父节点。当初对每个外部节点 \( n \) ,咱们任意选取一个它的子节点,定义为 \( ch(n) \) (个别是左节点)。而后,咱们能够计算概率为

$$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})$$

其中

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

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

  • 首先,咱们将依据从根节点 \( (n(w,1)) \) 到叶节点 \( (w) \) 的门路的形态(左右分支)来计算相乘的项。如果咱们假如 \( ch(n) \) 始终都是 \( n \) 的左节点,而后当门路往左时 \( [n(w,j+1)=ch(n(w,j))] \) 的值返回1,往右则返回0。
  • 此外, \( [n(w,j+1)=ch(n(w,j))] \) 提供了归一化的作用。在节点 \( n \) 处,如果咱们将去往左和右节点的概率相加,对于 \( v_{n}^{T}v_{w_i} \) 的任何值则能够查看, \( \sigma(v_{n}^{T} v_{w_i})+\sigma(-v_{n}^{T} v_{w_i})=1 \) 。归一化也保障了 \( \sum_{w=1}^{ \left | V \right |}P(w\mid w_i)=1 \) ,和一般的softmax是一样的。
  • 最初咱们计算点积来比拟输出向量 \( v_{w_i} \) 对每个外部节点向量 \( v_{n(w,j)}^{T} \) 的类似度。上面咱们给出一个例子。以上图中的 \( w_2 \) 为例,从根节点要通过两次右边的边和一次左边的边才达到 \( w_2 \) ,因而

$$\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}$$

咱们训练模型的指标是最小化负的对数似然 \( -log\,P(w\mid w_i) \) 。不是更新每个词的输入向量,而是更新更新二叉树中从根结点到叶结点的门路上的节点的向量。

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

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

在python中能够很简略地基于Gensim工具库构建和应用词向量,提供了most_similardoesnt_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.参考资料

  • 本教程的在线浏览版本
  • 《斯坦福CS224n深度学习与自然语言解决》课程学习指南
  • 《斯坦福CS224n深度学习与自然语言解决》课程大作业解析
  • 双语字幕视频】斯坦福CS224n | 深度学习与自然语言解决(2019·全20讲)
  • Stanford官网 | CS224n: Natural Language Processing with Deep Learning

ShowMeAI系列教程举荐

  • 大厂技术实现 | 举荐与广告计算解决方案
  • 大厂技术实现 | 计算机视觉解决方案
  • 大厂技术实现 | 自然语言解决行业解决方案
  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
  • 自然语言解决教程 | 斯坦福CS224n课程 · 课程带学与全套笔记解读

NLP系列教程文章

  • NLP教程(1)- 词向量、SVD合成与Word2vec
  • NLP教程(2)- GloVe及词向量的训练与评估
  • NLP教程(3)- 神经网络与反向流传
  • NLP教程(4)- 句法分析与依存解析
  • NLP教程(5)- 语言模型、RNN、GRU与LSTM
  • NLP教程(6)- 神经机器翻译、seq2seq与注意力机制
  • NLP教程(7)- 问答零碎
  • NLP教程(8)- NLP中的卷积神经网络
  • NLP教程(9)- 句法分析与树形递归神经网络

斯坦福 CS224n 课程带学详解

  • 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步
  • 斯坦福NLP课程 | 第2讲 - 词向量进阶
  • 斯坦福NLP课程 | 第3讲 - 神经网络常识回顾
  • 斯坦福NLP课程 | 第4讲 - 神经网络反向流传与计算图
  • 斯坦福NLP课程 | 第5讲 - 句法分析与依存解析
  • 斯坦福NLP课程 | 第6讲 - 循环神经网络与语言模型
  • 斯坦福NLP课程 | 第7讲 - 梯度隐没问题与RNN变种
  • 斯坦福NLP课程 | 第8讲 - 机器翻译、seq2seq与注意力机制
  • 斯坦福NLP课程 | 第9讲 - cs224n课程大我的项目实用技巧与教训
  • 斯坦福NLP课程 | 第10讲 - NLP中的问答零碎
  • 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络
  • 斯坦福NLP课程 | 第12讲 - 子词模型
  • 斯坦福NLP课程 | 第13讲 - 基于上下文的表征与NLP预训练模型
  • 斯坦福NLP课程 | 第14讲 - Transformers自注意力与生成模型
  • 斯坦福NLP课程 | 第15讲 - NLP文本生成工作
  • 斯坦福NLP课程 | 第16讲 - 指代消解问题与神经网络办法
  • 斯坦福NLP课程 | 第17讲 - 多任务学习(以问答零碎为例)
  • 斯坦福NLP课程 | 第18讲 - 句法分析与树形递归神经网络
  • 斯坦福NLP课程 | 第19讲 - AI平安偏见与偏心
  • 斯坦福NLP课程 | 第20讲 - NLP与深度学习的将来