本节课继续讲授word2vec模型的算法细节,并介绍了一种新的基于共现矩阵的词向量模型——GloVe模型。最后,本节课重点介绍了word2vec模型评估的两种方式。

Skip-gram模型

上节课,我们介绍了一个十分简单的word2vec模型。模型的目标是预测word \(o\)出现在另一个word \(c\)的上下文语境里的条件概率:
\[p(o|c) = \frac{exp(u_o^Tv_c)}{\sum_{w=1}^W{exp(u_w^Tv_c)}}\]

其中,向量\(u_o\)被称为word \(o\)的outside vector;向量\(v_c\)被称为word \(c\)的inside vector。

模型的损失函数是一个对数似然概率:
\[J(\theta) = \frac{1}{T}{\sum_{t=1}^T\sum_{-m \leq j \leq m, j \neq 0} \log{p(w_{t+j}|w_t)}}\]

后面我们会看到这个损失函数的物理意义。

我们通常用一个向量\(\theta\)表示模型的所有参数(这里是词典中每个word的\(u\)、\(v\)向量)。显然这是一个维度巨大的长向量(\(\theta \in \mathbf{R}^{2dV}\))。然而,在用SGD(随机梯度下降法)求解模型的参数时,对于每一个时间窗口,我们至多仅有\(2c-1\)个单词需要计算。因此,\(\theta\)的梯度\(\nabla_\theta{J_t(\theta)}\)是一个极其稀疏的向量!

为此,在word2vec模型里,我们通常用一个叫做embedding matrix的矩阵存储模型的参数。该矩阵的大小为\(d \times V\),每一列对应着词典中一个word的词向量。借助这个hash词表,我们可以只对当前训练时出现的词向量进行更新。

然而,这个简单的word2vec模型的训练却并不简单。原因在于计算损失函数的梯度时需要用到归一化的条件概率——而正是这个归一化成为了模型训练的瓶颈。想象一个百万量级的词典,每一步训练我们都需要计算上百万次词向量的内积——显然,这是无法容忍的。

因此,Mikolov在2013年那篇著名的论文里提出了一种负采样(Negative Sampling)的似然函数,避免了归一化概率的计算:
\[J_t(\theta) = \log \sigma(u_o^Tv_c) + \sum_{i=1}^K E_{j \sim P(w)} [\log \sigma(-u_j^Tv_c)]\]

其本质是训练一个二分类的逻辑回归函数,用于判断一对词是来自真实语料环境还是采样自一个随机的噪声分布。\(K\)是模型的超参数,决定负采样的个数。\(\sigma(x) = \frac{1}{1 + e^{-x}}\)是逻辑回归函数,也被称为Sigmoid函数。注意到\(\sigma(-x) = 1 - \sigma(x)\)。 \(P(w)\)通常取为\(U(w)^{\frac{3}{4}}\)。幂次项对超高频的word起到了下采样的作用。

基于这个似然函数,Mikolov在他的word2vec工具包里提供了两种模型:Skip-gram和CBoW。这两个模型都是一个log-bilinear的浅层神经网络结构。区别在于,Skip-gram是用一个center word预测其context里的word;而CBoW是用context里的所有word去预测一个center word。显然,前者对训练数据的利用更高效,因此,对于较小的语料库,Skip-gram是更好的选择。

GloVe模型

在上节课最后,我们比较了基于统计的词向量模型和基于预测的词向量模型。前者以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量,充分利用了全局的统计信息。然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。后者则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。不过,其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。

既然两种模型各有优劣,那么能不能二者各取其长,构造一个更强大的词向量模型呢?这就是接下来要介绍的GloVe模型。

在GloVe的原始论文里,作者首先分析了Skip-gram模型能够挖掘出词与词之间线性关系的背后成因,然后通过在共现矩阵上构造相似的条件,得到一个基于全局信息的词向量模型——GloVe模型。

GloVe模型的损失函数是:
\[J(\theta) = \frac{1}{2} \sum_{i,j = 1}^W {f(P_{ij})(u_i^Tv_j - \log{P_{ij}})^2}\]

其中,\(f(x)\)是一个截断函数,以降低高频词对模型的干扰。

与Skip-gram模型相比,GloVe在充分利用了语料库的全局统计信息的同时,也提高了词向量在大语料上的训练速度(一个共现矩阵的遍历要比整个语料库的遍历容易的多)。而与传统的SVD技术相比,SGD的训练也更加简单高效。同时,GloVe得到的词向量更能把握住词与词之间的线性关系。

模型的评估

在NLP的研究领域里,一个模型的评估通常有两种方式:Intrinsic和Extrinsic。

Intrinsic评估关注的是模型在一个特定子任务上的表现。子任务的设计使得Intrinsic的评估快速便捷,同时有助于我们更好地理解模型内在的性质。不过,要注意的是,除非子任务被设计为与我们的最终目标有一定的联系,否则,模型在子任务上的评估结果并不具有太大的意义。

Extrinsic评估则关注的是模型在一个具体任务上的表现。比如情感分析或是机器翻译。此时,我们关注的模型通常只是一个更复杂模型里的一部分。因此,Extrinsic评估一般比较耗时。但是相比于Intrinsic评估更具有参考意义。

Intrinsic评估

对于词向量模型,一个常用的Intrinsic评估是向量类比(word vector analogies)。它评估了一组词向量在语义和句法上表现出来的线性关系。具体来说,给定一组词(a, b, c, d),我们要验证的是:\(d=\arg\max_i{\frac{(x_b-x_a+x_c)^Tx_i}{||x_b-x_a+x_c||}}\),即\(d\)是与向量\((x_b-x_a+x_c)\)的cosine距离最近的词。

Mikolov在他的word2vec开源工具包里也提供了用于word analogy评估的数据集。例如国家与首都的类比数据,时态或是比较级的类比数据。

借助于Intrinsic评估,我们也可以方便快捷地对模型的超参数(Hyperparameters)进行选择。例如向量的维度,context window的大小,甚至是模型的选择。

Extrinsic评估

值得注意的是,即使一些模型在人为设定的Intrinsic任务上表现较弱,并不能说明它们在具体的真实任务中毫无优势。Intrinsic评估的主要作用是对模型的超参数进行初步的调整和选择(这种模型选择在Extrinsic任务上往往极为耗时)。而评估模型的优劣还是要看它在Extrinsic任务上的表现。

对于词向量模型,常见的Extrinsic任务是对词向量进行分类。例如命名实体识别(NER)和情感分析。理论上,如果我们习得的词向量足够精确,那么语义或句法上相近的词必然分布在同一片向量空间。这就使得基于词向量的分类更加准确。

为此,我们引入专门处理多分类问题的Softmax函数。这个函数是Sigmoid函数的一般形式;它给出了每个类别在输入特征\(x\)下的归一化条件概率。在后面的课程中,我们会经常用到这个函数:
\[p(y|x) = \frac{exp(W_yx)}{\sum_{c=1}^C exp(W_cx)}\]

(这其实就是上节课我们介绍word2vec模型时提到的条件概率\(p(o|c)\)!因此,矩阵\(W\)也可以被认为是分类label \(y\)的主题向量。)

由于Softmax的输出是一个概率分布,因此,我们通常用交叉熵(Cross Entropy)来定义Softmax的损失函数。

交叉熵可以用两个分布的\(KL\)散度表达:
\[H(p, q) = H(p) + D_{KL}(p||q)\]

其中,\(p\)是真实的概率分布,\(q\)是我们估计的概率分布。\(D_{KL}(p||q)\)是一个非对称的变量,它定义了这两个分布的“距离”:
\[D_{KL}(p||q) = \sum_{c=1}^Cp(c)\log{\frac{p(c)}{q(c)}}\]

因此,最小化两个分布的交叉熵,等价于最小化这两个分布的\(KL\)散度距离。

对上式化简,我们得到交叉熵一个更直接的定义:
\[H(p, q) = -\sum_{c=1}^C{p(c)\log{q(c)}}\]

在单分类问题中,一条训练样本对应的\(p\)是一个one-hot向量。因此,\(H(p, q)\)可以进一步简化为:
\[H(p, q) = -\log{q(y=c|x)}\]

其中,\(p(c) = 1\)。(对这个损失函数可以直观地理解为最大化目标label的对数似然概率)

最后,在用Extrinsic任务训练Softmax权重\(W\)时,有一个问题值得考虑:我们是否也要同时对embedding的词向量进行调整?答案是,it depends。微调embedding的词向量固然使得模型能够更好地拟合训练数据,但如果训练数据不是足够多,对部分词向量的微调可能会破坏整个向量空间原有的几何结构,而使得模型的泛化能力反而变差了。

(Stanford CS224d) Deep Learning and NLP课程笔记(三):GloVe与模型的评估的更多相关文章

  1. (Stanford CS224d) Deep Learning and NLP课程笔记(一):Deep NLP

    Stanford大学在2015年开设了一门Deep Learning for Natural Language Processing的课程,广受好评.并在2016年春季再次开课.我将开始这门课程的学习 ...

  2. (Stanford CS224d) Deep Learning and NLP课程笔记(二):word2vec

    本节课将开始学习Deep NLP的基础--词向量模型. 背景 word vector是一种在计算机中表达word meaning的方式.在Webster词典中,关于meaning有三种定义: the ...

  3. Deep Learning for NLP学习翻译笔记(2)

    Deep Learning for NLP Deep Learning for NLP Lecture 2:Introduction to Teano enter link description h ...

  4. Deep Learning for NLP 文章列举

    Deep Learning for NLP 文章列举 原文链接:http://www.xperseverance.net/blogs/2013/07/2124/   大部分文章来自: http://w ...

  5. deep learning in nlp 资料文献

    Deep Learning for Natural Language Processing (without Magic) http://nlp.stanford.edu/courses/NAACL2 ...

  6. 转 Deep Learning for NLP 文章列举

    原文链接:http://www.xperseverance.net/blogs/2013/07/2124/   大部分文章来自: http://www.socher.org/ http://deepl ...

  7. Deep Learning in NLP (一)词向量和语言模型

    原文转载:http://licstar.net/archives/328 Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果.关于这 ...

  8. Word2Vec之Deep Learning in NLP (一)词向量和语言模型

    转自licstar,真心觉得不错,可惜自己有些东西没有看懂 这篇博客是我看了半年的论文后,自己对 Deep Learning 在 NLP 领域中应用的理解和总结,在此分享.其中必然有局限性,欢迎各种交 ...

  9. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

随机推荐

  1. Go语言类型转换

    类型转换用于将一种数据类型的变量转换为另外一种类型的变量. Go语言类型转换基本格式如下:表达式 T(v) 将值 v 转换为类型 T . Go语言各种类型转换及函数的高级用法:strconv包实现了基 ...

  2. jackson构建复杂Map的序列化

    1.序列化复杂的Map时,可能需要下面的方式 import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson. ...

  3. Mac 10.12安装IntelliJ出品的数据库管理工具DataGrip

    下载: (链接: https://pan.baidu.com/s/1nvJw88T 密码: srv2) 安装参考: http://www.cnblogs.com/EasonJim/p/7868645. ...

  4. HTTP协议浅谈

    一.介绍: http 即 超文本传送协议  (Hypertext transfer protocol) 是通过因特网传送万维网文档的数据传送协议.今天普遍使用的一个版本——HTTP 1.1. HTTP ...

  5. 安装TD出现Unknown user name or bad password问题

    在Server 2003 sp2上安装TD8.0 出现Unknown user name or bad password,是因为2003启用了DEP保护.  关闭系统的DEP保护就可以了.  方法如下 ...

  6. mysql exceeded the 'max_questions' resource 记录

    最近Hive Meta的  Mysql 常报错 'user' has exceeded the 'max_questions' resource (current value: 10000) 解决:调 ...

  7. java的instanceof简单使用

    instanceof:是java中用来判断一个对象属于哪个类型的关键字 (instanceof是instance和of两个单词组成,但of并没有大写) eg: public class Test{   ...

  8. Python(2):创建函数模块

    说明: 在使用python的时候我们除了使用内置的函数之外,可能还需要使用一些别人写的函数.或者我们写的代码也希望可以给其他人使用.要实现这样的功能,我们就需要按照下面的步骤来定义自己的模块: Ste ...

  9. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  10. MySQL学习基础

    MySQL是被Sun公司收购了,所以也有热咖啡图标,不过MySQL的作者后来又做了一个MariaDB,小海豚图标,也很好用. MySQL学习: <MySQL网络数据库设计与开发>(电子工业 ...