【NLP笔记】理论与实践详解词向量

2020 年 10 月 18 日 深度学习自然语言处理

点击上方,选择星标置顶,每天给你送干货

阅读大概需要14分钟

跟随小博主,每天进步一丢丢



作者:艾春辉

学校:华北电力大学、苏州大学准研究生

Introduction to Natural Language Processing

nlp有什么特别的?

  • 离散的/符号的/分类的
  • ֺ例如: “rocket”意思很多,我们使用单词和字母来表达信号。最重要的是,语言符号可以被编码成多种形式,通过信号传给大脑,大脑本身也是一种连续方式对这些信号解码

怎样去表示词语?

  • 在所有的nlp任务重,首要的也是最重要的是我们如何去表示词语?我们需要首先了解词语之间的相似性和差异性。采用词向量,我们可以和容易的编码词语

Word Vectors

  • 首先提出的就是one-hot编码(独热码)

    这里我们可以查看到,向量的维度太大
  • 我们通过将每个词语独热码话,我们会发现一个问题,就是没有相似性概念了。

    所有向量都是正交的,这就代表着一个问题,如上图所示: hotel和motel是相似的,但是在独热码中和cat也相似,这是不可取的。

  • 结论: 简单one-hot向量无法给出单词间的相似性,我们需要将维度减少到一个低维度的子空间,来获得稠密的词向量,获得词之间关系

SVD Based Methods

  • svd的原理类似于主成分分析,但是主成分分析只能针对方阵,而svd可以针对所有矩阵进行

  • 过滤了一些噪声,加快运算

  • 我这里不详细 怎么计算的,我讲一下大概u是 的特征向量,v是 的特征向量, 是特征值的排序后开根号

  • 举例子:

import numpy as np
w = np.array([[1,1],[0,1],[1,0]])
w
  array([[1, 1],
[0, 1],
[1, 0]])
求u
B = np.dot(w,w.T)
a,b = np.linalg.eig(B)
u = b[:,[0,2,1]]# 参考特征值大小排序给出
u
  array([[ 8.16496581e-01, -1.57009246e-16,  5.77350269e-01],
[ 4.08248290e-01, -7.07106781e-01, -5.77350269e-01],
[ 4.08248290e-01, 7.07106781e-01, -5.77350269e-01]])
a = np.sort(a)[::-1]
a
  array([ 3.00000000e+00,  1.00000000e+00, -2.22044605e-16]
求v
C = np.dot(w.T,w)
C
  array([[2, 1],
[1, 2]])
c,d = np.linalg.eig(C)
d
  array([[ 0.70710678, -0.70710678],
[ 0.70710678, 0.70710678]])
c = np.sqrt(c)
c
  array([1.73205081, 1.        ])
v = d
根据条件, 表示的元素是3*2的,且对角线上元素等于c
sigma = np.array([[1.73,0],[0,1],[0,0]])
进行验证,
u.dot(sigma).dot(v.T)

array([[ 9.98815966e-01,  9.98815966e-01], [ 9.99407983e-01, -5.92017151e-04], [-5.92017151e-04,  9.99407983e-01]])

u,sigma,v = np.linalg.svd(w)

Window based Co-occurrence Matrix (共现矩阵的提出)

  • 依赖我们的语境我们可以知道,单词与单词之间有一点的共现性(出现在一起的概率很高),我们采用svd的 矩阵当成我们词向量矩阵,对此我们计算每个单词在我们特定窗口(length window)中出现的次数,按照这种方法进行统计

  • 采用结果:

    1. Generate |V|×|V|co-occurrence matrix, X.
    2. Apply SVD on X to get X = . •
    3. Select the first k columns of U to get a k-dimensional word vectors.
    4. indicates the amount of variance captured by the first k dimensions

      使用svd


  • 虽然思路很好,但是还有一些问题需要解决

    However, count-based method make an efficient use of the statisticsSome solutions to exist to resolve some of the issues discussed above:---------上述问题的解决方法

    1. Ignore function words such as "the", "he", "has", etc.---忽略功能词语
    2. Apply a ramp window – i.e. weight the co-occurrence count based on distance between the words in the document.---采用加权方法
    3. Use Pearson correlation and set negative counts to 0 instead of using just raw count.---采用皮尔逊相关系数(数据分析方法中有)
    1. The dimensions of the matrix change very often (new words are added very frequently and corpus changes in size).---矩阵维度经常变化

    2. The matrix is extremely sparse since most words do not co-occur.---矩阵太过稀疏

    3. The matrix is very high dimensional in general (≈ )----维度太高

    4. Quadratic cost to train (i.e. to perform SVD)-----训练成本高

    5. Requires the incorporation of some hacks on X to account for the drastic imbalance in word frequency

Iteration Based Methods - Word2vec

  • 我们希望尝试一个新的模型,这个模型能够一次学习一个迭代,并且能给给上下文单词出现的概率编码,而不是去计算和存储一个大型数据集
  • 这个想法的思路就是训练一个模型,模型的参数就是词向量。在一个确定的目标函数下进行训练,评价我们损失函数,并且遵循一些更新的规则,这个模型具有惩罚造成失误的参数的作用。我们把这种更新方法叫做反向传播。模型和任务越简单,我们训练越快
  • word2vec介绍
两个算法
  • cbow和skip-gram,cbow预测中心词,skip-gram预测上下文
两种训练方法
  • 两个训练方法:negative sampling和 hierarchical softmax。Negative sampling通过抽取负样本来定义目标,hierarchical softmax通过使用一个有效的树结构来计算所有词的概率来定义目标

Language Models (Unigrams, Bigrams, etc.)

  • 1-gram模型,一元语言模型(unigram model),假设单词的出现是完全独立的,分解概率

    但是这种方法不太合理,我们知道下面词语的概率和上一个词语概率是有很大影响的,所以我们让序列的概率取决于单词和旁边单词的成对概率---bigram模型

  • 2-gram模型(bigram模型)

    但是还是有点简单,因为我们只关心一对临近单词,而不是整个句子

Continuous Bag of Words Model (CBOW)

  • {"The", "cat", ’over", "the’, "puddle"} as a context and from these words, be able to predict or generate the center word "jumped". This type of model we call a Continuous Bag of Words (CBOW) Model. -----预测中心词语

  • 对于模型中的每个单词有两个向量,一个是单词作为中心词时候,一个单词作为上下文时候

  • 首先我们采用onthot形式的词向量表示我们的输入 ,输出表示为 .因为我们只有一个输出,所以我们称为已知中心词语的ont-hot向量

    1. :词汇表V中的单词i
    2. :输入词矩阵
    3. :V的第i列,表示单词 的输入向量
    4. :输出词矩阵
    5. :U的第i行,单词 的输出向量表示
  • how to do it?

         1. 我们为大小为m的输入上下文,生成one-hot词向量 

    1. 我们从上下文 得到输入向量
    2. Average these vectors to get -----对上述向量求平均值
    3. 生成一个分数向量 当相似向量的点积越高,就会令到相似的词更为靠近,从而  获得更高的分数。将分教转换为概率 $ \hat y}=\operatorname{softmax}(z) \in \mathbb{R}^{V|$
    4. We desire our probabilities generated, $ \hat y} \in \mathbb{R}^{V| y \in \mathbf{R}^{|V|}$,  which also happens to be the one hot vector of the actual word.---就是希望均值能够和我们向量相匹配

  • 损失和优化方法

    1. 上述式子中损失函数

    2. 但是y是one-hot向量,所以上面损失函数优化为:

    3. 对于概率分布,交叉熵很好的为我们提供了一个度量,所以优化函数为:



    4. 我们采用sgd来更新优化

    5. 其实我们主要更新的就是w和w‘,并且w代表的是词嵌入矩阵

Skip-Gram Model

  • 一样,我们定义的参数和cbow一样

  • 定义:

    1. We generate our one hot input vector of the center word. ---中心词识别
    2. 我们从上下文 得到输入入向量
    3. 生成分数向量
    4. 将分数向量转化为概率 注意  是每个上下词观寨到的概率
    5. 我们把我们生成的概率匹配真实概率
  • 图示:

  • 优化函数: 我们引用一个强力的朴素贝叶斯假设:In other words, given the center word, all output words are completely independent,输入向量时候,输出向量是完全独立的



Negative Sampling(负采样)

  • For every training step, instead of looping over the entire vocabulary, we can just sample several negative examples! We "sample" from a noise distribution (Pn(w)) whose probabilities match the ordering of the frequency of the vocabulary. -----对于每一个训练的时间步长,我们仅仅抽取一些负样本,并且跟新它们的目标函数,梯度,更新规则

  • 目标函数优化:考虑一对中心词和上下文词  (w, c)  。这词对是来自训练集吗? 我们通过 表示  (w, c)  是来自语料库。相应地, 表示  (w, c)  不是来自语料库。对此我们采用sigmod建模

  • 现在,我们建立一个新的目标函数,如果中心词和上下文词确实在语料库中,就最大化概率 ,  如果中心词和上下文词确实不在语料库中, 就最大化概率 。我们 对这两个概率采用一个简单的极大似然估计的方法(这里我们把   作为模型的参数,在我们的例子是  和  

  • 极大似然估计的优化;



    上述函数还是太复杂,我们需要再次进行优化: 最大化似然函数等同于最小化负对数似然

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

  • 对 CBOW 模型,我们对给定上下文向量  来观察中心词 的新的目标函数

  • 但是负采样在0.75的时候效果最好

Hierarchical Softmax

  • , hierarchical softmax tends to be better for infrequent words, while negative sampling works better for frequent words and lower dimensional vectors.Hierarchical Softmax 对低频词往往表现得更好,而负采样对高频词和低维度向量表现的更好

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


  • 实际上,我们不用便利全部,我们只需要对应路径上的概率求即可



  • Finally, we compare the similarity of our input vector  to each inner node vector   using a dot product. Let's run through an example. Taking in Figure  4,  we must take two left edges and then a right edge to reach

  • 我们更新的不是每个词的输出向量,而是更新二叉树中从根节点到叶节点的路径上的节点向量

   
   
     
下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!
后台回复【五件套


下载二:南大模式识别PPT
后台回复南大模式识别



说个正事哈



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方深度学习自然语言处理”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心



投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等

记得备注呦


推荐两个专辑给大家:
专辑 | 李宏毅人类语言处理2020笔记
专辑 | NLP论文解读
专辑 | 情感分析

整理不易,还望给个在看!

登录查看更多
0

相关内容

《常微分方程》笔记,419页pdf
专知会员服务
71+阅读 · 2020年8月2日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
word2Vec总结
AINLP
3+阅读 · 2019年11月2日
【论文笔记】基于LSTM的问答对排序
专知
12+阅读 · 2019年9月7日
详解谷歌最强NLP模型BERT(理论+实战)
AI100
11+阅读 · 2019年1月18日
自然语言处理中的词表征(第二部分)
AI研习社
3+阅读 · 2018年12月31日
不懂 word2vec,还敢说自己是做 NLP 的?
AI研习社
8+阅读 · 2018年5月4日
干货|自然语言处理中的词向量 — word2vec!
全球人工智能
7+阅读 · 2018年1月25日
基于典型相关分析的词向量
AI研习社
7+阅读 · 2017年12月24日
机器学习(29)之奇异值分解SVD原理与应用详解
机器学习算法与Python学习
5+阅读 · 2017年11月30日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
Arxiv
0+阅读 · 2020年12月3日
Arxiv
0+阅读 · 2020年11月29日
Arxiv
4+阅读 · 2020年5月25日
Embedding Logical Queries on Knowledge Graphs
Arxiv
3+阅读 · 2019年2月19日
VIP会员
相关VIP内容
相关资讯
word2Vec总结
AINLP
3+阅读 · 2019年11月2日
【论文笔记】基于LSTM的问答对排序
专知
12+阅读 · 2019年9月7日
详解谷歌最强NLP模型BERT(理论+实战)
AI100
11+阅读 · 2019年1月18日
自然语言处理中的词表征(第二部分)
AI研习社
3+阅读 · 2018年12月31日
不懂 word2vec,还敢说自己是做 NLP 的?
AI研习社
8+阅读 · 2018年5月4日
干货|自然语言处理中的词向量 — word2vec!
全球人工智能
7+阅读 · 2018年1月25日
基于典型相关分析的词向量
AI研习社
7+阅读 · 2017年12月24日
机器学习(29)之奇异值分解SVD原理与应用详解
机器学习算法与Python学习
5+阅读 · 2017年11月30日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
Top
微信扫码咨询专知VIP会员