最近僕はcontinual learningの文脈でタスクの数に依存せずにリプレイバッファを構築する方法について考えているんだけど、ここら辺を研究しているとなんとなくonline pca、つまりオンライン主成分分析と関連性があるような気がしてくる
リプレイバッファというのは言わば訓練データの要約のようなもので、それをタスクの数に依存しない定数個に抑えるためには常にデータの取捨選択をする必要があり、タスク単位での分布に対して何かしらの仮定を置かないと効率的なアルゴリズムは構築できないような気がしてくる
しかし、この状況設定はまさにオンライン最適化、特にオンライン主成分分析と同じなので、オンライン主成分分析についての知見はあるに越したことないんじゃ...と思って少し調べてみた
オンライン主成分分析の手法はいくつか存在していて、サーベイ論文とかがあまり見つからないから体系的な理解がまだ出来ていないんだけど、手始めに読んだ論文がなかなか面白いアルゴリズムだった
(わかりにくいけど上の画像はpdfへの直リンク)
主成分分析
そもそも主成分分析とはn次元のデータを複数個受け取った時、それらのデータを最もよく表現できるような次元部分空間を見つけ出す*1ことで、オンライン主成分分析では複数個のデータがオンラインな形で、すなわちデータを1つずつ観測し、その度に対応する部分空間を更新していく
数式的にいうなら、ステップまでに観測したデータをもとに次元部分空間への射影行列と平均値を構築したとし、ステップ目に新しいデータを受け取るとき、"圧縮損失"と呼ばれる損失を被る
以上のような段取りが各ステップごとに行われ、ステップまでの圧縮損失の合計値を最小化するような射影行列と平均値を計算するアルゴリズムを考えることになる
ヘッジアルゴリズム
上の論文で提案されている論文は、オンライン最適化におけるエキスパート統合問題およびヘッジアルゴリズムと密接に関連しているので、まずはその説明をする
エキスパート統合問題においてプレイヤーは人のエキスパートの答えを統合して次々出題される問題に答える必要があり*2、ナイーブなやり方としては各エキスパートの今までの問題に対する正答率を記録しておき、その正答率が最も高いエキスパートに従うなどが考えられる
ヘッジアルゴリズムはこの考えをもう少し洗練したもので、今までの問題に対するエキスパートの挙動に基づいて計算した確率ベクトルから確率的にエキスパートを選び出す
より具体的には、ステップ目において
1. エキスパートを確率で選び出し
2. それに対応する損失を被り*3
3. 確率ベクトルを各についてと更新する
確率ベクトルの更新式の分母はベクトルが確率になるように正規化を行なっており、損失を被らない答えを導き出しているエキスパートほど選ばれやすいように確率ベクトルが更新される
Randomized Online PCA Algorithms
もう一度オンライン主成分分析の圧縮損失を見返してみると、今までのデータの平均値をとすれば射影行列の圧縮損失は
先程のオンライン最適化の文脈に合わせると、各部分空間をエキスパートとした時に、上式の右辺をなるべく小さくするようなヘッジアルゴリズムを考えることができるが、当然そのままでは部分空間が無限個存在するため計算を行うことができず、この論文の賢い点はまさにこれを可能にした点にある
証明の詳細は省くが、次元への射影行列*4を倍したものを考えるとこれは密度行列になっており、そのような無限個の密度行列の凸包をとおくと、最大固有値が以下である密度行列全ての集合と一致することが示され、特にの要素は高々個のの元の線型結合で表せることも示すことができ、この線型結合の係数は確率ベクトルになっているため、の要素を確率ベクトルと同一視することでヘッジアルゴリズムを適用することができる
具体的に手続きを述べると、初めに適当なをとり、ステップまででが得られているとすると、
1. と対角化
2. -cornerと呼ばれる、個の要素がで他がであるベクトルを用いての対角ベクトルをと分解することができ、は確率ベクトルになっている*5
3. 確率でベクトルを選ぶ
4.
5. によって射影行列を得、損失を被る*6
6.
7. cappingによりを得る
という感じになる
発想はとても面白いんだけど、毎ステップ対角化なり行列のlog、expの計算なりしないといけないのでコストがかなり高そうという印象を受けた
特にデータの次元がでかくなったときにキツそうだ😵💫