社会人からはじめる機械学習勉強 Week 27 – 帰国・面接

2016/7/4~7/10

2016年1月に始めた機械学習の勉強。独学で勉強してSeRanetをリリースし、ついに転職面接までたどりついた。

今週は友達の結婚式のために日本に帰国する予定があり、ちょうどマレーシアの連休であるHari Rayaであったため、1週間日本に滞在していた。

面接

1次面接で自己紹介をした後、こちらの開発してきたSeRanetなどに関して質問があった。質問が実装の詳細にわたっていて、わざわざここまで見てくれているのかと感動した。そのあともパフォーマンスをさらに良くするためにどういったことができるかのアイデア共有やアドバイスをもらえて、面接がとても楽しかったことを覚えている。こういったエンジニアと共に働けたら刺激を受けながら成長できると確信し、より入社希望度が高まった。

結局面接は合計3回あった。

やることはやったので、あとは結果を待つのみ。ということでマレーシアに戻る。

社会人からはじめる機械学習勉強 Week 26 – 転職活動

2016/6/27~7/3

7月には転職面接を受けると締め切り設定を課して、この締め切りに合わせてアプリ開発を行ってきた。少し無理やりに近い日程だったけど、SeRanetのリリースは達成し、とうとう実際に転職希望メールを送った。

本当はもっとパフォーマンスよくして、State of the artを超すレベルの超解像ソフトを作成したかったのだけど、設定した締め切りに間に合わなかった。このままずるずると開発を延長しているときりがなくなるので、割り切ってこの段階で提出することにした。

転職活動

転職活動とはいっても、転職紹介サイトには登録せず、本命1社のみにメール送っただけなので、そこまでたいしたことはしていない。会社に通常勤務して、合間の時間や家でメールしてただけ。

第一転職希望先

メールの返信が来て書類選考は通過。日本に帰国している7/5に面接を設定してもらった。

ヘッドハンティング

これは結構びっくりしたのだけど、SeRanetのSlideshareを公開してすぐ(1日後)に、ヘッドハンティング会社から機械学習に取り組んでいる企業を紹介したいとメールがきた。

この時点でSeRanetのSlideShareの内容や人気度を見て判断したわけではないと思うので、完全に「機械学習分野に精通していそうな人材」にヒットする人に手あたり次第連絡を送っているのではないかと思うのだけれど、それだけDeep learningの分野での人材確保がホットであるということがわかって面白かった。

結局このヘッドハンティング会社から1社紹介してもらうことになったのだけど、結局面接の日程が合わずに先に第一転職希望先が決まってしまったので、こちらの面接はしなかった。

社会人からはじめる機械学習勉強 Week 25 – SeRanet公開

2016/6/20~6/26

7月には転職面接を受けると締め切り設定を課した。
この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。
→とりあえず完成はした!!が、Performanceがよくなければ意味がない。パフォーマンスよければ自信でるんだけど。

転職活動

結局SeRanetはぎりぎりで完成という形だったので、機械学習を行っている会社をたくさん調べ上げる時間は取れず、特に気になっていた1社にのみ直接メールを送ることにした。転職紹介サイトなどへの登録もせず。

SRCNNの公開


inference, compareの実装
githubの公開はしたけど、まだREADME.mdも書いていないし正式リリースにはなっていない状況。infrerence, compareの実装はOK.


トレーニングにあまりに時間かかるのであんま進んでいない。CRBMがうまく機能していないような気がする。どうやったらgabor Filter得られるのだろう。。。


転職活動を真剣に進めるため、休みとって一日やった。本当は今日までに転職希望先にメール出すことを目標としていたけど、できなかった。理由は志望動機、履歴書などの作成にももう少し時間とりたかったため。

SeRanetに関しては以下の二つを終了させる必要がある。
1.github公開 → DONE。README.mdも書き終わり、今日を正式公開としよう。 PEXELSから写真Distributionの許可もとった。
2.Slideshare → パワポあと少しまで行ったけどまだ終わってない。。

木 ついに転職希望のメールを出す。
家で開発成果、志望動機、履歴書、およびパワポも完成させてSlideshareにて公開。その後転職希望先にメール送った。夜2時すぎ。


これからはcNote充実に費やしたいかな。


Slideshare英語訳もしたい。


BBQパーティーに時間とられてほぼ何も進められなかった。。。
Topcoder 12時間勘違いしてて参加逃した。。。

社会人からはじめる機械学習勉強 Week 24 – SeRanet実装

2016/6/13~6/19

7月には転職面接を受けると締め切り設定を課した。
この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。
→とりあえず完成はした!!が、Performanceがよくなければ意味がない。パフォーマンスよければ自信でるんだけど。

SRCNNの実装、パフォーマンスチェック

waifu2xの差別化としてRGBでTrainingさせることに決定。
RGBのコードを実装。その際にYonlyのコード内に重大なBugがあったことが発覚。。Y_dataが正しくなかった。今までのTrainingは全部無駄だった、、。

プロコンは2章巻末問題を1日1問解いていくことに。

SinraMediumをRGBでTraining。1日くらいかかった。

SinraMediumとwaifu2xのPerformance比較。大体の写真では大差なかった。
が、一部の写真でwaifu2xではJPEG Noiseがのっていて、その部分はSinraMediumの方がよさそう

Sharpnessはどちらもあまり良くなかったのでこの部分もっと改良できればすごいものになるなあ、と思う。

chainer imagenetのサンプルコードをcifar-10のデータを使って無理やり回してみた。
train.py参考にすべき、とてもよい。

Chainerでmlpconv Layerが実装されていたので、その元論文読んだ。Network in Network MLPと言っているけれど、これはただ1×1のConvolutional layer重ねたのと同じ計算しているだけであって、そんなに面白くないと思う。

社会人からはじめる機械学習勉強 Week 23 – Convolutional RBM 2

2016/6/6~6/12

7月には転職面接を受けると締め切り設定を課した。
この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。
→2016/6/5 このままの進捗だと達成は厳しい。Realでの動作がうまくいっていない。
      追い込んでいかないと無理!
→2016/6/12 土日にはかどったので、とりあえず完成はした!!
      あとは、Performanceもっとでれば自信でるんだけど!!!。。。

Convolutional RBM

RBMから考えるDeep Learning ~黒魔術を添えて~を読んで、(これは下記の日本語訳”A Practical Guide to Training Restricted Boltzmann Machines” )Binary Unitを用いたCRBMのエネルギー関数のままで、連続値扱えば無理やりいけるんじゃないかと思えてきたのでそれを試すことにした。

実際のPexels写真データを用いたCRBMのPretraining code実装。今週中にPretrainingまで動作確認できた。

SeRanetの動作確認

Chainer版SRCNNであるSeRanet。fusion, splice関数の実行および、動作確認までおわりとうとう完成した。これから動作確認とPerformance checkを行う。

現状は、Fusion, Splice, CRBMを導入したことによるメリットがそこまで出ていない結果となっている。もうすこしいろいろNN設計いじって比較検討したい。(でもすぐにでも公開・ブログ書きしていかないと7月のInterviewに間に合わない。。。)

社会人からはじめる機械学習勉強 Week 22 – Convolutional RBM

2016/5/30~6/5

7月には転職面接を受けると締め切り設定を課した。
この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。

Convolutional RBM

Convolutional RBM=CRBMの動作確認すること。いろいろとバグがありなかなかうまく動作しなかった。。。当初の予定より時間食ったけど、BinaryでのCRBMはOK!ただ、CRBMの動作Realがどうしてもうまく学習しない。。。難しい。。。

現時点でのStock

最近やりたいことをまとめなおす

  1. CRBMに集中。とにかく早く完成させたい!
  2. プロコン → コンスタントに積み上げていきたい。
    1. Const. 蟻本 
      – 6月中に4章読みたい。
      上級編はどういったアルゴリズムがあるかのメタ記憶のみでよし→実装なしの流し読みでいいので5ページ/日 進めていく。
      – 7月中に本もう1週して、基礎の単語・アルゴリズム全部暗記する。(ノートにまとめていく)
    2. プラグイン改良
      C/C++ Single file execution pluginをアップデートしてSRMで使えるようにしたい。
      – スペース文字対応。
      – output PATHの制御
      → OK!!!
    3. 問題の数こなす。(週1問とか?)
      もしSRMでBlue coderになるのがまず目標ならば、SRMの過去問数こなしておきたい。特にString, charの扱いに習熟しておきたいところ。

目標設定および振り返り

WK20
Step1 waifu2x仕様で実装、週末に電源買う。→OK.

WK21
Step1 waifu2x仕様で実装、Step2 BN入れる。家のPCで動作・パフォーマンス確認
→OK. 結論として今回のような情報復元タイプの機械学習にはBN入れない方が素直に良いと判断。BNは不採用の方向で。
早く終わったので、その分をCRBMの実装に回して、CRBMの実装終了まで行けた。

WK22 
Step3 CRBM作成、cNoteで技術ブログ書き込む。

WK23
Step4 Fusionさせたもので動作させてみる。
→これで徹底的にディープにしてもよいので、パフォーマンスよければ。。。。

WK24
公開 & cNoteに技術などいろいろと書き込む。
→パフォーマンスダメだった場合は、、、
WK24 Scene detectionのLayer(Global feature)も入れ込んで、Fusionさせてパフォーマンス確認 & 公開 & cNoteにいろいろと書き込む。

WK25
100 star 達成。 週末にメール送る。
→* 追記:結論を先に書くと100 starなんてまったく達成できなかった。。。

WK26
Interview準備、まとめ。

WK27
Interview

その他勉強したもの

DeepPose: Human Pose Estimation via Deep Neural Networks

Deep Pause: 人間の部位位置検出をしている。 → 位置検出・Translation invaliantではない例のいいものになりそう?

Chainerについて調べていたらアプリがgithubにあるのを偶然見つけた。(論文とは別の人が実装した非公式サンプルアプリ)

github
https://github.com/mitmul/deeppose

論文
http://arxiv.org/abs/1312.4659
http://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/42237.pdf

社会人からはじめる機械学習勉強 Week 21 – Chainer RBM実装

2016/5/23~5/29

7月には転職面接を受けると締め切り設定を課した。
この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。

Chainer RBM

RBMの実装試す。やっぱり理解するのに時間がかかる。。。
今週はPersistent CDの実装見直しなどしてた。

SRCNNのパフォーマンスを上げるために、教師なし学習を用いて精度があげられないかと考えた。教師なし学習としてRBM、それをimage processing に応用するためにConvolutional RBMに興味を持った。
論文読む、Convolutional RBM(CRBM)のFormulate & 実装へ。
いろいろと論文を読んだりしてRBMの理解を深めていた。
連続変数のRBM・PCDの実装・reconstruct・Sparsityについて
特に連続変数のRBMはまだ理解できてないし、ここはしっかりと抑える必要がありそう。
参考リンク:Theano 入門

予定通りCRBMのFormulation・実装に入った。
理論は特に問題なさそう、あとは実践でちゃんと動くかどうか。

論文

Continuous RBMの実装として以下の論文読みたい。

Sparsityについては以下の論文たちを参考にしたい。いくつか異なる手法がある模様。

その他メモ

面白そうな論文見つけた。Deepmindの社員の論文で、2016Award取ったみたい。

社会人からはじめる機械学習勉強 Week 20 – Chainer入門

2016/5/16~5/22

機械学習業界に転職するために勉強をしてきて半年近くになるわけだけど、とうとう先週、7月にはInterviewを受けようということで一つの締め切り設定を課した(ちょうど7/2から日本に帰国する予定があったため、その予定と締め切り設定を合わせた)。この締め切りまでに成果としてChainerでのSRCNN実装を終えたい。

Chainer

いままでTheanoライブラリを使って機械学習を行ってきたけど、他のライブラリフレームワークはどうなのか?ということで、Chainerを使ってみることにした。なぜChainerにしたのか?

  • 日本製である
    Preferred Networksという日本の会社が作ったオープンソースなプロジェクトであることが非常に親近感を持てる。
  • Define by run スキームの採用
    正直まだ、厳密な違いとか分かっていないんだけど、、、メインコンセプトとして、Chainerと他の機械学習ライブラリとの違いは、従来の機械学習ライブラリの大半がモデルを決めて構築してから実行するのに対して、Chainerはモデルを毎回実行時に構築できるという事でより柔軟なニューラルネットワークの設計が可能になるという事。
    今後、開発でいろいろなモデルを比較・検討したりモデルを組み合わせることによって従来以上の成果を上げることを目指すといった場合にこのモデル構築の柔軟性は重要になると感じた。
    (個人的にはOBSと組み合わせた動的なニューラルネットの刈り込み・うまく活性していないユニットのパラメータ再初期化による効率活用に興味がある。Adaptive learning?)
  • GPUの高速化に力が入れられている。
    GPUではnumpyの代わりにcuda.cupyを使用することで、GPUデバイス上での計算を高速に行えるようになっているのなど速度面も不足なし。

機械学習ライブラリの比較については下記参照。

SRCNNを改良するためのアイデア

ChainerでのSRCNN実装にあたってのIdea だし。ブレインストーミング的な感じで、思いついたアイデアをここに書き出しておこう。

1.Global ContextはColorizationのPaperにあったようにPlaces2の景色ラベルを使って教師あり学習させればいい、、、?→ただ、これだと学習する要素がGlobalすぎないか?実際にほしいのはもう少し細かい部分Middle featureのはず。

例:毛並、岩肌、木の葉っぱ、、、といった細かい部分の特徴を検出して、ディティールを再現するようなソフトがほしいわけ。ただ、これらの特徴をどうやって学ばせるか?写真の各部分でラベル貼り付けされているものなどはないので、教師なし学習による特徴量の抽出がしたい。

2.上の用途に関しては、Google の猫の顔を教師なし学習で構築した以下の論文が参考になるかも。

“Building high level features using large scale unsupervised learning”

読了。

要約:Filtering (Weight shareしていないのでConvolutionとは言わない!), L2 Pooling, LCN(Local Contrast Normalization)の3層×3の計9層からなるDeep learning。YouTubeからのランダム画像を10Million枚用いた、教師なし学習での特徴抽出タスク。パラメータ数が1Billionあり、16コア×1000台のコンピュータで3日間かけてのトレーニングという超莫大なデータ量及び計算リソースを使ってでた結果として猫の顔などを自然に特徴抽出できた。

以下、Convolutional Restricted Boltzmann Machine について調査。

Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations

読了。

要約:CRBMを用いて、教師なし学習での画像特徴抽出。

Layerを重ねるごとに、Edge→Parts→Objectといった特徴の抽出を実際に達成している。

  • CRBM:Convolutional RBMの提案
    – Visible layerとHidden layer
  • Probabilistic Max Pooling  
    – Pooling層に対応するものをこれで実現。これによってTranslation invariantな性質も持たせることができる。

CONVOLUTIONAL DEEP BELIEF NETWORKS (ppt)

Empirical Evaluation of Convolutional RBMs for Vision

その他

DeepPose: Human Pose Estimation via Deep Neural Networks

Deep pose: 人間の部位位置検出をしている。 → 位置検出・Translation invaliantではない例のいいものになりそう?→結果としては、CNN + MLPの組み合わせでx,y座標を算出しているだけだった。SRへの応用は難しそう。

Chainerについて調べていたらアプリがgithubにあるのを偶然見つけた。(論文とは別の人が実装した非公式サンプルアプリ)

github deeppose

論文

Chainer 実践

SRCNN

Chainer で SRCNNの実装した。

実装始めるまでのChainer勉強にはかなり時間をかけたけど、一度実装を始めてみると、豊富なLink, Functionが揃ってるので、実装はとても簡単にできる印象。Theanoの方からのコード移植という事もあり0からの実装ではなかったが、木曜・金曜の2日間だけで終わってしまった。

日曜にはwaifu2x仕様での実装チェックOK. ChainerにCudnn入れたら驚くほど速くTrainingが終わっていく。。。BNでのチェックもOK, 結論としてBNは入れない方が良いだろうという事に。 (Sigmoid Fnには有用だけど、Leaky ReLUには対して有効じゃなさそう & 今回は画像の復元系なので、もともとの値が重要。BN入れると相対差を重要視しちゃうのであまり良くない(実際黒潰れの写真などができてしまう。))

RBM

目標設定(改め)

7月に

WK20
Step1 waifu2x仕様で実装、週末に電源買う。

WK21
Step1 waifu2x仕様で実装。
Step2 BN入れる。家のPCで動作・パフォーマンス確認
上海行くのであんま進まないかも、、、

WK22
Step3 CRBM作成、cNoteで技術ブログ書き込む。

WK23
Step4 Fusionさせたもので動作させてみる。
→これで徹底的にディープにしてもよいので、パフォーマンスよければ。。。。

WK24
公開 & cNoteにいろいろと書き込む。→パフォーマンスダメだった場合は、、、
WK24 Scene detectionのLayer(Global feature)も入れ込んで、Fusionさせてパフォーマンス確認 & 公開 & cNoteにいろいろと書き込む。

WK25
100 star 達成。 週末にメール送る。
→* 追記:結論を先に書くと100 starなんてまったく達成できなかった。。。

WK26
Interview準備、まとめ。

WK27
Interview

社会人からはじめる機械学習勉強 Week 19 – TheanoでSRCNN実装5 公開

2016/5/9~5/15

SRCNN実装

勉強だけでは実力は身につかないので、実践して見ようという事で、waifu2xで資料があることからSRCNNをTheanoを用いて自分で実装してみることに。

*このプロジェクトはtheanonSRとしてgithubで公開済み。

公開

4週間前から行ってきた本プロジェクトも、まとまりがついてきて公開するところまで来たので、公開した。結果として望むパフォーマンスは全く出なかった。なので今回のソースコード公開はあくまでTheanoでのSRCNN実装をシェアするだけの教育的なもの。(実用価値はほぼなしってこと。)残念。

なにはともあれ公開したのはこちら。

中期計画見直し

WK17, 18

実際にいろいろなパラメータでテストしていく。
パラメータと動作時間の関係を出していく。
可能ならAWSでの環境構築もしてしまいたい。
 →2016.5.9 [結果] 予定通りできていたけど、パフォーマンスが良くない。

WK19 可能なら動画への応用検討を開始。

(これができるようならマネタイズもできるかも。)Star 100とれないかなー?
 →2016.5.9 結局全然プラン通りに行っていない。プラン修正の必要あり、chainer使って再チャレンジ

WK20,21,22 動画への応用へ。
 →2016.5.9 結局全然プラン通りに行っていない。プラン修正の必要あり、chainer使って再チャレンジ
  WK20, 21で開発
  WK22, 23でトレーニング
  WK24で公開

2016/5/9 感想
結局第1プラン通りのスケジュールではいかなかった。
このままずるずるとスケジュール変更が重なるようだとよくない。。
→7月に日本に帰国する予定があるので、
 結果が出ても出なくても7月までにはInterview終了させること。
 そのために他の会社受けるなり、Interview受ける前に辞表提出するとしても。

社会人からはじめる機械学習勉強 Week 18 – TheanoでSRCNN実装4

2016/5/2~5/8

SRCNN実装

勉強だけでは実力は身につかないので、実践して見ようという事で、waifu2xで資料があることからSRCNNをTheanoを用いて自分で実装してみることに。

*このプロジェクトはtheanonSRとしてgithubで公開済み。

Padding問題の根本原因を見つけた。→TheanoのConv2dにPadding任せちゃうとダメ。0パディングされちゃう。代わりにnumpy使って自分でPaddingするよう実装変更した。

32x3x3_32x3x3_32x3x3_1x3x3にてチェック中。→なんかただパラメータ値によって誤差関数がランダムにFluctuateしてるだけな感じで、モデルの表現に限界がある気がする。うーむ、どうやったらパフォーマンスもっとよくなるのかなぁ。。。

最近読んでる論文集

SRCNNを良くするためのアイデアソースとするため。

1.OSD
http://ee.caltech.edu/Babak/pubs/conferences/00298572.pdf
https://papers.nips.cc/paper/647-second-order-derivatives-for-network-pruning-optimal-brain-surgeon.pdf
https://papers.nips.cc/paper/749-optimal-brain-surgeon-extensions-and-performance-comparisons.pdf

結局OBDはCNNには必要ない気がしてきた。

CNNにおけるUnitとは、Feature mapのことで、この場合Feature map数はあまり多くないから、それぞれ実際に”Pruning = そのチャンネルにおけるWすべての要素を0にする”して試してみればいいんじゃないかって気がしてきた。計算量的にわざわざHessianを計算する必要はないと思う。

2.ディープネットワークを用いた大域特徴と局所特徴の学習による白黒写真の自動色付け
→ここで紹介されていたLayerのFusion はSRCNNでも是非試してみたい!!!

3.Batch Normalization

ニューラルネットがディープになっていったときに、Gradient descentが機能し続けるように入力データを平均からのずれで整形する方法。
http://jmlr.org/proceedings/papers/v37/ioffe15.pdf