李宏毅nlp学习笔记04:bert和它的好朋友们
1.当下追求的模型:
输入文本,训练使得模型可以读懂文本,然后根据不同的任务微调模型!
2.bert大家庭—芝麻街:
3.预训练:
把token用嵌入的向量表示。
针对英文系的前缀后缀等,有fasttext
中文的偏旁部首也能体现一定的意义:
为了表示相同字在不同词中的意思不同,现在的model都是输入整个句子之后,再给出每个token
的embedding。
即上下文。
这样的模型可以有哪些呢?
bert的encoder中的自注意力机制就是做这个的。
给出10个含有苹果的苹的句子,前5个是吃的苹果,后5个是苹果公司,求这10个字向量的自注意力矩阵。
模型越做越大:
但一般会搞出“穷人”使用的bert(小型):
怎样实现的呢?
比如albert:架构基本相同,原来每一层都是不同的参数,现在设置成每一层都是相同的参数。然而,效果不但基本没有掉,而且还有一定的提升,太神奇了。
4.让模型变小的方式:
5.当前模型追求让输入的句子变得越来越长,甚至是一本书:
6.追求将注意力机制的计算量减下去,
当前是n2,
bert是一个预训练的模型。
7.fine-tune(微调):因为要具体到各种不同的任务之中去。
比如,有任务:
多个句子之前应该添加一个特殊的token来告诉模型这是两个不同的句子。
8.输出①:one class:
有两种方法:
1.加一个cls,然后通过某种方法(注意力机制),把所有信息都融入到它所输出的向量中,然后再做一定的处理。
2,不加cls,把每个token的输出在输入到一个模型中。
9.输出②class for each token:
10.输出③:
红色来侦测开始位置,蓝色来侦测结束位置。
11.输出④:
另外一种方法就是把输出的再当做输入来预测下一个输出(我记得transformer就是这样子的):
12.
13.fine-tune(微调):预训练模型+具体任务的模型:
那么,一般有两种,一种是固定预训练模型,调整具体任务的模型。
另一种是把两个模型作为一个大的模型,一起进行调整。
后者的效果一般要好于前者。
14.第二种微调方法(把预训练和具体任务的模型当做一个大的模型)的缺点:
不同的具体任务会使得model有着不同的参数,这样model都应该分别存储,几亿个参数的会占据很大的空间。
15.Adapter:解决上述问题:
adapter中的參數只是model中的一小部分,在进行调节的时候,也只是调节这一部分的参数,因此可以降低需要存储的量。
16.最后的处理:
有一种处理是:输入的参数经过第一层的模型输出一个向量,这个向量再经过第二层的模型输出一个向量,作为最终的向量。
另一种方法是,第一次输出和第二次输出的权重和作为最终的向量。