李宏毅机器学习笔记29
目录
摘要
1.Predictive Approach
2.Contrastive learning
3.Bootstrapping Approache
Bootstrapping
Knowledge Distillation
摘要
本篇文章继续学习李宏毅老师2025春季机器学习课程,学习内容是self-supervised learning在语音和影像上应用的方法,包括Predictive Approach,Contrastive learning,Bootstrapping Approache。
1.Predictive Approach
Predictive Approach就是给机器一些图片或者是影像,声音讯号,让他预测一些简单的东西。之前generative的方法都是让机器还原声音,图片的内容,但是产生原来声音或图片是很复杂的事情。举一个例子,我们让机器预测一张图片有没有被旋转过。机器要学的就是能不能根据一张图片,判断旋转多少度。
或者是给一张较大的图片,把图片切成小块,拿出两个小块,然后问第二个小块在第一个小块的哪个方向。在声音上也有类似的方法,就是给出两段声音讯号,判断他们两之间有多宽,相差几秒。通过这些任务,会让机器在其他任务上表现的更好。
也有比较general的方法,就是让它生成的东西简化,以声音为例,声音讯号可以表示为一排向量,但是之间产生这些向量不是意见容易的事,所以我们把这些向量做clustering,让他们从向量变为一个一个的token。接下来还是要对输入做mask,但是还原的不是原来的声音讯号,而是做clustering之后的cluster id。
2.Contrastive learning
那有没有办法在不产生东西的情况下,做self-supervised learning?这个就是Contrastive learning要做的事情。它的基本概念是不需要产生或预测任何东西,而是找出一些postive的例子,让他们向量越近越好,negative的例子越远越好。假设给你两张图片,你知道他们是同类别,那我们就说它是postive的例子,接下来我们将两个例子丢入model中,输出的向量期待他们越接近越好。如果是不同类别的图片,就是negative的例子,那么输出的向量越远越好。
一个知名的例子是SimCLR,它是将数据中的图片都先做data augmentation(将图片截一块放大到跟原来一样,或更改颜色,或加入一些gaussian的杂讯)。同一张图片augment的不同图片就是postive的例子,反之,如果另一张图片augment的结果就是negative的例子。
在语言上如何做Contrastive learning,知名的有CPC,Wav2vec。首先有一大堆的声音讯号,放入encoder中,产生一排representation,接下来再把encoder的输出通过predictor产生新的输出。predictor的输出和相邻位置的encoder输出是postive的,跟其他句子或是不相邻的encoder的输出是negative。
Contrastive learning有一个很大的问题就是我们需要取选negative的例子,这是一件困难的事,因为需要有一定难度但是不能太难。假设猫的negative例子是天空,树,海,这些与猫非常不相似,对机器来说太简单,困难看一个颜色就知道了,最后训练出来可能只学会了抽取颜色资讯。但是也不能选太难,不然会把两只不同猫的图片视为是negative的例子,这就将本来是同类的向量距离拉远。
3.Bootstrapping Approache
Bootstrapping
丢掉negative的例子并不简单。如果训练时只用postive,最后model会学到不管看到什么图片都给一模一样的向量。Bootstrapping是这样的,输入两张图片,第一张通过encoder得到向量,第二张通过encoder之后再通过一个predictor(一个简单的,可能只有几层的feedforward network)后,再产生向量,但是在训练时只计算右边的gradient,计算之后把右侧更新后的参数复制到左边。
Knowledge Distillation
还有一个Knowledge Distillation技术。假设你有一个比较大teacher network,输入一张图片,输出一个representation。还有一个比较小的student network,用student network学teacher network的行为,他们看到同一张图片的时候,输出越接近越好并且student network的参数与teacher network差不多。Bootstrapping就可以看作是一个Knowledge Distillation,Bootstrapping左侧就看做是teacher network,右侧是student network。在右侧更新后,student就变成teacher将参数传递给左侧。