衡量标准Evaluation

此处的衡量标准主要是针对单词向量而言。

内部标准Intrinsic

  • 固定任务 (specific subtask)
  • 运行时间 (time taken to compute)
  • 能否帮助理解系统 (helps to understand the system)

外部标准Extrinsic

  • 真实任务的评估 (evaluation on a real task)
  • 计算正确率的用时 (time taken to compute accuracy)
  • 不清楚是该子系统问题还是它与其他子系统的相互作用导致了问题的出现 (unclear if the subsystem is the problem or its interaction with other subsystems)

内在词向量评估

英文是Intrinsic word vector evaluation。

引子

我们先从word2vec的跳字模型入手。考虑wiw_iwi为中心词时,将其所有背景词全部汇总并保留重复元素,记作多重集(multiset) Ci\mathcal C_iCi。一个元素在多重集中的个数称为该元素的重数(multiplicity)。将多重集中jjj元素的重数记为xijx_{ij}xij,表示整个数据集中所有以wiw_iwi为中心词的背景窗口中词wjw_jwj的个数。损失函数可以表示如下。
J=−∑i∈V∑j∈VxijlogP(wj∣wi)J = -\sum_{i \in V}\sum_{j \in V} x_{ij} log P(w_j|w_i) J=iVjVxijlogP(wjwi)
我们将数据集中所有以wiw_iwi为中心词的背景词的数量之和∣Ci∣|\mathcal C_i|Ci记为xix_ixi,将以wiw_iwi为中心词生成背景词wjw_jwj的条件概率xij/xix_{ij} / x_ixij/xi记作pijp_{ij}pij。我们可以将损失函数改写为
J=−∑i∈Vxi∑j∈VpijlogP(wj∣wi)J = -\sum_{i \in V} x_{i} \sum_{j \in V} p_{ij} log P(w_j|w_i) J=iVxijVpijlogP(wjwi)
损失函数的后半部分计算的是以wiw_iwi为中心词的背景词条件概率分布pijp_{ij}pij和模型预测的条件概率分布的交叉熵,前半部分使用以wiw_iwi为中心词的背景词的数量之和对交叉熵进行加权。最小化损失函数会使模型预测的条件概率分布尽可能接近训练集的条件概率分布。

由于生僻词出现次数少,其权重较小。模型对生僻词的条件概率分布的预测会出现较大偏差。

类似Latent Semantic Analysis (LSA)等全局矩阵分解模型具有训练时间短和充分运用统计知识的优点,但是模型在词类比任务上表现较差,另外会给予常出现的词语非常大的权重。

而诸如word2vec和NNLM等上下文窗口模型能够学习到除词语相似度之外的一些复杂规律,但是可扩展性较弱(不太能够应对非常大的训练文本),而且对统计知识的利用不足(忽视一些重复出现的词句现象)。

下面介绍全局向量的词嵌入模型,结合了上述两类模型的优点。

全局向量的词嵌入

英文是Gloabl Vectors for Word Representation (GloVe)。

损失函数

采用平方损失取代交叉熵,使用非概率分布的变量p’ij=xijp’_{ij} = x_{ij}pij=xijq’ij=exp(ujTvi)q’_{ij} = exp(u_j^Tv_i)qij=exp(ujTvi),并对他们取对数。
J=(logp’ij−logq’ij)2=(ujTvi−log(xij))2J = (log p’_{ij} - log q’_{ij})^2 = (u_j^Tv_i - log(x_{ij}))^2 J=(logpijlogqij)2=(ujTvilog(xij))2
为每一个词wiw_iwi增加了两个标量模型参数:中心词偏差项bib_ibi和背景词偏差项cjc_jcj。将每个损失项的权重替换成函数h(xij)h(x_{ij})h(xij),值域在[0,1]之间,单调递增。
∑i∈V∑j∈Vh(xij)(ujTvi+bi+cj−log(xij))2\sum_{i \in V} \sum_{j \in V} h(x_{ij}) (u_j^Tv_i+b_i+c_j- log(x_{ij}))^2 iVjVh(xij)(ujTvi+bi+cjlog(xij))2
其中权重函数h(x)h(x)h(x)的建议选择如下:如果x<tx < tx<t,令h(x)=(x/t)αh(x) = (x/t)^{\alpha}h(x)=(x/t)α,如α=0.75\alpha = 0.75α=0.75。否则令h(x)=1h(x) = 1h(x)=1。此处ttt只是一个人为设定的最大界限。因为h(0)=0h(0) = 0h(0)=0,所以如果两个词并未相邻,则不会有任何损失。每个时间步采样小批量非零xijx_{ij}xij(可以预先基于整个数据集计算得到),包含了数据集的全局统计信息。

不同于word2vec中拟合的是非对称的条件概率P(wj∣wi)P(w_j|w_i)P(wjwi),GloVe模型拟合的是对称的xijx_{ij}xij。因此,任意词的中心词向量和背景词向量在GloVe模型中是等价的。但由于初始化值的不同,同一个词最终学习到的两组词向量可能不同。当学习得到所有词向量以后,GloVe模型使用中心词向量与背景词向量之和作为该词的最终词向量。

条件概率比值

作为源于某大型语料库的真实例子,以下列举了两组分别以“ice”(冰)和“steam”(蒸汽)为中心词的条件概率以及它们之间的比值。

对于与“ice”相关而与“steam”不相关的词wkw_kwk,如“solid”,我们期望条件概率比值较大,如上表最后一行中的值8.9;

对于与“ice”不相关而与“steam”相关的词wkw_kwk,如“gas”,我们期望条件概率比值较小,如上表最后一行中的值0.085;

对于与“ice”和“steam”都相关的词或都不相关的词wkw_kwk,如“water”和“fashion”,我们期望条件概率比值接近1,如上表最后一行中的值1.36和0.96;

我们可以对任意三个不同的词构造条件概率比值。
f(uj,uk,vi)≈pijpikf(u_j, u_k, v_i) \approx \frac{p_{ij}} {p_{ik}} f(uj,uk,vi)pikpij
函数fff可能的设计并不唯一,我们只考虑其中一种合理的可能性。由于函数输出是一个标量,我们可以将函数限制为一个标量函数。
f(uj,uk,vi)=f((uj−uk)Tvi)f(u_j, u_k, v_i) = f((u_j-u_k)^T v_i) f(uj,uk,vi)=f((ujuk)Tvi)
值得注意的是单词共现矩阵中,背景词和中心词应该是可以互换的。我们需要使得u⇔vu \Leftrightarrow vuv(单词作为背景词与作为中心词的词向量等价),还要使得单词共现矩阵X=XTX = X^TX=XT。而显然上式并不满足这两个条件。

我们利用函数在群(R,+)(R,+)(R,+)R>0,×R_{>0}, \timesR>0,×同态知识改写上式。
f((uj−uk)Tvi)=f(ujTvi)f(ukTvi)f(ujTvi)=P(wj∣wi)=xijxif((u_j-u_k)^T v_i) = \frac{f(u_j^T v_i)}{f(u_k^T v_i)} \\\\ f(u_j^T v_i) = P(w_j|w_i) = \frac {x_{ij}}{x_i} f((ujuk)Tvi)=f(ukTvi)f(ujTvi)f(ujTvi)=P(wjwi)=xixij
因此,一种可能是f(x)=exp(x)f(x) = exp(x)f(x)=exp(x)。于是,
f(uj,uk,vi)=exp(ujTvi)exp(ukTvi)≈pijpikf(u_j, u_k, v_i) = \frac{exp(u_j^T v_i)} {exp(u_k^T v_i)} \approx \frac{p_{ij}} {p_{ik}} f(uj,uk,vi)=exp(ukTvi)exp(ujTvi)pikpij
满足约等号的一种可能是exp(ujTvi)≈αpijexp(u_j^T v_i) \approx \alpha p_{ij}exp(ujTvi)αpij,考虑到pij=xij/xip_{ij} = x_{ij}/x_ipij=xij/xi,取对数后ujTvi≈log(α)+log(xij)−log(xi)u_j^T v_i \approx log(\alpha) + log(x_{ij}) - log(x_i)ujTvilog(α)+log(xij)log(xi)。我们使用额外的偏差项来拟合−log(α)+log(xi)-log(\alpha) + log(x_i)log(α)+log(xi),可以得到
ujTvi−log(α)+log(xi)≈log(xij)u_j^T v_i - log(\alpha) + log(x_i) \approx log(x_{ij}) ujTvilog(α)+log(xi)log(xij)
对上式左右两边取平方误差并加权,同样可以得到GloVe模型的损失函数。

时间复杂度

模型的复杂度主要受限于单词共现矩阵XXX中的非零项,一个较为宽松的上限是O(∣V∣)2O(|V|)^2O(V)2。这看起来像是废话。我们再尝试缩小这个上限。

我们假设一组词wiw_iwiwjw_jwj同时出现的几率可以被模拟为该词频率等级的幂律函数rijr_{ij}rij
Xij=k(rij)αX_{ij} = \frac{k} {(r_{ij})^{\alpha}} Xij=(rij)αk
我们知道,训练文本中的单词总数与共现矩阵中的每一项之和成正比。我们使用广义调和数重新改写了总合。
∣C∣∼∑ijXij=∑r=1∣X∣krα=kH∣X∣,α|C| \sim \sum_{ij} X_{ij} = \sum_{r=1}^{|X|} \frac k {r^\alpha} = kH_{|X|,\alpha} CijXij=r=1Xrαk=kHX,α
这个和的上界是∣X∣|X|X,同时是最大频率等级,也是矩阵中的非零元素。也是当Xij≥1X_{ij} \ge 1Xij1rrr可取的最大值。根据此,我们再将上式进行改写。
∣C∣∼∣X∣αH∣X∣,α|C| \sim |X|^\alpha H_{|X|,\alpha} CXαHX,α
同时,我们已知广义调和数的计算(s>0s>0s>0s≠1s\ne1s=1),其中L(s)\mathcal L(s)L(s)是黎曼Zeta函数。
Hx,s=x1−s1−s+L(s)+O(x−s)H_{x,s} = \frac{x^{1-s}} {1-s} + \mathcal L(s) + \mathcal O(x^{-s}) Hx,s=1sx1s+L(s)+O(xs)
再对上式进行化简
∣C∣∼∣X∣1−αL(α)∣X∣α+O(1)|C| \sim \frac{|X|}{1-\alpha} \mathcal L(\alpha) |X|^\alpha + \mathcal O(1) C1αXL(α)Xα+O(1)
XXX非常大时
∣X∣=O(∣C∣),α<1∣X∣=O(∣C∣1/α),α>1|X| = \mathcal O(|C|), \alpha < 1 \\\\ |X| = \mathcal O(|C|^{1/\alpha }), \alpha > 1 \\\\ X=O(C),α<1X=O(C1/α),α>1
经过试验,在原paper中得到α=1.25\alpha=1.25α=1.25,所以∣X∣=O(∣C∣0.8)|X| = \mathcal O(|C|^{0.8})X=O(C0.8)。所以这个比类似word2vec等窗口模型的复杂度O(∣C∣)\mathcal O(|C|)O(C)是要稍微好一些的。

应用

预训练的GloVe模型的命名规范大致是“模型.(数据集.)数据集词数.词向量维度.txt”。

我们平时可以使用基于维基百科子集预训练的50维GloVe词向量。其中含有40万个词和1个特殊的未知词符号。

近义词

from mxnet import nddef knn(W, x, k):# 添加的1e-9是为了数值稳定性cos = np.dot(W, x.reshape((-1,))) / (np.sqrt((nd.sum(W * W, axis=1) + 1e-9)) * np.sqrt(np.sum(x * x)))topk = nd.topk(cos, k=k, ret_typ='indices').asnumpy().astype('int32')return topk, [cos[i].asscalar() for i in topk]def get_similar_tokens(query_token, k, embed):topk, cos = knn(embed.idx_to_vec,embed.get_vecs_by_tokens([query_token]), k+1)for i, c in zip(topk[1:], cos[1:]):  # 除去输入词print('cosine sim=%.3f: %s' % (c, (embed.idx_to_token[i])))

类比词

由近义词延伸出来的类比词。对于类比关系中的4个词a:b::c:da:b :: c:da:b::c:d, 第一组词aaabbb在某个维度上不同,而且这种差异可以在第二组词cccddd上体现。给定前3个词 aaabbbccc ,求ddd。设词www的词向量为vec(w) 。求类比词的思路是,搜索与vec©+vec(b)−vec(a)的结果向量最相似的词向量。需要注意的是,如果搜索结果中出现了输入的单词,我们需要丢弃。
d=argmaxi(xb−xa+xc)Txi∣∣xb−xa+xc∣∣d = argmax_i \frac{(x_b-x_a+x_c)^T x_i} {||x_b-x_a+x_c||} d=argmaxixbxa+xc(xbxa+xc)Txi
下图展示了不同词之间的对应关系,词嵌入的差异主要是由于性别造成的。

代码实现如下。

def get_analogy(token_a, token_b, token_c, embed):vecs = embed.get_vecs_by_tokens([token_a, token_b, token_c])x = vecs[1] - vecs[0] + vecs[2]topk, cos = knn(embed.idx_to_vec, x, 1)return embed.idx_to_token[topk[0]]

例如

get_analogy('beijing', 'china', 'tokyo', glove_6b50d)

可以得到答案是japan。相当于Beijing:China::Tokyo:JapanBeijing:China :: Tokyo:JapanBeijing:China::Tokyo:Japan

缺点

  1. 单词之间具有一定的关联,但未必是线性关联

对一词多义的思考

大部分单词都有很多个意思,特别是那些存在已久的单词和常见的单词。如何解决一词多义的问题是词嵌入的一大难题。

多单词原形训练

在GloVe中,我们可以创造多个单词原形进行学习,将多个单词原形放到不同聚类当中进行重新训练。例如,bank既可以表示银行,也可以表示河边、岸边意思。下图bank(1)(2)分别代表了这个意思。

一词多义的线性组合

例如word2vec之类的标准单词嵌入,使用单词的不同含义的加权线性叠加。我们可以设置权重为单词不同意思出现的概率。
vecword=α1vecword1+α2vecword2+α3vecword3α1=f1f1+f2+f3vec_{word} = \alpha_1 vec_{word_1} + \alpha_2 vec_{word_2} + \alpha_3 vec_{word_3} \\\\ \alpha_1 = \frac{f_1} {f_1+f_2+f_3} vecword=α1vecword1+α2vecword2+α3vecword3α1=f1+f2+f3f1

Reference

  • GloVe: Global Vectors for Word Representation, Jeffrey Pennington, Richard Socher, Christopher D. Manning. 2014.
  • Dive Into Deep Learning,第10章

从词向量衡量标准到全局向量的词嵌入模型GloVe再到一词多义的解决方式相关推荐

  1. 文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简

    文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简化为 ...

  2. 2.8 GloVe词向量-深度学习第五课《序列模型》-Stanford吴恩达教授

    Glove 词向量 (GloVe Word Vectors) 你已经了解了几个计算词嵌入的算法,另一个在NLP社区有着一定势头的算法是GloVe算法,这个算法并不如Word2Vec或是Skip-Gra ...

  3. 腾讯AI Lab开源大规模高质量中文词向量数据,800万中文词随你用

    今日,腾讯AI Lab 宣布开源大规模.高质量的中文词向量数据.该数据包含800多万中文词汇,相比现有的公开数据,在覆盖率.新鲜度及准确性上大幅提高,为对话回复质量预测和医疗实体识别等自然语言处理方向 ...

  4. word2vec训练词向量 python_使用Gensim word2vector训练词向量

    注意事项 Skip-Gram models:输入为单个词,输出目标为多个上下文单词: CBOW models:输入为多个上下文单词,输出目标为一个单词: 选择的训练word2vec的语料要和要使用词向 ...

  5. (Word2Vec)怎么将得到的词向量变成句子向量,以及怎么衡量得到词向量的好坏

    腾讯一面的题目,当时脑子里只有相加平均 1. Word2Vec 怎么将得到的词向量变成句子向量 1)平均词向量: 平均词向量就是将句子中所有词的word embedding相加取平均,得到的向量就当做 ...

  6. 中文自然语言处理向量合集(字向量,拼音向量,词向量,词性向量,依存关系向量)

    ChineseEmbedding Chinese Embedding collection incling token ,postag ,pinyin,dependency,word embeddin ...

  7. Python Word2vec训练医学短文本字/词向量实例实现,Word2vec训练字向量,Word2vec训练词向量,Word2vec训练保存与加载模型,Word2vec基础知识

    一.Word2vec概念 (1)Word2vec,是一群用来产生词向量的相关模型.这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本.网络以词表现,并且需猜测相邻位置的输入词,在word2 ...

  8. 将词向量传入MySQL_【腾讯词向量】腾讯中文预训练词向量

    腾讯词向量介绍 腾讯词向量(Tencent AI Lab Embedding Corpus for Chinese Words and Phrases)提供了预训练好的800万中文词汇的word em ...

  9. keras 生成句子向量 词向量_Keras中使用TensorBoard可视化词向量

    1. 前言 最近几天都耗在了词向量的训练以及可视化上,期间遇到了一些坑,也了解到一些容易忽略的知识点,在此一并记录下来,给自己也给大家一个警示. 2. keras中的TensorBoard Tenso ...

最新文章

  1. Postfix配置文档
  2. java框架知识_java框架知识点总结
  3. day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询
  4. Java引入import其它目录的自定义包或java源文件
  5. sqlserver ssms ctrl+e快捷键问题
  6. [渝粤教育] 西北工业大学 博弈论基础 参考 资料
  7. 十年云计算大爆发,微软正在摧毁其它竞争对手
  8. Oracle PL/SQL基础知识
  9. angular之性能优化
  10. Cyrus SASL Libary学习
  11. 微软ReportViewer(rdlc)发布时所需要的动态库(vs2010)
  12. mysql双机备份最简单_简单实现MySQL数据库双机热备份的方案
  13. windows下创建本地局域网svnserver和gitserver
  14. chrome浏览器无法登录印象笔记
  15. Egret 配置主题
  16. 简单方法:将iso镜像文件压缩包转化为直接可用的光盘映像文件
  17. 【问链财经-区块链基础知识系列】 第二十三课 一张纸搞定B2B供应链金融产品设计思路
  18. 局域网访问提示无法访问检查拼写_windows无法访问请检查名称的拼写… 错误代码:0x80070035 | 吴文辉博客...
  19. CV | 运动目标检测 之 背景差分法
  20. 基于ssm框架的校园二手交易平台

热门文章

  1. 开源免费OA:O2OA中的日程安排功能是什么样的?
  2. Hadoop 3的主要优缺点
  3. 低代码,或将颠覆开发行业?
  4. 陪领导参加饭局,懂2个座次5道程序3套话术,不会喝酒也受重用
  5. pygame飞机大战系列文章介绍
  6. python算法实现反欺诈案例完整建模流程!电信诈骗这么多?
  7. 在WordPress中使用Font Awesome
  8. 前程无忧爬虫源码及分析(一)
  9. 《越狱》第二季已发布
  10. 宝马全球首发全新一代5系轿车和纯电动i5