目录
一、word embedding
1.1 介绍
1.2 Word2Vec有两种训练方法:
1.3 Word Embedding的应用:
1.4 word embedding存在的问题:
二、从word embedding到ELMo
2.1 ELMo的本质思想是:本身是个根据当前上下文对Word Embedding动态调整
2.2 ELMo采用了典型的两阶段过程:
2.3 网络采用双层双向LSTM特征抽取器
2.4 结果:
2.5 ELMo优点:
2.6 ELMo的缺点:
三、从word embedding到GPT
3.1 基于"Fine-tuning的模式"
3.2 GPT优点:
3.3 GPT的缺点:
3.4 Transformer:
四、BERT诞生
4.1 Bert的输入部分
4.2 Bert采用和GPT完全相同的两阶段模型:
4.3 Bert和GPT的最主要不同在于:
NLP四大类任务:
4.4 总结:
word2vec
这里可以使用word2vec的例子图
这里举一个例子。
18年之前NLP中经典的预训练方式。
第一层将词进行embedding之后获取词向量,句子中的每个词以one-hot形式输入,然后和学好的 word embedding矩阵Q相乘,得到该句子的word embedding了。所以word embedding等价于 one-hot层 到 embedding层 的网络。
矩阵Q包含V行,V代表词典大小,每一行内容代表对应单词的Word embedding值。只不过Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。
CBOW 与 skip-gram的区别:CBOW 与 skip-gram_"灼灼其华"的博客-CSDN博客_cbow和skipgram
本质上来说,经过Word Embedding之后,各个word就组合成了一个相对低维空间上的一组向量,这些向量之间的远近关系则由他们之间的语义关系决定。
无法解决多义词问题,没有语境信息,原因是word embedding是静态的。
针对word embedding无法解决多义词的问题,ELMO( Embedding from Language Models )提出了一个简洁有效的解决方案。
我事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
基于上下文的word embedding:ELMO
比如我们目前的任务上面讲的CBOW完形填空任务,根据上下文取预测单词Wi。这个Wi之前的是上文,之后的是下文。
图中左端的前向双层LSTM代表正向编码器,输入的是从左到右的单词Wi的上文;右端的逆向双层LSTM代表反向编码器,输入的是从右到左的逆序的单词Wi的下文。每个编码器的深度都是两层LSTM叠加。
使用大量语料训练好这个网络后,输入一个新句子,句子中的每个词对应三个embedding:
(1)最底层的是单词的word embedding;
(2)往上一层是第一层双向LSTM中单词位置对应的embedding,句法信息更多;
(3)再往上走一层是第二层双向LSTM中对应单词位置的embedding,语义信息更多。通过将这三个embedding整合成一个,更能区分多义词的效果。
ELMo预训练过程不仅学会了单词的word embedding,还学会了一个双层双向的LSTM网络结构。
Transformer Encoder在Multi-head Self-Attention之上又添加了三种关键操作:
Transformer Encoder的输入和输出在形式上还是完全相同,因此,Transformer Encoder同样可以表示为将输入文本中各个字的语义向量转换为相同长度的增强语义向量的一个黑盒。
把Transformer Encoder模块一层一层的堆叠起来就是大名鼎鼎的bert
它的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。每个单词有三个embedding:
1. 位置信息embedding,这是因为NLP中单词顺序是很重要的特征,需要在这里对位置信息进行编码;
2. 单词embedding,这个就是我们之前一直提到的单词embedding;
3. 三个是句子embedding,因为前面提到训练数据都是由两个句子构成的,那么每个句子有个句子整体的embedding项对应给每个单词。把单词对应的三个embedding叠加,就形成了Bert的输入。
Bert本身在模型和方法角度有什么创新呢?
Masked双向语言模型:
随机选择语料中15%的单词,把它抠掉,也就是用[Mask]掩码代替原始单词,然后要求模型去正确预测被抠掉的单词。但是这里有个问题:训练过程大量看到[mask]标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对[mask]这个标记的,但是实际使用又见不到这个标记,这自然会有问题。
为了避免这个问题,Bert改造了一下,15%的被上天选中要执行[mask]替身这项光荣任务的单词中,只有80%真正被替换成[mask]标记,10%被狸猫换太子随机替换成另外一个单词,10%情况这个单词还待在原地不做改动。这就是Masked双向语言模型的具体做法。
1、一类是序列标注,这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。
2、第二类是分类任务,比如我们常见的文本分类,情感计算等都可以归入这一类。
它的特点是不管文章有多长,总体给出一个分类类别即可。
3、第三类任务是句子关系判断,比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,
它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系;
4、第四类是生成式任务,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。
它的特点是输入文本内容后,需要自主生成另外一段文字。
NLP四大类任务都可以比较方便地改造成Bert能够接受的方式。这其实是Bert的非常大的优点,这意味着它几乎可以做任何NLP的下游任务,具备普适性,这是很强的。(强调Bert的普适性有多强。)
Bert最关键两点: