word2vec是在自然语言处理中经常需要的工具,本文在此做了简单的介绍,作为自己的个人笔记留存,但尚未在本文涉及底层的算法细节。
word2vec的意义
在机器学习中,对于离散型变量,将其转化成可以被数学模型读取的数字变量最常用的方法就是one-hot编码。但是,这样也会导致一个问题:one-hot编码的原理在于将原本一个特征用一组向量去表示,向量的长度取决于离散型变量中一共有多少种值,例如:
现在有一个由三个单词构成的离散型变量:['high', 'mid', 'low']
,那么其采用one-hot编码后,将会变成:[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
,其中[1, 0, 0]
代表原来特征里面的high
,[0, 1, 0]
代表原来特征里面的[mid]
, 而[0, 0, 1]
代表原来特征里面的low
。这样,本来这个特征只需要一个维度来表示,现在则需要三个维度来表示。如果这个离散型特征里面有几千个可能的值呢?考虑到在机器学习中,模型的效率很多时候都会受到特征维度的影响,那么结果将是灾难性的:仅仅这一个特征我们就需要扩充到好几千的维度来表示,更糟糕的是,在自然语言处理中,每一个特征都存在这样一个特性,我们得到的将是一个巨大的高维稀疏矩阵,用这样的数据集进行训练是不可想象的,因此我们需要采用一些方法来进行降低纬度。
word2vec
就是在这个时候可以大展身手的存在。他的基本思想就是对每一个单词进一步进行分类给出标签,这样一个曾经由数千个单词构成的字典将会由一个规模显著减小的标签集来构成离散型特征,维度也就得到了下降,而且还能最大程度地避免信息的丢失。例如:
在一段话中,出现如下几个单词:kitty
、cat
、dog
以及puppy
,在经过word2vec
处理之前,这四个单词将会有四个不同的向量来处理。但是,很显然,这四个单词之间根据词义很显然有一定程度的亲疏关系,kitty
和cat
都是猫,dog
和puppy
都是猫,如果把这四个单词各自想象成一个高维空间里面的向量,那么很显然,这四个单词根据其距离,可以分成两组,那么我们理论上就可以将这四个单词用两个标签来表示,这样维度变得到了降低。
word2vec的两种算法的基本介绍
word2vec
有两种常见的算法:
- skip-gram算法
- CBOW算法
在介绍这两种算法之前,我们必须要提到一个word2vec
中的基本规则:”Similar words always occur in similar contexts.”。这句话是我在听udacity的DEEP LEARNING课程的时候听到的,几乎可以用茅塞顿开来形容当时的心情。具体到这种算法,则就是如下的原理:
- skip-gram算法:基本原理是输入单词,预测该单词的上下文。
- CBOW算法:基本原理是输入单词的上下文,预测该单词
值得注意的是,我们这里提到单词的上下文并不意味着我们要在一次预测中完整的给出这个单词的完整上下文。举例来说,当我们有这样一句话:”The truth is still out there.”,现在我们需要对单词is
做分类。
当使用skip-gram算法时,我们的输入数据是is
,我们的输出自然就是它的上下文,假设我们定义左右各一个单词构成上下文,那么此处的上下文就是truth
以及still
,但是我们并不需要输出”truth still”,我们只需要输出truth
或者still
就行了。换句话说,在构建训练集的时候,我们会据此构建成如下的关系:[(is
, truth
), (is
, still
)]。
当使用CBOW算法的时候,我们的思路几乎一样,唯一的区别就是输入与输出对调一下,变成:[(truth
, is
), (still
, is
)]。
这样,我们就可以顺利构建起这两种算法各自的数据集为接下来的模型训练提供便利了。至于具体的模型的算法的详细过程则不在此处介绍。