License: CC BY-NC-SA 4.0
同步发表于我的新博客。
supervised learning 是之前见过很多次的,给定一些输入和输出,让机器学习其中的规律。而 self-supervised learning 就不用标注数据。有趣的是,这一类模型大都以芝麻街的人物命名,例如 BERT. 它的结构和 transformer 的 encoder 差不多。
假设我们没有标注好的数据,这时又怎么做呢?可以将数据分为两部分,一部分作为模型的输入,另一部分作为 label. 这就是 self-supervised learning。它可以看作是一种 unsupervised learning 的方法. 这一段比较抽象,下面是详细解释:
-
masking input
考虑 transformer 的 encoder,但将输入随机盖住一些 token(以中文序列为例,下面把一个字当成一个 token)。所谓盖住有两种做法,一种是用一种特殊的符号代替,另一种是随机替换为另一个 token。对于这个被盖住的字,它在通过 encoder 后会输出一个向量。我们把这个向量通过一层 linear 层之后做 softmax,就是机器认为这个字 应该 是什么。接下来由于我们知道它实际上是什么,所以只要 minimize cross entropy 就行了。
-
next sentence prediction
(这个方法好像不是很管用)
还是以中文序列为例。在你的训练资料里随便抽出两句话(不一定要是相邻的),在第一句话前面加一个特殊的 token「CLS」,在两句话中间加一个 token「SEP」,把这两个句子缝合成一个长句子。之后把这个缝合怪直接丢进 encoder 里,它会输出一个同样长度的向量序列,但我们只关心 CLS 对应的向量,将这个向量丢进一个 linear model 里,输出 yes/no,代表这两句话是否是相邻的。
-
sentence order prediction
和上面的方法类似,但是用于拼接的两个句子是相邻的,只是前后顺序颠倒。任务是判断这两个句子是否顺序颠倒了。
学完之后虽然只会做填空题,但经过 finetune 之后就能拿来做各种下游任务。这些任务需要一些 labeled data。
如何使用 bert 之类预训练的模型并 finetune?其实方法和前面差不多。
在一个序列的开头加入特殊的 token「CLS」,然后把这个序列丢进 bert(其实就是一个预训练好的 encoder)。接下来的操作取决于下游的任务类型:
-
输出一个分类
只看 CLS 对应输出的向量。将它再通过 linear 层(这层是随机初始化的),softmax 之后得到分类。bert 和 linear 层整个就是要 finetune 的对象,两者都要做梯度下降之类的 optimization. 为了做 optimization,你需要一些标注的资料。
-
输出一个序列,长度和输出相同
encoder 的每个输出都过同一个 linear,然后分别输出各自的 class.
-
输入两个句子,输出一个分类
具体应用例如给出一篇文章和一个评论,分析是正面评论还是负面评论。
方法仍然是将两个序列通过添加 CLS 和 SEP 来缝合成一个更长的序列,然后通过 bert 之后只取 CLS 对应的输出向量,再过一层 linear 层与 softmax 层输出一个类别。
-
问答系统(但是带限制)
给机器读一篇文章,然后问它一些问题。保证答案可以在文章里照抄到。
输入的文章和问题都是 sequence,我们想要模型输出两个正整数 \(s,e\),意思就是文章里第 \([s, e)\) 个字符就是答案。
做法和上面类似,将文章和问题缝合成一个序列输入进 bert。除了 bert 本身,我们还要两个随机初始化的向量,记作 \(\mathbf{v}_1, \mathbf{v}_2\). 对于文章部分通过 bert 之后的每一个向量,将这个向量与 \(\mathbf{v}_1\) 做点积,你就得到了一个和文章长度相同的标量序列。对这个标题序列做 softmax,数值最大的地方就是 \(s\). 同样地可以得出 \(e\). 其实这个部分有点像 transformer 里的 attention score。
有一个问题:transformer 没法输入太长的序列(要算 \(O(n^2)\) 个数的矩阵)。因此本次作业里其实是将文章切成小块然后训练。
bert 为什么能用?先看 encoder 的原理:经过 encoder 之后,每个字都被转换成了向量,这个向量是带有上下文语义的。
但是这个解释其实并不完整。例如,将一串 DNA 序列的每个碱基转换成一个英文单词,然后类似地训练,最后结果是优于随机初始化的。总结一下就是原理目前也解释不清楚。
还有一种现象,如果一个 bert 提前学习了多种语言,给它 finetune 英文的问答,它也能自动学会其他语言的问答。猜测可能是不同语言对应的 embedding 相近,但也要数据足够多。
除了 bert 之外,GPT 系列的模型也很知名。bert 做的是填空题,而 GPT 做的是文字接龙。它有个更大的目标,就是做到 few-shot learning(而不是像 bert 一样微调)。意思是,不必为某些任务单独 finetune,只要给出任务并举几个例子就行了。然而这里根本就没有 gradient descent 的过程,于是在 GPT 的文献里换了个名字,叫 in-context learning.
self-supervised learning 的概念也可以用到语音或图像等任务上。例如 SimCLR,BYOL(讲这部分时就放了两张 ppt 就过去了)。