Word2vec原理+实战学习笔记(一)

来源:投稿 作者:阿克西

编辑:学姐

视频链接:https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6

文章标题:

Efficient Estimation of Word Representations in Vector Space

基于向量空间中词表示的有效估计

作者:TomasMikolov(第一作者)

单位:Google

发表会议及时间:ICLR2013

1 研究背景

1.1 前期知识储备

数学知识:

  • 高等数学中微积分

  • 线性代数中的矩阵运算

  • 概率论的条件概率

机器学习:

  • 机器学习中基本的原理以及概念、如逻辑回归分类器、梯度下降方法等

神经网络:

  • 了解神经网络基本知识

  • 知道前馈神经网络和循环神经网络的概念

  • 知道语言模型概念

编程:

  • 了解Pytorch基本使用方法,如数据读取、模型构建等

1.2 学习目标

序号标题内容
1了解词向量的背景知识历史背景
数学基础
2了解前人的工作SVD
前馈神经网络  
RNN语言模型
3掌握词向量的评价方法Cosine/Analagy:相似度/词对类比
论文中数据集
4掌握模型结构CBOW
Skip-gram
5Word2vec中的关键技术:提高训练速度层次softmax
负采样
6掌握Word2vec代码关键代码
提高效率细节

对比模型:NNLM,RNNLM(LM:Language Model)

2 词向量背景储备知识

2.1 语言模型

直观概念:语言模型是计算一个句子是句子的概率的模型,即给定的一个句子,判断是否符合语义和语法,符合二者的句子概率较大。

示例:

句子概率分析
深度之眼的论文课真的很好!0.8符合语义和语法
深度之眼的论文课真的很一般!0.01不符合语义,因为深度之眼的课较好
论文课的深度之眼很真好的!0.000001不符合语法,因此也不符合语义

语言模型的应用有很多,例如在输入法里输入拼音:zi ran yu yan chu li ,它返回对应的中文结果就是一个语言模型。

句子概率
自然语言处理0.9
子然预言出力0.01
紫然玉眼储例0.0001

2.2 语言模型的发展

本节讲述如何构建语言模型?

2.2.1 基于专家语法规则的语言模型

语言学家企图总结出一套通用的语法规则,比如形容词后面跟名词,动词后面跟副词,符合这些规则是句子。缺点是语言千变万化,很难总结出一套通用的语法规则。而且随着时间的变化会有新词的诞生,很难总结出词性,例如笑skr人!这件事雨女无瓜。

2.2.2 统计语言模型

通过概率计算来刻画语言模型:将句子的概率转变为所有词出现的概率的乘积。

P(s)=P\left(w_{1}, w_{2}, \ldots, w_{n}\right)=P\left(w_{1}\right) {P}\left(w_{2} \mid w_{1}\right) {P}\left(w_{3} \mid w_{1} w_{2}\right) \ldots {P}\left(w_{n} \mid w_{1} w_{2} \ldots w_{n-1}\right)

「某个词出现的概率的计算方法:」

P(w_{i})求解方法:用语料的频率代替概率(频率学派)

p\left(w_{i}\right)=\frac{\operatorname{count} (w_{i})}{N}

统计语言模型是通过一个很大的语料来构建的,这个语料被称为背景语料,通过上图中的公式可以计算出每个词出现的频率,用频率来代替概率。

{P}\left(w_{2} \mid w_{1}\right)求解方法:频率学派+条件概率

\begin{aligned} p(w_{i} \mid w_{i-1})=\frac{p(w_{i-1}, w_{i})}{p(w_{i-1})} &\implies \left\{\begin{array}{l} p(w_{i-1}, w_{i})=\frac{\operatorname{count} (w_{i-1}, w_{i})}{N} \\ p\left(w_{i-1}\right)=\frac{\operatorname{count} (w_{i-1})}{N} \end{array}\right. \\ &\implies p(w_{i} \mid w_{i-1})=\frac{\operatorname{count}(w_{i-1}, w_{i})}{\operatorname{count}(w_{i-1})} \end{aligned}

语言模型示例:

\text {sentence }=\left\{w_{1}, w_{2}, \ldots, w_{n}\right\}

  • P(张三 很 帅)=P(张三)*P(很|张三)*P(帅|张三, 很)

  • P(张很帅 很 帅)=P(张很帅)*P(很|张很帅)*P(帅|张很帅, 很):张很帅这个名字很少见,在语料库可能没有出现过,但是这不能代表它不存在,P(张很帅)=0不合理

  • P(张三 很 漂亮)=P(张三)*P(很|张三)*P(漂亮|张三, 很):较长的句子(短语)在语料库中也可能概率较低,比如张三的同学的妹妹的朋友的好朋友很漂亮

「统计语言模型中的平滑操作」

  • 有一些词或者词组在语料库中没有出现过,但是这不能代表它不存在。

  • 平滑操作就是给那些没有出现过的词或者词组也给一个比较小的概率。

  • 拉普拉斯平滑(Laplace Smoothing):也称为加1平滑,每个词在原来出现次数的基础上加1。

示例:

原概率模型频数概率Laplace Smoothing频数概率
A0P(A)=\frac{0}{1000}=0A1P(A)=\frac{1}{1003}=0.001
B990P(B)=\frac{990}{1000}=0.99B991P(B)=\frac{991}{1003}=0.988
C10P(C)=\frac{10}{1000}=0.01C11P(C)=\frac{11}{1003}=0.011

P(w)= \frac{c(w)}{N} \implies P(w) = \frac{c(w)+1}{N+V}

V表示语料库中词的个数

缺点:主要解决了词的问题,如果出现较长的词组,需要平滑的词和词组数量大大增加。

示例:假设语料库中只有一句话,张三很漂亮

  • P(张三 很 帅)=P(张三)P(很|张三)P(帅|张三, 很)

  • P(张三 很 桌子)=P(张三)P(很|张三)P(桌子|张三, 很)

  • 平滑之后P(帅|张三, 很)=P(桌子|张三, 很),即两个句子概率是相等的。但是第二个句子是不合理的,一般情况下,第一句话概率应该比第二句话概率要高才对

平滑操作的问题,可能会导致一个有语法错误的句子和一个正确句子的概率是相同的。

问题原因:

  1. 参数空间过大:与模型相关的参数会很多。例如:计算P(w)参数有V个(每个P(w_i)一个参数),V代表词表大小,计算P(w_i|w_{i-1})参数有V^2个,(\frac{P(w_i, w_{i-1})}{P(w_i)}分子有V\times V个参数),依次类推,那么模型参数空间为:V+V^2+...+V^L,L为句子长度。

  2. 数据稀疏严重:平滑之后较少出现的词的概率较小,当较少的词占比较多时,数据会很稀疏。最终大部分数据值接近于0,只有少部分不为0。类似的,大的计算量会导致一些问题,比如说数据过于稀疏。因为我们想每个词都要考虑前面很多的词,而且把很多词组合在一起的概率其实并没有很高。组合到一起的词越多它的数据是越稀疏的。

解决办法:马尔科夫假设

「马尔科夫假设」:下一个词的出现仅依赖于前面的一个词或几个词

\begin{aligned} \operatorname{unigram}: P(s)&=P(w_{1}) {P}(w_{2}) {P}(w_{3}) \ldots {P}(w_{n}) \implies V \\ \operatorname{bigram}: P(s)&=P(w_{1}) {P}(w_{2} \mid w_{1}) {P}(w_{3} \mid w_{2}) \ldots {P}(w_{n} \mid w_{n-1}) \implies V+V^2 \\ \operatorname{rigram}: P(s)&=P(w_{1}) {P}(w_{2} \mid w_{1}) {P}(w_{3} \mid w_{1} w_{2}) \ldots {P}(w_{n} \mid w_{n-2} w_{n-1}) \implies V+V^2+V^3 \\ \operatorname{k-gram}: P(s)&=P(w_{1}) {P}(w_{2} \mid w_{1}) {P}(w_{3} \mid w_{1} w_{2}) \ldots {P}(w_{n} \mid w_{n-k+1} \ldots w_{n-1}) \implies V+V^2+...V^k \end{aligned}

语言模型示例:我 今天 下午 打 羽毛球

 2.3 语言模型评价指标

困惑度(Perplexity)

PP(s)=P\left(w_{1}, w_{2}, \ldots, w_{n}\right)^{-\frac{1}{n}}=\sqrt[N]{\frac{1}{P\left(w_{1}, w_{2}, \ldots, w_{n}\right)}}

语言模型实质上是一个词表大小的多分类问题,类别是一个词。句子概率越大,语言模型越好,困惑度越小。

inputlabel词表大小
Nonew_1\mid V \mid
w_1w_2\mid V \mid
.........
w_1, w_2, w_3, ..., w_{n-1}w_n\mid V \mid

语言模型只能判断句子是句子的概率,不是完备的监督学习。困惑度越小,对应句子概率越大,则表示词表大小的多分类问题每个类别的概率越大。困惑度越小越好。

2.4 n-gram特征

在文本特征提取中,常常能看到n-gram的身影。它是一种基于语言模型的算法,基本思想是将文本内容按照字节顺序进行大小为N的滑动窗口操作,最终形成长度为N的字节片段序列。看下面的例子:

我来到达观数据参观

  • 相应的bigram特征为:我来 来到 到达 达观 观数 数据 据参 参观

  • 相应的trigram特征为:我来到 来到达 到达观 达观数 观数据 数据参 据参观

注意一点:n-gram中的gram根据粒度不同,有不同的含义。它可以是字粒度,也可以是词粒度的。上面所举的例子属于字粒度的n-gram,词粒度的n-gram看下面例子:

我 来到 达观数据 参观

  • 相应的bigram特征为:我/来到 来到/达观数据 达观数据/参观

  • 相应的trigram特征为:我/来到/达观数据 来到/达观数据/参观

n-gram产生的特征只是作为「文本特征的候选集」,你后面可能会采用信息熵、卡方统计、IDF等文本特征选择方式筛选出比较重要特征。

3 论文简介

3.1 论文背景知识

3.1.1 词的表示方式

「1、One-hot Representation 独热表示」

比如将“话筒”表示为:[0, 0, 0, 0, 1, 0, 0,……],将“麦克”表示为[0, 0, 1, 0, 0, 0, 0, ……]等。

  • 优点:表示简单。

  • 存在的问题:词越多,维数越高,维数为词表的大小V,且无法表示词和词之间的关系。

「2、SVD」

这种是基于窗口的贡献矩阵(Window based Co-occurrence Matrix)的方法,一个词只跟与它周围特定窗口内的词有关,两个词共同出现一次就加一。例如:

  • 1)I enjoy flying.
  • 2)I like NLP.
  • 3)I like deep learning.

先规定对角线为0,然后构建窗口大小为1的共现矩阵。通过共现的方法,可以体现一定相似的关系,例如\rm like和enjoy都和I相邻,但是这个矩阵大小仍然和词表大小有关,维度很高,而且还是比较稀疏。因此需要降维度:V*V,V=10e5 \implies V*K,K=300

第一种使用词向量的方法,使用SVD分解。SVD分解可以在一定程度上得到词与词之间的相似度,但是矩阵太大,SVD分解效率低,学习得到的词向量可解释性差。

将一个矩阵分解成三部分,U,\Sigma,V,三者与X矩阵维度均是V * V\Sigma只有对角线元素不为0,相当于X所有特征值,表示X矩阵中向量u_i的重要程度。一般情况下,\Sigma中特征值\sigma为从大到小排序,这样可以保留前k个大小特征值。对应的,也只保留U中前k个向量。

X=U \Sigma V^{\mathrm{T}}

\begin{array}{cc}\quad |V| \\ |V|\left[\begin{array}{cc} \quad \\ \quad X \quad \\ \quad \end{array}\right]\end{array} =\begin{array}{cc}\quad |V| \\ |V|\left[\begin{array}{ccc} \mid & \mid & \\ u_{1} & u_{2} & \cdots \\ \mid & \mid & \end{array}\right] \end{array} \begin{array}{cc}\quad |V| \\|V|\left[\begin{array}{ccc} \sigma_{1} & 0 & \cdots \\ 0 & \sigma_{2} & \cdots \\ \vdots & \vdots & \ddots \end{array}\right]\end{array} \begin{array}{cc}\quad |V| \\|V|\left[\begin{array}{ccc} \ -& v_{1} & - \\ \ -& v_{2} & - \\ & \vdots & \end{array}\right]\end{array}

保留前k个:

x_{i j}=\sum_{k=1}^{n} u_{i \mathrm{k}} \sigma_{k} v_{j k}

U中每个词只用k维向量表示,

\begin{array}{cc}\quad |V| \\ |V|\left[\begin{array}{cc} \quad \\ \quad \hat{X} \quad \\ \quad \end{array}\right]\end{array} =\begin{array}{cc}\quad k \\ |V|\left[\begin{array}{ccc} \mid & \mid & \\ u_{1} & u_{2} & \cdots \\ \mid & \mid & \end{array}\right] \end{array} \begin{array}{cc}\quad k \\ k \left[\begin{array}{ccc} \sigma_{1} & 0 & \cdots \\ 0 & \sigma_{2} & \cdots \\ \vdots & \vdots & \ddots \end{array}\right]\end{array} \begin{array}{cc}\quad |V| \\ k \left[\begin{array}{ccc} \ -& v_{1} & - \\ \ -& v_{2} & - \\ & \vdots & \end{array}\right]\end{array}

优点:可以一定程度上得到词与词之间的相似度。

缺点:矩阵太大,SVD矩阵分解效率低,学习得到的词向量可解释性差。因为舍弃的一些不重要信息无法解释不重要的原因,同理重要的信息也无法解释重要性。

「3、分布式表示/稠密表示,也称为词向量/词嵌入(Word embedding)」 —— 本文提出

它的维度不再是词典的大小,每个维度上的数字不再是0,这些数之间的关系是通过训练得到的,训练得到的词向量可以将意思相近的词离得很近。

每个词表示成D维的向量,D<<V。类似于10000个人,10000个位置,将其压缩为300个位置,训练迫使10000中相熟的人在一起节省位置。相当于用300维度的空间容纳10000维度空间的词,迫使相似的词在一起,展现非常好的性质。降维变成二维,通过余弦相似度可以表示两个词之间的关系。

参考链接:

美国知乎:https://www.quora.com/Deep-Learning-What-is-meant-by-a-distributed-representation

3.1.2 发展历程

  • 1996年:Hinton 1986年提出Distributed Representation

  • 2003年:Bingio首次使用词向量A Neural Probabilistic Language Model,使用训练语言的方式训练词向量,表现较好

  • 2003-2013年,提出很多训练词向量的方法,但是速度较慢,与SVD较像,无法在大语料上进行训练

  • 2013年:本文改进开源word2vec,训练速度非常快,可以在大语料上进行训练

3.2 本文研究成果

  • 提出新的模型结构word2vec

  • 提出优化训练方法,使得训练速度加快

  • 给出训练代码word2vec,使得单机训练成为可能

  • 成果:训练的词向量,又快又好,并且能够在大规模语料上进行词向量的训练。

3.3 研究意义

研究意义:

  1. 衡量词向量之间的相似程度:余弦相似度和词类比。

  2. 作为预训练模型提升nlp任务

1、衡量词向量之间的相似程度,也是评价方法:余弦相似度和词类比。 1)余弦相似度:

\rm sim(word1, word2)= cos(wordvec1, vordvec2)

主观验证:比如查找青蛙frog的相似词向量,都是青蛙。

12345678
frogfrogstoadlitorialeptodactylidaeranalizardeleutherodactylus

2)词类比analogy:(语义关系)

\rm cos(word1- word2 + word3, wordvec4)

验证方法有效性,国家与首都的关系:计算France - Paris + Rome,查看与结果最相近的词向量,如果是Italy,说明该方法是有效的

  • France \impliesParis

  • Italy \impliesRome

W("woman")-W("man")=W("aunt")-W("uncle")

W("woman")-W("man")=W("queen")-W("king")

参考链接:

https://nlp.stanford.edu/projects/glove/

http://www.fit.vutbr.cz/~imikolov/rnnlm/word-test.v1.txt

2、作为预训练模型提升nlp下游任务准确度和效果

1)外部任务比如命名体识别、文本分类

2)应用到其他nlp任务上,相当于半监督训练

3)双语单词嵌入,Word embedding,类似于中英文词典

参考链接:

https://nlp.stanford.edu/~socherr/SocherGanjooManningNg_NIPS2013.pdf

3.4 论文总览

序号标题内容
摘要 Abstract提出2种新的高效计算词向量结构,并使用词相似度任务验证效果
1Introduction介绍词向量背景;本文目标;前人工作
2Model ArchitecturesLSA/LDA;前向神经网络;循环神经网络;并行网络计算
3New Log-linear Models「介绍2中新模型结构:CBOW, Skip grams」
4Results评价任务描述;最大化正确率;模型结构比较;模型上大量数据的并行计算;微软研究院句子完成比赛
5Examples of the Learned Relationships例子:学习到的词与词之间的关系
6Conclusion结论:高质量词向量;高效率训练方式;作为预训练词向量作用于其他nlp任务能提升效果
7Follow-Up Work后续工作:C++单机代码
8References参考文献

本文实际讲2篇论文:

4 论文泛读

4.1 摘要

  1. 提出了两种新颖的模型结构用来计算词向量

  2. 采用一种词相似度的任务来评估对比词向量质量

  3. 大量降低模型计算量可以提升词向量质量

  4. 进一步,在我们的语义和句法任务上,我们的词向量是当前最好的效果

4.2 Introduction

  • 传统NLP把词当做最小单元处理,并且能够在大语料库上得到很好的结果,其中一个例子是n-grams模型

  • 然而很多自然语言处理任务只能提供很小的语料,如语音识别、机器翻译,简单地扩大数据规模来提升简单模型的表现在这些任务不再适用,所以我们必须寻找更加先进的模型

  • 分布式表示可以在大语料上训练得到很好的语言模型,并且能够超过n-grams模型,这是一个很好的可以作为改进的技术。

4.3 word2vec词向量评价方法

内部任务评价:训练好什么任务来评价什么任务。如下图为五种语义,九种语法评价。

外部任务评价:外部任务比如命名实体识别、文本分类。

关注下方《学姐带你玩AI》🚀🚀🚀

论文资料+比赛方案+AI干货all in

码字不易,欢迎大家点赞评论收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值