Self-training 与 Self supervised learning 简明对比

前言

最近搜 self supervised learning 工作时,不知怎么就输成了 self-training 自己还没反应过来已经搜错了hhh,这篇文章简明对比一下。

正文

Self-training

想要详细了解的可以看一篇综述 https://arxiv.org/pdf/2202.12040.pdf

Self-training 其实有另一个叫法,self-labeling,更加直观表示核心思路。Self-training 的应用场景是,有监督数据是昂贵的,而无监督数据很便宜,所以通常情况下,有监督数据比较少,而无监督数据比较多。

核心版本的 Self-training 的思路是:

  1. 在有监督数据集 D_{labeled} 上训练模型 M 。
  2. 从无监督数据集上抠下来一部分子数据集 D_{unlabeled}^{'} 。
  3. 使用 M 对 D_{unlabeled}^{'} 进行分类,得到 Pseudo Label(伪标签),然后我们用伪标签作为这部分数据集的真标签,把这部分数据和 D_{labeled} 并起来作为新的监督数据集。
  4. 如果训练结果不满意,回到第一步。

 (写法不是很符合伪代码的标准,见谅)

小细节:  

这里伪标签可以是 hard 的,即只有一个类的值为 1,也可以是 soft 的,即类似每个类别的概率组合成一个向量 y,细节可以搜索 soft label and hard label 。

另外这些年来 Self-training 有无数变体,但是原始核心思路就是上述的过程,有兴趣的同学可以看综述。

Self supervised learning

自监督学习通常被认为是无监督学习的一种,通常监督学习要求有一个 x 和其标签 y,自监督学习通过某种方法处理 x 来得到这对 x 和 y。自监督学习的核心诉求有点类似,有标签的数据是昂贵的,面对较为容易获取的大量的无标签数据(爬虫立大功),如何利用他们?

自监督学习希望通过设计一些合适的 代理任务(似乎对比学习领域喜欢说 pretext task,也见到过 proxy task 的说法),在大规模的无监督数据上得到一个好的预训练模型 pretrained model。而这个 model 通常能够敏锐的从样本中提取有用的 embedding(可以理解成特征),用这个 Embedding ,我们无论是什么下游任务 downstream task,只要再配上一个简单的分类器(很多时候就是简单的全连接层),和少量的监督数据,进行 Finetune 就能得到一个效果很好的模型了。

举个栗子,BERT 中设计了两个代理任务,举其一为例。目标是我们需要得到每个单词或者说 token 的特征,用于分类等操作,那我们需要模型能够输入一个词得出一个很好代表这个词的词向量。BERT 的做法是选词填空,我们可以获得大量符合语言习惯的语料,对于一个句子,我们把一个词挖掉,送给BERT,让BERT猜挖掉的词是什么,BERT在漫长学习过程中,学会了通过上下文得到一个词的语义,同时也能得到一个词对应的向量,这个词向量就可以用于之后的任务了。注意我们全程没有需要带标签的数据,我们将完整的句子挖洞,或者说叫掩码,被 mask 的句子就是模型的输入 x ,而模型需要输出的 y 就是我们 mask 的单词,这些都可以通过最初的 x 也就是原始句子得到,不需要人为标标签,从而能够在庞大的数据集上训练。

扫描二维码关注公众号,回复: 14792426 查看本文章

对比

很明显,Self-training 需要一部分的监督数据,来得到一个初具作用的模型,然后思路是利用现有的数据,逐渐扩展有监督数据。而 self supervised learning 的过程中并不需要监督数据,这个过程得到的通常是一个能力强大的编码器,我们之后在我们感兴趣的任务上(很可能监督数据比较少),把预训练模型拿过去,然后配上简单的分类头,做简单的 Finetune 即可得到较好的效果。

好像不够简明了,就写到这吧。

如有错误多多指教。

猜你喜欢

转载自blog.csdn.net/Haulyn5/article/details/128914203