词嵌入(word2vec)-NNLM(Neural Network Language Model)
- 基本概念
词编码
向量空间子结构
One-Hot
Bag of words(词袋模型)
TF-IDF
语言模型
分布式表示
共现矩阵 - NNLM(Neural Network Language Model)神经网络语言模型
NNLM的基本思想
NNLM原理
projection layer
SoftMax层
hidden layer
1.基本概念
传统的机器翻译,自然语言处理多是基于规则的,现在更多的是基于模型,规则隐含的参数里。
词编码
每个词都用不同的含义,而要被机器所识别,就必须要把词进行编码,同时词编码时要保证词的相似性。图像识别的时候,对图像在RGB三个颜色通道中看他们的相似性就可以了,但是,无论中文还是英文,词都太多了,他是人造的,很难保持像图片这样的信息,所以我们希望能对词进行编码,保持它所包含的信息量。
因此,我们希望能有一个对应关系,如图,这些数字在空间中的表示能有一个对应关系。这不就是和机器学习差不多吗?很多机器学习的预测都是寻找一个对应关系,也就是数据(X)和预测的东西(Y)的对应。机器翻译其实原理也差不多。
向量空间子结构
我们希望找到这样一个关系,可以作为机器学习/深度学习的输入.
One-Hot
最简单的一种想法,就是对一句话用one-hot编码:比如对于这句话:
Bag of words(词袋模型)
另一种方法则是词袋模型,它相当于一个词袋,不考虑词/句之间的相关性,只要出现了该词,就会记为1,再次出现就会+1。比如前面的那句话:
TF-IDF
因此,就有tf-idf解决这个问题,它的主要思路就是有两方面:
A—第一就是如果这个词在我们当前文档出现的频率非常高,说明它在当前文档应该是比较重要的。
B-但如果它在所有的文档中出现的频次都非常好,大家可能就会觉得这个词应该不是那么重要的。
比如中文的“的“,或者我们上面那两个句子中的to.
因此,tf-idf就是一个在当前文档和所有文档中权衡他们的重要性,然后计算出每个词的重要度的方法。
语言模型
语言模型可以考虑到词之间的前后关系,我在这篇文章中举了非常详细的例子以及原理解释。神奇的贝叶斯思想
缺点就是n-gram随着预料的增多,离散化越严重,最终导致数据稀疏的问题。
分布式表示
如果数据的维度过高,经常需要用到分布式来表示,它是个什么东西呢?
比如有这么一个例子:
其中,在现代统计自然语言处理中,有一个非常有洞见的想法,就是:
共现矩阵
基于前面那个想法,就有了这样一个局域窗口,这个窗口的主要作用就是看一下周围的几个词才好,窗口的长度一般设为5-10。就像你看你朋友的收入一样,你是看周边的五个人还是10个人呢?
那他具体怎么表示呢?
假设为三句话:
假设局域窗口为1,可以得到这样的对称矩阵
可以发现的前后一共出现了2次,所以第一行第二列是2。
其实共现矩阵的本质代表着词与词之间的连接,且不考虑顺序。因为他是对称的,所以一般会取行向量或者列向量来表示词向量。
其中面临的问题就是向量的维数随着词典的大小呈先行增长,且对于模型有着严重的稀疏性问题。
2.NNLM(Neural Network Language Model)神经网络语言模型
NNLM的基本思想
在一开始的时候,做自然语言处理可以发现很多问题,比如很多情况下,要做平滑处理等,因此深度学习慢慢开始火了之后,就有人说,不然咱来试一下神经网络来做这个吧。
他的本质就是:直接从语言模型出发,将模型最优化的过程转换为求词向量表示的过程。
最优的方向是这个目标函数:用“我爱自然语言处理“为例,窗长度为n-1:
概率p满足归一化条件,因为词典中的每个词都有一个概率:
NNLM原理
其原理图如下,我们先从第一层说起
他的使用场景是这样的:假设我们有一分文本,我们可以通过他的前个词预测他的第N个词应该是什么?
projection layer
假设我们的句子是“我爱自然语言处理“,拆开就是‘我’,’爱’,’自然’,’语言’,一共四个词,预测一下,下一个词是什么?
如果每个词都给一个索引表示,’我’为0,’爱’为1。
C矩阵为投影矩阵,其中词典的维数为v,假设v=10000。
那么‘我‘和‘爱‘的one-hot向量表示为:
总结一下这一层做的事:主要是把一句话用one-hot向量表示,通过一个权重矩阵,得到表示这一句话的词向量。
hidden layer
这一部分主要做的就是将上一层的输出作为输入,进行全连接,然后一般会有个tanh,来处理这些数据。
SoftMax层
隐层出来之后,接一个SoftMax分类器,预测一下,在这10000个词的词表中,出现每个单词出现概率有多大。因此拿到的是一个
因为我们有标准答案,就是”我爱自然语言”的第五个词应该是“处理“,如果预测出来的不准确,就可以通过定义一个交叉熵损失函数来计算损失,通过BP算法来调整参数C。