绿色健康小清新

耐得住寂寞,守得住繁华

李宏毅机器学习-49-03-ML-Metric-based Approach & Train+Test as RNN

Meta Learning - Metric-based

我们有一个更疯狂的想法,能不能直接learn一个function,这个function既做了Learning,又做了Prediction。给它Training Data,它就learn好了;给它Testing Data,它就给出Testing Data的答案!

Face Verification

Face Verification就用到了这样的技术!

Face Verification和Face Identification听起来有点像,但其实是不同的Task!

  • Face Verification是给你一张人脸,让你判断是不是某个人,这是一个是非题。比如在手机上,它就是判断:这是“我”的主人吗?

  • Face Identification是给你一张人脸,让你判断是一组人中的哪一个?比如公司的门禁系统,通过刷脸打卡,然后以此来判断你有没有来上班,也就是说通过刷脸判断是公司里的哪一个员工。

我们在手机买来的时候,就会让我们眨眼睛,扭下头什么的来收集你的信息,这些信息就是Training Data,然后用这些Training Data进行Few-shot Learning。然后在Testing的时候,看到一个脸,就判断“这是不是手机的主人?”。

如上,我们需要搜集一些训练任务:训练的时候你有一张人脸,测试的时候有另一张人脸,然后判断测试中的人脸和训练中的人脸是不是同一个人。

  • train是一张三玖,test是另一张三玖,这个测试的结果就是Yes。在我们的Network中(具体架构接下来会说),就是吃这一张训练的图片(三玖)和一张测试的图片(三玖),然后判断测试的图片是不是三玖,这里当然是Yes。
  • train是一张三玖,test是一张一花,然后判断测试的图片是不是三玖,这里显然是No。
  • train是一张一花,test是一张三玖,然后判断测试的图片是不是一花,这里显然也是No。

在测试的时候,我们要注意一个问题:train(support set)和test(query set)不能出现之前task中出现过的图片

看图中,train是一张四宫辉夜,test是另外一张图片,然后判断这张图片是不是四宫辉夜,这里显然是Yes。我们让Network做的就是吃一张训练的图片和一张测试的图片,然后告诉你Yes还是No。

Siamese Network(孪生网络)

Siamese的中文意思是暹罗人,这有点奇怪!但其实它还有另外一个意思:连体。因此Siamese Network可以称为孪生网路。

实际上,这个Network最简单的一种做法就是Siamese Network。

上图,就是两个CNN(这两个CNN通常参数是一样的,但如果训练资料和测试资料有很大差别,也可以不一样),训练的图和测试的图通过CNN得到两个embedding vector,然后计算这两个embedding vector的相似度 (比如说计算它们的Euclidean Distance或者Cosine Similarity等),得到一个score,这个score越大,就代表这个network的输出是Yes,越小输出就是No。

训练的时候:

  • 如果train和test是同一个人,output的score就越大越好
  • 如果train和test是不同的人,output的score就越小越好

Siamese Network - Intuitive Explanation (直观的解释)

你可以把Siamese Network单纯的当做是一个Binary classification,输入是两张图片,输出是这两张图片一样吗?还是不一样?

在Training Set中,每一个task就是训练时的一笔资料,而每一个task有两张图片,它们的标注就是这两张图片是一样的吗?还是不一样?一样就算是一类,不一样就不算是一类。

在Testing Set中,就是判断这两张图片是一样的吗?还是不一样?

那么Siamese Network内部的设计有什么意义呢?

如果我们单纯的通过pixel计算两张图片的相似度,会发现同一个人的两张图片相差会非常的大!因为同一个人可能一张图片往左看,一张图片往右看。

因此通过CNN我们将图片投影到一个公共空间上,就算一张图片往左看,一张图片往右看,但是在这个公共空间上是非常接近的。而且我们希望同一个人的不同图片在这个空间中越近越好,不同人的图片越远越好。


看到这,你可能会想:我们用PCA和Auto-Encoder不是也能做吗?

仔细想一下,我们在做PCA和Auto-Encoder的时候,并不知道test的任务是什么呀!它们会保留图片中大部分的资讯,而且它们不知道什么样的资讯是重要的,什么样的资讯是不重要的。在这个例子中(右图),一花的图和右上三玖的图背景都是浅灰色,右下三玖的图是深灰色,对于Auto-Encoder来说,一花和右上三玖可能是一样的,因为它们的背景是一样的。

但是在Siamese Network中,因为要让右上三玖跟右下三玖拉近,右上三玖跟一花拉远。那么它就会学到可能头发的颜色很重要,但是背景的颜色可能不重要,可以忽略它。


那么问题来了,怎么计算两个点在公共空间中的距离呢?

方法如下:

  • SphereFace: Deep Hypersphere Embedding for Face Recognition
  • Additive Margin Softmax for Face Verification
  • ArcFace: Additive Angular Margin Loss for Deep Face Recognition

我们这里不细说了!

上图中还有一个概念:Triplet loss

Triplet有三的意思嘛,意思就是输入三个资料。就是说在一个task中,train的数据集给它两个训练资料:一个是目标的脸,一个不是目标的脸。然后进行训练,这样子效果可能会更好。


N-way Few/One-shot Learning

我们上面说的都是Face Verification,它就是单纯的回答Yes or No,也就是一个二分类问题。但如果此时要做的是Face Identification,一个多分类的问题,又该怎么办呢?

举例:

我们此时要做一个5-ways 1-shot(有5个class,每个class只有一个example):

上面的5个class就是:一花,二乃,三玖,四叶,五月

不得不说老师的脑洞是真的大。。。我全都要不香吗!?花泽香菜,竹达彩奈,伊藤美来,佐仓绫音,水濑祈,啧啧啧,无法舍弃!

言归正传,每个姐妹各一张图片作为training data吃下去,测试的图片是一张三玖,希望可以判断出测试的图片是training data中五个姐妹中的哪一个。这又如何做呢?

Prototypical Network(原型网络)

👉 Prototypical Networks for Few-shot Learning

它和Siamese Network非常的像!

  • 通过CNN将Training Data中和Testing Data的每个图片变为vector
  • 然后再计算Testing Data的vector和每个Training Data的vector的相似度,就是图中的黄色块。
  • 将所有的相似度通过Softmax得到预测的结果
  • loss function就和一般的分类问题一样,比如用cross-entropy。将预测的结果和真实的结果进行比较,得到loss,然后minimize它

我们上面说的是one-shot,如果是few-shot呢?

也很简单!看下图:

将每个class的图片求vector,然后相加求平均就可以了!然后求Testing Data中图片的vector和哪一个class的平均vector最像,那么就是哪一个class!

上图凭我们的直觉就能看出来,Testing Data属于c2c_2


Matching Network(匹配网络)

👉 Matching Networks for One Shot Learning

还有一种很像的做法叫做Matching Network

不同的做法是前面我们将Training Data中每个class的数据分别进行处理,而这种Model是假设Training Data中就算是不同class的图片也是有某种关系的,所以我们直接用一个Bidirectional LSTM来处理,然后每个class分别得到一个vector。

Matching Network还有一个不一样的地方,它在计算出相似度之后,其实有通过一个类似于Multiple hop的过程。

感兴趣的可以看前面贴出来的论文和下面几篇文章:

有趣的是,是先有的Matching Network再有的Prototypical Network。


Relation Network(关系网络)

👉 Learning to Compare: Relation Network for Few-Shot Learning

其实道理差不多:

input训练资料和测试资料,然后接下来当做分类问题来做。

但它也有一个不一样的地方:先从训练资料和测试资料中抽取embedding vector,上图中,左边的五种不同颜色的vector就是从训练资料中抽取出来的,而右边的黄色vector就是从测试资料中抽取的,放在训练资料的vector后面形成一个新的vector。本来我们是直接算训练资料和测试资料vector的相似度,但Relation Network是另外再用一个network来算相似度,input就是通过连接新生成的vector,这个network也是在整个model中一起学出来的。

Few-shot learning for imaginary data

通常我们的训练资料都比较少,我们其实可以通过一张图片来进行幻想从而生成更多的图片。

上图中,我们输入一个三玖的图片,它是面无表情的,但是也许可以幻想出三玖害羞的样子,生气的样子以及卖萌的样子!

上图中,我们的Testing Data是一张图片,Training Data是五个class,每个class一张图片。但是我们可以通过一个Generator来生成更多的图片,然后丢进Network中进行接下来的训练。

在训练的时候,我们的Network和Generator是一起train的!


Meta Learning - Train+Test as RNN

上面我们说了一个疯狂的想法,将训练资料和测试资料一起给Network,然后给出测试资料结果。这是能实现的,我们上面也给出了几种方法。

但上面的几种Network都要设计一下Network的架构才能达到我们想要的目标。现在说的是能不能用一个general network来完成这件事情呢?

LSTM

我们可以用一个LSTM来解决这个问题。

就当做是一个sequence,LSTM依次读取training data,最后读取testing data,然后输出答案!

  • 训练资料:每张图片经过一个CNN得到embedding vector,每张图片的类别也可以用one-hot vector来表示,然后这两个vector做concatenate丢进LSTM中。
  • 测试资料:图片经过一个CNN得到embedding vector,类别并不知道,可以用一个zero vector来表示,然后这两个vector做concatenate丢进LSTM中。

很遗憾,看似很有道理,但并不work!

因此有人也修改了network的架构:

  • MANN:Nerual Turing Machine
  • SNAIL:Using Attention

这里我们并不细讲!

MANN & SNAIL

MANN:全名为Memory Augmented Graph Neural Networks,翻译成中文就是:记忆增强图神经网络。感兴趣的可以看论文。

👉 Memory Augmented Graph Neural Networks for Sequential Recommendation

SNAIL:全名为A Simple Neural Attentive Meta-Learner,翻译成中文就是:一个简单的神经注意力元学习器。SNAIL中文意思是蜗牛,看上图右下角的架构,可能看起来有点像蜗牛吧?

👉 A Simple Neural Attentive Meta-Learner

它的做法其实差不多,也是将训练资料和测试资料丢进RNN中,但它不是单纯的RNN,而是加入了Attention,这个attention有点像之前讲Transformer的self-attention!当丢进Xt2X_{t-2}时,会attentXt3X_{t-3}的资料;当丢进Xt1X_{t-1}时,会attentXt2X_{t-2}Xt3X_{t-3}的资料;当测试资料XtX_t丢进去的时候,会attent之前所有的训练资料。

想想测试资料attent这一步是不是和之前讲的Prototypical Network和Matching Network的计算相似度差不多呢?

也就是说我们原本是想要用general network来解决这个问题,但是最终发现还是要改一下network的架构才能做到和前面Siamese Network,Prototypical Network类似的想法!

Experimental Results

上图是使用SNAIL与其它六种方式(表格下方)在Omniglot上的结果进行了对比;

下图是使用SNAIL与其它五种方式(表格左方)在Mini-ImageNet上的结果进行了对比。

结果看起来真的是蛮厉害的!

-------------本文结束感谢您的阅读-------------
六经蕴籍胸中久,一剑十年磨在手

欢迎关注我的其它发布渠道