の勉強を最近していて、来週のセミナーでなんかしら進捗を発表しないといけないんだけど何も産んでいなくてかなりヤバイ
書いているうちにセミナーもとっくに終わって年が明けてた
サーベイ論文としては
を参考にしてる
1つ目は割と神経科学に基づいていて、2つ目はタイトルの通りロボットに実践的に適用するためにはどうすればいいかみたいな話も交えてる
3つ目は有名な手法たちを実験的に比較してる
一つ目のタイトルはcontinual "lifelong" learningと言っているけど、continual learning/lifelong learning/incremental learning/never-ending learningと様々なパラダイムがある上にそれらの定義及び違いはかなり不明瞭で、サーベイする上でも辛い
今の自分の理解としてはcontinual learningとincremental learningは似ていて、どちらもタスクが連続的に与えられる時のパフォーマンスに関する話*1で、lifelong learning/never-ending learningはより自立的な学習に関する話だと思ってる
つまりcontinual learningの方が受け身で、こちらの方が状況は簡単だと思うからまずはこっちの研究をしたい*2
簡単と言っても依然として話は難しくて、transfer learning/few-shot learning/online learning/multi-task learningなどの話題も関連してくるため、困難の分割、つまりcontinual learningのどこの問題に注目しているのかをはっきりさせることが何より重要な気がする
2つ目のサーベイは、乱立しているcontinual learningの定義を包括するようなフレームワーク、そして論文にする時にどの仮定を明示するべきなのかの話も書いてあって参考になる
上に書いたように、continual learningの共通する設定は様々なタスクが連続的にモデルに与えられるということなのだけど、以下のような問題点をどのように克服するかが重要になる
- catastrophic forgetting...多分これが一番重要。ニューラルネットワークの致命的な欠点として、タスクAを学習させたのちにタスクBを学習させようとすると、タスクAの精度が急激に落ちるという現象が知られている
- knowledge transfer...以前のタスクで得られた知識を元にして新たなタスクの精度を上げるforward transferの他に、新しいタスクを学ぶことで以前のタスクの精度が上がるbackward transferも考慮する必要がある
- model capacity...与えられるタスクは無限なのに対してモデルのメモリ(もしくはパラメーター)は有限なので、どうにか工夫しないといけないという話だけど、そもそも容量が無限だったら一番上のcatastrophic forgettingも起こらない。なぜこの項目も書いたかというと、手法によっては過去のタスクに関する情報を保存しておくものも結構あって、メモリ管理の側面は意識する必要があるから
- stability-plasticity dilemma...stabilityというのはモデルが過去のタスクに関する情報を維持する力のことで、plasticityは新しいタスクへの適応力を指してる。これも上のmodel capacityに通じる話だけど、容量が有限である時に何を取捨選択するか考えなければならない
- distributional shifts...continual learningにおいて、今与えられているタスクがなんなのかを示すtask identifierが与えられているか否かは重要な点で、当然与えられない方が理想的かつ難しい。与えられなかった場合にどう対処するかは手法によるけれど、1つのやり方としてタスクの変化を検出する方法を考えるというものがある
他にも、例えば入力/出力の定義域は変化するのか、そもそもsupervisedなのかunsupervisedなのかみたいに考えるべきことはいろいろあるけれど、とりあえず上のモノたち(特にcatastrophic forgetting)が主な問題になってそう
どうやら手法は大きく3つに分けることができるらしくて、それぞれ
- Replay methods...過去のタスクに関する情報(例えば入力とラベル)を保存しておいて、のちにそれを使ってモデルを学習させる手法。ある意味一番直接的だけど、タスク数に比例して過去の情報を保存するのはmodel capacityの観点から望ましくないので何かしら工夫する必要がある。例えば生成モデルを使って過去のタスクの情報を学習させるのがよくある手法だけど、それだけではcatastrophic forgettingの問題を生成モデル側に押し付けてるだけで根本的な解決にならない
- Regularization-based methods...過去のタスクにおいて重要だったパラメーターを重み付けすることで情報を失わないようにする手法、もしくはロス関数の勾配をいじってcatastrophic forgettingを失わないようにする方法もここに属するかもしれない
- Dynamic architectures methods...モデルの構造を明示的、もしくは暗黙的に変更しながら学習するもので、例えば過去のタスクで重要なパラメーターを凍結させて次のタスクを学習することで前のタスクに重要な部分を守るなど。 2つ目のサーベイでは、長期記憶や汎化に特化し安定的な新皮質と、エピソード記憶に特化しより柔軟な海馬の相補的な学習(complementary learning system)からインスパイアされたdual architecturesというサブカテゴリもこのカテゴリに含まれていた*3
となってる*4
当然複数の手法を同時に使うのもありで、自分的にはそうしないと真に問題を解決することは難しい気がする
適当に読んだやつ書いてく(ニューラルネットに対する手法中心)
いわゆるknowledge distillationの類に属する手法
ネットワークが共有部分と最終層の今まできたタスクの数だけのヘッドで構成されてて、新しいタスクが来るたびにヘッドを追加する
新しくきたタスクの入力に対して、現タスク以前のタスクに対応するヘッドの出力を保存しておき、新しいタスクの学習をするときは保存した出力との値が変わらないようにペナルティを設けるというもの
タスク毎にヘッドが増えていくことからタスクの境界がオラクルとして与えられてないといけないのがネック
これもLwFと同時期に提案された比較的初期の手法
iCaRLはタスクが増えていくというより分類するクラスが増えていく感じ*5で、新クラスを学ぶたびにあらかじめ記録しておいた以前のクラスの代表サンプルを交えて特徴抽出器を学習し、実際に分類を行う時は入力を特徴抽出器に突っ込んで、その結果と一番特徴(の平均)が近いクラスを答えとして出力する
おそらく一番の工夫ポイントは新しいクラスが来たときの学習のやり方で、これもLwF同様knowledge distillation的アプローチを用いて、以前のクラスの特徴量をなるべく変化させずに新しいクラスを学習する
多分一番有名なやつ
前タスクD_A、現タスクD_Bに対してlog p(パラメータ|D_{A&B}) = log p(D_B|パラメータ) + log p(パラメータ|D_A) - log p(D_B)となるが、log p(パラメータ|D_A)を2次近似して、さらにその係数(フィッシャー情報行列F)をその対角行列で近似*6することで、損失関数のペナルティ項として\sum_i F_{ii}(\theta-\theta_A)^2が出てくる
シンプルかつ綺麗で流石って感じだけど、欠点として「タスクの境界が分かってないといけない」「タスクが増えるにつれてペナルティ項が大きくなってく」*7「フィッシャー情報行列の対角行列の計算をしなきゃいけない」「経験フィッシャー情報行列の精度が正しいのか」*8「前タスクが収束していない場合、近似が間違っているからbackward transferが抑制される」「タスクの数に比例してフィッシャー情報行列と以前のパラメータを保存しなければいけない」など
[1805.06370] Progress & Compress: A scalable framework for continual learningではonline ewcというのも提案されてて、ラプラス近似を適用する項をちょっと変えることで、これまでのフィッシャー情報行列の総和を保存しとけばいいようになってる
EWCと発想は似てるけどよりヒューリスティックで、以前のタスクにおけるパラメータの重要度をフィッシャー情報行列の対角成分の代わりに「(そのパラメータのロスの低下に対する貢献度)/(パラメータの変化率)^2」で測る*9
パラメータのロスの低下に対する貢献度は、ロスの変化率=ロスの勾配の積分=ロスの勾配とパラメータの勾配の内積の積分=各パラメータに対するロスの勾配*パラメータの変化率の積分の和であることを利用して、ロスの勾配*パラメータの変化をイテレーション毎に足したもの、として定義できる
パラメータの変化率は単純にイテレーション毎の変化を足したもの
フィッシャー情報行列の計算は省かれたけど、結局このままではタスクの境界が分かってないと計算ができない
synaptic intelligenceと発想は同じだけど、フィッシャー情報行列を計量とする多様体上でSIのように各パラメータの重要度を計算する
より具体的にはSIの分母がパラメータの変化率だったのに対して、これの分母は分布の変化をKLダイバージェンス(をラプラス近似したもの)
他にもEWC++とforward/backward transferの計算方法とかも提案されてて、EWC++はヒューリスティックな代わりにタスクの前知識がいらない
ヒューリスティックな箇所の正当性を真面目に考えてみるのもアリかもしれない
EWCはフィッシャー情報行列を対角行列で近似していたわけだけど、逆転の発想(?)でフィッシャー情報行列が対角行列に近くなるようにパラメーターを移し替える
初見の時は面白いな〜と思ったけど、フィッシャー情報行列の逆行列が必要になるnatural gradient descentの文脈で提案された
[1507.00210] Natural Neural Networks
とほぼほぼやってることが同じでびっくりした
今までに学習した各タスクから代表サンプルをいくつか保存しておき、新しいタスクを学習するときに、同時に以前のタスクの損失が低下しないように気を配る
具体的には、以前のタスクの損失を低下させないために現在のタスクの損失勾配と以前のタスクの損失勾配の内積が全て正になるような制約を加えつつ、新しいタスクを学習して得られたパラメーターとなるべく距離の近いパラメーターを採用する
これは二次計画法として定式化でき、理論上は(損失関数が局所的に線形であれば)以前の損失が低下することはないわけだけど、圧倒的デメリットとして以前のタスクの代表サンプルを全て記憶しなければならないこと、そしてタスク毎の計算量がえぐいことがある
ちなみにBackward transferとForward transferを測るための計算式も提案している
GEM(Gradient Episodic Memory)とほとんど同じだけれど、GEMで代表サンプルをタスクごとにまとめて記憶していたのに対し、A-GEMでは過去のタスクを一緒くたにすることで二次計画法を解く計算量と少なくした
あとlearning curve areaという指標も提案してる
GEM/A-GEMと発想は似ているけど、代表サンプルを記憶しておいてタスク毎に損失勾配を計算する代わりに、ネットワークの勾配そのものを記憶しておき、新しいタスクで勾配降下を行う時にその勾配が記憶している勾配と直交するように射影変換をする
ネットワークの勾配は出力が最も変化するパラメーターの方向なので、その方向と直交するように新しいタスクを学習することで以前のタスクで重要だった出力をあまり変化させずに済むという発想
これはneural tangent kernelの枠組みでは学習が線形になる
[1902.06720] Wide Neural Networks of Any Depth Evolve as Linear Models Under Gradient Descent
ことからも正当化されて、実際無限幅のネットワークでは学習がうまくいく証明を与えてる論文もあった
ただ、やっぱりタスク毎に勾配を記憶する必要があるということが問題なわけだけど、以前セミナーで少し考えた時は勾配の記憶&直交化フェイズをonline principle component analysisで置き換えるなんて進捗()を得た
これ自体は手法を組み合わせただけだから本当に何をしたわけでもないけど、continual learningの一番簡単な状況としてonline pcaがあるって考えることもできるな〜と思った(のでそこから知見を得られるかもしれない)
ニューラルネットワークの各パラメーターの重要度を計算して正則化するシリーズ
重要度の計算はサンプル点でのパラメーターの変化率に対する関数の出力の変化率、具体的には関数の勾配を用いて行われる*10
クラス分類などのようにネットワークの出力ヘッドが複数の場合は出力のl2ノルムの勾配を考える
MASをタスクの境界が与えられていない状況で使えるようにしたもの
具体的にはK個サンプルが与えられて1つ目から順に学習していくとき、Kサンプルの損失関数の平均値が急激に変化した場合何か新しいものを学んだと解釈できるので、損失の平均値*11をsliding windowで観察する
EWCは大まかに言って事後分布をラプラス近似するという手法だけど、ここでは別の近似方法として変分ベイズを導入している
論文では代表サンプルを保存して変分ベイズと組み合わせるようなことをしてるが、やはりタスクの増加とともに必要な記憶容量と計算量が増加してく問題は残っている
ただ、この論文のおかげでincrementalなベイズ推定に関する見通しがよくなった気はする
メタラーニングからのアプローチ①
基本的にメタラーニング的手法はbackward transferだけでなくforward transferにも注目している
この論文では上で述べたknowledge transferを数式的に表現して学習する、具体的には2つの入出力点での損失関数の勾配の内積を取ることで、それが正であれば片方の入力がもう片方の入力での学習を補助することを意味し、逆に負であれば干渉が起こると解釈できるので、内積がなるべく正になるよう損失関数にペナルティを加える
賢いなーーーと思ったけど、どうやらこのアイディア自体は
[1803.02999] On First-Order Meta-Learning Algorithms
で既に出ていたらしく、じゃあこの論文での新規性は何かというと、上の考え方にexperience replayを組み合わせることでnon-stationaryな分布をstationaryっぽくするところらしい
メタラーニング②
新規手法の提案というよりは強化学習の文脈でMAMLのcontinual learning版を定式化した感じ
あとMuJoCoを使ってRoboSumoっていう強化学習 x continual learning向けの環境を実装した
メタラーニング③
関数を直接学習するのではなく、Representation Learning Network(RLN) phi_thetaとPrediction Learning Network (PLN) g_Wに分解して合成関数g_W(phi_theta(x))を用いる
これらの関数の学習方法は2つ(MAML-RepとOML)提案されてるけど、基本的にメタ学習フェイズでRLNを学習、固定したのち個別のケースについてPLNを学習する
スパースな表現学習はcatastrophic forgettingを緩和すると言われているらしく、論文ではOMLで学習したRLNはスパースな表現を得られることが実験的に確かめられたと主張しているが、実際OMLがどうなのかはともかくスパースな表現とcatastrophic forgettingの関係はもう少し調べたいなと思った*12
メタラーニング④
online changepoint analysisによって動的にタスクの境界を推定することでタスクの境界が与えられていない時でもメタラーニングできるようにしたもの
今までの論文では保存しておいた代表サンプルを選び出すときは完全にランダムに行われていたが、より効率よく学習を進めるためのサンプリング方法を模索したもの
具体的には新しいサンプルの学習に最も干渉を受けるものを選び出すという手法で、感覚的には関数が識別しづらい箇所の解像度を上げるようなイメージかもしれない
とりあえずiPadで開きっぱなしになってた論文を羅列してみた
もちろん冒頭に載せたサーベイ論文には他にも色んな手法が載ってるけど、分野の軽い把握はできたような気がしてる(勘違い
今まで理論よりの論文ばっか読んでたけど、手法提案系論文の方が気軽に読めて気は楽だ
この記事を書きながら一番下にメモ書きを残してたんだけど、清書するやる気を無くしてしまったのでそのまま載せる😓
これからの方向
Experience Replayをより効果的に(今のところreservoir samplingしか見てないので、サンプリング手法を工夫する論文を探す)
stability-plasticity dilemmaはニューラルネットワークに限った話ではない=>catastrophic forgettinとは関係ない?
catastrphic forgettingをより数学的に
ニューラルネットのsample-inefficiencyとcatastrophic forgettingの関係
representation learningの効果
今のところ上の殴り書きにもあるけどcatastrophic forgettingについてもう少し理論的に考える方向に興味があるかなー
よくcatastrophic forgettingの原因として「ニューラルネットは過去のデータを考慮せずにパラメーターを更新するから」「ニューラルネットが極めて柔軟だから」みたいな言説を見かけるけど、前者だったらcatastrophic forgettingはニューラルネットに限った話じゃないし、後者に関してはstability-plasticity dilemmaを踏まえてニューラルネットがplasticである代わりにstabilityが失われている、っていう発想だと思うけど、となると果たしてニューラルネットは最適な学習ができているのか、すなわち高いplasticityを保ちつつstability-plasticity dilemmaにおいて最善なstabilityを確保できているのか、みたいなことが考えられるので、その方向を調べてみようと思う
*1:incremental learningの方が名前的にタスク間の境界がはっきりしている感じがする
*2:ただ、モチベーションの観点に立つとnever-ending learningとかの方が分かりやすい気がして、continual learningの標準的な定義が存在しない大きな理由にcontinual learningの目指すところがはっきりしてないというのがあると思う
*3:なんとなく生成モデルによるreplay methodsに通じるものがある
*4:2つ目のサーベイと3つ目のサーベイに書いてあることをフュージョンした
*5:なのでどちらかというとincremental learningの枠組み
*7:これはある意味当然の挙動とも言える
*8:
[1905.12558] Limitations of the Empirical Fisher Approximation for Natural Gradient Descent
*9:分母が二乗になっている理由は単位を揃えるためらしいけどよく分かってない
*10:損失関数ではなく関数そのものの勾配に注目する点ではorthogonal gradient decsentと似ているが、内容は損失関数に正規化項を付け加えるという点でむしろEWCに似ている
*11:実際には平均値と分散
*12:少し調べてもスパースな表現を得られるように学習させたら性能が上がった!という論文ばかりで、なぜスパースな表現が効果的なのかを論理的に述べてる論文が見つからなかった。ただ、共通している直感的説明としては例えば
[1811.06626] The Utility of Sparse Representations for Control in Reinforcement Learning
で述べられているようにスパースな表現はその局所性ゆえincremental learningにおいてあるインスタンスの学習が他に影響を与えづらいとか何とか