1、词表特征
前面介绍过表征单词的方式是首先建立一个较大的词汇表(例如10000),然后使用one-hot的方式对每个单词进行编码。例如单词Man,Woman,King,Queen,Apple,Orange分别出现在词汇表的第5391,9853,4914,7157,456,6257的位置,则它们分别用O5391,O9853,O4914,O7157,O456,O6257表示
这中one-hot表征单词的方法最大的缺点就是每个单词都是独立的、正交的,无法知道不同单词之间的相似程度。例如Apple和Orange都是水果,词性相近,但是单从one-hot编码上来看,内积为零,无法知道二者的相似性。在NLP中,我们更希望能掌握不同单词之间的相似程度
因此,我们可以使用特征表征(Featurized representation)的方法对每个单词进行编码。也就是使用一个特征向量表征单词,特征向量的每个元素都是对该单词某一特征的量化描述,量化范围可以是[-1,1]之间。特征表征的例子如下图所示:
特征向量的长度依情况而定,特征元素越多则对单词表征得越全面。这里的特征向量长度设定为300。使用特征表征之后,词汇表中的每个单词都可以使用对应的300 x 1的向量来表示,该向量的每个元素表示该单词对应的某个特征值。每个单词用e+词汇表索引的方式标记,例如e5391,e9853,e4914,e7157,e456,e6257
这种特征表征的优点是根据特征向量能清晰知道不同单词之间的相似程度,例如Apple和Orange之间的相似度较高,很可能属于同一类别。这种单词“类别”化的方式,大大提高了有限词汇量的泛化能力。这种特征化单词的操作被称为Word Embeddings,即单词嵌入
词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将单词或短语映射到连续的向量空间中。它能够将文本中的单词表示为密集的低维向量,捕捉到单词之间的语义和语法关系。通过词嵌入,计算机可以更好地理解和处理自然语言。 词嵌入的目的是将离散的符号(单词)转换为连续的向量表示。在这种连续的向量空间中,词嵌入能够捕捉到语义相似性,即语义相似的单词在向量空间中的距离较近。例如,"king"和"queen"在语义上更相似,因此在词嵌入向量空间中,它们的向量表示也会更接近
值得一提的是,这里特征向量的每个特征元素含义是具体的,对应到实际特征,例如性别、年龄等。而在实际应用中,特征向量很多特征元素并不一定对应到有物理意义的特征,是比较抽象的。但是,这并不影响对每个单词的有效表征,同样能比较不同单词之间的相似性
每个单词都由高维特征向量表征,为了可视化不同单词之间的相似性,可以使用降维操作,例如t-SNE算法,将300D降到2D平面上。如下图所示
2、使用词嵌入
之前我们介绍过 命名实体 识别的例子,每个单词采用的是one-hot编码。如下图所示,因为“orange farmer”是份职业,很明显“Sally Johnson”是一个人名
如果采用 特征表征 对每个单词进行编码,再构建该RNN模型。对于一个新的句子:
Robert Lin is an apple farmer
由于这两个句子中,“apple”与“orange”特征向量很接近,很容易能判断出“Robert Lin”也是一个人名。这就是featurized representation的优点之一
可以看出,featurized representation(特征表征)的优点是可以减少训练样本的数目,前提是对海量单词建立特征向量表述(word embedding)。这样,即使训练样本不够多,测试时遇到陌生单词,例如“durian cultivator”,根据之前海量词汇特征向量就判断出“durian”(榴莲)也是一种水果,与“apple”类似,而“cultivator”与“farmer”也很相似。从而得到与“durian cultivator”对应的应该也是一个人名。这种做法将单词用不同的特征来表示,即使是训练样本中没有的单词,也可以根据word embedding(词嵌入)的结果得到与其词性相近的单词,从而得到与该单词相近的结果,有效减少了训练样本的数量
featurized representation的特性使得很多NLP任务能方便地进行迁移学习。方法是:
- 从海量词汇库中学习word embeddings,即所有单词的特征向量。或者从网上下载预训练好的word embeddings
- 使用较少的训练样本,将word embeddings迁移到新的任务中
- (可选):继续使用新数据微调word embeddings
建议仅当训练样本足够大的时候,再进行上述第三步
有趣的是,word embeddings与Coursera吴恩达《卷积神经网络》课程笔记(4)– 人脸识别与神经风格迁移中介绍的人脸特征编码有很多相似性。人脸图片经过Siamese网络,得到其特征向量f(x),这点跟word embedding是类似的。二者不同的是Siamese网络输入的人脸图片可以是数据库之外的;而word embedding一般都是已建立的词汇库中的单词,非词汇库单词统一用< UNK >表示
3、词嵌入的特性
上例中,特征维度是4维的,分别是[Gender, Royal, Age, Food]。常识地,“Man”与“Woman”的关系类比于“King”与“Queen”的关系。而利用Word embeddings可以找到这样的对应类比关系
将“Man”的embedding vector与“Woman”的embedding vector相减
类似地,我们将“King”的embedding vector与“Queen”的embedding vector相减
相减结果表明,“Man”与“Woman”的主要区别是性别,“King”与“Queen”也是一样
一般地,A类比于B相当于C类比于“?”,这类问题可以使用embedding vector进行运算
如上图所示,根据等式得 equeen = eking − eman + ewoman
关于相似函数,比较常用的表达式为Cosine similarity (余弦相似度),余弦相似度的取值范围在 -1 到 1 之间,值越接近 1 表示两个向量越相似,值越接近 -1 表示两个向量越不相似,值为 0 表示两个向量正交(无相似性)
还可以计算Euclidian distance(欧氏距离)来比较相似性,即。距离越大,相似性越小
euclidean_distance(A, B) = sqrt( (x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2 + ... )
其中,(x1, y1, z1, ...) 表示点 A 的坐标,(x2, y2, z2, ...) 表示点 B 的坐标
4、嵌入矩阵
假设某个词汇库包含了10000个单词,每个单词包含的特征维度为300,那么表征所有单词的embedding matrix维度为300 x 10000,用 E 来表示。某单词w的one-hot向量表示为Ow
,维度为10000 x 1,则该单词的embedding vector表达式为
因此,只要知道了embedding matrix E,就能计算出所有单词的embedding vector ew。后面我们将重点介绍如何求出E
值得一提的是,上述这种矩阵乘积运算E⋅Ow效率并不高,矩阵维度很大,且Ow大部分元素为零。通常做法是直接从E中选取第w列作为ew即可
5、学习词嵌入
embedding matrix E可以通过构建自然语言模型,运用梯度下降算法得到。举个简单的例子,输入样本是下面这句话
I want a glass of orange (juice)
通过这句话的前6个单词,预测最后的单词“juice”。E未知待求,每个单词可用embedding vector ew表示。构建的神经网络模型结构如下图所示:
神经网络输入层包含6个embedding vactors,每个embedding vector维度是300,则输入层总共有1800个输入。Softmax层有10000个概率输出,与词汇表包含的单词数目一致。正确的输出label是“juice”。其中E,W[1],b[1],W[2],b[2],[1],[1],[2],[2]为待求值。对足够的训练例句样本,运用梯度下降算法,迭代优化,最终求出embedding matrix E
这种算法的效果还不错,能够保证具有相似属性单词的embedding vector相近
为了让神经网络输入层数目固定,可以选择只取预测单词的前4个单词作为输入,例如该句中只选择“a glass of orange”四个单词作为输入。当然,这里的4是超参数,可调。
一般地,我们把输入叫做context,输出叫做target。对应到上面这句话里:
context: a glass of orange
target: juice
关于context的选择有多种方法:
target前n个单词或后n个单词,n可调
target前1个单词
target附近某1个单词(Skip-Gram)
事实证明,不同的context选择方法都能计算出较准确的embedding matrix E
6. Word2Vec
上一小节我们介绍了context和target的选择方法,比较流行的是采用Skip-Gram模型。以下面这句话为例:
I want a glass of orange juice to go along with my cereal.
Skip-Gram模型的做法是:首先随机选择一个单词作为context,例如“orange”;然后使用一个宽度为5或10(自定义)的滑动窗,在context附近选择一个单词作为target,可以是“juice”、“glass”、“my”等等。最终得到了多个context—target对作为监督式学习样本
训练的过程是构建自然语言模型,经过softmax单元的输出为:
其中,θt为target对应的参数,ec为context的embedding vector,且ec=E⋅Oc。
相应的loss function为:
然后,运用梯度下降算法,迭代优化,最终得到embedding matrix E
然而,这种算法计算量大,影响运算速度。主要因为softmax输出单元为10000个,y^计算公式中包含了大量的求和运算。解决的办法之一是使用hierarchical softmax classifier,即树形分类器。其结构如下图所示:
这种树形分类器是一种二分类。与之前的softmax分类器不同,它在每个数节点上对目标单词进行区间判断,最终定位到目标单词。这好比是猜数字游戏,数字范围0~100。我们可以先猜50,如果分类器给出目标数字比50大,则继续猜75,以此类推,每次从数据区间中部开始。这种树形分类器最多需要log N步就能找到目标单词,N为单词总数
实际应用中,对树形分类器做了一些改进。改进后的树形分类器是非对称的,通常选择把比较常用的单词放在树的顶层,而把不常用的单词放在树的底层。这样更能提高搜索速度
最后提一点,关于context的采样,需要注意的是如果使用均匀采样,那么一些常用的介词、冠词,例如the, of, a, and, to等出现的概率更大一些。但是,这些单词的embedding vectors通常不是我们最关心的,我们更关心例如orange, apple, juice等这些名词等。所以,实际应用中,一般不选择随机均匀采样的方式来选择context,而是使用其它算法来处理这类问题
Skip-Gram模型是Word2Vec的一种,Word2Vec的另外一种模型是CBOW(Continuous Bag of Words)