ざっくばらんメモ_20:kaggle, visitor function

kaggle recruit challenge

code

Kernelにて今まで公開されてきたメソッドをアンサンブルして LB0.479を実現しているものが公開されていた。

利用されているメソッドの中に自分の公開したものが含まれていた。

そのおかげか自分のkernelがブロンズを獲得。

ただこのメソッドは以前使っていたもので古いので、最新のやり方で出した結果で置き換えたら性能向上できると 考えトライ。しかし結果は変わらず。

現在93位。

visitor functionの作り方

多型な関数表現をしたい時に役立つプログラムデザイン。

elementとvisitorという2つの概念がある。

elementクラスはvisitorクラスを入力とするvirtual accept関数のみを持つ。

この時、想定する全ての型をelementのinheritanceとして宣言。

各element毎に固有の動作を定義しておく。

各elementはinheritanceされてきたaccept関数を持つ。

次に各elementを入力とした関数を持つvisit関数を持つvisitorクラスを宣言。

ここで各elementのaccept関数を定義し、それらは入力されてくるvisitorクラスの visit関数に対して自身(elementクラス)を入力として実行するようにする。

最後に、visitor継承クラスを(複数)作り、それぞれにおいて各element毎にそのelementを 入力とするvisit関数の内容を定義する。

以上をクライアントが利用する場合においては、 クライアントはvisitorクラスのインスタンスを作成し、 それは各elementに関してaccept()関数を通して実行される事になる。

結果、異なった型を持つelementに関して同じvisitor関数を用いて処理が行えるようになる。

ざっくばらんメモ_18:kaggle, MCMC w/ human preference, classificationと文化

kaggle recruit challenge

code

今までsklearnのGridSearchCV関数などを利用して 自動パラメータチューニングを行ってきたが、時間がかかる割に 性能が改善されない。

Trainデータ内でcross validationにより作るvalidationセットが実際の テストデータと整合していないのか、あるいは別の原因があるのかも しれない。

いずれにせよ、今回手動でsubmissionして得られるLBスコアを見ながら 手動でlightgbmとxgboostのパラメータをある程度チューニングし、 最後に2つの予測結果の平均を取ってみた所、 結果:LB0.492まで向上。

しかしこれ以上は新たなアプローチをしていかないと性能が上がらなそう である。

MCMC with human preferences

NIPS 2017 John Platt's Opening Remarksより。

物理的な実験において、パラメータ設定を行う際に, パラメータサンプリングの度に人からそれが好ましいかそうでないかのフィードバックを もらう事で,human preferenceの山登りをするイメージでサンプリングパスを描く.

classificationは現在の文化を表現する。

NIPS 2017 KeynoteであるThe Trouble with Bias, Kate Crawfordを見た。

まずプレゼンが非常に上手くてそこに感動したが、内容も非常に興味深かった。

内容は学習された機械学習モデルが持ってしまう望ましくないbias(例えば性差別的観点) の問題についてのもの。

今までは、望ましくないbiasに対しては正則化してneutralizedして解決と考えていたが事は そんなに単純ではないようである。

中でも面白かったのが、classificationの歴史とそれがいかにその時々の文化を象徴しているか という事であった。

例えば、画像分類データで一番出てくる人名(クラス)はジョージ・ブッシュだと知られているが、 これは彼の画像がマスコミなどで頻繁に露出しており、それだけ社会的に重要視されてきた証である。

つまり社会的に、あるいは文化的にその時重要だったものがデータ分布を決定し、 またその分類に関するtaxonomyを決めてきたという事である。

実際分類の歴史を紐解くとそれは時代によって次々と変化しており、直近だと、google formで選べる 性別は2つから数十個に増えたらしい。

こうした事から、biasを直すという事はつまり文化、社会のレベルまで働きかける事が本質的には 必要で、データはneutralだから差別してしまう人間より遥か良いというような数年前の論調は間違いで、 上記の難問を解かない限り、またAI winterが来てしまうかもしれない。

ざっくばらんメモ_17:自動パラメータチューニングの良し悪し

自動パラメータチューニングの良し悪し

kaggleなどでxgboostなどのチューニングを行うことを考えたとき、 何も考えずに広いパラメータグリッド内で最適化しようとすると 当然ながら非常に時間がかかる。

しかもそうしてやって得られた結果が割と大した改善にもなっていない事が多い。

そのためパラメータチューニングをする際にはある程度human in the loopをした 方がまだ効率的である。

つまり、序盤の事前知識がない状態においてはなるべく粗く、でも広くパラメータグリッドを取り、 まずはどのあたりのパラメータで性能が出そうか人手で当たりを付ける。

続いて当たりを付けたあたりのより狭い範囲で、しかしグリッドの粒度を上げた形で さらなる探索を行っていく形である。

だがこれはグリッドサーチに限った形で、例えばランダム探索やbayesian optimisationと比較した 場合にどちらが効率が良いかは気になる。

ざっくばらんメモ_15:kaggle, deepnetの特性解析, 既約性メモ

kaggle recruit

Recruit Restaurant Visitor Forcasting Challengeをスタート.

コード

レストランの将来訪問者数を予測するタスク.

分析はすでにやられていて参考になる

https://www.kaggle.com/headsortails/be-my-guest-recruit-restaurant-eda

ひとまずkernelにあるスターターを参考にxgboostを実装.

ー結果:0.516

sklearnのgridsearchCVで適当にパラメータをふってチューニングしたところ

ー結果:0.512

あまりうまくないので他のkernelのパラメータも参考にしつつ手動チューニングも 取り入れたところ

ー結果:0.500

でまあまあな感じに.

他にもlightgbmも試しに適用してみたところほぼデフォルトのパラメータで

ー結果:0.493

でxgboostよりも良い感じに.今回のタスクはlightgbmが相性が良い?

現在ランク:171/707

Failure of Gradient-Based Deep Learning

この論文を読んだ際に気になった事として, 最適化の収束速度,sample complexityなどの観点からdeep learningモデルの性能を改めて評価している点がある.

例えばEnd-to-Endモデルは複数に分解して別々に学習するよりもはるかに収束速度が遅くなるから 良くないなどとしている.

通常の論文などはとりあえず一般的の指標でSOTA出せばOKな風潮がだいぶ根付いてきたが, 改めて多面的な評価、あるいはモデルの特性の理解、の重要性を訴えている感じがする.

実用面だとただ性能が良いだけでは結局モデルの一側面でしかないので, モデルの特性解析を理論抜きでやるはめになり,イレギュラー対応など頻繁に発生して 保守が難しい面があると感じる.

irreducabilityとintegral domain

あるvariety Xが与えられた時、それが非ゼロでXそのものでない 二つのvariety X_1, X_2で表せる時,Xはreducibleと言い、 そうでない場合はirreducibleであるという。

Xがirreducibleな時のみにおいて、そのcoordinate ring Γ(X)は整域(integral domain)となる.

つまりXがreducibleな場合、X上に定義される非ゼロ関数が2つあって, その積がゼロ関数になるものが存在する.

例:Xはx2+y2=1の解集合とする.Γ(X)=C[x,y]/(x2+y2-1)なので、f=x-y, g=x+yとおけば これらはΓ(X)上でゼロ関数でないがfgはゼロ関数である.つまりΓ(X)は聖域でなくreducible.

ざっくばらんメモ_15:capsule network, model switchingとdomain adaptation

capsule net

最近急に話題になり始めたcapsule networkに関するHintonの講義を見た.

この新しいモデルの一つの動機として従来のconvnetはpooling処理があるせいで,同じ物体に関する様々な観点の特徴を捨てて代表値で代替してしまう事かある.

Capsule netはそれを回避する事が出来る.

これはautoencoderを用いたデータ再構成を考えた時に,従来のconvnetを使ったVAE的な やり方において,細かな復元が難しい問題へ対応可能かもしれないと考えた.

model switcingに基づいたdomain adaptation

最近のdomain adaptationの手法はGANの要領でdomainギャップに関する目的関数を学習して最適化する手法が berkeleyからよく出ている(例えばCyCADA).

ところでdomain adaptationの文脈ではtarget domainの教師情報が与えられていない想定が多いが, 最近は教師情報のコストが下がり始めたおかげかそういう場合は減ってきたように思う(domainごとに偏りはあるが).

なのでむしろどのdomainに対しても教師情報があって良いから状況に合わせて能動的にモデルをスイッチングできるような ネットワークがもっとあって良いように思えた.

最近だと制御分野で出始めているが,条件が色々限定されているのでまだ形式化されていないのかもしれない.

古典的にはswitching linear dynamics modelとか他にも色々あるが,最近のconvnet等でそれを効率よくやる方法は あるのだろうか(特に計算・メモリ効率的な意味で)

ざっくばらんメモ_13:kaggle, 教師コスト

kaggle seguro

code

objectiveを’reg:linear’に元に戻す.

少なくともパラメータ選択で性能向上する事を確認したい.

パラメータ選択の範囲が狭く局所解へ陥っているのかもしれない.

代わりにもう少し広い範囲でパラメータ検索を行ってみる.

また並行して別のモデルを追加していく.

まずはlightgdmを追加してxgboostとのensembleを適用.

結果:0.265でxgboost単体の0.269と比較して微減

教師あり学習のコストを低減したい

最近は主にdeep learning系の研究テーマの動機づけとして, 教師あり学習におけるデータ作成コストの低減が良くあげられるようになってきた.

例えば,deep learningのモデルは学習のため大量のラベル付きデータが必要, 複雑化していくタスクのためにデータ単位辺りのラベルコストも上昇している, 等である.

そのための方法として強化学習ではcuriosity driven search,教師ありでは Self-supervision,transfer learning,あるいはsimulationの利用などがある.

そうした結果はしかし従来のラベル付きデータによる教師あり学習を代替出来るには まだまだ遠く,現状は組み合わせて使う事で性能向上をサポートする事を可能に出来ると いったレベルである.

一方,人為的のろベル付きコストも削減され始めている.

これは単純にラベル付け会社が増えて競争が発生している事と,ノウハウが溜まって 効率化出来てきている事に起因している.

実用面では人為的なラベリングが圧倒的に単純なので, 今後,上記の教師あり学習コストの低減手法が実用化するまでの道のりは遠い.

しかしエッジケース,そもそも現実世界で集めにくいデータ,に完全にフォーカス すれば実用性は向上しそうである.

この場合人為的にデータを集めてラベル付けする事のコストが非常に高くなるからである. 例えば,自動車の安全機能のテストのため,事故データを大量に集める事は出来ないし, 集まったとしても詳細なデータは得辛い.

また曖昧なタスクは人手で定義するためのは難しいが,self-supervision, curiosity, 逆強化学習などを通して データから自然なタスク定義を導き出す事が出来れば非常に有用である.