Life Long Learning直译过来就是终身学习,什么叫终身学习呢?我们人类在做的事情其实就是终身学习,从小到大,我们的视觉系统会不断接收到新的图像,小狗、树、山川等等,我们不会因为学会识别山川就忘记怎么识别小狗,但如果我们希望神经网络也能做到这一点却不太容易。
下面的例子告诉我们,一个用于Task 1的神经网络经过训练以解决Task 2的时候,会发生对Task 1的“遗忘”。也就是说,看起来我们只能对不同的任务训练不同的模型。实际上我们之前一直是这么做的,但问题在于,这样是很费力气的,而且实际上可能做了很多重复的特征提取工作。那么能不能想办法训练一个网络同时解决多个Task呢?
对于上述问题来说,最直接的想法就是把多个Task的训练集混合在一起,然后训练一个神经网络出来:
可以看到,现在得到的模型在两个Task上的表现都还不错。进一步说,当我们的Task不完全相同(上述Task都是数字识别)的时候,我们还可以使用之前迁移学习一节提到的Multitask Learning:
但是这样做的问题是我们始终要保留各个Task的Training Data,不仅每来一个新的任务就要用所有的数据重新训练一遍,而且存储这么多的Training Data也要花费很大的存储空间。所以多任务学习的时间空间开销都是很大的。
要想让模型具有持续学习的能力且具备一定的记忆力(即学习了新任务后不会忘记怎么解决旧任务),一个很直接的想法就是让模型可以解决新任务的同时不要对模型有太大改动。
如何衡量我们对模型改动的大小呢?对之前的任务很重要的参数最好不要有大的改动,而不太重要的参数则可以有较大改动。这可以用正则项来刻画。具体形式如上图所示。
下面则是一个直观的例子,颜色越深的区域代表损失函数越小(即表现越好),现在模型参数在Task 1上表现很好,然后新来了一个Task 2,若直接优化参数使得Task 2上表现最好,那么新参数在Task 1上的表现将会很差,若我们让参数沿着的方向(因为Task 1的损失函数对的变化不敏感)变化而尽可能少的沿的方向变化并使得在Task 2上表现尽可能好,则更新后的参数会在两个Task上都取得较好的表现。
接下来的问题就是,我们怎么确定正则项系数呢?也就是说我们如何衡量各个参数对在任务上表现的影响呢?
我们可以考虑用二阶导数:
若损失函数对某个参数的二阶偏导较小,则说明该参数方向上的变化是较为平缓的。从而我们在新任务上进行梯度下降的时候应优先考虑沿二阶导较小的参数方向进行变化。
当然除了EWC方法,我们也可以考虑生成数据的方法,具体来说,就是利用GAN等方法训练可以生成用于Task 1的“伪数据”的生成器,并训练一个用于解决Task 1的模型,然后就可以丢掉Task 1的Training Data了,然后当遇到Task 2的时候,我们先用之前的生成器来生成一些Task 1的“伪数据”,然后把这些数据和Task 2的真实Training Data一起用来训练模型,这样就得到了可以解决Task 1&2的模型,然后我们用这些数据训练一个可以生成用于Task 1&2的“伪数据”的生成器……依次进行下去……
李宏毅老师还讲了一些其它的模型,不过这里就不进行整理了,在我看来,LLL是一个很有趣的想法,但是它的实际应用场景可能并不广泛,因为我们对模型的期望很高,我们希望可以得到最好的表现,而LLL的“兼顾”可能并不是我们需要的。至于利用别的任务的数据来提升当前任务的表现,那就是Transfer Learning做的事情了。
网友评论