Meta Learning
调参占据了深度学习实验的大部分时间。在工业界,我们有足够的算力,我们可以使用多张GPU用于调参,但是在学术界,具有的算力是及其有限的,所以就需要是用其他方法调参,那就是元学习 -- "学习如何学习"
Introduction
Review
回顾我们以前的机器学习模型算法,我们的定义了model,loss function,optimization,通过使用优化算法去最小化损失函数去优化我们的模型参数
\[loss: \quad L(\theta) = \sum^K_{k=1}e_k \\ \theta^* = arg \operatorname{min} L(\theta) \\ f_{\theta} \rightarrow f_{\theta^*} \]元学习和普通的机器学习一样,我们也要定义一个函数,这个函数输出是一个函数,也就是说它的输出是我们的模型。那么这个函数要学习的其实就是我们的超参数(模型架构,学习率,初始化参数),我们定义这个函数是\(F_{\phi}\),\(\phi\)就是我们可学习的元件,我们可以把\(F_{\phi}\)看作我们的学习算法。
Meta-Learning
元学习也是一个需要迭代学习的过程,那么我们依旧需要定义我们的损失函数去评价我们的\(F_{\phi}\)的好坏。在外面的元学习中,我们的训练材料是我们的训练任务。
上图是元学习的一个训练episode,通过我们的\(F_{\phi}\),我们在每一个任务中,通过训练出一个函数\(f_{\theta^*}\),并且计算最终这个已经由学习算法训练好的模型的任务损失。最后把所有任务的损失相加得到我们的最终损失。
\[L(\phi) = \sum_{n=1}^N l^n \]在每一个任务的内循环(也就是训练\(f_{\theta}\))的过程中,我们的损失函数是用在训练集的数据,但是在最终计算\(F_{\phi}\)的损失时,我们的训练数据是使用测试集的数据。
那么我们如何训练我们的\(F_{\phi}\),其实和一般的机器学习训练一样,我们要最小化我们的损失函数\(L(\phi)\),也就是\(\phi^*=arg \operatorname{min}\limits_{\phi}L(\phi)\)。使用优化算法如梯度下降去优化\(\phi\),当你能计算\(\frac {\partial L(\phi)} {\partial \phi}\);但是由于我们的\(\phi\)通常是很复杂的,并且是无法计算的,如我们的模型的架构,但是我们可以Learning from experience,也就是使用强化学习算法。
我们已经说完了元学习的基本过程,值得一提的是元学习也叫cross-task training,也就是跨任务学习
我们定义内循环和外循环,内循环训练\(f_{\theta}\),外循环训练\(F_{\phi}\)
Issue
元学习和传统的机器学习一样,也具有类似的问题,如下:
- 过拟合在训练的任务上,也就说在训练的任务中,\(F_{\phi}\)能输出性能较好的模型,但是在测试的任务中,输出的\(f_{\theta^*}\)性能明显低于训练任务
- 要获得更多的训练任务去训练\(F_{\phi}\)
- 任务强化,类似于 data argumentation
- 元学习也有一系列超参数要调,但是元学习模型如果能训练出来,就能训练出一系列模型用于task
- development task
All things can be meta
Learning to Initialize
- MAML (Model-Agnostic Meta-Learning)
- Reptile
NAS (Network Architecture Search)
\[\hat{\phi}=arg \operatorname{min}L(\phi) \]上面的\(\phi\)就是我们的network架构,由于我们无法通过求导的梯度下降算法去解这一个问题,但是我们可以使用强化学习硬做,也就是把network架构作为我们强化学习agent的参数。除此之外,我们也可以用演化算法,把结构可微分等方法去解决这个问题。
Data Augumentation
让模型学会去做数据增强,以上有相关的文献
Sampling Rewaigting
可图可知,就是把每一个数据都添加一个权重的方法
Application
Few-shot Image Classification
数据集中每一个类别只有几张图片,模型需要通过学习这几张图片去学习一个类别。我们定义 "N ways K shot classification" 意思为在每一个任务中,我们有N个类别,每一个类别有K张例子。
- Omniglot