word2vector
word2vec来源于2013年的论文《Efficient Estimation of Word Representation in Vector Space》,它的核心思想是通过词的上下文得到词的向量化表示,有两种训练方式:CBOW(通过附近词预测中心词)、Skip-gram(通过中心词预测附近的词)
前世今生:
NGRAM:将词当成一个离散的单元(因此存在一定的局限性,没有考虑到词与词之间的关系)
neural network language model:只能处理定长序列,训练慢。使用RNN之后有所改善
两种优化方式:针对CBOW和SKIP-gram,样本大以及不均衡问题
考虑到sofmax归一化需要遍历整个词汇表,层次softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;负采样更为直接,实质上对每一个样本中每一个词都进行负例采样;
层次softmax:
从根节点到叶子节点的唯一路径编码了这个叶子节点所属的类别
代价:增强了词与词之间的耦合性
glove
word2vec只考虑到了词的局部信息,没有考虑到词与局部窗口外词的联系
glove利用共现矩阵,同时考虑了局部信息和整体的信息。
Count-based模型,如GloVe,本质上是对共现矩阵进行降维。
首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。共现矩阵就是计算每个word在每个context出现的频率。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。
来自论文《Glove: Global vectors for word representation》。
设共现矩阵为X,其元素为Xi,j 每一个值的意义为:在整个语料库中,单词i和单词j共同出现在一个窗口中的次数。
Pij=P(j∣i)=Xij/Xi表示词汇jjj出现在词汇iii上下文的概率。
P在一定程度上可以反映词汇之间的相关性,当相关性比较低时,其值应该在1附件,当相关性比较高时,比值应该偏离1比较远。
因此主要是训练得到词向量满足以下规律。最终可通过训练迭代得到符合规律的词向量。
https://github.com/stanfordnlp/GloVe
详细使用步骤: https://blog.csdn.net/sscssz/article/details/53333225
ELMO
之前介绍词向量均是静态的词向量,无法解决一次多义等问题。下面介绍三种elmo、GPT、bert词向量,它们都是基于语言模型的动态词向量。
ELMO是“Embedding from Language Models"简称。其本质就是根据当前上下文对Word Embedding进行动态调整的过程。
但是elmo是一个伪双向模型
使用向量拼接方式融合上下文特征融合能力较弱,伪双向。
GPT
GPT是Generative Pre-Traxining的简称。
与elmo不同的是,GPT使用transformer进行提取特征,并且是单向的transformer,只是根据上文来预测某个词,Transformer模型主要是利用自注意力(self-attention)机制的模型。
fine-tuning: 与ELMo当成特征的做法不同,OpenAI GPT不需要再重新对任务构建新的模型结构,而是直接在transformer这个语言模型上的最后一层接上softmax作为任务输出层,然后再对这整个模型进行微调。
BERT
BERT是“Bidirectional Encoder Representations from Transformers"的简称。
同GPT采用两阶段模式:利用双向transformer语言模型进行预训练,通过fine-tuning模式解决下游任务。
BERT创新: Masked语言模型和Next Sentence Prediction。
BERT(Bidirectional Encoder Representations from Transformers)详解(参考链接:https://plmsmile.github.io/2018/12/15/52-bert/
http://fancyerii.github.io/2019/03/09/bert-theory/#elmo):
缺点:对文本字数512限制,不利于文本生成。