Word2VEec理论基础

NLP常见任务

  • 自动摘要
  • 指代消解(小明放学了,妈妈去接【他】)
  • 机器翻译(小心地滑->Slide carefully)
  • 词性标注(heat(v.) water(n.) in(p.) a(det.) pot(n.))
  • 分词(中文日文等) 大水沟/很/难/过
  • 主题识别
  • 文本分类

NLP处理方法

  • 传统:基于规则
  • 现代:基于统计机器学习
  • HMM,CRF,SVM,LDA,CNN …
  • “规则”隐含在模型参数里

图像是原始数据,但是自然语言是人的智慧的结晶,所以利用机器学习的方法,难度更大,词编码异常重要

离散式表达

词编码
  • 词编码需要保证词的相似性
  • 向量空间分布的相似性
  • 向量空间子结构
    Apache OpenNLP 词性标注_词向量
    国王和王后之间的区别与男人和女人之间的区别很相似

最终目标:词向量表示作为机器学习、特别是深度学习的输入和表示空间——最大程度表示词的意思

在计算机中表示一个词(痛点):

  • 不能分辨细节的差别
  • 需要大量人为劳动
  • 主观
  • 无法发现新词
  • 难以精确计算词之间的相似度
one-hot编码
  • 词典包含10个单词,每个单词有唯一索引
  • 在词典中的顺序和在句子中的顺序没有关联

语料库:

John likes to watch movies. Mary likes too.

John also likes to watch football games.

词典:

{“John”:1,“likes”:2,“to”:3,“watch”:4,“movies”:5,“also”:6,“football”:7,“games”:8,“Mary”:9,“too”:10}

One-hot 表示:

John→[1,0,0,0,0,0,0,0,0,0] likes→[0,1,0,0,0,0,0,0,0,0] too→[0,0,0,0,0,0,0,0,0,1]

文档编码
Bag of Words(词袋模型)-词频

词向量表示加和

文档的向量表示可以直接将各词的词向量表示加和

John likes to watch movies. Mary likes too. →[1,2,1,1,1,0,0,0,1,1]

John also likes to watch football games. →[1,1,1,1,0,1,1,1,0,0]

句子的向量表示为,对应词典,每个位置上的词在这个句子中所出现的次数。==每个词是One-hot表示,整个句子就是 Bag of Words 表示形式。==丢失了词语在句子中的前后顺序信息。

词权重

TF-IDF

经常用于信息检索,词在文档中的顺序没有被考虑

IDF(Inverse Document Frequency),衡量一个term有多重要,如 ‘is’ ‘the’ 这些不重要——所以需要把罕见的权值弄高,把常见的词权值弄低。
Apache OpenNLP 词性标注_word2vec_02

[0.693, 1.386, 0.693, 0.693, 1.099, 0, 0, 0, 0.693, 0.693]

ln(2)=0.693

Binary weighting

短文本相似性,Bernoulli Naive Bayes

[1,1,1,1,1,0,0,0,1,1]→出现\没出现

N-gram(几元模型)-词序
  • 优点:考虑了词的顺序
  • 缺点:词表的膨胀

为2-gram建索引:

'Join likes'→1 likes to'→2 'to watch'→3 'watch movies'→4 'Mary likes'→5 ...... football games'→10

John likes to watch movies. Mary likes too. →[1,1,1,1,1,1,0,0,0,0]

John also likes to watch football games. →[0,1,1,0,0,0,1,1,1,1]

模型参数数量与 Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_03

Apache OpenNLP 词性标注_自然语言处理_04

模型参数量

1(unigram)

2×10的5次方

2(bigram)

4×10的10次方

3(trigram)

8×10的15次方

4(4-gram)

16×10的20次方

一句话(词组合)出现的概率
Apache OpenNLP 词性标注_自然语言处理_04
Unigram/1-gram
Apache OpenNLP 词性标注_自然语言处理_06
Bi-gram/2-gram
Apache OpenNLP 词性标注_词向量_07

离散表示的问题:

  • 无法衡量词向量之间的关系
    酒店 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],宾馆 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],旅舍 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
  • 词表维度随着语料库增长膨胀
  • n-gram词序列随语料库膨胀更快
  • 数据稀疏问题
共现矩阵 (Cocurrence matrix)

Word - Document 的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA (Latent Semantic Analysis)

局域窗中的Word - Word 共现矩阵可以挖掘语法和语义信息

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

window length设为1(一般设为5~10),使用对称的窗函数(左右window length都为1)

counts

I

like

enjoy

deep

learning

NLP

flying

.

I

0

2

1

0

0

0

0

0

like

2

0

0

1

0

1

0

0

enjoy

1

0

0

0

0

0

1

0

deep

0

1

0

0

1

0

0

0

learning

0

0

0

1

0

0

0

1

NLP

0

1

0

0

0

0

0

1

flying

0

0

1

0

0

0

0

1

.

0

0

0

0

1

1

1

0

将共现矩阵行(列)作为词向量,会出现的问题:

  • 向量维数随着词典大小线性增长
  • 存储整个词典的空间消耗非常大
  • 一些模型如文本分类模型会面临稀疏性问题
  • 模型会欠稳定

如何解决?

构造低维稠密向量作为词的分布式表示 (25~1000维)!

SVD降维/PCA降维

但是会出现以下问题:

  • 计算量随语料库和词典增长膨胀太快,对X(n,n)维的矩阵,计算量O(n^3)。 而对大型的语料库,n400k,语料库大小160B token
  • 难以为词典中新加入的词分配词向量
  • 与其他深度学习模型框架差异大

分布式表示

用一个词附近的其他词来表示该词

NNLM (Neural Network Language model)
  1. 固定滑动窗口的大小
  2. 滑动窗口会遍历整个语料库求和
  3. 看完整个语料库之后,再去做推断

语言模型:会构造一个目标函数,loss Function:评估差距有多大,objective Function
Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_08

  • 使用了非对称的前向窗函数,窗长度为n-1
  • 滑动窗口遍历整个语料库求和,计算量正比于语料库大小
  • 概率P满足归一化条件,这样不同位置t处的概率才能相加,即

Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_09

用神经网络实现概率 Apache OpenNLP 词性标注_词向量_10

结构

有一个语料库,eg:4-gram🥕

用前面三个词去预测第四个词,用w1,w2,w3预测w4,所以前面三个词在下面w1,w2,w3,用若干次projection layer:(在one-hot中做dense 将对应w1的词取出来)

输入是一个one-hot的表示,从词海里面找了10w个短语,就编码成10w个行向量

w1,w2,w3就是3个(1,10w)

在最底层和上一层有矩阵C:

一共有10w个词,想要编码为300维(工业上为300~500),c就是(300,10w),one-hot的矩阵是(10w,1)两个向量相乘之后,维度就变为了(300,1)

相当于从10w中挑出来真正想要的词向量:我 爱 北京,三个词向量作拼接=(900,1)

最后要得到的结果是:我 爱 北京,这三个词都确定了,不能确定下一个词是不是天安门,就要把这10w个词的概率拿出来,看天安门的概率向量是多少

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLxByUcM-1653616376834)(E:/A%20wangdanxu/%E6%9D%82%E7%89%A9/typore/image-20220512140250061.png)]

  • (N-1)个前向词:one-hot表示
  • 采用线性映射将one-hot表示投影到稠密D维表示
  • 输出层:Softmax
  • 各层权重最优化:BP+SGD

Apache OpenNLP 词性标注_word2vec_11 矩阵是投影矩阵,也是稠密词向量表示。
Apache OpenNLP 词性标注_word2vec_12
词典维数 Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_13,稠密词向量表示维数 Apache OpenNLP 词性标注_自然语言处理_14

复杂度-计算量大

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYZLauVM-1653616376836)(E:/A%20wangdanxu/%E6%9D%82%E7%89%A9/typore/image-20220512192458501.png)]

每个训练样本的计算复杂度:N * D + N * D * H + H * V 3×300+3×300×500+500×10w(假设隐藏层为500维)

Apache OpenNLP 词性标注_词向量_15

CBOW模型:已知上下文wt−2,wt−1,wt+1,wt+2,预测当前词wt。对于一个样本,做一次预测,具体做法是:将所有的上下文单词的词向量加起来,得到投影层向量xw,由xw预测当前词出现的概率。
    Skip-gram模型:已知当前词wt,预测上下文wt−2,wt−1,wt+1,wt+2。对于一个样本,做4次预测:直接使用当前词的词向量作为投影层向量,得到投影层向量xw,由xw分别预测每个上下文单词出现的概率。
Skip-Gram

从直观上理解,Skip-Gram是给定input word来预测上下文。

接下来我们来看看如何训练我们的神经网络。假如我们有一个句子“The dog barked at the mailman”。

首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog”作为input word;

有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得**窗口中的词(包括input word在内)**就是[‘The’, ‘dog’,‘barked’, ‘at’]。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 (‘dog’, ‘barked’),(‘dog’, ‘the’)。

神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词是output word的可能性。这句话有点绕,我们来看个栗子。第二步中我们在设置skip_window和num_skips=2的情况下获得了两组训练数据。假如我们先拿一组数据 (‘dog’, ‘barked’) 来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词是“barked”的概率大小。

模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。举个栗子,如果我们向神经网络模型中输入一个单词“中国“,那么最终模型的输出概率中,像“英国”, ”俄罗斯“这种相关词的概率将远高于像”苹果“,”蝈蝈“非相关词的概率。因为”英国“,”俄罗斯“在文本中更大可能在”中国“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。

面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)

Apache OpenNLP 词性标注_词向量_16

我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“中国“,”英国“)这样的训练样本对,而对于(”英国“,”蝈蝈“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”中国“作为输入,输出的结果中”英国“或者”俄罗斯“要比”蝈蝈“被赋予更高的概率。

再次提醒,最终我们需要的是训练出来的权重矩阵。

作者:一梦到天涯
链接:https://www.jianshu.com/p/471d9bfbd72f

CBOW(连续词袋)
  1. 输入层就是用的稠密向量
  2. 投影层简化为求和
  3. 最大化目标函数,输出是10w维(全连接)

eg🍕

corpus=[ 我w(t-2) 喜欢w(t-1) 学习w(t) 机器学习w(t+1) ]

想要通过“我w(t-2)" 喜欢w(t-1)” “机器学习w(t+1)” 去预测中间的“学习w(t)”

我喜欢机器学习就是词向量INPUT

projection layer:就是把词向量拼接在一起了,但是维度太高了

word2vector就做了一个简化,去掉了projection layer,将几个词向量加起来求和sum,直接去预测后面那个词

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N7A2ZAQ7-1653616376837)(E:/A%20wangdanxu/%E6%9D%82%E7%89%A9/typore/image-20220512192725541.png)]
Apache OpenNLP 词性标注_人工智能_17

  • 无隐层
  • 使用双向上下文窗口
  • 上下文词序无关 (BoW)
  • 输入层直接使用低维稠密表示
  • 投影层简化为求和(平均)
tricks
hierarchical softmax

最后预测输出向量时候,大小是1*V的向量,本质上是个多分类的问题。通过hierarchical softmax的技巧,把V分类的问题变成了log(V)次二分类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BSLpsItI-1653616376838)(E:/A%20wangdanxu/%E6%9D%82%E7%89%A9/typore/image-20220512194357888.png)]

  • 使用 Huffman Tree 来编码输出层的词典
  • 只需要计算路径上所有非叶子节点词向量的贡献即可
  • 计算量降为树的深度 V => log_2(V)

例🍕

(我 喜欢 观看 巴西 足球 世界杯)根据词出现的词频,展开得到 6 个节点,长度为 6 的概率向量

根据 ’我’ ‘喜欢‘ ‘观看’ ’巴西‘ ’足球‘ ’世界杯‘ 出现的频次,编码成一棵哈夫曼树

这棵树到每个节点做决策都只有两个,左右分支 0和1,每个权重都在点和边连接的上面

编码成树之后,就把 θ 放到了树上,每个做决策的树上都有一个权重,因为是0 和 1,所以就是二分类(左走的是sigmoid,右走的是1-sigmoid)

之前是v,现在是logv量级

如果 '我喜欢观看巴西' 后面是 '足球',哈夫曼编码 → [1,0,0,1],其实每个节点就是分类Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_18
Apache OpenNLP 词性标注_人工智能_19 函数:Apache OpenNLP 词性标注_word2vec_20

Apache OpenNLP 词性标注_人工智能_21Apache OpenNLP 词性标注_词向量_22 树内部第 Apache OpenNLP 词性标注_word2vec_23

Apache OpenNLP 词性标注_人工智能_24Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_03 节点的 Apache OpenNLP 词性标注_词向量_26

Apache OpenNLP 词性标注_人工智能_27

Skip-gram

Apache OpenNLP 词性标注_word2vec_28

负例采样

本质上是对训练集进行了采样,从而减小了训练集的大小。

Apache OpenNLP 词性标注_词向量_29: 一个正样本,Apache OpenNLP 词性标注_人工智能_30 个负样本,对负样本做采样
Apache OpenNLP 词性标注_自然语言处理_31

  • Apache OpenNLP 词性标注_自然语言处理_32Apache OpenNLP 词性标注_word2vec_33
  • Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_34 是词 Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_35
  • Apache OpenNLP 词性标注_Apache OpenNLP 词性标注_36Apache OpenNLP 词性标注_词向量_37

损失函数:对语料库中所有词 Apache OpenNLP 词性标注_word2vec_38 求和
Apache OpenNLP 词性标注_自然语言处理_39

词典中的每一个词对应一条线段,所有词组成了[0,1]之间的剖分
Apache OpenNLP 词性标注_自然语言处理_40

  • 实际使用中取 Apache OpenNLP 词性标注_word2vec_41
  • Apache OpenNLP 词性标注_word2vec_42
  • 正样本为我们要预测的‘学习’,负样本为‘我’,‘喜欢’,‘机器学习’

Apache OpenNLP 词性标注_自然语言处理_43

语言模型存在的问题
  1. 对每个local context window 单独训练,没有利用包含在global co-currence矩阵中的统计信息
  2. 对多义词无法很好的表示和处理,因为使用了唯一的词向量

词嵌入效果评估

  1. 词类比任务(inner)
    Accuracy on the analogy task for 300-dimensional vectors trained on different corpora
    ‘Athens is to Greece as Berlin is to German
    ‘Bigger is to Big as Greater is to Great
  2. 词相似度任务(inner)
  3. word2vec产出的特征用到其他模型(外部任务)
    比如用于条件随机场的物体识别

样本量小的时候倾向用CBOW,样本量大的时候用skip-gram