文章目录
介绍
Life Long Learning (LLL)
终生学习
也叫:Continuous Learning, Never Ending Learning, Incremental Learning
最后那个是skynet…
公式输入请参考:在线Latex公式
Knowledge Retention but NOT Intransigence
Example – Image
可以看到任务1有噪音,但是两个任务都是数字识别
模型构架:3 layers, 50 neurons each
用任务1训练,用任务2进行test
用任务1训练后,作为任务2的初始参数:
把任务1和任务2的数据混合后训练:
明明可以两个任务都做得很好,为什么先训练任务1再训练任务2结果是任务1会烂掉?
Example – Question Answering
问答系统任务描述:Given a document, answer the question based on the document.
使用的是QRN模型
用的语料库是bAbi,它包含有20种题型,一般有两种玩法:
1、训练一个模型,读取所有题型数据进行训练;
2、训练20个模型,分别解决20种题型。
现在的想法是,训练一个模型,然后一个题型一个题型的任务依次训练。Train a QA model through the 20 tasks
下图是训练题型5的过程,训练完每个题型都让模型去回答题型5的问题,看准确率,可以看到只有训练完题型5其准确率突然暴涨为100%,然后学完别的则坏掉。
类似的:
是模型不够复杂吗?不是,下面是把所有数据都学完的结果:
这个称为:Catastrophic Forgetting灾难性遗忘。
虽然说Multi-task training can solve the problem!但是Multi-task有如下两个问题:
Multi-task training 的两个问题
学一个任务要1天,那么1000个任务?注意这里数据不是一次到位的,所以时间是1+2+3…
另外数据的存储也是问题。
• Multi-task training can be considered as the upper bound of LLL.
经典的解决方法:
Elastic Weight Consolidation (EWC)
基本思想:固定重要的参数,更改不重要的参数。
Basic Idea: Some parameters in the model are important to the previous tasks. Only change the unimportant parameters.
θ
b
\theta^b
θb is the model learned from the previous tasks.
Each parameter
θ
i
b
\theta^b_i
θib has a “guard”
b
i
b_i
bi.
其中下标i代表第i个参数。
b
i
b_i
bi代表参数的重要性。
If
b
i
=
0
b_i=0
bi=0, there is no constraint on
θ
i
\theta_i
θi
If
b
i
=
∞
b_i=\infty
bi=∞,
θ
i
\theta_i
θi would always be equal to
θ
i
b
\theta^b_i
θib
上式中的后面一项相当于正则项,不同于L2正则,它是针对每一个参数
θ
i
\theta_i
θi,限制
θ
i
\theta_i
θi不能远离
θ
b
\theta^b
θb。
下面两个任务,蓝色代表loss越小,白色是loss越大。
先训练任务1,从
θ
0
\theta^0
θ0开始进行GD,更新到
θ
b
\theta^b
θb
然后接着训练任务2,从
θ
b
\theta^b
θb开始进行GD,更新到
θ
∗
\theta^*
θ∗
经过对比就知道了,
θ
∗
\theta^*
θ∗在任务1上并不是最优解。
改进:
假设上面两个参数都有一个“guard”
b
i
b_i
bi,我们用
θ
\theta
θ的二次偏导来观察
b
i
b_i
bi应该取多大:
曲线平滑代表
θ
1
\theta_1
θ1方向变化不大,即
θ
1
\theta_1
θ1值变化对task 1的损失函数影响不大,也就是
b
1
b_1
b1可以小一点,不需要对
θ
1
\theta_1
θ1的值进行限制。
曲线不平滑代表
θ
2
\theta_2
θ2方向变化大,即
θ
2
\theta_2
θ2值变化对task 1的损失函数影响大,也就是
b
2
b_2
b2可以大一点,需要对
θ
2
\theta_2
θ2的值进行限制。
也就是说:
b
1
b_1
b1很小,
b
2
b_2
b2很大,即可以移动
θ
1
\theta_1
θ1,尽量不要移动
θ
2
\theta_2
θ2
其他的Elastic Weight Consolidation (EWC)
• Elastic Weight Consolidation (EWC)
• http://www.citeulike.org/group/15400/article/14311063
• Synaptic Intelligence (SI)
• https://arxiv.org/abs/1703.04200
• Memory Aware Synapses (MAS):最新
• Special part: Do not need labelled data
• https://arxiv.org/abs/1711.09601
Generating Data
这个方法是解决不好存储数据的问题的角度出发的,我们每训练一个任务后就用建立一个Generator来生成对应任务的数据,如果多个任务就生成多个任务的数据。(有些数据实在太大,几百个G,这个做法还是有一定意义的,但是具体实作上怎么样还不好说,因为生成一些简单的数字图片还行,但是当前技术要生成高清影像比较困难,如果生成模糊的图片会导致训练结果烂掉)
Adding New Classes
在LLL中还会遇到任务差异较大,导致模型结构不一样,这个时候应该怎么办?例如一个任务是二分类,一个任务是10分类,那么如何用一个模型解决多个差异较大的不同任务?
• Learning without forgetting (LwF)
https://arxiv.org/abs/1606.09282
• iCaRL: Incremental Classifier and Representation Learning
https://arxiv.org/abs/1611.07725
Knowledge Transfer
如果为不同任务训练不同模型,有两个缺点:
➢Knowledge cannot transfer across different tasks
➢Eventually we cannot store all the models
那用Transfer learning是不是可以解决这个问题?
Life-Long v.s. Transfer
Transfer learning目标当然也是学完task 1后学习task 2要学得更棒,但是学会task 2后并不会一定保证task 1还没忘记。
LLL Evaluation
一个表格,其中:
R
i
,
j
R_{i,j}
Ri,j: after training task i, performance on task j
If 𝑖 > 𝑗, After training task i, does task j be forgot
If 𝑖 < 𝑗, Can we transfer the skill of task i to task j
常见评价指标有:
准确度,就是第一个任务到第T个任务的performance求平均,就是表格最下面一行的平均值
Accuracy
=
1
T
∑
i
=
1
T
R
T
,
i
\text{Accuracy}=\cfrac{1}{T}\sum_{i=1}^TR_{T,i}
Accuracy=T1i=1∑TRT,i
Backward Transfer衡量模型对过去任务的记忆程度,具体看下面蓝色部分,就是模型从task 1学完有一个performance
R
1
,
1
R_{1,1}
R1,1,然后学task 2,一直学到task T后有一个performance
R
T
,
1
R_{T,1}
RT,1,在这个学习过程中模型对于task 1是会遗忘一些东西的,这个时候用
R
T
,
1
−
R
1
,
1
R_{T,1}-R_{1,1}
RT,1−R1,1来衡量忘记了多少,我们希望这个值越小越好,通常这个值是负的,如果是正的那就NB了(有可能是为正,正代表模型触类旁通,青出于蓝而胜于蓝)。同样算从task 2到task T遗忘了多少:
R
T
,
2
−
R
2
,
2
R_{T,2}-R_{2,2}
RT,2−R2,2。
这里能不能像Resnet一样保存一些信息?
Backward Transfer
=
1
T
−
1
∑
i
=
1
T
R
T
,
i
−
R
i
,
i
\text{Backward Transfer} =\cfrac{1}{T-1}\sum_{i=1}^TR_{T,i}-R_{i,i}
Backward Transfer=T−11i=1∑TRT,i−Ri,i
Forward Transfer用来衡量学了前面的task后学习下一个task的performance有多好。这个表中的第一个行代表用随机初始化来训练不同的task的performance。
Forward Transfer
=
1
T
−
1
∑
i
=
2
T
R
i
−
1
,
i
−
R
0
,
i
\text{Forward Transfer} =\cfrac{1}{T-1}\sum_{i=2}^TR_{i-1,i}-R_{0,i}
Forward Transfer=T−11i=2∑TRi−1,i−R0,i
Gradient Episodic Memory (GEM)
这个是一个更新GD的策略
该策略通过保存以前task的一部分数据用来计算之前task的梯度,如下图中的
g
1
g^1
g1和
g
2
g^2
g2,当然任务的的梯度方向为g,在更新梯度的时候要保证新梯度g’不会拖累之前的梯度,而且和当前任务的梯度g越接近越好。
该方法结果:
Model Expansion but Parameter Efficiency
当任务太多的时候,模型可能是由于参数太少,复杂度不够,导致无法拟合所有任务,因此我们希望模型能够在出现这样的情况的时候自动扩展。但我们希望这个扩展是有效率的扩展,而并不是乱扩展(不能和任务的增加数量成正比)。
Progressive Neural Networks
这个在transfer learning有讲,直接贴过来
有一个Task 1,先训练之,并把其参数固定:
然把Task 1的参数接入到Task 2中(Task 2 的隐藏层会copy Task 1的某个隐藏层的参数),这样的好处就是:
Task 1和Task 2是不同的任务,Task 2的参数是不会影响Task 1的参数的,所以Task 1不会变得比原始更差;
把Task 1的参数接入到Task 2的时候,Task 2可以对参数有选择的copy,例如完全不copy就相当于不接入Task 1的参数,自己训练自己的。
以此类推:
这个方法缺点是没有办法学习太多的任务,因为参数增加太快。
Expert Gate
新任务进来就判断新任务和现有任务的相似度,找一个最相似的任务并以其作为新任务的初始化。每增加一个任务也会增加一个模型:
Net2Net
为原来的网络增加神经元,且保证不改变原来的神经元识别结果。就是如下图所示把一个神经元分裂为两个神经元,注意看输出权重,由于输入不变输出的权重变成原来的1/2,所以结果不变。但是这样分裂后做BP二者算的结果也一样,因此在分裂后会加入一个小小的noise。
注意:Expand the network only when the training accuracy of the current task is not good enough.
Curriculum Learning : what is the proper learning order?
学习的任务会影响模型的遗忘的情况,以最前面的数字识别的例子
taskonomy= task + taxonomy
http://taskonomy.stanford.edu/#abstract