NLP学习-Task 2: 词向量和词义Word Senses

NLP学习

更新流程↓
Task 1: 简介和词向量Word Vectors
Task 2: 词向量和词义Word Senses
Task 3: 子词模型Subword Models
Task 4: Contextual词嵌入
Task 5: 大作业
女 生 行 为 图 鉴
监 控 行 为 大 赏
WRONG WAY


词向量和词义Word Senses




1. 词向量

 1.1. 基于统计的词向量

  词向量目的:希望通过低维稠密向量来表示词的含义

在这里插入图片描述  以上三个句子中,对每一个单词的左右两个单词出现次数进行统计。
  例1:I的左右出现了2like1enjoy,故I所对应的词向量中,like和enjoy维的值为2和1。
  例2:like的左右出现了2I1deep1NLP,故like所对应的词向量中,I、deep和NLP维的值为2、1和1。

  但这些预训练模型也存在不足:

  • 词梳理很多时,矩阵很大,维度很高,需要的存储空间也很大
  • 当词的数目是在不断增长,则词向量的维度也在不断增长
  • 矩阵很稀疏,即词向量很稀疏,会遇到稀疏计算的问题

拓展了解:https://pdfs.semanticscholar.org/73e6/351a8fb61afc810a8bb3feaa44c41e5c5d7b.pdf



 1.2. Word2vec

  Word2vec有两种模型是CBOWSkip-gram

  1. CBOW是在已知context(w)的情况下预测 w,即通过附近词预测中心词。
  2. Skip-gram在已知w的情况下预测context(w),即 通过中心词预测附近的词。
    在这里插入图片描述

  1.2.1. CBOW

  通过目标词ww的上下文context(w)context(w)的词预测目标词,图中就是取大小为2的窗口,通过目标词前后两个词预测目标词。
  具体的做法是,设定词向量的维度dd,对所有的词随机初始化为一个dd维的向量,然后要对上下文所有的词向量编码得到一个隐藏层的向量,通过这个隐藏层的向量预测目标词,CBOW中的做法是简单的相加,然后做一个softmaxsoftmax的分类,例如词汇表中一个有VV个不同的词,就是隐藏层dd维的向量乘以一个WW矩阵(Rd×V)(\mathbb{R}^{d \times V})转化为一个VV维的向量,然后做一个softmaxsoftmax的分类。由于VV词汇的数量一般是很大的,每次训练都要更新整个WW矩阵计算量会很大,同时这是一个样本不均衡的问题,不同的词的出现次数会有很大的差异,所以论文中采用了两种不同的优化方法多层softmaxsoftmax负采样


  1.2.2. Skip-gram

  跟CBOW的原理相似,它的输入是目标词,先是将目标词映射为一个隐藏层向量,根据这个向量预测目标词上下文两个词,因为词汇表大和样本不均衡,同样也会采用多层softmaxsoftmax负采样优化。


  1.2.3. 多层softmaxsoftmax

在这里插入图片描述
  由於单词出现的频率是不一样的,所以用哈夫曼编码构建一个二叉树,出现频率高的词放在前面可以减少计算量,用哈夫曼编码记录路径,例如图中单词2(w2w_{2}规定左边走是1,右边走是0)的哈夫曼编码就是1110,在路径上每到一个节点就是一个sigmoidsigmoid的二分类,所以叫多层softmaxsoftmax。具体来说每个节点处会有一个dd维的向量参数θ\theta,每个单词也是dd维的向量xwx_{w} ,一个sigmoidigmoid的方程决定向左或者右走的概率,往左走的概率是:
P(+)=σ(xwTθ)=11+exwTθP(+)=σ(x_{w}^{T}\theta )=\frac{1}{1+e^{-x_{w}^{T}\theta }}  将路径上的概率连乘,极大化这个概率值,就是模型的训练目标,每次用一个样本更新梯度,使用对数似然函数:L=j=2lw(1djw)log[sigma(xwTθj1w)]+djwlog[1sigma(xwTθj1w)]L=\sum_{j=2}^{l_{w}}(1-d_{j}^{w})log[sigma(x_{w}^{T}\theta_{j-1}^{w})]+d_{j}^{w}log[1-sigma(x_{w}^{T}\theta_{j-1}^{w})]  其中lwl_{w}代表目标词在哈夫曼树中的深度,djwd_{j}^{w}代表在jj层中目标词根据哈夫曼编码的路径应该向左还是向右走,左是1右是0,可以看到整个目标函数跟逻辑回归是基本相似的,梯度的计算也跟逻辑回归基本一样。

  • 对于CBOW,多层softmaxsoftmax是将窗口内的2c2c个词求平均得到xwx_{w},放入哈夫曼树的网络中,每一层得到的梯度更新哈夫曼树中的参数,同时梯度同步更新到2c2c个单词的向量中。
  • 对于Skip-gram,多层softmax是用目标词的词向量为xwx_{w},然后遍历窗口内的2c2c个词,一个进行2c2c次的训练,每次将xwx_{w} 放进哈夫曼树中,更新xwx_{w}和树中的参数。

  1.2.4. 负采样

  负采样也是把模型变为二元的逻辑回归,每个词对应一个词向量xwx_{w}和词的网络参数θwθ_{w},每个词附近有2c2c个词,通过负采样,随机采样nn个反例,让正例词对目标词的词向量和窗口内词的网络参数的乘积尽可能的大,反例的尽可能小,是模型的训练目标。
  例如在Skip-gram中目标词AA的词向量是xAx_{A},它2c2c的窗口内附近一个词的网络参数是θBθ_{B},让这两个的乘积尽可能的大,σ(xATθB)\sigma(x_A^T \theta_B) )尽可能大,反例,随机采样出来的词乘积尽可能小。
  同理CBOW中是将2c2c个词相加求平均,然后与目标词的网络参数相乘,也是让窗口内真实存在的词乘积尽可能大,随机采样出的词尽可能小。
  负采样的方式是根据词出现的频率进行采样,出现频率越高,越可能被采样到,原文中是根据出现频率的3/4次方然后做一个归一化作为概率进行采样。




2. GloVe

  GloVe 的全称叫 Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。

  GloVe目标是综合基于统计和基于预测的两种方法的优点。它首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量

  模型目标:词进行向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息

  流程输入语料库–> 统计共现矩阵–> 训练词向量–>输出词向量



 2.1. 构建统计共现矩阵X

  设共现矩阵为XX,其元素为Xi,jX_{i,j}Xi,jX_{i,j}的意义为:在整个语料库中,单词ii和单词jj共同出现在一个窗口中的次数。

# 例:设语料库
I love you but you love him I am sad

  这个小小的语料库只有1个句子,涉及到7个单词:I、love、you、but、him、am、sad。如果我们采用一个窗口宽度为5(左右长度都为2)的统计窗口,那么就有以下窗口内容:

窗口符号 中心词 窗口内容
0 I I love you
1 love I love you but
2 you I love you but you
3 but love you but you love
4 you you but you love him
5 love but you love him I
6 him you love him I am
7 I love him I am sad
8 am him I am sad
9 sad I am sad

  窗口0、1、8、9长度小于5是因为中心词左侧或右侧内容少于2个。
  以窗口5为例说明如何构造共现矩阵:中心词为love,语境词为but、you、him、I;则执行:Xlove,but+=1X_{love,but}+=1Xlove,you+=1X_{love,you}+=1Xlove,him+=1X_{love,him}+=1Xlove,I+=1X_{love,I}+=1。使用窗口将整个语料库遍历一遍,即可得到共现矩阵XX



 2.2. GloVe具体实现

  GloVe的实现分为以下三步:

  1. 根据语料库(corpus)构建一个共现矩阵(Co-ocurrence Matrix)XX(什么是共现矩阵?),矩阵中的每一个元素XijX_{ij}代表单词和上下文单词jj在特定大小的上下文窗口(context window)内共同出现的次数。 一般而言,这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离dd,提出了一个衰减函数(decreasing weighting):deacy=1/ddeacy=1/d用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。

  2. 构建词向量(Word Vector)和共现矩阵(Co-ocurrence Matrix)之间的近似关系,论文的作者提出以下的公式可以近似地表达两者之间的关系:
    wiTw~j+bi+bj=log(Xij)        (1)w^T_{i}\tilde{w}_j+b_i+b_j=log(X_{ij})\; \; \; \; (1) 其中,wiTw^T_{i}w~j\tilde{w}_j是我们最终要求解的词向量;bib_{i}bj~\tilde{b_j}分别是两个词向量的bias term。当然你对这个公式一定有非常多的疑问,比如它到底是怎么来的,为什么要使用这个公式,为什么要构造两个词向量wiTw^T_{i}w~j\tilde{w}_j?下文我们会详细介绍。

  3. 有了公式(1)之后我们就可以构造它的loss function了:
    j=i,j=1Vf(Xij)(wiTw~j+bi+bjlog(Xij))2j= \sum_{i,j=1}^{V} f(X_{ij})(w_i^T \tilde{w}_j +b_i+b_j−log(X_{ij}))^2
    这个loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数f(Xij)f(X_{ij}),那么这个函数起了什么作用,为什么要添加这个函数呢?我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希望:
     (1) 这些单词的权重要大于那些很少在一起出现的单词(rare co-occurrences),所以这个函数要是非递减函数(non-decreasing)。
     (2) 但我们也不希望这个权重过大(overweighted)当到达一定程度之后应该不再增加。
     (3) 如果两个单词没有在一起出现,也就是Xij=0X_{ij}=0,那么他们应该不参与到loss function的计算当中去,也就是f(x)f(x)要满足f(0)=0f(0)=0满足以上两个条件的函数有很多,作者采用了如下形式的分段函数:f(x)={(x/xmax)α,x<xmax1,otherwisef(x)=\left\{\begin{matrix} (x/x_{max})^{\alpha}, &x<x_{max} \\ 1,& otherwise \end{matrix}\right.这个函数图像如下所示:
    在这里插入图片描述

  这篇论文中的所有实验,αα的取值都是0.75,而xmaxx_{max} 取值都是100。以上就是GloVe的实现细节。




3. 参考链接

  • https://blog.csdn.net/xiayto/article/details/84730009
  • https://www.infoq.cn/article/PFvZxgGDm27453BbS24W
  • https://github.com/datawhalechina/team-learning/tree/master/04%20%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/Lecture/Lecture2/reference
  • https://blog.csdn.net/Yolanda71/article/details/76165154
  • https://blog.csdn.net/mawenqi0729/article/details/80698350
  • https://blog.csdn.net/XB_please/article/details/103602964
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章