您的位置:首页 > 其它

词嵌入(word2vec)-NNLM(Neural Network Language Model)

2018-01-31 17:11 274 查看
基本概念

词编码

向量空间子结构

One-Hot

Bag of words(词袋模型)

TF-IDF

语言模型

分布式表示

共现矩阵
NNLM(Neural Network Language Model)神经网络语言模型

NNLM的基本思想

NNLM原理

projection layer

SoftMax层

hidden layer

1.基本概念

传统的机器翻译,自然语言处理多是基于规则的,现在更多的是基于模型,规则隐含的参数里。

词编码

每个词都用不同的含义,而要被机器所识别,就必须要把词进行编码,同时词编码时要保证词的相似性。图像识别的时候,对图像在RGB三个颜色通道中看他们的相似性就可以了,但是,无论中文还是英文,词都太多了,他是人造的,很难保持像图片这样的信息,所以我们希望能对词进行编码,保持它所包含的信息量。



因此,我们希望能有一个对应关系,如图,这些数字在空间中的表示能有一个对应关系。这不就是和机器学习差不多吗?很多机器学习的预测都是寻找一个对应关系,也就是数据(X)和预测的东西(Y)的对应。机器翻译其实原理也差不多。



向量空间子结构

我们希望找到这样一个关系,可以作为机器学习/深度学习的输入.

VKing−VQueen+VWomen=VMan
这个有没有感觉呢?其实换成这样,你可能更好理解:

VKing−VQueen=VMan−VWomen
我们就是希望找到King,Queen之间的差异,隐含的关系,然后通过一个dense
vector表示。

One-Hot

最简单的一种想法,就是对一句话用one-hot编码:比如对于这句话:

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(词袋模型)

另一种方法则是词袋模型,它相当于一个词袋,不考虑词/句之间的相关性,只要出现了该词,就会记为1,再次出现就会+1。比如前面的那句话:

John likes to watch movies,Mary likes too.
可以表示为

[1,2,1,1,1,0,0,0,1,1]
与其相似的是binary weighting,它就是看一下每个词是否出现,出现记为1,没出现记为0

[1,1,1,1,1,0,0,0,1,1]
但他们都有一个缺点,不能将每个单词所代表的中心表示出来,比如John 和to,watch他们都是1,怎么直到那个词更重要呢/

TF-IDF

因此,就有tf-idf解决这个问题,它的主要思路就是有两方面:

A—第一就是如果这个词在我们当前文档出现的频率非常高,说明它在当前文档应该是比较重要的。

B-但如果它在所有的文档中出现的频次都非常好,大家可能就会觉得这个词应该不是那么重要的。

比如中文的“的“,或者我们上面那两个句子中的to.

因此,tf-idf就是一个在当前文档和所有文档中权衡他们的重要性,然后计算出每个词的重要度的方法。

语言模型

语言模型可以考虑到词之间的前后关系,我在这篇文章中举了非常详细的例子以及原理解释。神奇的贝叶斯思想

缺点就是n-gram随着预料的增多,离散化越严重,最终导致数据稀疏的问题。

分布式表示

如果数据的维度过高,经常需要用到分布式来表示,它是个什么东西呢?

比如有这么一个例子:

红色的大型卡车,黄色的中型轿车,蓝色的小型电动车
可以发现,这几个词之间都有一定的模式存在,我们可以通过这些模式,把表达的空间压缩的三个维度:颜色,车型,那个品牌的车。然后他们做一个笛卡尔积就可以有:

需要记忆的单元数=颜色 X 型号 X 车型

其中,在现代统计自然语言处理中,有一个非常有洞见的想法,就是:

能否用一个词附近的其他词来表示该词?
就像你认识一个新认识的朋友,想直到他的收入,你可以看一下他周围10个朋友的收入大致是多少,来推断他的收入是多少一样。

共现矩阵

基于前面那个想法,就有了这样一个局域窗口,这个窗口的主要作用就是看一下周围的几个词才好,窗口的长度一般设为5-10。就像你看你朋友的收入一样,你是看周边的五个人还是10个人呢?

那他具体怎么表示呢?

假设为三句话:

I like deep learning,I like NLP,I enjoy flying

假设局域窗口为1,可以得到这样的对称矩阵



可以发现I的前后一共出现了2次like,所以第一行第二列是2。

其实共现矩阵的本质代表着词与词之间的连接,且不考虑顺序。因为他是对称的,所以一般会取行向量或者列向量来表示词向量。

其中面临的问题就是向量的维数随着词典的大小呈先行增长,且对于模型有着严重的稀疏性问题。

2.NNLM(Neural Network Language Model)神经网络语言模型

NNLM的基本思想

在一开始的时候,做自然语言处理可以发现很多问题,比如很多情况下,要做平滑处理等,因此深度学习慢慢开始火了之后,就有人说,不然咱来试一下神经网络来做这个吧。

他的本质就是:直接从语言模型出发,将模型最优化的过程转换为求词向量表示的过程。

最优的方向是这个目标函数:用“我爱自然语言处理“为例,窗长度为n-1:

L(θ)=∑tlogP(Wt|Wt−1,Wt−2,…,Wt−n+1)=logP(′我′)+logP(′爱′|′我′)+⋯+logP(′处理′|′语言′,′自然′)
这个是n=3的通俗表达。

概率p满足归一化条件,因为词典中的每个词都有一个概率:

∑w∈(vocabulary)P(w|wt−n+1,…,wt−1)=1

NNLM原理

其原理图如下,我们先从第一层说起



他的使用场景是这样的:假设我们有一分文本,我们可以通过他的前N−1个词预测他的第N个词应该是什么?

projection layer

假设我们的句子是“我爱自然语言处理“,拆开就是‘我’,’爱’,’自然’,’语言’,一共四个词,预测一下,下一个词是什么?

如果每个词都给一个索引表示,’我’为0,’爱’为1。

C矩阵为投影矩阵,其中词典的维数为v,假设v=10000。

C=(W1,W2,…,Wv)=⎡⎣⎢⎢⎢⎢⎢(W1)1(W1)2⋮(W1)D(W2)1(W2)2⋮(W2)D⋯⋯⋱⋯(Wv)1(Wv)2⋮(Wv)D⎤⎦⎥⎥⎥⎥⎥

那么‘我‘和‘爱‘的one-hot向量表示为:

⎛⎝⎜⎜⎜⎜⎜⎜10…00⎞⎠⎟⎟⎟⎟⎟⎟,⎛⎝⎜⎜⎜⎜⎜⎜01…00⎞⎠⎟⎟⎟⎟⎟⎟
每个列向量都有D行,那么一个词对应的列向量乘以这个矩阵C就可以得到

(D X v) x (v X 1)=D X 1
这样的乘法相当于把一个句子中的一个词取出来了,将每个词的结果进行拼接,就可以得到一句话,这句话的向量表示为

5D X 1
的列向量。

总结一下这一层做的事:主要是把一句话用one-hot向量表示,通过一个权重矩阵,得到表示这一句话的词向量。

hidden layer

这一部分主要做的就是将上一层的输出作为输入,进行全连接,然后一般会有个tanh,来处理这些数据。

SoftMax层

隐层出来之后,接一个SoftMax分类器,预测一下,在这10000个词的词表中,出现每个单词出现概率有多大。因此拿到的是一个

10000X1
的概率向量。

因为我们有标准答案,就是”我爱自然语言”的第五个词应该是“处理“,如果预测出来的不准确,就可以通过定义一个交叉熵损失函数来计算损失,通过BP算法来调整参数C。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: