文章目录
自监督学习self-supervised learning
自监督学习是无监督学习的一种
自监督学习:不需要(X,y)成对的数据;只依靠数据X,将数据X自身的一部分作为训练的label,剩下的部分作为feature,来让网络训练。
BERT
bert名字来源于芝麻街动漫的人物。
BERT本身架构就是一个Transformer的Encoder,应用于seq2seq方面。
任务1:Masked Token Prediction
要求:
输入feature: 序列“台 × 大 学”,其中“×”是一个被mask盖住的special token,或者用一个random随机的汉字来替代这个字。
输出label: mask向量经过bert的输出再经过linear层,输出softmax向量。让缺失的“湾”字成为输出的label。
相当于做一个填空题,本质上是对遮盖住的input-mask向量的output-softmax做分类。
训练时,bert+linear一起训练。
任务2:Next Sentence Prediction
bert的cls经过网络后的输出yes/no是二元分类,表明对**Sentence 1和Sentence 2是否在正文中应该是两个相连接的句子(而不是随意排列的)**进行预测。
但是后续有研究表明“任务2”对bert的表现的作用不是很大。有可能是因为bert网络很强大,对于“两个句子是否是直接相连的关系”这一判断并不需要的单独进行训练。
后续工作SOP:把句子是否相连接的判断,改为判断句子顺序。
Bert的Downstream Tasks下游任务
BERT看起来好像只能做**“填空题”masked token prediction和“没有特别大作用和影响“的”语句相连判断题“Next sentence prediction**。但是我们可以fine tune出很多模型,来做海量的下游任务。
评估BERT
自然语言处理的GLUE标准
- GLUE由纽约大学, 华盛顿大学, Google联合推出, 涵盖不同NLP任务类型, 截止至2020年1月其中包括11个子任务数据集, 成为衡量NLP研究发展的重要标准。
BERT可以针对9个不同的测试方向,微调出9个不同的model来参与评估。
BERT家族的自然语言处理的表现结果在之前的数据集上已经优于人类。
下游应用1:文本情感分析sentiment analysis
任务
给出一个句子的vector-sequence,给出“情感”分类,比如是positive还是negative。
方法
BERT+Linear
-
输入:[cls]+“this”+“is”+“good”+“.”+“[end]”
-
层:只取[cls]经过bert后的对应的输出,这里的bert相当于transformer的encoder,bert输出的黄色vector相当于整合了整个句子信息的一个特征向量。
-
输出:将中间层得到的vector通过Linear,得到判断的class。
-
训练:Linear和Bert一起训练。Linear层显然参数随机初始化,特别的地方在于BERT:Bert采用预训练的模型,bert网络是之前已经通过自监督的Masked Token Prediction训练好的网络(一个学会做填空题的model)。然后二者一起做有监督的sentiment analysis任务的梯度下降参数优化。(这个下游的情感分类任务是有监督的,但是预训练Bert这一过程是无监督的)
-
实验:之所以采用Pre-train的bert网络,而不是随机初始化的transformer-encoder,在于Bert网络的表现更好。
整个任务可以看做一个semi-supervised任务。
下游应用2:Pos tagging词性标注
任务
给一个句子单词组成的sequence,求出每个词对应的词性。
方法
bert+linear
-
self-attention做法:给一个encoder,输入时I saw a saw的sequence,输出是N V DET N的sequence。随机初始化Q、K、V,求注意力系数矩阵,再求得输出向量组,再做residual,最后得到输出的seq(如图输出的黄色向量组)。
-
Bert的做法:通过自监督学习,训练好一个BERT网络作为上游网络,这个BERT和上述self-attention方法中构建的网络结构一样,只不过它不直接通过监督学习方法进行优化参数来解决具体问题,而是先通过self-supervised learning来作为pre-train的model。监督学习的部分则作为网络的下游,将Bert的输出作为Linear层的输入,再输出得到分类结果class,与真实的词性label求loss,做参数优化。
下游应用3:Natural Language Inference自然语言推断
任务
给出两个句子(两个sequence),求出两个句子间的逻辑关系:矛盾、蕴含(推导)、中立(并列)。
方法
输入:[cls]+seq1+[sep]+seq2
中间层:取[cls]经过bert后得到的输出vector,作为下一层的输入
输出:Class,分类,表明seq1和seq2之间的逻辑关系
与上述同理,Linear是随机初始化的,Bert是之前通过自监督训练pre-train之后的model。
下游应用4:extraction-based Q&A问答
任务
输入:给出一段文字,和若干question
输出:回答answer片段。extraction-based:答案是出现在原文中的。
方法
- 输入:
- Document:文章单词序列
- Query:问题单词序列
- 输出
- s:start位置的idx
- e:end位置的idx
- 答案:
- Document[s:e]
如图将[cls]+qestion+[sep]+document输入BERT,然后随机初始化两个和bert输出的vector同维度的vector,如图红色和蓝色的vector,然后做类似attention的Q*K的操作,将得到的一组和document同等长度的inner product值过softmax,红色向量求出s的值,蓝色向量求出e的值。然后做loss+梯度下降,来优化红、蓝向量的取值并对bert进行fine-tune。
BERT的训练
虽然目标很简单——做填空题,但是训练起来十分困难,需要海量的数据超高的算力才可以。称之为:bert embryology胚胎学
bart——除了训练encoder,还想要训练decoder
前面的例子都不是seq2seq的例子,seq2seq要求“输入和输出的长度是不一定的”,所以不能把pos tagging应用看作是seq2seq的应用。典型的seq2seq是transformer。
给一个transformer,encoder输入:一个corrupted的序列{w1,w2,w3<被损坏>,w4},要求decoder能够产生corrupt之前的序列 {w1,w2,w3<被还原>,w4},即对input的重建。
corrupt的方法
google尝试做了所有可能的corrupt的方法来训练transformer,model 的大小约为7TB
BERT为什么work
词汇编码
onehot
- 缺点:
- 它是一个词袋模型,不考虑词与词之间的顺序。
- 它假设词与词相互独立,不能体现词汇间的相似性
- 每个单词的one-hot编码维度是整个词汇表的大小,维度非常巨大,编码稀疏,会使得计算代价变大。
word embedding
把文本分散嵌入(embedding)到另一个数值向量空间,称作分布式表示,又称为词嵌入(word embedding)或词向量。
- Word Embedding的输入是原始文本中的一组不重叠的词汇,将他们放到一个字典里面,例如:[“cat”, “eat”, “apple”],就可以作为一个输入。
- Word Embedding的输出就是每个word的数值向量表示,变成一个矩阵。
举一个例子,这是一个单词“king”的词嵌入(在维基百科上训练的GloVe向量):
我们将忽略数字并仅查看颜色以指示单元格的值。现在让我们将“king”与其它单词进行比较(注意,世间有相似之人,也有相似之词):
Word Embedding的优点
- 对比one-hot高维稀疏向量,embedding维度低,连续向量,方便模型训练;
- 语意相似的词在向量空间上也会比较相近
- 一个向量可以编码一词多义(歧义需要另外处理);
- 天然有聚类后的效果,是一种无监督学习。
- 罕见词也可以学到不错的表示。
word Embedding的方法
从N-gram模型、NNLM到Word2Vec
cosine similarity
计算两个向量之间相似度得分的常用方法是余弦相似度
举例:
BERT就是在做word Embedding
BERT就是在做word Embedding,并且是在做一种“考虑上下文”的word embedding。
朴素的word embedding思想,可以做到具有简单的聚类性质的非稀疏性编码。但是各种语言都会具有一词多义和不同语境下含义不同的问题。由于bert实际上是源于注意力机制,所以很容易做到考虑上下文。
实验:计算不同语境上下文中汉字的“果“的embedding向量的cosine similarity。
可以看到matrix[:5,:5]中不同语句间“果”字的embedding相似度很高,都是浅黄绿色。(自己和自己的相似度最高,为1,黄色)。matrix[5:,5:]同理。但是交叉起来的位置embedding相似度很低,这意味着bert将苹果手机的"果"和水果苹果的"果"编码为欧式空间中相距很远、相差较大的向量【聚为两个不同的类】。
类比BERT和CBOW
其他
此外,bert还可以做看似没有context的任务,比如DNA序列分类、蛋白质分类、音乐分类。为什么在这些领域也work,还需要后续研究。
BERT还可以应用于multi-lingual BERT,在pre-train时,用多种语言去训练它。最后embedding的结果是,不仅同种语言内可以很好的embedding,并且不同语言间也会被embedding的很好。想要用实验验证,同样也需要大量的数据和算力。
上述这样优秀的表现的用途在于,在下游任务中,可以实现:训练用english的Q&A,测试用chinese的Q&A.
实际训练结果:
不同语言embedding后也是有差异的,不会因为训练了104种语言,就抹去了语言的差异(抹去差异意味着会输入给中文,embedding到英文单词的错误)。并且差异也是有规律的,这种差异意味着“语言”间的差异。例如:
δ
=
∣
′
跳
′
−
′
j
u
m
p
′
∣
=
∣
′
游
′
−
′
s
w
i
m
′
∣
=
∣
′
兔
′
−
′
r
a
b
b
i
t
′
∣
\delta=|'跳'-'jump'|=|'游'-'swim'|=|'兔'-'rabbit'|
δ=∣′跳′−′jump′∣=∣′游′−′swim′∣=∣′兔′−′rabbit′∣
于是可以做到神奇的事:输入“深度学习”,输出v1,v2,v3,v4,加上delta,得到对应英文的embedding,这样可以做到unsupervised translation。