1.word2vec
首先通过词向量的学习我发现了自己理解中的误区,我原来一直以为Word2Vec是一种词向量。其实它只是一种训练词向量的模型,和那些机器学习的模型的本质是一回事,通过训练数据得到我们想要的内容,只不过Word2Vec训练出来的是词的向量表示。我觉得这也是许多NLP任务中预训练词向量的原因吧。
Word2Vec模型背后的基本思想是对出现在上下文环境里的词进行预测。对于每一条输入文本,我们选取一个上下文窗口和一个中心词,并基于这个中心词去预测窗口里其他词出现的概率。因此,word2vec模型可以方便地从新增预料中学习新增词的向量表达,是一种高效的在线学习算法。
word2vec主要思路:通过单词和上下文彼此预测,对应的两个算法分别为:
Skip-gram(SG):通过中心词预测上下文。
Continuous Bag of Words(CBOW):通过上下文预测中心词
训练中有两个小tips:
- Hierarchical softmax
- Negative sampling
1.1 Skip-Gram原理和网络结构
Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。
Word2Vec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量。
word2vec整个建模过程实际上与自编码器的思想相似。先基于训练数据构建一个神经网络,当这个模型训练好以后,不需要用这个训练好的模型处理新的任务,真正需要的是这个模型通过训练数据所学的的参数,例如隐层的权重矩阵——实际上我们看到的权重在w2v中就是我们尝试学习的词向量。
但是很容易出现维度灾难。如果现在有10000个单词,词向量维度为3000维,那么总共会有10000*300=300万个权重。在如此庞大的神经网络中进行梯度下降非常慢。
解决方案:
- 将常见的单词组合(word pairs)或者词组作为单个“words”来处理
- 对高频次单词进行抽样来减少训练样本的个数
- 对优化目标采用“negative sampling”方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担。
Hierarchical Softmax过程
为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。
使用gensim训练word2vec
from gensim.models.word2vec import Word2Vec
model = Word2Vec(sentences, workers=num_workers, size=num_features)
2.TextCNN
TextCNN利用CNN(卷积神经网络)进行文本特征抽取,不同大小的卷积核分别抽取n-gram特征,卷积计算出的特征图经过MaxPooling保留最大的特征值,然后将拼接成一个向量作为文本的表示。
这里我们基于TextCNN原始论文的设定,分别采用了100个大小为2,3,4的卷积核,最后得到的文本向量大小为100*3=300维。
3.TextRNN
TextRNN利用RNN(循环神经网络)进行文本特征抽取,由于文本本身是一种序列,而LSTM天然适合建模序列数据。TextRNN将句子中每个词的词向量依次输入到双向双层LSTM,分别将两个方向最后一个有效位置的隐藏层拼接成一个向量作为文本的表示。