nyaaaaaam’s

データサイエンスの技術のこと,仕事のこと,育児のこととかを書いていきます

Goodfellow et al (2016)のDeeplearningが良かった

f:id:nyaaaaaam:20181010221326p:plain

少し前から,Goodfellow, Bengio & Courville (2016)のDeeplearningを読んでいます.ほとんどの方がよく知っている本かもしれません.表紙が悪夢のようなイラストの本です.

本のサイトはこちらhttps://www.deeplearningbook.org

GithubでPDF版も配布されています(僕はこちらを読んでいます). github.com

こういった技術書は紙のほうが読みやすいという人は,印刷版を買うのも良いと思います.

Deep Learning (Adaptive Computation and Machine Learning)

Deep Learning (Adaptive Computation and Machine Learning)

もともと,この本はよく通勤中やランニング中に聞いているポッドキャストのひとつ,misreading chatで紹介されていたもので,興味を持っていました.ひょんなことから会社で印刷版を買うことになり,自宅に持ち帰ったりするのが面倒だったので,結局PDF版を読んでいます.

先日,第1部のApplied math and Machine Learning Basicsを読み終わりまして,結構感動したことが多かったので,その感想を雑にまとめておきます.

数学的道具の説明が必要かつ十分

本書では,機械学習全般,特にDeeplearningの歴史を振り返りつつ,近年の動向を概観した後に,線形代数の基礎的な話が始まります.大学院の研究で普段線形代数をめちゃくちゃ良く使うので,こういう線形代数の話は耳にタコができるほど聞いてきたのですが,シンプルかつ明快な線形代数のイントロがとても心地よかったです.特に,固有値分解の一般化としての特異値分解,ムーアペンローズ一般逆行列などの説明が好みでした.最後に,学んだことを使って主成分分析を導出するエンディングも,素敵です.

その後,線形代数と同じく重要な数学的道具として,確率論や情報理論,最適化の話が続きます.だいたいこういった数学的道具の説明は「小難しくて理解できない割に,本論ではあまり使わない」ものが多いように感じていましたが,説明も簡潔かつ直感的に理解しやすい,必要十分な説明に留められていると感じました.

新しく学んだこと1: CapacityとVC次元

5.2では,機械学習モデルのUnder/Overfittingの考え方を紹介する際に,モデルの複雑性=capacityという概念を導入して説明しています.良いモデルとは,データに対して十分なcapacityを持つものだと考えられますが,そのcapacityを評価するための重要な概念として,VC次元(Vapnic-Chervonenkis dimension)を紹介しています.これは「任意のラベル付けで完全に分離できるデータポイントの数」であり,たとえば2次元空間上のデータポイントなら,3点までならどんなラベル付けをしたとしても完全に分離できるデータポイントは3です.よってこのときのVC次元は3になります.このVC次元は,無限のサイズの仮説集合に対して,まぁまぁいい学習を行うために必要な訓練データの数を導く上で必要になるらしいです(参考:計算論的学習理論入門 -PAC学習とかVC次元とか-).

新しく学んだこと2: ベイズ推定と正則化

f:id:nyaaaaaam:20181011181315j:plain 線形回帰モデルのベイズ推定を解説している箇所があります.ここではいろいろと式を展開してパラメータの事後分布を求めていくと,Ridge回帰のclosed formの解に事後平均が一致することが示されています.つまり,ベイズ推定とは本質的には正則化である,という結論らしく,この点は今まで知らなかったポイントでした.

機械学習アルゴリズムの構築

データに対してどのような機械学習アルゴリズムを適用するかを表現するためには,次の4つのbuilding blockを明らかにせよ,という主張です. - どのデータを使うか? - 適用しようとしているモデルは何か? - 損失関数は何か? - 最適化アルゴリズムは何か? たとえば,同じデータであっても,モデルを変えればまったく違ったアルゴリズムになりますし,最適化アルゴリズムを変えれば違った解が得られるかもしれません.逆に言えば,4つのうちどれかがはっきりと決まっていないと,ほかの人にアルゴリズムを伝えるときに,正しく伝えられない=再現性が取れない可能性があります.この辺は,実務家として理解しておくべきことだと思いました.


書きながら「理解が甘いなぁ」というところも再発見しましたが,何度も書いているように,必要十分な知識を簡潔に得ることのできる本(というかまだイントロですが)だと感じました.これから本題のdeeplearningに入っていきますが,楽しみです.

また感想がまとまったら書きます.

参考文献

Goodfellow, I., Bengio, Y., Courville, A., & Bengio, Y. (2016). Deep learning (Vol. 1). Cambridge: MIT press.

普段の時間の使い方と研究の記録

f:id:nyaaaaaam:20180914230525p:plain

僕は普段会社員として働くかたわら,2年前からとある大学の博士課程に入学して,博士学生として研究もやっています.そのような二足のわらじを履いてはや二年,いろいろ試行錯誤しつつたどり着いた時間の使い方などについて書きたいと思います.

一日の流れ

だいたいこんな感じで仕事と研究を両立させています.

  • 7:00 起床(たまに早く起きてジョギングなど運動)
  • 8:00 出社
  • 18:00 帰宅
  • 21:00 食事や入浴を済ませ研究開始
  • 23:30 研究終了
  • 24:00 一日のまとめなどして就寝

割とホワイトな会社かつ「遅くまで会社にいないやつ」と周囲に印象づけることに気をつけて会社員生活を歩んできたので,結構早く帰宅しています.また,専攻は多変量解析法の理論的研究(主成分分析や因子分析などの多変量解析法をいろいろ魔改造する研究)なので,基本的に自宅で研究できます.先生とはたまに連絡を取りつつ,主に論文を書いたりしています.

今はこんな感じの時間の使い方で落ち着いているのですが,こういうパターンを発見するまでにいろいろと紆余曲折がありました.その中で学んだことを以下にまとめます.

遅くまで研究しすぎない

院生になりたての頃は「研究頑張るぞ」と息巻いて,深夜2時や3時まで研究をがんばる夜も多くありました.しかし今年で30代に入った事もあってか,遅くまで研究すると次の日の仕事にかなり響きます.何日か繰り返すと慣れるかなと思ったのですが,全く慣れず,それどころか次の日の夜は早く寝たい気持ちになってしまうので,結局研究に避ける時間が少なくなる事に気づきました.そんなこともあって,最近は(よほど何かの締切に追われていない限りは)24時までには研究を終えて床につくようにしています.「細く長く」続けていくスタイルが僕にはあっているようです.

子供が生まれると研究に割ける時間が増える

子供が生まれる前は,夕食後妻とダラダラしていたので,結局研究を開始できるのは妻が眠って以降の22時頃からでした.しかし子供が生まれて以降,妻と子供が遅くとも21時頃には,規則正しく就寝するようになったので,その分長く研究時間が取れています.周囲には「子供が生まれると自分の時間がなくなるよね」と言われていましたが,実際生まれるとそんなことはないなぁと思いました.もちろん,夜泣きがひどいときにはあやすのを手伝ったりもします.

ちゃんと研究してると仕事にもいい影響が出る

夜やっている研究と昼の仕事とが比較的近いせいもあり,夜しっかり研究していると,その時の気づきを仕事に応用したり,反対に仕事の気づきを研究に応用したりと,二足のわらじならではのメリットも大きいなと思います.頭も切り替わっていい感じです.

記録を取ることは大事

研究生活を始めた当初から,画像みたいな感じで研究ノートをEvernoteにつけています.ほぼ日記みたいな感じです. f:id:nyaaaaaam:20180914231047p:plain 毎日やったことや,やり残したこと,感想などを書き付けておくと,達成感もあるし,タスク管理も簡単にできるので,重宝しています.1年前の研究ノートとか見ると,結構懐かしい気持ちになります.WunderlistとかAsanaとか,タスク管理やプロジェクト管理のアプリを使ってみたこともあったけど,結局めんどくさくてあんまり使わず,Evernoteに落ち着いています.


また思いついたら書きます(ブルーライトカットメガネを会社に忘れてきて,目がしょぼしょぼして疲れる...).

【GCP+Bitbucket】kaggleのための環境構築

先日,kaggle(http://kaggle.io)のための環境を構築しました.その時の作業をまとめておきます. 計算機環境としてのGoogle Cloud PlatformGCP)と,バージョン管理のためのBitbucketを使っています.これらは

  • GCP : 見た目がおしゃれ,300USDのクレジットがついててしばらく無料で使える
  • Bitbucket:プライベートレポジトリが無料で使える,こちらもおしゃれ

ってことで選びました.

構築にあたっては,Takumi Satoさんの動画を参考にしました.Youtubeで説明してくださっていて,とてもわかりやすかったです.

細かい手順は上の動画を参考にしてください.

GCPを準備する

上のGCPのリンクから,VMインスタンスを作成します.けちってあまり豪華な構成にはしていないです. f:id:nyaaaaaam:20180903163952j:plain

OSは仕事でも使うことの多いUbuntuを使ってみました.セキュリティは大事なので,公開鍵認証にしています.

Bitbucketを準備する

Githubを使うと,kaggleの利用規約には「チーム内の情報シェアなどを除き,kaggleのフォーラムを通して情報をシェアしなければならない」というものがあるらしく,Githubの公開レポジトリを使うと,この規約に違反する可能性があります.そのため,無料でプライベートレポジトリが使えるBitbucketを使います. 普通にIDをを取得してレポジトリを作成しておきましょう.

GCPへの接続

毎度GCPのページにアクセスして,そこからターミナルを立ち上げてログインすることもできますが

  • 微妙にレイテンシがある
  • ログインに時間がかかる

といった理由があるので,ターミナルから接続することをおすすめします.ターミナルでつぎのようにしましょう.

ssh -i (秘密鍵のパス) (ユーザ名)@(VMインスタンスの外部IPアドレス) -p (ポート番号,あれば)

こうすれば,ターミナルから接続できて便利です.

Jupyter notebookを使えるようにする

データサイエンスでは,対話的にコードが書けるJupyter Notebookを使う人が多いんじゃないかと思います.僕もそうなので,kaggle用の環境には,Jupyter notebookが必須です.

GCPインスタンスを立ち上げたあと,Anacondaを以下のようにしてインストールします.

wget = https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
sh Anaconda3-5.2.0-Linux-x86_64.sh

これでJupyter notebookのインストールは完了です.

あとはこの記事に従って,ポートを開放したりすれば,Jupyter notebook環境の出来上がりです.

ディレクトリ構成

データサイエンスプロジェクトのディレクトリ構成をどうするか問題に関して,今回は以下の様な構成をとっています.

├── README.md
├── input: データセットを入れておく.ファイルは絶対に編集しない.
│   ├── train.csv
│   ├── test.csv
│   └── ...
├── notebooks: 実験したnotebookを入れておく
│   ├── 20180901_EDA.ipynb
│   └── ...
├── results: 予測結果とか,submit用のcsvを入れておく
│   ├── 20180901_predict_LASSO.csv
│   └── ...
└── trained_models: 訓練済みのモデルを.pklで入れておく
    ├── 20180901_LASSO.pkl
    └── ...

まずinput/には,kaggleなどからDLしたデータそのものを入れておきます.特徴量エンジニアリングなんかでいろいろとデータを弄る場合は,このファイルをいじるのではなく,別のディレクトリを作って編集して,もとのデータセットを編集しないことをおすすめします(あとで元データが何なのかわからなくなるため).また,trained_modelsには,joblib.dumpで保存したモデルを入れておきます.CVなどですごく時間がかかる場合,結果を保存しておくといろいろとあとで時間の節約になるので.

こういったディレクトリ構成ではcoockiecutterというモジュールを使うと良いっぽいですが,そこまで細かいディレクトリ構成は必要ないと感じたので(今のところは),今回はオリジナルの構成で組んでいます.

github.com

今取り組んでるコンペ

今は,不動産の特徴からその価格を予測する,House Pricesというコンペに取り組んでいます.データセットはある程度構造化されていて(欠損値などはもちろんありますが),回帰をいろいろと試してみる問題です.なにかいい結果が出たら,Kernelでも書こうかなと思っています.

https://www.kaggle.com/c/house-prices-advanced-regression-techniques

追記

GCPのストレージからVMにファイルを転送する.

gsutil -m cp gs://ストレージ上のパス VM上のパス

はじめてのエントリー

f:id:nyaaaaaam:20180902153232p:plain

はじめまして,はてなブログでブログを始めてみました.

ブログで書いていくこと

以下のことについて,不定期で書いていきます.

  • データサイエンス関連の技術の話:Python, R, Kaggle...
  • 仕事の話:研究や開発,転職のことなど
  • 育児の話
  • 趣味の話 今後追加したり削除したりするかもしれません.

ブログを書こうと思い立ったきっかけ

現在僕はとあるメーカーの研究所で働いています.研究所内でデータサイエンティスト的なことをしています.しかしいろいろと思うところもあり(この辺の事情はまた別のエントリーで書こうと思います),2019年の1月からテック系に転職して,本格的にエンジニアとして仕事を始めることにしました.

「エンジニアってなんとなくブログを書くもの」とぼんやり思っていたのですが,セルフブランディングとか,アウトプットの場を持つことで勉強が捗るなど,いろいろとエンジニアにとっていいことがあるということなので,これを機にはじめてみることにしました.

続くかもしれないし続かないかもしれませんが,よろしくおねがいします!