本系列博客为斯坦福大学 Stanford CS330: Multi-Task and Meta-Learning 2019 的学习笔记。博客中出现的图片均为课程演示文档的截图。笔记为课程的内容整理,主要是为了方便自己理解和回顾,若有纰漏和错误,烦请指出,谢谢 ~ 。希望对你有帮助。如需转载,请注明出处。
CS330课程传送门
如果你也好奇什么元学习,好奇为什么要学习元学习,可以先搂一眼这篇元学习课程介绍
多任务学习:
元学习:
我们用 θ \theta θ来描述网络的参数, x x x是网络的输入, y y y是网络的输出。即可以把该网络表示成:
f θ ( y ∣ x ) f_{\theta}(y \ |\ x) fθ(y ∣ x)
对于单任务有监督学习问题来说,数据集 D = { ( x , y ) k } \mathcal{D}=\{(x,y)_{k}\} D={(x,y)k} ,目标为 min θ L ( θ , D ) \min\limits_{\theta}\mathcal{L}(\theta,\mathcal{D}) θminL(θ,D) 。如用典型的损失函数,负对数似然函数(NLL损失函数):
L ( θ , D ) = − E ( x , y ) ∼ D [ log f θ ( y ∣ x ) ] \mathcal{L}(\theta,\mathcal{D})=-\mathbb{E}_{(x,y)\sim\mathcal{D}}[\log f_{\theta}(y\ |\ x)] L(θ,D)=−E(x,y)∼D[logfθ(y ∣ x)]
通常我们会用反向传播来优化网络中的参数,运行诸如SGD,Adam等深度学习优化算法。
在上一篇就提到了这个定义,这节对“task”这个概念做一个更正式的定义
T i ≜ { p i ( x ) , p i ( y ∣ x ) , L i } \mathcal{T}_i\triangleq \{p_i(x),\ p_i(y\ |\ x),\ \mathcal{L}_i\} Ti≜{pi(x), pi(y ∣ x), Li}
这两个概率就相当于取样分布(data generating distribution)。在训练中,我们通常会设置两个数据集 D i t r \ \mathcal{D}_i^{tr} Ditr和 D i t e s t \mathcal{D}_i^{test} Ditest。我们会假设这两个集合的分布都等于取样分布 p i p_i pi。
所以不同的任务就可能对应于不同概率分布的输入,给定输入下不同的标记分布和不同的损失函数。一般我们会将 D i \mathcal{D}_i Di来用作为 D i t r \mathcal{D}_i^{tr} Ditr的简写。
在所有的任务中, L i \mathcal{L}_i Li 是相同的。如不同文字的手写识别,个人垃圾邮件过滤器。在这些情况中,损失函数是相同的,但是每个人收到的邮件种类是不一样的,即 p i ( x ) p_i(x) pi(x)不同。甚至对于同样的输入邮件,对于不同的人也可能是不同的标签。所以 p i ( y ∣ x ) p_i(y\ |\ x) pi(y ∣ x)也可能是不同的。
L i , p i ( x ) \mathcal{L}_i, p_i(x) Li,pi(x) 是不同任务中是相同的。如输入同一张照片,任务一可能是需要判断照片中人物是否戴了帽子,任务二可能是判断人物的发色(CelebA attribute recognition)。或是其他例如场景识别等,在同样的输入条件下, 我们需要得到输入的深度,表面法线等等属性。
任务分别处在连续空间和离散空间
我们对不同task的重视程度不同,所以不同的task损失函数的权重可能不同。
如果我们希望在神经网络中解决不同的任务,那我们肯定需要在网络中添加机制,告诉网络该做什么。即所谓的条件(condition)。
所以在此处,我们用 z i z_i zi 来表示任务描述符(task descriptor),将其添加到网络中以起到条件的作用。所以我们函数模型也就变为:
f θ ( y ∣ x , z i ) f_{\theta}(y \ |\ x,\ z_i) fθ(y ∣ x, zi)
那我们该如何实现任务描述符呢?最简单的一种做法就是将其设置为任务状态索引(task index)的独热编码(one-hot encoding)。(e.g. 一个简单的告诉你这是哪个任务的向量。)描述符中也可以包含一些关于任务的元数据(meta-data)。如:
此时我们的目标函数也需要改写为:
min θ ∑ i = 1 T L i ( θ , D i ) \min\limits_{\theta}\sum_{i=1}^T\mathcal{L_i}(\theta,\mathcal{D_i}) θmini=1∑TLi(θ,Di)
此时我们已经有基本的模型和目标,那么在我们面前就有两个亟待解决的问题:
假定我们将 z i z_i zi作为任务状态索引,其中包括了我们对该任务的所有已知信息。那问题来了:我们该如何添加条件使得构建出来的模型中在不同任务间分享的信息足够少?即,把问题推向极端,我们该如何构建一个在不同任务间尽可能少分享信息的神经网络?这个问题的答案其实也就是第一种,最朴素的conditioning方式:
答:各玩各的。对每一个任务都设置一个神经网络模型。在最后输出时,将 z i z_i zi作为判断依据,再对每一个网络的输出施加影响(个人理解类似门控),最后即可得到总输出。在这种情况下,不同任务间没有共享的参数。
此时我们来考虑另一个极端,如果直接把 z i z_i zi插入到神经网络的某一层的输入或输出之后,然后正常训练网络。在这种情况下,除了插入点之后部分的参数没有被共享,其他的参数都会被所有的任务所共享。
我们还可以从参数的角度对多任务学习问题做一个解释:将 θ \theta θ 分为共享的参数 θ s h \theta^{sh} θsh 和任务特定的参数 θ i \theta^i θi,目标即为:
min θ s h , θ 1 , . . . , θ T ∑ i = 1 T L i ( { θ s h , θ i } , D i ) \min\limits_{\theta^{sh},\theta^1,...,\theta^T}\sum_{i=1}^T\mathcal{L_i}(\{\theta^{sh}, \theta^i\},\mathcal{D_i}) θsh,θ1,...,θTmini=1∑TLi({θsh,θi},Di)
选择如何添加 z i z_i zi的限制条件就相当于选择如何、在哪开始共享参数。
这两种方式虽然看起来不同,但其实最后结果是一样的。为什么呢?
答:传送门
但比较不好的是,这些结构都比较强依赖于特定问题,且通常都是由问题的相关知识启发得出的。所以模型的构建并不系统,它更像是艺术品。
min θ ∑ i = 1 T L i ( θ , D i ) \min\limits_{\theta}\sum_{i=1}^T\mathcal{L_i}(\theta,\mathcal{D_i}) θmini=1∑TLi(θ,Di)
Tips:
出现这个情况的通常表现就是:有时独立训练的网络结果反而更好。
原因如下:
通常情况下,多任务学习网络对应于单任务网络要大得多。如果模型不够大的话,很容易欠拟合。
那这种情况下应该怎么办呢?显然,少分享就可以缓解这个问题,但是除了二元的解决这个问题,我们还可以通过软参数分享(soft parameter sharing)来解决。
min θ s h , θ 1 , . . . , θ T ∑ i = 1 T L i ( { θ s h , θ i } , D i ) + ∑ t ′ = 1 T ∣ ∣ θ t − θ t ′ ∣ ∣ ⏟ " s o f t p a r a m e t e r s h a r i n g " \min\limits_{\theta^{sh},\theta^1,...,\theta^T}\sum_{i=1}^T\mathcal{L_i}(\{\theta^{\ sh}, \theta^{\ i}\},\mathcal{D_i}) \ + \underbrace{\sum_{t\prime = 1}^T||\ \theta^{\ t}-\theta^{\ t\prime}||}_{"soft\ \ parameter\ \ sharing"} θsh,θ1,...,θTmini=1∑TLi({θ sh,θ i},Di) +"soft parameter sharing" t′=1∑T∣∣ θ t−θ t′∣∣
这样做,可以使得参数之间的相似性增加,从而减小因为参数之间差距较大所带来的影响。同时相较于直接copy任务间的参数,这样方式则更为缓和。
优点:
出现这个情况的原因可能就是没有分享足够的信息。
多任务学习,某种程度上也可以理解为正则化。
Recommending What video to Watch Next: A Multitask Ranking System
这是谷歌的一篇关于youtube视频推荐的文章。文章中将这个视频推荐问题总结为一个多任务学习问题。
conflicting objectives:
同时论文也关注了反馈(feedback)导致的隐式偏差:即用户观看的视频可能并不是因为他爱看,只是因为系统推荐了这个。
本文主要关注ranking过程,不考虑收集candidate video的过程
文章的最终目标主要评估了两大类: