介绍
我们在做NLP任务时,首先需要把文本表示成计算机能够理解的数据,通常的做法是把词映射成向量。把词映射成向量的方法非常多,比如词带模型,one-hot,词嵌入模型等等,目前使用比较多的是词嵌入模型,将词映射成低维连续的向量。
用TensorFlow或者keras等框架时,都会创建一层Embedding层,这个Embedding层可以用随机初始化的矩阵也可以是预训练的矩阵。这个Embedding实现的就是词嵌入层,或者成为词表示层。
这里有两个问题需要注意:
1. tf.keras或者keras的Embedding层与word2vec的词向量有什么区别?
2. 经过训练的Embedding会与word2vec训练出来的词向量一样吗?
回答这个问题,首先只要弄清楚word2vec
是怎么训练得到的词向量的。网上总结了Word2vec中数学原理详解
1。使用word2vec训练词向量时,虽然没有标记数据,但并不是无监督的训练,是利用文本的上下文来训练的,比如Tomas Mikolov
给出的两个模型,CBOW
和Skip-gram
模型,二者的区别在于CBOW
使用上下文来预测当前词,而Skip-gram
利用当前词来预测上下文,本质上都是利用神经网络来做分类问题,很明显就是一种监督训练。
语言模型
设置好词窗口的宽度L,就能得到词的上下文向量context(w_i)=\sum_{i\ne j}^L w_i,中心词为w_i,在语料中可以得到大量的数据对(context(w_i), w_i)。目标就是
L(w) = \sum_{i \in C} \log p(w_i|context(w_i))
最大化上面的似然函数,就能得到一个根据上下文预测当前词的模型,而词向量就是这个任务的副产物。
回答上面的问题
看到这里现在可以回答上面的问题了。
1. keras的Embedding仅仅只是一个词的映射层,如果采用随机初始化相当于是半成品的词向量,而word2vec训练得到的词向量是完整的此嵌入向量,有表示上下文的能力。
2. 可以一样,也可以不一样,取决于任务是否相同。如果我们构建的模型与word2vec训练任务相同,那么得到的词向量可以认为是等价的。当然我们也可以用word2vec训练得到的词向量来初始化Embedding层的权重。
这里再来解释一下,引用苏剑林的例子(他的文章分析的很透彻2):
我喜欢你
我讨厌你
对于这样的文本,利用word2vec训练的结果一定是喜欢
和讨厌
距离非常近似,因为上下文是一致的。而在情感分析中,这是两种完全不同的情感,那么喜欢
和讨厌
这两个词距离相差很远。
总结
这里简单总结一下:
1. word2vec是一个完整神经语言模型,包含输入层,投影层,隐藏层,输出层。而Embedding层仅仅只相当于投影层(词嵌入)而已。
2. 对于不同的NLP任务来说,虽然都用Embedding层,最终训练得到的副产物词向量(投影层)结果没有任何关联,都是通过更新参数得到的Embedding。
3. 虽然这两个层不一样,但在很多时候可以通过word2vec训练得到词向量,去初始化Embedding层的权重,这样的Embedding层可以很好的表示文本的上下文特征。不过在Bert大行其道以后,直接采用Bert的预训练来做词表示,其捕捉上下文特征的能力大大提升,成为了主流方法。但认识和理解词向量仍然具有重要意义。