在线流式训练中, 早期的样本和当前的样本所包含的内容也可能不同, 只不过变化是连续的, 不像多任务中, 各个任务是有一个明确的变化节点. 所以很有可能也存在这种问题.
大体思路, 如果一个参数对之前的任务非常重要, 那么在当前任务训练时, 尽量不要修改它: 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的二次导数绝对值大小决定.
conducting multi-task learning by generating pseudo-data using generative model.
有点类似人类大脑自己回想问题, 自己创造case
希望新的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 意思就是修正后的方向不与之前的方向重冲突.
每有一个新的Task, 创建新的网络, 新网络的各层, 接入老Task等层的前一层当输入:
每当有一个新任务, 通过一个Task Detector 网络, 判断新任务和那个任务最像, 使用最像的网络, 来init 一个新的task的model. 每一个新任务, 一个新的model.
当当前的任务学习的准确率不高时, 对网络的节点进行分裂. 一分为二, 将layer变宽.