Machine learning可以理解为根据数据找一个函数f的能力,Machine Learning通过训练数据让模型能够学习到某种抽象的规律或概念,而Meta Learning可以理解为根据数据找一个函数f的函数F的能力,通过训练任务集让模型更加精通如何去学习。
MANN,Siamese Network,Matching Net,MAML,Prototypical Network,Meta Network,GD as LSTM
Meta learning 或Few shot learning中训练数据是以Task为单位的,分为Training-Task和Testing-Task,Task中也分为Training set以及Testing set,这里为例避免与Task的Train set和Test set混淆,分别被称为support set和 query set。例如在图像分类中,未知分类10类(P1-P10),其中每类包含五个已标注数据,15个未标注数据;已知分类20类(C1-C20),每类中有30个数据。在N-way,M-shot训练方式中(以N=5,M=1为例),首先进行Meta-training,从已知分类C中随机抽取出5类,每类抽取出1张图片组成Training-Task的support set,每类抽取出5张图片组成Training-Task的query set;在Meta-testing时,从未知分类P中随机抽取5类,在已标注数据中抽取1张图片组成Testing-Task的support set,在未标注的数据中抽取5张图片组成Testing-Task的query set。每一个Task相当于机器学习中的一条数据。
(1)作者研究的问题主要是模型快速学习以及快速适应新任务的能力
(2)挑战:过去信息与少量新数据的融合,避免过拟合
(3)先前工作的缺点:适用范围不广,需要过多的限定条件,需要引入新的参数
(4)贡献:提出了一种可以适用于任何基于梯度的学习方法,可以应用于分类,回归,强化学习
(5)缺点:引入二阶导数后复杂性以及计算增加,虽然作者在实验部分说明了二阶导在大部分情况下都为0,可以用一阶近似,但是该方法并不适用于训练模型与测试模型结构不同的情景。
MAML方法主要是训练一个对于所有任务集都较优的参数,使模型再训练新任务的过程中可以通过几步迭代就达到最佳的效果,训练出的参数对于每个任务可能都不是最优的但是对整个任务参数空间是最优的,如图所示,对于Task1,2,3模型训练出的初始化参数并不在 θ 1 ∗ \theta_1^* θ1∗, θ 2 ∗ \theta_2^* θ2∗, θ 3 ∗ \theta_3^* θ3∗ 这三个点,但是对于这三个任务整体来说,训练出的 θ \theta θ 可以经过几步就能够达到最优点。最终训练出的参数 θ \theta θ 我们不在意它在训练任务上的表现,而是在意由 θ \theta θ 训练出的 θ 2 \theta_2 θ2 θ 1 \theta_1 θ1 θ 3 \theta_3 θ3的表现。
MAML与Pre-training的区别如图所示,其中 ϕ i \phi^i ϕi代表了第i步的模型参数 θ m , n \theta^{m,n} θm,n 代表了对于m,n任务集的参数更新方向。
MAML算法大致是从任务集中选取出一个Task,然后进行训练并计算损失,然后进行参数更新得到一个对于某个Task的 θ i ′ \theta^{\prime}_i θi′,最后求所有任务损失对原参数 θ \theta θ的偏导,并更新 θ \theta θ,这里第8步会涉及到二阶导数的问题,作者在文中提到二阶导数在大部分情况下都为0,采用一阶导近似的方法在最后实验得出的结果与二阶导没有明显区别。
6 : θ ′ i = θ − α ∇ θ L T i ( f θ ) 8 : U p d a t e θ ⟵ θ − β ∇ θ ∑ T i p ( T ) L T i ( f θ i ′ ) 6:{\theta^\prime}_i = \theta -\alpha\nabla_\theta L_{T_i}(f_\theta)\\8: Update \quad\theta \longleftarrow \theta-\beta\nabla_\theta\sum_{T_i}^{p(T)} L_{T_i}(f_{\theta^\prime_i}) \\ 6:θ′i=θ−α∇θLTi(fθ)8:Updateθ⟵θ−β∇θTi∑p(T)LTi(fθi′)
将6中的 θ ‘ i = θ − α ∇ θ L T i ( f θ ) {\theta^‘}_i = \theta -\alpha\nabla_\theta L_{T_i}(f_\theta) θ‘i=θ−α∇θLTi(fθ) 带入到8的 f θ i ‘ f_{\theta^‘_i} fθi‘中,则出现了二阶导。这里我们可以使用一阶导近似:
θ ′ i = θ − α ∇ θ L T i ( f θ ) L ( θ ) = ∑ L T i ( θ ′ i ) θ ⟵ θ − β ∇ θ L ( θ ) {\theta^\prime}_i = \theta -\alpha\nabla_\theta L_{T_i}(f_\theta)\\L(\theta)=\sum L_{T_i}({\theta^\prime }_i ) \\\theta \longleftarrow \theta-\beta\nabla_\theta L(\theta)\\ θ′i=θ−α∇θLTi(fθ)L(θ)=∑LTi(θ′i)θ⟵θ−β∇θL(θ)
原参数 θ \theta θ中的任意一个参数都对更新后的参数有影响,对于某个任务集更新出的参数 θ ^ \hat\theta θ^对于 θ \theta θ中某一个参数的偏导如下:
∂ l ( θ ^ ) ∂ θ i = ∂ l ( θ ^ ) ∂ θ ^ j ∂ θ ^ j ∂ θ i \frac{\partial l(\hat\theta)}{\partial \theta_i}=\frac{\partial l(\hat\theta)}{\partial \hat\theta_j}\frac{\partial \hat\theta_j}{\partial \theta_i} ∂θi∂l(θ^)=∂θ^j∂l(θ^)∂θi∂θ^j
这里分两种情况来看:
∂ θ ^ j ∂ θ i = { 1 − − ∂ l ( θ ) ∂ θ i ∂ θ j , i = j − ∂ l ( θ ) ∂ θ i ∂ θ j , i ≠ j \frac{\partial \hat\theta_j}{\partial \theta_i}=\left\{\begin{array}{cc} 1--\frac{\partial l(\theta)}{\partial \theta_i\partial \theta_j}, & i = j\\ -\frac{\partial l(\theta)}{\partial \theta_i\partial \theta_j}, & i\neq j \end{array}\right. ∂θi∂θ^j={1−−∂θi∂θj∂l(θ),−∂θi∂θj∂l(θ),i=ji=j
这个时候我们可以将近似 ∂ l ( θ ) ∂ θ i ∂ θ j \frac{\partial l(\theta)}{\partial \theta_i\partial \theta_j} ∂θi∂θj∂l(θ)为0,也就是将偏导简化为:
∂ l ( θ ^ ) ∂ θ i = ∂ l ( θ ^ ) ∂ θ ^ j \frac{\partial l(\hat\theta)}{\partial \theta_i}=\frac{\partial l(\hat\theta)}{\partial \hat\theta_j} ∂θi∂l(θ^)=∂θ^j∂l(θ^)
作者在实验中也给出了一阶导与二阶导的对比:
(1)作者研究的问题:用学习的方式来代替手工设计的优化规则
(2)现有的优化器大部分是基于特定领域,采用特别的优化规则。RMSprop,Adam等优化器并不针对于某个特定的问题,其优化更新规则是不变的,只是单纯的自适应调节学习率。
(3)贡献:提出了一种将优化算法的设计转化为学习问题的方法,该方法可以用在训练模型与测试模型结构不同的问题上。
(4)缺点:与MAML想对比,引入了新的参数作为输入,参数的梯度或者是梯度的二元组。
作者使用LSTM代替传统的优化器来对待优化的模型进行优化,同时训练LSTM来提高优化效果,简单来说就是用神经网络训练神经网络。传统的梯度下降基本通过学习率乘以梯度来对参数更新,而论文提出的方法是将梯度值传入LSTM中,由LSTM来输出一个更新值来对梯度进行更新:
θ : = θ − α ∇ θ L ( θ ) 传 统 θ : = θ − g ( ∇ θ L ( θ ) , ϕ ) L S T M \theta :=\theta-\alpha\nabla_\theta L(\theta) \quad\quad\quad\quad 传统 \\\theta :=\theta-g(\nabla_\theta L(\theta),\phi) \quad LSTM θ:=θ−α∇θL(θ)传统θ:=θ−g(∇θL(θ),ϕ)LSTM
对于传统的更新方法,我们可以将 θ \theta θ看做LSTM中的记忆细胞C,其中输入门与遗忘门分别为学习率和1:
C t = Z f ⊙ C t − 1 + Z i ⊙ Z θ t : = 1 ∗ θ t − 1 − α ∇ θ L ( θ ) C_t = Z_f \odot C_{t-1}+Z_i \odot Z \\\theta_t :=1 * \theta_{t-1}-\alpha\nabla_\theta L(\theta) Ct=Zf⊙Ct−1+Zi⊙Zθt:=1∗θt−1−α∇θL(θ)
论文里面提到了对梯度的预处理,即处理不同数量级别的梯度,来进行BPTT,因为每个周期的产生的梯度幅度是完全不在一个数量级,前期梯度下降很快,中后期梯度下降平缓,这个对于LSTM的输入,变化裕度太大,应该归一化,用梯度的(归一化幅值,方向)二元组替代原梯度作为LSTM的输入。
最后作者用10维的二次函数以及Mnist数据集进行了实验,有关论文复现可以参考这里。
总的来说,meta learning还是一个挺神奇的研究方向,而且它解决的问题也颇具实际意义。除了前边介绍的meta learning方法之外,还有一些奇妙的领域有待人们研究和开拓,但是Meta learning 也有一个绕不开的循环,Meta learning也称为Learning to learn,那么是否还需要Learn to learn to learn,Learn to learn to learn to learn…比如MAML的方法是训练一个好的初始化参数,但是MAML方法本身的模型参数还是随机初始化的,用LSTM作为优化器去优化网络,但是LSTM 本身也是采用传统的优化方法去优化的,还有许多类似的问题,而解决这些问题对于Meta Learning来说是具有里程碑意义的,因为那可能标志着机器学习的完全自动化
持续更新中。。。