ざっくばらんメモ_9:kaggle, 技術適応力,コラボ重視の仕事スタイル

kaggle zillow

アンサンブルとresnet regressionを組み合わせるも結果は対して変わらず.

根本的のアプローチが間違っていると思われる.

kernelで公開されている手法では,割りと単純なregression tree系の手法を 組み合わせるだけで,ただ組み合わせる時の重み選択はかなり詳細に行われている.

そこで,今まで作ってきたモデルの重み付け和に関して, 線形回帰での学習を行っておき,学習した重みを用いてアンサンブルする.

ー結果,微量の改善.しかし順位に対した影響なし

技術における適応力を付けるには

技術は日進月歩であり、それに素早く適応していかなければ自分の能力はすぐに陳腐化してしまう。

しかし適応するには学習コストはどうしてもかかる。

それを削減するにはどうしたらよいのか。

学習コストの中で最も高くつくのは時間である。

時間が経つと学ぼうとしている事自体も陳腐化してしまい、結果として得られる効果も薄れてしまうからである。

では時間を減らすにはどうしたらよいか

1.金で時間を買う

これは外注すると言い換えても良いかもしれない。

学びたい事の本質を見極め、それ以外は賢く外注してしまうのが良い。

2.必要な事だけをやる

1.とも関連するが、目的を常に明確化し、そのために最低限必要な事を見極め、それだけを速やかに行う事が理想である。

しかし必要な事を見極めるのは簡単ではなく、実際はやりながら修正を加えていく事がほとんどになる。

3.評価可能な事をやる

評価可能でない事を目標にしてしまうと、その目標を具体化、細分化する事が難しく、つまり↑の1.2.を行う事も難しくなる。

また目標が達成されたかどうかの見極めも難しい。

ただし数値化にこだわると評価可能な事があまりにも少なくなるのでそこはトレードオフである。

4.リスクを知り、リスクを取る

3.で言う評価可能な事をやるのは実際は難しく、大抵は不明瞭な部分を残したまま進まざるを得なくなる。

そうした不明瞭な最中に素早く決断して前に進んでいく事も大事である。

この時、闇雲にやってしまうと失敗ばかりになってしまうのでここもまたバランスが難しい.

人材の流動性がないから目的の人材とコラボする日本のスタイル

アメリカでは,ほしい人材がいればヘッドハントしていく.

日本ではそれが難しいから,コラボをしようとする.

その場合,相手にもメリットがあり,win-win関係が結べるならば ビジネスとして理想的だが,そうでない場合(こっちの方が多い)は こちらからお金を出して協力してもらう.

これは間接的な雇用のようなもの.

しかしお金だけで解決しない利害関係もあるので, 契約関係の問題が面倒である.

似たような事は社内の部署間でも起きている.

またアメリカでは必要でなくなった人材は比較的解雇しやすい.

しかし終身雇用の文化が強い日本ではそれは難しい.

それに対して(ジェネラリスト?)教育を社員へ施し, 社内外で任意のコラボ(調整)が得意な人材を生み出す事で, 上記のスタイルを最大限確立しようとする.

しかしそれに失敗した人材はいわゆる窓際族になってしまう.

ざっくばらんメモ_8:kaggle, projective space

kaggle

Resnet regressionモデルを stackingを含めたアンサンブルモデルの中へ 組み込んで見る.

現在学習中(結構時間がかかる)

projective spaceを利用した線分及び面の表現

(x, y)2次元ユークリッド空間における線分は ax + by + c = (x, y, 1)(a, b, c)T = 0 の形式で表す事ができる.

ここで,l = (a, b, c)を線分と呼ぶ.

この時,係数をk倍した場合の kax + kby + kc = (kx, ky, k)(a, b, c)T = 0 も同じ線分を表しているため,このkに関する軸wを新たに含んだ (x, y, w)の3次元空間をprojective spaceと呼び, 対応する線分上の点を(x/w, y/w)で代表して表現する.

ここで,(x, y, w)が線分上の点を表す条件は 上式で(kx, ky, k)を(x, y, w)で置き換えれば, (x, y, w)(a, b, c)T = 0 になる.

これは面表現に拡張する事が可能で,今度は(x, y, z)3次元ユークリッド空間で 考えた時,ある3次元直線ax + by + cz + d = 0があってそれを法線として捉えれば 対応する平面を構成出来る.

すると結局3次元直線だけを考えておけば良い事になる. 対応するprojective space(x, y, z, w)表現は ax + by + cz + dw = 0 となる.

ここでn = (a, b, c)は法線ベクトル(必ずしも単位長でない)で 原点から平面への距離は D = w / ||n|| で表せる.(http://mathinsight.org/distance_point_plane)

ざっくばらんメモ_7:kaggle、ベンフォードの法則、他者の学習規則の学習

kaggle zillow challenge

前回出したresnetの結果をアンサンブル予測のなかに組み込んで 予測を行ってみる.

ー結果,0.0657365で改善ならず.

 resnetはアンサンブルしない方が良い事になってしまった.

 もう少しresnetの学習を続けてみて,再トライする.結果0.0657484でほぼ変わらず

Let’s See Your Digits: Anomalous-State Detection using Benford’s Law, kdd2017

ベンフォードの法則は自然に生てくる数字の発生頻度がある決まった法則に従う事を示す理論である。

本論では、その事実を最近のWebサービスであるWikipediaTwitterGitHubなどに対して成り立つ事をまず示す。

そしてこの事を利用して、ベンフォードの法則から外れた事象を異常として検知するシステムを提案している。

ベンフォードの法則自体は昔からある法則で、これから外れた事象を異常として検知する考え方も昔から 存在したが、それをWebサービス(ビックデータ?)へ適用可能な形に構築し、かつそれがしっかりと 働く事を示したという点で新規性があるのかもしれない。

Learning to Model Other Minds

マルチエージェントシステム的な設定を考えた時に, 他者の存在を考慮に入れて学習を行うようにする手法は すでに提案されてきているが,本論では特に, 他者もまた学習している事までを考慮に入れて, 効率よく自分の目的を最大限達成しつつ他者との協調を行えるようにしている.

この事が重要な理由は,この設定は最近注目されている分野である Multi agent reinforcement learning, hierarchical reinforcement learning (learning to learnも 含まれる?), adversarial net等,複数ある目的関数を同時に最適化するタスク全てに 適用可能だからである.

ここで提案されているエージェントは他者がどのようなpolicyを持ちパラメータ更新を行うかを モデル化し,他者のpolicy及びlearning stepへどのように影響を及ぼしていけば, 最終的に自己のrewardを最大化できるかを考慮に入れる事が可能になる.

これにより,従来の他者を考慮に入れない同時最適化では到達出来ない ナッシュ均衡を実現していく事が可能になる.

ざっくばらんメモ_6:kaggle, C++のVisitor

kaggle Zillow challenge

前回まででresent based regressionが動くようになったので 今回はモデルのセーブとテストデータに対する予測を行えるようにする.

結果無事resnetベースの推論モデルによる予測ができるようになってきた ので早速ある程度学習してからテストデータで予測をしてみる.

ー結果改善はせず.スコア0.0688108,学習が足りないのかもしれない.  もう少し学習を続けてみる事にする

C++におけるVisitorの仕組み

Visitorという設計概念を用いることで,入力の型に限定されない汎用的な関数を設計する事が可能となる.

これはelementとvisitorクラスから成り立っている.

まず始めにベースクラスとしてのelementを作成.ここではaccept関数を宣言しておき またありえる各elementのtype毎のベース関数を定義しておく.

次にベースクラスとしてのvisitorを作成.visit関数を作成した全てのelement typeに対して作っておく.

続いて各elementにおいてaccept関数を定義し,引数として入ってきたvisitorクラスのvisit関数をコールするようにする.

そしてvisitor derivedなクラスを定義し,その中で具体的なvisit関数の定義を行う.

この時,visit関数は引数としてelementクラスをとるため,各elementクラスに対して定義が必要になる.

以上の設計において,クライアントはvisitor derivedなクラスのinstanceを作成し, それらはelementクラスのaccept関数の引数として用いられる.

ここでは,elementクラスのaccept関数で定義した通り,引数のvisitorクラスのvisit関数が実行されることになる.

結局,最終的に実行されるvisit関数はelement,visitorクラス双方に依存して動作を変化させられる.

この設計は,複数typeのelement/visitorを再帰的に適用したい場合などにおいて便利な設計になる.

ざっくばらんメモ_5:gitのcommit頻度、Dvorak配列、コードの拡張性

git commitの頻度とタイミング

現状の機能を損なわない範囲で新機能を部位を最小単位でインクリメントし、 その度にローカルでコミットしておく。コミットの数は多くて良い。 そうする事で、予期せぬバグが発生した際、直近の正常動作する 状態へ戻す事ができる。

あるいは正常動作を担保するためにテストをこまめに書いておくのも重要である。

Pushする場合はそれらを1つの機能単位でpushを行う。

細かなコミットの集まりをプッシュしてしまうとコミットが簡単に 増えてしまい、その管理が難しくなるため、機能単位で必ず まとめてから行うと良い

Dvorak配列について

通常のキーボード配列はqwerty配列であるが、 この配列はキーを打つ上で最適な配列とはいえない。

歴史的にタイプライターを早く打ちすぎる事による故障を防ぐために あえて打ちづらくしている配列との事。

対して、キーの打鍵頻度などからより最適な配列として 提案されているのがDvorak配列である。

仕事などで長い間キーボードを打つ必要が有る場合には Dvorak配列を採用する事で仕事スピードの改善が期待できる。

コーディングにおける拡張性について

コーディングする際の構造を考える際、そのコードの立ち位置を知る事が指針になる。

書くべきコードが今後も変わる事のない特定のタスクに関するものの場合、 拡張性を意識する必要性は薄く、まだ抽象化などをあまり意識する必要もない。

一方、研究用途や、開発初期のコードの場合、今後新たな機能が追加されていく事が 十分予想される。

そのためコード自体を抽象化しておき、新たな機能を追加しやすくしたり、 既存の機能の変更を受け入れやすいデザインを心がける事が重要になる。

機能毎に、その機能のどの部分が今後追加、変更されやすいかを見極め、 それに合わせたレベルの拡張性、柔軟性を備えておけば、レガシーコードを捨てて 再度1から書き直すといった事態に陥りにくくなり、無駄をなくす事が 期待できる。

ざっくばらんメモ_4:kaggle, ACKTR, A2C, Semantic guide

kaggle zillow challenge

pytorchによるCNNベースのregressionモデルの構築を開始する。

モデルのベースはresnetを利用する。

torchvisionのライブラリ内にresnetのモデルがあるためそれを利用したい。

このモデルはそのまま利用するとclassificationの出力となってしまうため、

最後の出力部のみ線形出力を行えるように修正しておく。

ACKTR, A2C from OpenAI

最近のOpenAIのRLに関するベースライン手法を解説。

A2Cは従来手法であるAsynchronous Advantage Actor Critic (A3C)をsynchronousかつdeterministic にした手法。

synchronousかつdeterministicになったので、計算効率的が良くなり、アルゴリズム的にも扱いやすい と思われるが、この手法で従来のA3Cと同等の性能が出せるとの事。

ACKTRは従来手法のTRPOやA2Cよりもさらに効率的な手法で、A2Cにさらに少量の計算処理を増やすことで 実現可能な手法である。

ACKTRはKronecker-factored Trust Region (KTR)と呼ばれる空間を見つけそれ上の探索を行う事でより効率的な 強化学習における探索を可能にする。

KTRはNatural Gradientに関連する二次オーダーの最適化手法の一つで、Natural Gradientの効率的な近似計算を可能にする。 この手法は従来のTRPOと比較して高速である。

Superresolution with segmantic guide

最近良く見るようになってきた、semantic情報を援用した手法で、superresolutionに関するもの。

生成モデルにおける画像生成は、メモリや処理能力の問題から高解像度画像に対する適用が難しい。

StackGANなどの手法では段階的な生成を行う事で高解像度を実現しようとしている。

本記事では、そこで生成された画像をsuperresolutionの手法によってさらなる高解像度化を目指す。

具体的には、画像をcroppingし、抽出された画像と対応するsemantic segmentaion情報を共に 入力としたup-resolution networkを利用する。

ここでは、従来の画像入力だけのup-resolutionと比較して、semantic情報が付加されるため、 より高性能な高解像度化が可能になる。

これは高解像度化タスクが、対象画像に対するsemantic情報を多いに要求する事から性能向上が 理由付けできる。

興味深いのは、与える必要のあるsegmentation情報も別のモデルを用いて推論した結果を用いる事が 可能で、必ずしも人間により正確にラベル付けされたものを要求しない事である。

これは類似手法であるDeep Photo Style Transferでも行われている事である。

これは、異なる観点で学習されたモデルを組み合わせる事の効果(アンサンブル)を 示していると感じられた。

ざっくばらんメモ_3:kaggle、photorealistic画像生成

kaggle zillow challenge

今回解くべきタスクは各月に対するlogerrorであったが、

現在までは簡単のため月の区別はせずに予測を行っていた。

これは明らかな性能のボトルネックであるので、次に

月毎の予測を行うようモデルを切り替えていきたい。

ただ予測する年月は201610,201611,201612,201710,201711,201712どある一方、

訓練データには2016年のデータしかなく、2017年固有の要素を予測するのは

難しいと思われるので、年の違いは考慮せず、月に対する予測のみを考える。

月毎の予測に切り替えて結果を出したが、

見た感じだと、予測値は月によって変化がなさそうである。

結果:0.0660908で改善なし。

前回stackingありで性能が落ちていた事もあるので、

stackingなしでも試してみる。

結果:0.0660310でほぼ変わらず。

どうにも月に関する情報を活かしきれていないように感じる。

あるいは訓練データには10–12月の情報がないので、月の情報に関する外挿は難しいのかもしれない。

(あるいはバグがあるのかもしれない)

Photographic Image Synthesis with Cascaded Refinement Networks

photorealisticな画像をsemanticなレイアウト情報、画像のどのピクセルがどの物体へ属するかの情報、を援用する事で作成するというもの。

生成される画像は、一部うねりがあったりと完全に現実的な訳ではないが、従来手法と比較するとかなりリアルな画像生成ができるようになっているようである。

ある程度綿密なsemanticレイアウト情報が必要となる手法であるが、シミュレーション環境などを用いればシミュレーション画像→対応するsemanticレイアウト→本手法によるphotorealistic画像生成と繋げられるので問題はなさそうである。