机器学习入门之无监督学习(二)
引言
本文主要讨论单词嵌入(Word Embedding)。是用在文本上的降维方法。
单词嵌入
喂给机器大量的文章后,它可以自动的把每个不同的词汇都用一个向量来表示。
我们希望机器在用向量来表示词汇后,向量每个维度都代表某种含义。
或者说这些词汇有相似的关系或某种语义,能在这个向量中呈现出来。
这些来描述词汇的向量我们就称为单词嵌入。
一次词汇如果只用一个向量来描述它,最简单的方法就是1-of-N Encoding。
就是说,假设英文总共有10万个单词,我们就创建一个10万维度的向量。每次单词我们都用这个10万维的向量表示,但是这个向量只有其中一维是1(代表那个单词出现),其他都是0。
以5维词汇来举例就是上面的样子。这种表示方法有很多缺点,重要的一个是词汇之间的关系无法表示出来。
怎么办呢,我们对词汇也可以做聚类。
把动物放到一类;动作放到一类;植物放到一类。但是这样做太粗糙了。
这时我们可以做单词嵌入,在单词嵌入中,每个词汇不是硬归类于某个类别中,而是每个词汇都用一个 Continuous Vector(连续向量?)来描述,其中每个维度都可能代表某种含义。
我们看这个例子,红线下面的是植物,也可能有其他属性,比如代表不会动的东西;
所以单词嵌入的方式更加精细。
那如何找单词嵌入呢,如何用一个向量来描述这些词汇呢?
基本的概念是每个单词的意思可以从它的上下文看出来。
假设机器读到了“马英九520宣誓就职”和“蔡英文520宣誓就职”,机器就可以知道马英九和蔡英文有某种相似的关系。
那如何来根据词汇的上下文来得到词的向量呢?
有两种方式:
- 基于计数的(Count based)
- 如果两个单词和多次同时出现,那(单词的向量)和的相似度应该要高
- 基于预测的(Prediction based)
- 预测接下来要出现哪个词汇
基于预测
假设你收集到了很多句子,接下来要机器做的事情是给定前面几个词汇,来判断接下来要出现哪个词汇。
希望找到一个NN,输入“潮水”和“退了”,期望机器输出“就”。可以使用最小化交叉熵的方式,让输出和“就”越接近越好。继续输入“退了”和“就”,期望输出“知道”。
这个东西适用场景似乎不多,可以在成语接龙。其实还可以用在语言模型(Language Modeling)上,
语言模型要做的事是预测一个句子出现的概率。
比如说想要机器预测出现“wreck a nice beach”这个句子个概率,实际上无法直接预测一个句子出现的概率,估测一个句子出现的概率时,通常会拆成很多小的片段。然后把这些片段分开去计算它的概率。
比如要计算上面那个句子出现的概率,先要计算由“wreck”开头的概率,然后后面接“a”的概率,同时“a”后面接“nice”的概率…。
也可以用上面的NN来做,这里把“START”也当成一个词汇,把它丢到NN中,看它预测“wreck”的概率是多少,把“wreck”丢里面看它输出“a”的概率是多少…,最后把这些概率都乘起来,就得到了这个句子出现的概率。
语言模型很重要,一般用在机器翻译和语音识别里面。
基于预测的方式是如何运作的呢。
每个词汇都可以用1-of-N encoding的方式来表示,只有一个维度是1,其他都是0的向量。
希望把这个向量丢到某个NN中,输出就是接下来出现每个词汇的概率。
如上,期望在之后出现的话,那么希望词汇所对应的维度在上面的NN中输出的概率越大越好。
有了这些东西以后,接下来,我们把一个特征向量丢到NN里面去,把这个向量乘上一个矩阵做线性转换(降维)得到一个向量,再经过**函数变成第一个隐藏层的输入。
我们要对每一个词汇取一个向量,把输入的特征向量(每个词汇的1-of-N encoding向量)乘上线性转换后的向量当()成表示这个词汇的向量。
这样相似的词汇就会有相近的向量。
但是这样只看一个词汇来预测下一个词汇,可能是不太够的。
我们希望机器去看比较长的前面的词汇来预测下一个词汇。
这里假设看了前两个词汇,向量的长度都是,权重矩阵都是的矩阵,很巨大。
因此,我们这里把共享同样的参数,最后如果只考虑前两个词汇的话,计算向量就简单很多。
就是说词汇向量的第一维连到的权重和第一维连到的权重是一样的。
同样颜色的连线权重是同样的。这样每个词汇的权重都是固定的。
看前面词汇预测后面词汇还有一些变种,比如可以预测两个词汇中间的词汇,可以预测某个词汇左右两边的词汇。
参考
1.李宏毅机器学习