ざっくばらんメモ_2:kaggle、ceres::LocalParameterizaion、アジャイル
kaggle zillow challenge
前回までは複数のモデルを学習して得たモデルの予測値の平均(アンサンブル?)を用いていた。
今回はそのアンサンブルするモデルを追加する事にする。
Gaussian Process Regression:メモリエラー、見送り
KNearest Regressor:OKだがとても重い
Kernel Ridge Regression:メモリエラー、見送り
Support Vector Regression:OKだがとても重い
Random Forest:OK
Linear Regression:OK
全てsklearnからのモデルを利用。
パラメータはとりあえず試しなので、基本はデフォルト設定を利用した。
ひとまずOKかつ重くもないRandom ForestとLinear Regressionを加えて
試したところ:0.0677271-> 0.0664433。
OKだが重いモデルも適用したところ0.0659825(やっとサンプルベンチマー クを超えられた
Adaboost、GradientBoostも追加したところ0.0655690
次に、stackingを試してみる。
これはベースモデルの予測結果を特徴抽出結果と捉えて入力に加える事で、性能を向上させる手法である。
大雑把な手法は以下である:
1.trainデータをsplitして得たtrain_fold, test_foldの組み合わせに対して、train_foldで
訓練したモデルでtest_foldを予測した結果を元のtrainデータに足したものをtrain_meta
として保存。これを各ベースモデルに対して行う。
2.続いてtrainデータを全て利用して学習したモデルでtestデータを予測した結果を
元のtestデータに足してものをtest_metaとして保存。これを各ベースモデルに対し行う。
3.train_metaへ学習を行い、test_metaへ予測を行った結果を最終結果とする。
ー結果0.0656203でstackingしない時より性能が落ちてしまう。
現状のstackingは2foldで行っていたので、追加して5foldで試してみる。
結果:0.0656738で改善せず。
もしかすると、stackingは今回の問題ではあまり効果がないのかもしれない。
むしろ各月毎に予測しなくてはいけないのに、全て同じ値を用いている方が大きな問題かもしれない。
ceresのLocalParameterization
ceresで良く使われるLocalParameterizationの意味について。
ある対象の状態を定めるパラメータは、最適化時にはoverparameterizedな場合が多い。
例えば3次元空間内で描かれるある球面上に存在する点のパラメータを考えた時、
ある点周りの微小移動に関していえば、その接面上の移動を考えれば十分であり、
法線方向の移動は無視しても問題ない。
その場合、実際に扱う次元は接面上の2次元空間のみであり、最適化がしやすくなる。
こうした考え方を適用可能にするのがLocalParameterizationである。 実際は、与えられているパラメータブロックに対して、
微小移動に対する計算を関数として与える事が必要になる。
しかし基本的な微小移動関数はすでに定義されているので、それをただ用いるのが
一番良いやり方ではある。
アジャイル?な開発プロセスについて
twitterか何かに流れていたのだが、
四輪自動車を作成する事を考えた時、直接車の車輪や車体などの部品を作り上げて最後に合体させるのではなく、
まず相対的にシンプルな自転車から初めて、次に二輪自動車、最後に四輪自動車というふうに
発展させていく事が良いという図があった。
たしかに直接四輪自動車の部品を1つ1つ作り上げて合体させる場合、合体させるまで「走る」という機能を
機械に持たせる事ができない。
つまり、実現したい機能が「走る」事に関連している場合、それを最低限実現する機械(自転車)を開発して、
その後は「走る」機能を発展・改善していくプロセスを辿る方が良いという事になる。
これはシステム統合テスト(あるいは早期の市場でのテスト) のしやすさを言っているだと思っているが、
あるいは何か機能(「走る」)を作る時に、それを実現する機械を大きく1つ作れば良いと考えるのではなく、
その機能に関してどのようなユースケースがあるかを全て吟味して、発見したユースケース間をパスを
繋いでいくように細かく作っていく方がビジネス的にチャンスも多く良いという事かもしれない。
研究などにおいても大テーマを小テーマに分割して、各小テーマを論文として量産し食い繋ぎつつ、
最も重要な大テーマに迫っていくというのは良くある話ではある。
ざっくばらんメモ1:kaggle、脳科学とAI、ゲームとAI
kaggle zillow challenge
ーtruncation
logerrorに対してtruncation、1, 99 percentileでの切り捨てを行う。
結果0.0762954。
続いて他の変数にもtruncationを追加。
追加したのは(finishedsquarefeet12、calculatedfinishedsquarefeet、taxamount)
精度は大きく下がってしまった(0.0762954 -> 0.1232041)
truncationを全く行わない場合:0.2457573。ますます悪くなる。
適度なtruncationが重要?ひとまずlogerrorのみにtruncationを行う。
ーnormalization
normalizationを追加:0.0762954 -> 0.0699197へ改善。normalizationはデフォで追加に。
ーextreme treeとのアンサンブル
extreme treeを使った結果との平均を取るアンサンブルを利用
結果:0.0699197 -> 0.0677271へ改善。
アンサンブルはやはり効果があると思われる。
今後もモデルの追加とstacking, blendingなどのテクニックを追加していくと良さそう。
しかしまだまだ最下位に近いので大きな改善を目指さないときつそうである。
Neuroscience-Inspired Artificial Intelligence
DeepMindのDemis Hassabisが主著者の論文。
ニューロサイエンスとAIの関係性と将来性について述べたもの。
しっかりと読んではいないが、主にDeepMindの研究紹介になっているもよう。
結論の部分が唯一印象に残っていて、
「ニューロサイエンスそれ自体はAIに解を与えるものではないが、そこで観測された現象に対する
アルゴリズム的な興味を与え、AI分野における研究指針を与えるという意味で有用」
というような事を書いているのが面白く感じた。
関連する話として、最近ではCVPR2017であった講演
James J. DiCarlo, The Science of Natural intelligence (NI): Reverse Engineering Primate Visual Perception
にて、画像を一瞬見せてそれが何か分類させるタスクを人にさせた所、
タスクの難易度が上がるほど分類精度を上げるために画像を見せる時間を上げる必要がある事が分かったそうである。
この事実は聴衆をインスパイアしたそうで質問者が殺到していた。
今後はこれに関する研究が増えるのかもしれない。
ただ、すでに幾人かの研究者が同じCVPRで関連研究を提案していた。
例えばアルゴリズムにフィードバック構造をつける事でタスク(の難易度等)に応じて
適応的に推論プロセスを発展させていける構造が提案されている。
ーFeedback Networks、http://feedbacknet.stanford.edu/
ゲームとAIとヒューマンインタラクション
現状のゲームベースの研究でメインなのはAIと環境とのインタラクションな気がしている。
実際学習モデルも環境からのフィードバックを元に行動を決定したりしている。
この環境の部分をもっと直接的に人に変える事はまだまだ難しいのだろうか。
例えばデータに関していえばMMOなどのたくさんの人とAIが入り混じる環境を用いればもっと効率よく
正解データが作り出せる期待がある。
正解データが大量に作り出せる土壌がそろえば、研究はかなりやりやすくなるので、
AIのヒューマンインタラクションをもっと広い土壌で学習できないだろうか。
現状は文書ベースの会話のみに終始しており、ゲーミフィケーションもあまり
聞いたことがない(知らないだけかもしれないが)。
Rademacher Complexityの考え方
understanding machine learningに出てくるrademacher complexityの導入がなんかしっくり来た。
まずある分布DよりデータSが与えられた時、representativenessという指標を次のように定義する。
ここで、Fは仮説クラスHが与えられている時、あるサンプルを入力として損失を出力する写像集合。 この指標が0に近いほどデータSによる損失計算が真の分布に基づく損失に迫っているため、正しい評価ができている事になる
ところで真の分布Dは分からないので、実際にこの指標を評価する場合は、交差検定と似たようなノリでデータを切り分けて以下のように近似する。
S1とS2の切り分け方に関しては、σ1,..,σmを導入しσi=1ならS1、σi=-1ならS2とする。 さらにσの値は{1,-1}の2値一様分布からサンプルされると仮定する。 すると上の表現はもう少し一般化され次のようになる。
これでrademacher complexityが出てくる。
Rivalry of Two Families of Algorithms for Memory-Restricted Streaming PCA
Rivalry of Two Families of Algorithms for Memory-Restricted Streaming PCAを読む
概要
通常のデータに対するバッチ処理をベースとしたPCAと違い、 ストリームデータに対するPCAは、その問題設定から制約があり、従来手法の通りではうまくいかない。
その制約として挙げられるのは主にデータが逐次的に与えられるため、モデルを更新する必要がある事と、 リソースの問題でメモリ制約が存在する事、がある。 またPCAそのものを評価する場合においても、一般的に再構成誤差のみに注目した評価が行われるが、 実際は各主成分がどのように学習されたかについても評価する必要がある。 これをスペクトル誤差と呼ぶ。
この問題に対しては2種類のアプローチが存在する。 1つ目は確率勾配法に基づいて逐次的に最適化する手法(SPCA)だが、これは主成分が1つの場合のみ収束性が保証されている。 2つ目はデータブロック毎にべき乗法に基づき共分散行列のべき乗を求め、それを用いて主成分(固有値)を求める手法である(BPCA)。 この時各ブロック毎の経験共分散行列の積により共分散行列のべき乗を近似するのが鍵である。 しかしデータブロックサイズを決定する必要があり、それは簡単ではない。
結局のところ、SGDのPCAは一般的な次元における収束の証明がなされておらず、BPCAはブロックサイズが決定できず、実際問題どちらを採用するのが良いのかもわからない。 本論では、これら問題に対する対処を提案する。
本論では、1つ目の確率勾配法に基づく手法において、主成分数が1つより多い一般的な場合においても収束性を示す。 また2つ目のデータブロックに対するべき乗法においては、ブロックサイズを自動で決定する手法を提案し、 その利用によりより良い収束性が得られる事を示す。
どちらの提案手法も基本的なアプローチとして、対象とする共分散行列の固有ベクトル(固有値)をどれだけ効率よく計算できるかを考えている。 最適化時における各更新ステップでは、SPCAでは1サンプル毎にSGDの要領に沿って固有ベクトルの推測値を更新し、BPCAでは各ブロックに対して、一度に上記SGDと似た要領で固有ベクトルの推測値を更新する。
敵対的な観測が含まれるデータによる学習
論文
Online Anomaly Detection under Adversarial Impactを読む。
適当にまとめる。
概要
しかしセキュリティ分野においては、観測が敵対的に与えられる場合がある。
敵対的な観測により学習結果は偏りを生じさせられ、通常では受け入れられないような攻撃を正常として受け入れてしまう事になる。
その場合異常検知手法により外れ値を検出する事は敵対的観測を検知する上で大事となる。
従来手法では無限の訓練データが与えられる場合においては、敵対的観測がその中において指数関数的に与えられない限り学習プロセスが阻害される事はない事が分かった。
しかし無限の訓練データは非現実的なため、本論では有限の訓練データ上における考察を行った。 結局、訓練データのうちの数%しか攻撃者が制御出来ない場合であれば、攻撃者の施策はどのような努力を行っても失敗する事が判明した。
意味のある外れ値を見つける
Conditional Anomaly Detectionという論文を読んだ。
異常が検出された時にそれが意味のないものである事は多い。
そのためある異常検知がそうした意味のない異常ばかり検出してしまう場合、使い物にならない。
本論では事前知識に頼る事になるが、それを利用して「意味のある」異常のみを効率よく抽出する手法について説明している。
従来の異常検知は異常を一様分布として考えた時の、正常分布に対する判別問題のように扱う。
しかしそれでは限界があるという事で、最近は様々な論文にて異常の分布構造に対しても足を踏み入れる方法を模索している印象がある。