飞道的博客

关于增量学习的一点总结思考

395人阅读  评论(0)

联合概率分布,熵与增量学习

最近几年,学术界开始兴起了一些持续学习,增量学习,终生学习的研究,这个概念本身也是想模仿人的学习过程,人类的学习能力是可以持续的,我们的知识也是一个逐渐积累的过程,但是反观现在的学习模型,从一个任务转移到另外一个任务的时候,新任务上会学习的很好,但是原来的任务就会忘得一干二净,这也是 AI 被人诟病的一个地方,过去是,现在也是,即使有大数据和深度学习加持,依然不能避免这些缺陷。

当我们更加深入的开始思考深度学习的本质时,发现所有的理论基础和几十年前其实是一样的,类似的增量学习的概念在很久之前,就已经提出过,那时候,还是经典的统计机器学习的时代,那时候的神经网络,几乎处在一个被遗忘的角落里,现在,我们有了更多的数据,更强大的算力,更复杂的数学模型,我们渴望着可以把很多年前未完成的梦想实现,可事实上,我们还是被困在统计学的框架里,难以突破。

无论是过去,还是现在,机器学习本质上还是做着数据拟合的事情,只是以前的数据少,现在的数据多,以前的算力弱,现在的算力强,以前都是有着完整数学解释的模型,现在我们造出了越来越多的黑箱模型,事情还是一样的事情,只是规模变了。

统计机器学习里,最重要的几个基本原理是概率分布,熵和决策,我们就用概率分布来看看目前我们研究的增量学习是想解决什么样的问题:

假设我们在数据集 D 1 \mathcal{D}_1 上有一个数据集合: { x , y } \{ \mathbf{x}, y \} ,我们可以找到一个模型及一组参数,让其在该数据集上的联合概率分布最大:

max i = 1 N 1 p ( y i x i , θ ) \max \prod_{i=1}^{N_1} p(y_i|\mathbf{x}_i, \theta)

上面这个式子,就是一个常规的经典的分类问题,我们可以用很多不同的模型去拟合上面的数据分布,当然,我们现在用的最多的就是神经网络,或者说 CNN,到这一步的时候,相信大家都很熟悉解决这类问题的思路,不过,增量学习,就不是这么简单的问题,增量学习,就是在这个基础上,假设我们又有了一个新的数据集 D 2 \mathcal{D}_2 ,那么我们希望模型能够同时在 D 1 , D 2 \mathcal{D}_1, \mathcal{D}_2 上都能学习的很好,也就是说,我们希望模型在 D 1 , D 2 \mathcal{D}_1, \mathcal{D}_2 上的联合概率分布能达到最大:

max i = 1 N 1 p ( y i x i , θ ) j = 1 N 2 p ( y j x j , θ ) \max \prod_{i=1}^{N_1} p(y_i|\mathbf{x}_i, \theta^{*}) \prod_{j=1}^{N_2} p(y_j|\mathbf{x}_j, \theta ^{*})

一般来说, θ , θ \theta, \theta^{*} 应该是不同的参数了,为了能让模型同时学习 D 1 , D 2 \mathcal{D}_1, \mathcal{D}_2 的数据分布,很显然,最常规的方法就是把 D 1 , D 2 \mathcal{D}_1, \mathcal{D}_2 的数据放在一块训练,得到一组新的模型参数。

如果只是这样,那就不能称之为增量学习了,现在我们把条件换一下,假设我只能给你新增的数据 D 2 \mathcal{D}_2 ,和原来的模型 θ \theta ,但是原来的数据 D 1 \mathcal{D}_1 看不到了,我们再去考虑上面的那个联合概率分布,就会发现,问题没有想得那么容易了。

这也是统计机器学习的问题所在,所见即所得,你要让模型拟合数据,那就得让模型见到数据,如果模型见到了新的数据,模型对原来数据的记忆就会被新的数据所覆盖,类似狗熊掰棒子,模型没有一个柔性的记忆功能,这就是增量学习所要探讨的问题:

  • 当数据持续出现的时候,模型是否能对过往的数据保持记忆功能,同时又能拟合新来的数据

我觉得这个问题,在现有的统计机器学习的原理上,是很难获得有效解决的,虽然我们一直想要模拟人类的智能,但是人类的智能本质上和现在的 AI 本质上是完全不同的两套东西,所以我们还是只能从数学的角度来考虑这些问题。基于此,还是有一些研究人员,提出了一些解决思路。

在介绍这些研究思路之前,我们再回顾一下这个问题,假设一开始,我们在 D 1 \mathcal{D}_1 上学习了一个模型,按照目前的主流方法来说,这个模型很大概率就是一个 CNN 模型,我们也假设学习了一个 CNN 模型,这个模型由模型结构 G 1 G_1 和模型参数 Θ 1 \Theta_1 共同表示,数据我们表示成, { x 1 , y 1 } \{ \mathbf{x}^{1}, y^{1} \} ,上标 1 表示数据属于 D 1 \mathcal{D}_1 ,后来又来了一批新的数据集 D 2 \mathcal{D}_2 , { x 2 , y 2 } \{ \mathbf{x}^{2}, y^{2} \} ,如果我们只能见到 D 2 \mathcal{D}_2 ,那我们如何得到一个新的模型 G G 和模型参数 Θ \Theta ,使得 G G Θ \Theta D 1 , D 2 \mathcal{D}_1, \mathcal{D}_2 都拟合得很好呢,如果我们不管 D 1 \mathcal{D}_1 的数据,只是去拟合 D 2 \mathcal{D}_2 ,那么毫无疑问,我们会和拟合 D 1 \mathcal{D}_1 一样,得到一个比较好的模型结构和模型参数,我们称为 G 2 , Θ 2 G_2, \Theta_2 ,但是这个模型显然不能对 D 1 \mathcal{D}_1 有什么记忆功能,所以这让我们陷入两难,如果我们全力拟合新数据 D 2 D_2 , 那我们会遗忘掉原来的数据 D 1 D_1 ,如果我们保持原来的模型结构 G 1 G_1 和模型参数 Θ 1 \Theta_1 ,那我们可以记住原来的数据 D 1 D_1 ,但是我们就无法拟合新的数据 D 2 D_2 ,这就是增量学习里常说的稳定性(对历史数据的记忆)和可塑性(对新数据的拟合)悖论。

针对这个悖论,目前提出了一些解决思路,既然我们只有 G 1 , Θ 1 , D 2 G_1, \Theta_1, D_2 ,很显然,我们只能从 G 1 , Θ 1 , D 2 G_1,\Theta_1,D_2 上去考虑。

第一种思路是对模型结构做文章,既然我又要记住 D 1 D_1 ,又要学习 D 2 D_2 ,那最直观的方式,就是把 G 1 , G 2 G_1, G_2 都用上,我们把 CNN 模型进行扩充,每来一个新的数据集,我们就对模型进行扩充,原来的模型结构保持不变,,或者底层的卷积层共享,后面的层分别对应不同的任务,很显然,这是一种头痛医头,脚痛医脚的策略, 这种方式,简单直观,但是很不经济,随着数据集的增加,模型也会变得越来越复杂。

第二种思路,就是利用知识蒸馏的策略,既然我有 G 1 , Θ 1 , D 2 G_1, \Theta_1, D_2 ,那么我可以先用 G 1 , Θ 1 G_1, \Theta_1 D 2 D_2 预测一把,得到很多软标签,这些预测结果,就是原模型 G 1 , Θ 1 G_1, \Theta_1 对数据的响应,训练的时候,把蒸馏 loss 也考虑进来,这样可以让模型对历史数据有一定的记忆功能,同时又能去学习新的数据。

第三种思路,就是对模型参数 Θ 1 \Theta_1 进行约束,我们都知道,现在模型的复杂度,远远大于数据的规模,这样就会导致模型的参数会有很多的冗余,这种思路,就是利用参数的冗余,可以先用一些准则,把 Θ 1 \Theta_1 中对 D 1 D_1 比较重要的部分保留起来,然后学习新数据的时候,只更新那些对历史数据不重要的参数,这样也能在记忆与更新之间找到某种平衡。

第四种思路,就是数据回顾,这种思路本质上,还是一种联合训练的思路,只是数据规模要小很多,既然学习的本质是数据拟合,那么就想办法去保留历史数据,所以有些方法,就是保留历史数据,然后和新数据一块训练。

实际应用的时候,会把几种思路结合起来考虑,目前学术界比较流行的就是蒸馏结合数据回顾的方式来做增量学习。


转载:https://blog.csdn.net/shinian1987/article/details/102983510
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场