实时翻译的发动机:矢量语义(斯坦福大学课程解读)
Posted llguanli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时翻译的发动机:矢量语义(斯坦福大学课程解读)相关的知识,希望对你有一定的参考价值。
大家好,我是为人造的智能操碎了心的智能禅师。
GraphDB 近期刚刚升级到 8.7 版本号,此次特别更新了矢量语义包。直接以插件形式整合到程序中。
矢量语义在 NLP 领域,有着非常重要的意义。它用矢量的方式。加快了计算机学习新词汇的速度。让机器翻译、实时翻译、聊天机器人智能化等,成为可能。
全文大约5500字。读完可能须要好几首以下这首歌的时间
??
预备知识
回想一下我们读书时候,碰到不认识的词是怎样操作的。
一种方式是直接查字典;还有一种方式是先不理会这个词,继续往下阅读,当你越来越多的读到包括这个词的句子。词的含义也開始逐渐清楚起来。
来源:Reaching Higher NH
传统 NLP,比方之前禅师发过的文章,类似查字典的方式,非常可能导致词义和上下文脱节。比如 one-hot encoding。他觉得“狗”和“猫”就是两个东西。即使你在下文中,明白指出来他们都是动物、都是宠物。
非常明显,这种方式去做分词、打标签还能够,要想实现翻译、甚至聊天功能,那简直是不可能。
举个样例。?Tesgüino?这个词。预计没几个人认识,机器自然也不仅仅是。可是当我们有了以下 4 个句子:
桌子上有一瓶 Tesgüino?
大家都喜欢 Tesgüino
Tesgüino 能喝醉
Tesgüino 是用玉米制成的
非常easy就能联想出,Tesgüino 是一种酒(能喝醉)。是装在瓶子里,用玉米制成。
尽管还是不知道 Tesgüino 什么样子。闻起来什么味道,喝起来什么感觉。但我们已经能够想象出这东西可能和高粱酒、伏特加、龙舌兰几乎相同。可能还更好喝一点(大家都喜欢)。
就这样。通过一个新词周边的近似词,我们也能猜測出这个新词的含义。
单词向量是一行实数值(与虚数相对),当中每个点捕获单词的含义的维度。而且语义上类似的单词具有类似的向量。
所以我们仅仅要计算出语义向量的类似度。就能非常好的解决 NLU。那么接下来,考验智商的时刻到了(假设实在看不懂,拉到文末,相信会对你有所帮助)。
有请 NLP 一线开发人员罗周杨,为大家解读一下斯坦福经典 NLP 课程中,矢量语义向量类似度计算。
关于罗周杨:
某互联网公司 NLP 开发人员
最不喜欢的语言:javascript
推荐的电脑软件:Jetbrains 全家桶
推荐3本书:《Java编程思想》《深入理解计算机系统》《深度学习》
向量
文档和向量
假设用向量来表示一个文档,该怎么表示呢?
我们再莎士比亚的4部作品里(文档),找了4个词,我们统计各个单词在文档中出现的次数,能够得到一张表格:
上面表中。有4个单词。所以每个文档能够表示成一个由单词频率组成的向量:
假设单词有非常多个,假设是N,那么每个文档就能够表示成一个N维的向量。可见,这种向量表示是稀疏的(sparse)。
单词和向量
除了文档能够表示成一个向量。单词也能够。
和文档类似,我们能够统计出一张表格,可是不同的是,我们不是统计单词的个数。而是统计两个单词出如今一起的频数。
看一张表格你就知道了:
这个表格是一个 V×V 的表格,每个数字表示当前列的单词出如今当前行单词后面的次数,这就构成了上下文,所以这个表格事实上就是一个上下文矩阵,当中 V 就是总的词典的大小,也就是单词的数量。
我们取出每一行。就能够得到一个单词的向量表示,比如:
相同的,这种表示也是稀疏的。
Cos 计算类似度
如今我们已经有文档或者单词的向量表示了,那么该怎样计算它们之间的类似度呢?一个非经常见的方法就是余弦类似度(Cosine similarity)。
学过高中数学就知道,两个向量的点积(dot-product)或者内积(inner product)能够由以下公式计算:
而向量的模(vector length)为:
又:
即:
所以。我们能够计算和的余弦值:
所以,两个向量的余弦值越大,它们越类似。
接下来就要介绍TF-IDF了。
TF-IDF
首先解释一下这个词:TF-IDF = Term Frequency - Inverse Document Frequency
当中term-frequency
是单词
在文档中出现的次数。
那么什么是 IDF 呢?首先我们弄清楚 DF(document frequency)。
DFT 表示出现过这个单词的文档(document)的个数。
那么,IDF就是:
当中。N就是一个集合(collection)中的documents数量。
为了避免数值过大,一般会取对数:
至此。我们能够计算这个单词 t 的tf-idf
权值:
此时,我们的第一个表格,就变成了:
到眼下为止,上面的全部向量表示都是稀疏的。接下来要介绍一种稠密的(dense))的向量表示:word2vec
。
Word2Vec
这个大家应该非常熟悉了,应该算是NLP领域的标配了。,可是假设你没有一点基础的话,有些概念还是难以理解。想要相对完整地理解 word2vec。你须要结合多方面的资料。
TensorFlow 有一个教程《Vector Representations of Words》,文末扩展阅读也给出了參考链接。
Word embedding
首先我们解释一下词嵌入(word embedding)的概念。咱们之前的全部向量表示都是稀疏的。通常都是一个高维的向量。向量里面的元素大部分都是0。那么 embedding 有什么不一样的呢?
Embedding 相同也是用一个向量来表示一个词,可是它是使用一个较低维度、稠密地表示。
假设使用之前的稀疏表示。你可能会这样表示hello
这个词语:
使用 embedding 表示后:
当中的差异一眼就看出来了。所以非常明显。word embedding有优点:
不会造成维度爆炸,由于维度是我们自己设置的。通常比較小
向量是稠密的,不须要稀疏向量所採用的各种优化算法来提升计算效率
词嵌入理解了,那么什么是word2vec呢?事实上就是把单词表示成固定维度的稠密的向量!
说起来简单,可是也有非常多小技巧的。
数据模型
假设我们有一个非常大的文本语料,我们须要用这个语料来训练出单词的向量表示。那么该怎么训练呢?
word2vec 有两种经常使用的数据准备方式:
CBOW。用前后词(context words)预測目标词(target word) skip-gram,用目标词(target word)预測前后词(context word)。
我们用一个英语标准的測试键盘按键是否工作完善的句子開始:
the quick brown fox jumped over the lazy dog
这句话里包括了全部的英文字母。
假设我们的窗体大小(window size)是2,目标词选择 fox。
假设是 skip-gram 模型,我们会这样准备数据:
也就是一个目标词,我们能够构造出window_size
个训练数据对。
假设是 CBOW 模型。我们会这样准备数据:
看出当中的差异了吧?
总之,skip-gram 和 CBOW 就是两个相反的数据模型。
Learning Word Embedding有两张图能够分别表示两种模型的输入方式:
??skip-gram 模型
??CBOW 模型
数据模型应该清楚了。
与之前不同的是,word2vec 并不关心相邻单词之前一起出现的频数,而是仅仅关心,这个单词是不是属于还有一个单词的上下文(context)!也就是说,word2vec 不关系依据这个词预測出的下一个词语是什么。而是仅仅关心这两个词语之间是不是有上下文关系。
于是,word2vec 须要的仅仅是一个二分类器:“这个单词是还有一个单词的上下文单词吗?”
所以,要训练一个 word2vec 模型。我们事实上是在训练一个二分类器。而二分类器,你肯定非常easy就想到了 Logistic Regression。
实际情况,skip-gram 用的比較多,由于有一个说法。CBOW 模型在小的数据集上面表现不错,在大的数据集里,skip-gram 表现更好。
神经语言模型
这里须要说明进一步说明一下。
TensorFlow 里面有关于神经概率语言模型 (nerual probability language model) 的描写叙述。
传统的神经概率语言模型的训练一般是用最大似然 (maximum likelihood) 法则来最大化下一个词的softmax概率,基于前面的词。也就是:
当中,score(wt,h) 事实上就是 wt 和 h 的点积 (dot-production)。
那么这样训练模型的目标就是,最大化对数似然概率 (log likelihood):
这种问题是计算量太大了,由于在每个训练步里,须要对词典里的每个词,使用 softmax 计算出一个概率值。这个模型例如以下图所看到的:
正如前面所说。我们的 word2vec 并不须要一个完整的概率模型,我们仅仅须要训练一个二分类器,从 k 个噪声单词 (noise words) 里面判别出正确的目标词 (target words)。
这 k 个噪声单词是随机选择出来的,这个技术叫做负採样 (negative sampling),由于选出来的一批词都是不是正确的 target word。这个模型例如以下图所看到的:
这样一来,我们要最大化的目标就是:
?表示二分类逻辑回归在数据集 D 中的上下文 h 中包括目标 wt 的概率。
The classifier
上面说到了负採样。什么事负採样呢?事实上就是随机选取k个词语,和目标词组成负样本训练。
如今我们回到斯坦福的教材上来。
这里列出训练一个 skip-gram 模型的要点:
把目标词和上下文词组成的样本当做训练的正样本 (positive sample)
随机选取一些词和目标词组成的样本当做训练的负样本 (negtive sample)
使用 logistic regression 训练一个二分类器来区分两种情况 regression 的权重就是我们的 embedding word2vec 须要的是训练一个 binary logistic regression,给定一个目标t和候选上下文 c 的元组 (t,c),返回 c 正好是 t 的上下文词的概率:
那么,c 不是 t 的上下文词的概率就是:
那么分类器怎样计算这个概率 P 呢?skip-gram 模型有这样一个假设:相近的词它们的嵌入表示也非常近。
也就是,我们能够把两个词语的嵌入表示的类似度。用来表示概率 P。
类似度就用我们上文说到的余弦类似度:
当然。点积的结果并非概率表示。我们须要用 logistic 或者叫 sigmoid 函数。把它转化为概率表示:
那么:
上面的公式仅仅是一个单词的概率,可是我们须要把整个 window 里面的单词计算进来。skip-gram 模型还有一个假设:全部的上下文单词之间是独立的。
假设我们的 window_size = k,于是有:
通常。我们会使用对数概率:
skip-gram 模型的训练
为了训练这个 word2vec。我们除了正样本,还须要负样本。实际上。负样本通常比正样本很多其它。一般用一个比率k来控制正负样本。假设 k=2 则说明。每个正样本,相应2个负样本。这就是前面说的负採样技术。
构造负样本选择的词语(噪声词 noise words)是依据一个频率来的:
当中,α是一个比率。一般来说取值
为什么须要这个比例呢?这样能够让出现次数少的词被选择的可能性变大。
举个样例,假设没有这个比率。假设P(a)=0.99,P(b)=0.01,加上这个比率之后:
可见。b得选择的概率从0.01提升到了0.03。
有了正负样本之后。我们的模型训练就有以下目标了:
最大化正样本的概率。也就是正样本的类似度最大化
最小化负样本的概率,也就是负样本的类似度最小化
在整个训练集上,用数学表示出上面的目标就是:
假设从单个训练数据对来看(一个 (t,c) 对和 k 个噪声 n1,n2,…,nk)。就有:
概率P由simoid函数计算,有:
展开,有:
能够看出,最大化上面的目标,就是最大化正样本 c?t,同一时候最小化负样本 ni?t。
有了上面的概率表示。那么我们就能够使用交叉熵作为损失函数,然后训练模型了。
值得注意的是,TensorFlow 里面把上面的两个过程合并了,合并在tf.nn.nce_loss
这个函数里面。你能够看到 TensorFlow 的教程里面的损失函数就是使用的tf.nn.nce_loss
作为损失函数。可是你继续追踪源代码就会发现,这个损失函数仅仅只是是:
进行採样。计算出概率
使用交叉熵计算损失
可见,和我们上面的训练分析过程是吻合的.
两个权重矩阵W和C
还记得我们上面 skip-gram 模型训练的最后一个要点 regression 的权重作为 embedding 吗?
事实上,word2vec 训练之后会有两个权重矩阵,各自是嵌入矩阵 W 和上下文矩阵 C,回想一下这张图:
上图中的W权重矩阵就是我们的 embedding 矩阵,而 W′ 权重矩阵就是我们的 Context 矩阵.
假设我们要得到每个单词的向量表示,仅仅要从 W 中取出相应的行就可以!由于。训练的每个单词,都是用 one-hot 编码的,直接和 W 相乘就可以得到改词的向量表示.
所以,整个 word2vec 模型就是一个浅层的神经网络.
我们训练结束后,得到的两个矩阵 W 和 C 怎么用呢?普通情况下。我们不须要使用 C,直接忽略掉就可以。可是你也能够把两个矩阵相加。一起来表示新的N维嵌入表示,或者把他们合并,即 [W,C],用来创建一个新的2*N
的嵌入表示。
文末
至此,我们把斯坦福课程关于矢量语义的主要内容解读完成了。禅师知道,非常多人肯定没看懂。没关系,别被这一大堆公式吓住了,我们能够先从简单的入手??:
參考阅读《中文NLP用什么?中文自然语言处理的完整机器处理流程》
幸福
无非就是
我 ?AI ?你
以上是关于实时翻译的发动机:矢量语义(斯坦福大学课程解读)的主要内容,如果未能解决你的问题,请参考以下文章