先用无监督的语料去训练通用模型,然后再针对小任务进行专项训练学习。
首先介绍预训练模型,预训练模型的作用是将一些token表示成一个vector
但是对于英文,有太多的英文单词,这个时候应该对单个字符进行编码:
对于中文,可以对部首偏旁,或者把中文字当做图片送人网络中得到输出:
上述方法的问题不会考虑每个句子意思中相同字会有不同的意思,产生相同的token:
contextualized word embedding
类似于sequence2sequence模型的encoder一样。
同样的token,给出不一样的embedding,上述句子都有苹果两字。
self-attention的计算复杂度是 O ( n 2 ) O(n^2) O(n2)
将预训练模型当做encoder使用,每次产生一个word后,送入模型继续生成,直到产生eos结束符。
针对上述问题,解决方法:
fine-tune的时候只会调APT结构的参数,但是是插入到transformer结构中,加深了网络:
如何进行预训练:
self-supervised的input和output是自己产生出来的。
给定输入,预测下一个token
有了w1预测w2,用w1, w2预测w3, 然后用w1,w2,w3预测w4, 但是不能用右边的数据用来预测左边的数据:
基础架构网络使用的是LSTM:
注意:控制Attention的范围
可以用来生成文章: talktotransformer.com
但是问题是左边只能看到左边的,无法看到右边的结束,右边只能看到右边的,无法看到左边的开始。
随机的盖住某个词,是看到了完整的句子才来预测这个词是什么。
这种思想往前推,跟以前的cbow非常像:
Bert与cbow的区别就是左右两边的长度可以无限,而不是有个window窗口长度。
随机mask是否够好呢?有几种mask方法:
结构不是使用的Transformer,而是使用Transformer-XL
随机把顺序打乱,用各式各样不同的信息训练一个token。
Bert的训练语料比较规整:
Bert不擅长做Generative任务,因为bert训练的时候给的是整个句子,而generative只是给一部分,然后由左得右预测下一个token
要对w1,w2, w3,w4进行一些破坏,不然model学不到任何东西,破坏的方法:
结果是:
原始的Bert其实还有一项任务NSP,预测两个句子是否是相接的还是不相接的。两个句子中间用sep符号分割。
希望在train的时候加入knowledge
使用多种语言训练一个Bert模型
104种语言进行训练,可以做到Zero-shot的阅读理解。
在英文语料上进行训练,但在中文的QA任务上,效果还不错
中文翻译成英文,然后进行英文训练,发现结果并没有直接用中文训练的模型。
NER任务和词性标注任务都符合上述规律,用一种语言进行训练,然后在另外一种语音上进行任务处理。
中文的兔子embedding与英文的兔子embedding是比较接近的,模型可能去掉了语音的特性,而只考虑意思。
year排在第一名,month排在第三名,对应的分数是rank的倒数
资料量要非常大才能有比较好的结果,从BERT200k和BERT1000k中结果可以看到。
对传统的算法GloVe和Word2Vec也进行同样的实验,发现Bert效果还是要优于之前的算法。
用fake-english代替真的english,然后去训练,跨语言的能力不需要中介语音的存在。
每串文字代表一种语言,语言还是有一些差距的。
黄色是英文编码,蓝色是中文编码,二者融合起来,通过α进行控制:
在英文上进行fine-tune,然后在中文上进行测试,让embedding更像中文,在测试阶段,加上蓝色向量会提升效果。