1.终身学习概述:不断的学习新任务
1.1 终身学习的几种称呼:
Life Long Learning(LLL)
Continuous Learning
Never Ending Learning
Incremental(增长的,增加的) Learning
1.2 Life Long Learning 在现实世界的应用
用标记好的数据训练出模型Model(old task),模型上线,不断在线上收集资料,用收集的资料更新模型Model(New task),循环进行,这本质上就是LLL问题
1.3 LLL难点:
终身学习中指的学习不同任务不是说先语音后图像这种,每个任务相差都不大,就如上图所示,只是一个有杂质一个没有杂质,模型在task1上训练后,在task1可以达到90%,去预测task2可以达到96%,而把在task1上训练好的模型再接着用task2的数据训练,结果在task2上准确率变高了,在task1上反而会降低,也就是说对已经学习到的技能会产生遗忘
把两个任务的数据同时混到一起然后训练模型,而不是先用task1的数据训练再用task2的数据训练,会表明其实该模型结构有能力把两个任务都学好
corpus n.文集,文献,语料库
让机器对这20个问答任务依次学习
左图是让机器依次学习20个任务,然后学完一个任务就测一下在task5上面的准确率,会发现学习task5之前准确率为0,学习完task5之后准确率达到1,而后学习完其他task后准确率又会暴跌。
右图是把二十个任务的数据放到一起,让机器一起学习,然后测模型在不同task上的准确率,task19可能比较难,机器没有学会,但是也能证明机器是有能力学习这些任务的
总结:
LLL的难点是机器明明有能力学习多个任务,但是按序学习就会对前面的任务遗忘->是不为也,非不能也->catastrophic forgetting
1.4 怎么让机器可以依序学习多个任务而不产生这种灾难性任务?
有的人可能会说前面举的例子中把两个task的数据放到一起训练就可以同时学会两个task了,那也可以继续用这种方式去解决多任务学习问题。
首先这种训练方式称为Multi-task training,如果当任务很多时,比如已经学会了999个任务,现在要学习第1000个任务,那就需要把1000个任务的数据都拿去训练,一个是存储会有问题,一个是计算能力的问题,训练时间会很长。
所以Multi-task training can be considered as the upper bound of LLL,也就是说这种方式的结果会被视为LLL的上限,在研究LLL的时候会先跑一个Multi-task看上限在哪里,然后看自己的方法产生的结果能不能逼近这个上限。
1.5 为什么不让一个模型就学习一个任务,而是要让一个模型学习多个任务?
如果是让一个模型学习一个任务,那实现一个功能多样的机器人就会面临下面这两个问题:
(1)最终没有足够的空间存储所有模型
(2)不同的任务之间不能够互通有无,没法从别的任务里面学到在单一任务中没法学到的知识
1.6 终身学习和迁移学习的关注点不同:
二者虽然都是让机器去学习多个任务,但是关注点不一样,迁移学习里在意的是机器在task1上学到的技能能不能对task2有帮助,所以只看在task2上机器做的好不好,终身学习关注的是机器学完task2后还能不能解决task1
也就是说迁移学习是关注新任务做的怎么样,终身学习是关注旧任务做的怎么样
1.7 LLL的几个评估指标:
permutation是比较难的任务,从task2开始就是用不同的规则对task1的每一张图进行打乱
也可以选择让task1中的每张图片做不同角度的旋转然后充当后续的一系列任务
下面的任务序列比较简单,直接切分数字,然后在不同的task中分类,其实可以看成分奇偶
先随机初始化一个参数,测在不同任务上的accuracy,然后每次学完一个新task,测在不同task上的accuracy
i>j时是看有没有遗忘过去的任务,比如R4,1就是看学完4个task后有没有遗忘task1
i<j时是看能不能无师自通,比如R1,4就是看学完task1后能不能解决task4
评估指标有三个:
(1) accuracy是最后一行取平均值
(2) backward transfer是蓝色箭头指向的相减,R1,1就是刚学完task1时在task1上效果怎么样,RT,1是学完所有任务时在task1上效果怎么样,是衡量遗忘程度,这两个值相减的结果一般会是负的
(3) forward transfer是看没有接触这个task之前模型能学到什么程度,RT-1,T减R0,T是只学了前面T-1个任务,没有学task T时,这个时候在taskT上测试,与最初的随机初始化的模型相比,在taskT上有多大的提升
1.8 产生catastrophic forget的原因:
假设模型只有两个参数,颜色代表LOSS,越偏蓝色LOSS越小,越偏白色LOSS越大。在task1初始化一个参数θ0,利用梯度下降确认参数θb,然后保持这个参数不变用task2的数据训练跑到θ*的位置,这个位置对于task1来说,LOSS就会增大,也就是产生了forget,解决办法是限制参数移动方向,因为task2中明显在一个范围内的参数都可以保持低水平LOSS,可以找到一个位置使task1和task2的LOSS都可以接受
2.几种catastrophic forget的可能解法:
2.1 Selective Synaptic Plasticity: 只让网络中某些神经元或者某些神经元之间的连接具有可塑性,其余参数固化,该方法也称为Regularization-based Approach
每一个参数对学习完的任务的重要程度是不一样的,学习新任务时,对旧任务比较重要的参数最好保持不变,只去改对旧任务不重要的参数
θb是前面的任务训练出来的最终参数,给θb中的每个参数都配一个“守卫”bi是表示这个参数对旧任务的重要程度的
只需要bi大的新旧参数接近
bi=0相当于没做限制,就会造成灾难性遗忘
bi=∞新旧参数就会总保持一致使差值为0,不会忘记旧任务,但是没法学好新的任务,因为学习过程中参数几乎不变
bi是人为设定的,怎么确定这个bi该设置的大一点还是小一点
在θ1方向上移动,LOSS变化很小,说明θ1不重要,所以可以把b1设置的小一点
在θ2方向上移动,LOSS变化很大,说明θ2很重要,b2就设置的大一点,在学习新任务的时候就不要动θ2
b1设置的小,b2设置的大以后,在task2上训练时就会让它尽量在θ1方向移动,在θ2方向尽量不动,学习完的参数放到task1上也会得到一个可以接受的效果
横轴是一次训练各个任务的时间
纵轴是每个任务的准确率
蓝线是bi=0,也就是对参数不做限制,可以看到在taskA表现好,学完taskB就会对taskA遗忘,学完taskC时对taskA遗忘的更多,也就是会造成灾难性遗忘
绿线是bi=1,也就是所有的参数重要性假设一致,遗忘程度下降,但是很难学习新的任务
红线是按重要性给bi赋值,几乎不会遗忘,但是在学习新任务时没有不做限制(bi=0)在新任务上表现好
可以看这几个去学习怎么用不同的方法算bi
2.2 Gradient Episodic Memory(GEM)
GEM不是在参数上做限制,是在梯度更新的方向上做限制,红色虚线是在新任务上的梯度更新方向,绿色是如果还在旧任务上接着训练的梯度更新方向,然后对红色虚线做一些修正,用红色实线做最后的梯度更新方向
缺陷:需要存旧任务的数据才能算在旧任务上的梯度更新方向,LLL追求的是不保存旧任务的数据
2.3 Additional Neural Resource Allocation:
改变一下分配在不同任务上的神经网络资源
2.3.1 Progressive Neural Networks
训练task2的重新建立一个模型,然后用task1的最终参数做task2的初始参数,不去动task1的模型,从而在task1上的效果也不会有大变化,训练task3的时候再开一个模型,用task1和task2的最终参数做task3的初始参数
缺陷:任务多的时候,存所有模型会耗费内存
2.3.2 PackNet
与上一个方法想反,每一个圆圈代表一个参数位置,一开始创建一个大的网络,每个任务只分配一定量的参数位置,这样旧任务的参数就不会改变
2.3.3 Compacting,Picking,and Growing(CPG)
CPG就是Progressive Neural Networks和PackNet的结合,每一次既可以新增参数,又会只分配一部分参数给新任务做训练
2.4 Memory Reply
用一个模型去生成数据,假设是模型A
训练task1的时候用task1的数据训练出一个模型B,同时用模型A生成一份属于task1的数据dataset-task1
训练task2的时候用task2的数据加dataset-task1,在B的基础上训练出模型C,同时用模型A生成属于task1和task2的数据dataset-task1&2,依此类推
实验证明Generating Data可以接近LLL的上限,也就是可以接近Multi-task training的结果
如果不同的任务分类的class逐渐增多怎么办可以看上面的两个文献
LLL一共有三种情景,今天讲的是最简单的一种情景,剩下的可以看链接
上图表明不同的task学习顺序也会对效果造成影响