词袋模型(One-hot)
词袋模型:最早的以词为基本处理单元的文本向量化方法,词袋模型通过先构建一个包含语料库中所有词的词典,然后根据词典完成对每个词的向量化,进而完成文本向量化。
通过词典将所有的词向量化,每个词的向量长度都是词典的大小,然后向除了一个位置的元素是1,这个位置是词在词典中的index,其他元素全是0。这种表示方法称为one-hot向量表示,如下:
watch = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
完成对所有词的向量化之后,就可以得出两个文本的向量化(词向量相加)结果,每个文本的向量长度都是词典的大小,向量中的每个位置的元素代表词典中该位置的词在文本中出现的次数。以文本1为例,John出现了1次,likes出现了2次,football出现了0次等等,结果如下:
文本1 = [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
词袋模型(onehot编码)问题:
- 维度灾难:如果词典中有很多个词,那么每个词都是一个维度很高的向量
- 未保留词序:只将文本看成是一袋子词
- 语义鸿沟:通过向量表示无法体现两个词的关系
解决方案:
语言模型构建词向量的方式出现了。
统计语言模型
定义:统计语言模型(Statistical Language Model)即是用来描述词、语句乃至于整个文档这些不同的语法单元的概率分布的模型。
应用:语音识别、机器翻译、文档分类、光学字符识别等自然语言应用
作用:统计语言模型可以用来表述词汇序列的统计特性,譬如学习序列中单词的联合分布概率函数。
n-gram语言模型
定义: N-Gram是一种基于统计语言模型的算法。
基本思想:将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。常用的是二元的Bi-Gram和三元的Tri-Gram。
应用:搜索引擎提示
原理:
马尔可夫假设:
假设一个词wi在某个位置出现的概率只与它前面的一个词wi−1有关
2-gram例子:选自机器学习算法与自然语言处理
神经网络语言模型
神经网络语言模型(Neural Network Language Models,NNLM)克服了维度灾难,并且大大提升了传统语言模型的性能。
前馈神经网络语言模型
循环神经网络语言模型
长短期记忆的循环神经网络语言模型
缺点:计算复杂度过大,参数较多
word2vec
优点:
由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
比之前的 Embedding方 法维度更少,所以速度更快
通用性很强,可以用在各种 NLP 任务中
缺点:
由于词和向量是一对一的关系,所以多义词的问题无法解决。
Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化
神经网络语言模型包含两个非线性层,求解起来复杂度很高,于是出现了两种更高效的神经网络模型CBOW和Skip-Gram。
核心思想是利用神经网络对词的上下文训练得到词的向量化表示,训练方法:CBOW(通过附近词预测中心词)、Skip-gram(通过中心词预测附近的词)。
CBOW
CBOW 是 Continuous Bag-of-Words 的缩写,与神经网络语言模型不同的是,CBOW去掉了最耗时的非线性隐藏层。目标词前后各取k个词。
输入层到隐藏层
隐藏层到输出层
梯度,再梯度下降
Skip-Gram
输入层到隐藏层
隐藏层到输出层
梯度,再梯度下降
优化求解:Hierarchical softmax(把输出层改成了一颗哈夫曼树)和Negative Sampling(每次训练只随机取一小部分的负例使他们的概率最小,以及对应的正例概率最大)
glove
实践参考:
https://github.com/maciejkula/glove-python
Glove-python词向量训练与使用
word2vec只考虑到了词的局部信息,没有考虑到词与局部窗口外词的联系,glove利用共现矩阵,同时考虑了局部信息和整体的信息。
Count-based模型,如GloVe,本质上是对共现矩阵进行降维。
首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。共现矩阵就是计算每个word在每个context出现的频率。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。这一过程可以视为共现矩阵的重构问题,即reconstruction loss。。
安装pip install glove_python
(可能报错error: Microsoft Visual C++ 14.0 is required.) glove离线文件下载(推荐)
生成嵌入是一个两步过程: 从语料库中生成一个匹配矩阵,然后用它生成嵌入矩阵。 Corpus 类有助于从token的interable构建一个语料库。还支持基本的pagragraph向量。 在word空间vector段落向量是在单词向量空间中嵌入段落,这样段落表示就接近于它所包含的单词,因为在语料库中的单词的频率调整。 在训练模型上通过调用 transform_paragraph 方法来训练单词嵌入后,可以得到这些结果。
其中段落向量是词向量的平均可见.
ELMO GPT bert
之前介绍词向量均是静态的词向量,无法解决一次多义等问题。下面介绍三种elmo、GPT、bert词向量,它们都是基于语言模型的动态词向量。下面从几个方面对这三者进行对比.
优缺点
word2vec:
nlp中最早的预训练模型,缺点是无法解决一词多义问题.
ELMO:
优点: 根据上下文动态调整word embedding,因为可以解决一词多义问题
缺点:
1、使用LSTM特征抽取方式而不是transformer
2、使用向量拼接方式融合上下文特征融合能力较弱,伪双向。
GPT:
优点:使用transformer提取特征
缺点:使用单项的语言模型,即单向transformer.
BERT:
优点:使用双向语言模型,即使用双向transformer;使用预测目标词和下一句,多任务学习方式进行训练。
缺点:对文本字数512限制,不利于文本生成。
ELMO
定义
ELMO是“Embedding from Language Models"简称
引入
在此之前word embedding本质是个静态方式,静态的意思就是说单词训练好之后就固定了,在以后使用时,单词不会跟着上下文场景变化而变化。如Jobs is the CEO of apple,he finally eat an apple.用word2vec “apple”的表示是一样的向量,动态模型可以解决此问题。
思想
事先用一个语言模型去学习单词的word embedding, 当在使用时,单词已经具备了特定的上下文,这时候可以根据上下文的语义去调整单词的word embedding, 这样经过调整的word embedding更能表达这个上下文中具体的含义,也就解决了一词多义问题,故ELMO本质就是根据当前上下文对Word Embedding进行动态调整的过程。
过程
Elmo采用典型的两阶段过程:第一阶段使用预训练语言模型进行训练,第二阶段当做具体的下游任务时,从预训练的网络中提取对应的词的Word Embedding作为特征补充到下游任务中。
第一阶段,预训练:采用双层双向LSTM对上下文进行编码,上下文使用静态的word embedding, 对每层LSTM,将上文向量与下文向量进行拼接作为当前向量,利用大量的预料训练这个网络。对于一个新的句子,可以有三种表示,最底层的word embedding, 第一层的双向LSTM层的输出,这一层能学习到更多句法特征,第二层的双向LSTM的输出,这一层能学习到更多词义特征。经过elmo训练,不仅能够得到word embedding, 又能学习到一个双层双向的神经网络。
第二阶段,下游任务使用:将一个新的句子作为elmo预训练网络的输入,这样该句子在elmo网络中能获得三个embedding, 可以将三个embedding加权作为word embedding, 并将此作为下游任务的输入,这被称为“Feature-based Pre-Training"。
GPT
GPT是Generative Pre-Traxining的简称。与ELMO相似,采用两阶段的模式:利用语言模型进行预训练,通过fine-tuning模式应用到下游任务。
利用语言模型进行预训练:与elmo不同的是,GPT使用transformer进行提取特征,并且是单向的transformer,只是根据上文来预测某个词,Transformer模型主要是利用自注意力(self-attention)机制的模型。
fine-tuning: 与ELMo当成特征的做法不同,OpenAI GPT不需要再重新对任务构建新的模型结构,而是直接在transformer这个语言模型上的最后一层接上softmax作为任务输出层,然后再对这整个模型进行微调。
由于不同NLP任务的输入有所不同,在transformer模型的输入上针对不同NLP任务也有所不同。具体如下图,对于分类任务直接讲文本输入即可;对于文本蕴涵任务,需要将前提和假设用一个Delim分割向量拼接后进行输入;对于文本相似度任务,在两个方向上都使用Delim拼接后,进行输入;对于像问答多选择的任务,就是将每个答案和上下文进行拼接进行输入。
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/
详情见bert简单介绍和实践
fasttext
fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,优点非常明显,却在训练时间上比深度网络快许多数量级 ,且往往能取得和深度网络相媲美的精度。主要使用场景:同近义词挖掘和 文本分类
优点:
- fasttext工具包中内含的fasttext模型具有十分简单的网络结构.
- 使用fasttext模型训练词向量时使用层次softmax结构, 来提升超多类别下的模型性能.
- 由于fasttext模型过于简单无法捕捉词序特征, 因此会进行n-gram特征提取以弥补模型缺陷提升精度.
核心思想:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。
word2vec把语料库中的每个单词当成原子,它会为每个单词生成一个向量。忽略了单词内部的形态特征,比如:“apple” 和“apples”,在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。
fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有:“<ap”, “app”, “ppl”, “ple”, “le>”。其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。
这样
-
对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享。
-
对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量。
模型架构:和word2vec的CBOW模型架构非常相似
此架构图没有展示词向量的训练过程。可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。
不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
使用词embedding而非词本身作为特征,这是fastText效果好的一个原因;另一个原因就是字符级n-gram特征的引入对分类效果会有一些提升 。
参考:
https://zhuanlan.zhihu.com/p/32965521
中文词向量的训练_Jasminexjf的博客-CSDN博客_词向量训练
https://zhuanlan.zhihu.com/p/44599645、https://zhuanlan.zhihu.com/p/157835184、https://blog.csdn.net/qi_700/article/details/101013497
https://baijiahao.baidu.com/s?id=1647878529022615500&wfr=spider&for=pc