Life Long Learning
如果真的实现一个网络处理所有问题, 离真正的人工智能就不远了.
目标
- 希望一个模型能够对多种类型的目标进行处理(learning).
- 在不同的目标依次学习的前提下, 不遗忘之前学习到的知识.
遇到的问题,挑战:
- 遗忘: 学习了新的task2之后, 老的task1 准确度下降. 需要保证task1的准确性, 同时希望task2也能学好.
- 提升: 希望不同任务之间能够触类旁通, 不同任务之间互相辅助.
- 模型复杂度控制: 如何判断学习task2之后, task1的效果下降是模型参数太少还是真的由于先后原因被遗忘. 以及什么条件下需要增加参数.
- curriculum learning. 学习的先后顺序也非常重要.
在线流式训练中, 早期的样本和当前的样本所包含的内容也可能不同
, 只不过变化是连续的, 不像多任务中, 各个任务是有一个明确的变化节点. 所以很有可能也存在这种问题.
相关算法
1. 抗遗忘: Elastic Weight consolidation(EWC)
大体思路, 如果一个参数对之前的任务非常重要, 那么在当前任务训练时, 尽量不要修改它:
L
′
(
θ
)
=
L
(
θ
)
+
λ
∑
i
b
i
(
θ
i
−
θ
i
b
)
2
L'(\theta) = L(\theta) + \lambda \sum_{i}b_i(\theta_i -\theta_i^b)^2
L′(θ)=L(θ)+λi∑bi(θi−θib)2 其中,
b
i
b_i
bi为控制
θ
i
\theta_i
θi变化程度的参数.
θ
i
\theta_i
θi为当前的学习参数, 而
θ
i
b
\theta_i^b
θib为上一个task学习到的
θ
i
\theta_i
θi的值.
最简单的
b
i
b_i
bi 参数, 通过
θ
i
\theta_i
θi的二次导数绝对值大小决定.
2. 抗遗忘: 训练能够生成之前task样本的模型
conducting multi-task learning by generating pseudo-data using generative model.
有点类似人类大脑自己回想问题, 自己创造case
3. 提升: Gradient Episodic Memory (GEM)
希望新的task的训练过程中, 对老的task的效果也有提升.
具体做法是, 在使用
θ
i
t
j
\theta_i^{t_j}
θitj的gradient
g
i
t
j
g_i^{t_{j}}
gitj更新
θ
i
t
j
\theta_i^{t_j}
θitj的时候, 参考之前task中
θ
i
\theta_i
θi 的gradient
g
i
t
j
−
1
g_i^{t_{j-1}}
gitj−1,
g
i
t
j
−
2
g_i^{t_{j-2}}
gitj−2,
g
i
t
j
−
3
g_i^{t_{j-3}}
gitj−3…,
g
i
t
1
g_i^{t_{1}}
git1. 使用历史gradient修正当前
g
i
t
j
g_i^{t_{j}}
gitj 为
g
i
′
g_i^{'}
gi′, 使得:
g
i
′
.
g
i
t
k
≥
0
,
∀
0
≤
k
≤
j
g_i^{'} . g_i^{t_{k}} \ge 0 , \forall 0 \le k \le j
gi′.gitk≥0,∀0≤k≤j 意思就是修正后的方向不与之前的方向重冲突.
4. Model Expansion
1. Progressive Neural Networks
每有一个新的Task, 创建新的网络, 新网络的各层, 接入老Task等层的前一层当输入:
2. Expert Gate
每当有一个新任务, 通过一个Task Detector 网络, 判断新任务和那个任务最像, 使用最像的网络, 来init 一个新的task的model. 每一个新任务, 一个新的model.
3. Net2Net
当当前的任务学习的准确率不高时, 对网络的节点进行分裂. 一分为二, 将layer变宽.