Kerasの作者が書いたDeep Learning解説本:「Deep Learning with Python」を読んだ

タイトルの通り、広く使われているディープラーニングフレームワークであるKerasの作者François Chollet氏によるDeep Learningを解説した本「Deep Learning with Python」を読みました。今月末には日本語版が出るのでその前に読み終えることが出来て良かった。かなり分かりやすく、今まで何となく知っていた知識の整理に役だったのでオススメです。英語版を読んだので日本語版の翻訳が良いのか分からないですが、コードや図表が多いので日本語版でも理解は容易だと推測します。ちなみに英語版はUSのAmazonでかなりの高評価を受けています。


この本の特徴は、すべてのコードがKerasを用いて書かれており、コードが簡潔で理解しやすいという点だと思います。そして、本書を通じて(多分)一度も数式が登場していないので初学者にはとても読みやすいと思います(ただ、文章で説明するよりも数式なら一発で分かることというのもあるので、この点はレベルによります)。例えば、多層ニューラルネットが何をしているのかといった説明に、くしゃくしゃに丸めた紙を一層毎に開いていくイメージに似ている、といった説明がされており、初めて学ぶ人にとっては理解しやすいかと感じました。

カバーされている内容は、基本的なFully Connected Layerを用いたDNNから、畳み込み層を用いたCNN、RNNによる時系列データの取り扱い、GANやVAEなどによる画像生成などこの一冊でかなり広い分野をカバーできるようになっています。目を引いたのはCNNを用いた分類器の判断根拠を示す可視化手法(中間層の活性化状況やGrad-GAMといったヒートマップを用いた可視化)を書かれており内容が充実しています。その他にもRNNモデルの解説でLSTMやGRUが内部で何をしているかなどには、深く立ち入らず概念だけ説明して、Kerasを使えばこれだけでできるよ、と書かれているところも研究者よりは実践者向けだと感じました。

その他には、最後の章に著者が考えるディープラーニングの限界や、ディープラーニング技術の将来予測が書かれており興味深かったです。また、「この本を読み終わった後に進歩の速いディープラーニング分野の勉強を続けるにはどうしたらいいか」という内容が最後に書かれており、そこには「Kaggleをやれ、arXivで論文を読め」と書かれているのでその辺りを頑張って行きたいと思います。

恐らく、機械学習を学び始めて「ゼロから学ぶディープラーニング」を読み終えた人が、ディープラーニングを使って何か自分で試してみたいと思った時に、Kerasを学んで簡単にモデルを構築できるようになるためのステップとして最適な本だと思いました。

CNNによる価格予測の論文:「The Price is Right: Predicting Prices with Product Images」を読んだ

タイトルの通り、CNNモデルを利用して、自動車・自転車の画像から価格を予測する論文、「The Price is Right: Predicting Prices with Product Images」を読んだ。

この論文を読んだ動機は、ネットを調べるとCNNを用いて画像を分類するという例は山ほど出てくるが、CNNを用いて画像から何らかの数値を出力するregression問題に取り組んだ例があまり見つからず、ちょっとそういったことをやる必要に迫られたので読んでみた。

自転車と自動車の画像からそれぞれの価格を推定するregressionタスクにCNNを用いた。ベースラインモデルである多クラスSVMと線形モデルに対して同等~高い精度が出た。VGGとMobileNetによる転移学習よりも精度の高いネットワーク構造PriceNetReg CNNを提案している。また、CNNモデルに関して、画像のどの部分が予測に効いているかをVisualizationすることにより示している。

CNNモデルが画像のどの部分に着目して判断を行っているかということをVisualizationしているのが面白い。次はこういった可視化技術の論文を読んでみたい。

まとめスライドはこちら。

The Price is Right Predicting Prices with Product Images_slide

CNNによるセグメンテーション論文:「U-Net Convolutional Networks for Biomedical Image Segmentation」を読んだ

タイトルの通り、CNNを用いて医療画像をセグメンテーションするU-Netというネットワーク構造の論文を読んだ。

2015年に発表されたネットワーク構造だが、その後セグメンテーションでは古典的な内容になっており、いくつか発展形のネットワークも提案されている。

論文のまとめは以下。

U-Net Convolutional Networks for Biomedical Image Segmentation_Slide

Pythonでデータ整形まわりをまとめた本:「Python for Data Analysis (第2版)」を読んだ

最近、Pythonを使って機械学習を勉強しているがnumpyやpandas, グラフ作成辺りの体系的な知識が足りない気がしていたので、この辺りをまとめた本「Python for Data Analysis (第2版)」を読んだ。感想としてはもっと早くに読んでおくべきだったと思う。今まで何となく書いていたnumpyやpandasが割と頭の中で整理できたと思う。

日本語版は第1版の翻訳が出ているようだ。Amazonのレビューを見ると第1版はPython2系列で書かれており、今読むとしたら内容が古いのでオススメはしない。第2版ではPython3で書かれている。

以下に学んだことをピックアップしておく。

  • IPythonでは変数の後に「?」をつけると変数の情報が見れる
  • リストに要素を逐次的に追加していく場合、extendメソッドを使った方が要素を結合するよりも速い
  • arr2d[0][2]とarr2d[0,2]は同じ意味。
  • ffillメソッドで前方向のinterpolationができる
  • 大きなCSVファイルをpandasで読み込む際には、read_csv()にchunksizeを指定して処理していく
  • データ分析において前処理にかかる時間は全体の80%くらいという報告がある
  • Jupyter notebookではplotの設定がセル毎なので複雑なプロットは一つのセルにコマンドをまとめて書く必要がある
  • plot.kde()でカーネル密度推定をグラフにプロットすることが出来る
  • pandasのrolling()メソッドを使うことで、Moving Window Averageが取れる
  • 時系列データ分析では、exponentially weighted functionsが最近のデータに大きい重みをつける手法としてよく使われる
  • 特定の値しかとらないデータカラムはcategory型にすると使用するメモリが減って、機械学習の処理の高速化を見込める
  • DataFrameをNumPy配列に変換するにはdata.values
  • Pythonの関数を高速化する手法としてnumbaがある。numba.jit()を使うことで関数をJITコンパイルできる

最後の章に、この本よりもさらに学ぶのにオススメの本が挙げられている。「Hands-On Machine Learning with Scikit-Learn and TensorFlow」は読んだことがあるが、とても分かりやすく、特にこの本でnumpyやpandasを学んでからならすんなりと機械学習の手法を理解することが出来ると思う。読んだ際の感想はこちら。Hands-On Machine Learning with Scikit-Learn and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems を読んだ

紹介されている次に読むべきオススメの本:





ビルゲイツの新しい最も好きな本: 「Enlightenment Now」

ビルゲイツが自身のブログで新しい最も好きな本としてSteven Pinkerの「Enlightenment Now」であると発表しました。

My new favorite book of all time

今までビルゲイツはSteven Pinkerの「The Better Angels of Our Nature」(邦題「暴力の人類史」上下,青土社)を最高の本だと言っていた。


Steven Pinkerの新たな本「Enlightenment Now」が新たな最も好きな本であると、ビルゲイツは述べている。まだ出版されていないが、ビルゲイツのブログから登録することで無料の章を読むことが出来る。

「Enlightenment Now」では、どのようにして人類・世界が良い方向へと進んでいっているのかを述べている本であるそうだ。ビルゲイツ自身が気に入った5つの世界が進歩している理由を以下のように述べている。

1. You’re 37 times less likely to be killed by a bolt of lightning than you were at the turn of the century.

2. Time spent doing laundry fell from 11.5 hours a week in 1920 to an hour and a half in 2014.

3. You’re way less likely to die on the job.

4. The global average IQ score is rising by about 3 IQ points every decade.

5. War is illegal.

要するに、今は昔に比べてはるかに安全であり、家事に使う時間ははるかに減っており、世界の平均IQも上がってきている。歴史の本をよく読んでいるビルゲイツのオススメ本なので読んでみたいと思う。

Kaggleで人気 XGBoostの論文 「XGBoost: A Scalable Tree Boosting System」を読んだ

タイトルの通りなんですが、Kaggleでとても人気のある手法のXGBoostがどういった仕組みで動いているのかを知るために次の論文を読みました。

XGBoost: A Scalable Tree Boosting System

詳しいことは、日本語で読める分かりやすい解説記事(こことか)があるのでそちらを参照していただきたいです。この記事は個人的な備忘録です。

要するにXGBoostとは決定木をすでに作った木の情報をもとにしながら何個も作ってそれらの結果を足し合わせることで、性能を向上させるBoostingの手法を効率的に実装したものと言えます。

基本的なポイントは単純ですが、決定木を作っていくうえですべての木の中から最も良いものを調べて選択するのは計算量的に難しいため、ある種の近似を用いて精度的に問題の少ない気を作っていき高速に実行可能なアルゴリズムとなっています。また、オーバーフィッティングを防ぐために、サブサンプリングや縮退化などの仕組みも導入されており、汎化性能が良くなるようになっていることもKaggleのコンテストで人気の理由の一つだと思います。

また、論文では並列化や分散処理をした場合の速度性能の評価が行われており、高い並列性能が出ています。提供されているライブラリではキャッシュが当たりやすくなるようになどの最適化が施されているので、自分で実装せずにライブラリを使いましょう。pipで簡単に入れられるようです。

不良品予測チャレンジの解説 「Using Big Data to Enhance the Bosch Production Line Performance: A Kaggle Challenge」を読んだ

Kaggleのコンテスト(Bosch Production Line Performance Challenge)としてBoschがデータを提供しているコンテストの解説論文を読んだ。

Using Big Data to Enhance the Bosch Production Line Performance: A Kaggle Challenge

このコンテストは工場の様々なセンサーデータを用いて生産されたパーツの良・不良を判定するもの。時系列のデータとなっているが、この論文の手法だと時系列の影響は特に使っていないようだ。

とにかく特徴量が多いので、カテゴリ変数を一つの数値変数に変換する手法を使ったのち、カラム数を減らしてXGBoostを用いてモデルを構築している。

また、データ量も多くメモリに乗りきらないのでオンライン学習の手法を用いている。

モデルの良さの評価にはMatthew’s Correlation Coefficientという、頻度の低いイベントの評価指標に使えるものを用いている。

所感としては、Kaggleで人気のXGBoostはsparseで大量のデータに対して強いんだなあと感じさせられる。

「ベイズ推論による機械学習」を読んだ

最近出版された、「ベイズ推論による機械学習」を読んだ。何やら最近盛り上がってきているように見えるベイジアンの機械学習へのアプローチを学ぼうとして手に取った。しかも「入門」と書いてあるので。

本書はベイズの定理から始まって、各種確率分布の説明、ベイズ推論を用いた学習と予測、混合モデル、応用モデルの構築と推論などの内容がカバーされている。

数式が多いが、基本的に各項目でほぼ同じパターンをたどることが多く、かといって数式が省略されることもほとんどなく、難しい内容も追いやすかったと思う。

現在Murphy本を読んでいる途中だが、先に本書を読んで理解してから読み進めるべきであったと感じる。やはり日本語で解説を読んでおくと理解が進みやすいだろう。

個人的にはコラムの部分に書かれているベイジアンのアプローチの有用性についての議論が腑に落ちた。例えば、ビッグデータの時代においてはベイズ推論のアプローチをとるメリットは無くなるのでは?といった内容について、データが十分あれば解析対象を詳細にすべし、(推薦システムのように)使い始めのユーザの情報は少ないのでベイズ学習のアプローチが有効、などの議論からむしろ「多種多様の情報ソースを組み合わせて活用していくようなビッグデータの時代に適した方法論であるといえます。」と述べている。

また、ベイズ学習のこれから、と題されたコラムでは「ベイズ学習のもつ適用範囲の広さと、大量データに対する複雑なモデルの効率計算の2つが上手く組み合わされば、いままで行えなかったような大規模かつ包括的な問題解決に取り組むことが可能になるといえます。ベイズ学習は、深層学習や最適化理論で培われた効率的な計算のノウハウと組み合わさることにより、さらなるエキサイティングな応用領域を拡大していくでしょう。」と締めくくられており、今後もウォッチしていきたい分野である。

本書は基本的に数式を用いた理論的な解説をターゲットとしており、実際にコードに落とし込むには少し慣れが必要かもしれないと、素人としては感じた。以下のサポートページでは本書のサンプルコードが用意されているので、ここを見てみよう。

「機械学習スタートアップシリーズ ベイズ推論による機械学習入門」のサンプルコード

また、著者のブログ「作って遊ぶ機械学習」ではさまざまな問題に対してコードや数式と共に解説が用意されているようなので、次はそのあたりで勉強してみようと思う。

「Machine Learning – A Probabilistic Perspective」第7章を読んだ

前回の続き。第7章は線形回帰について。このあたりでようやく1/4までたどり着いた。先は長い。

目次は以下の通り。

  • 7 Linear regression
    • 7.1 Introduction
    • 7.2 Model specification
    • 7.3 Maximum likelihood estimation (least squares)
      • 7.3.1 Derivation of the MLE 219
      • 7.3.2 Geometric interpretation
      • 7.3.3 Convexity
    • 7.4 Robust linear regression *
    • 7.5 Ridge regression
      • 7.5.1 Basic idea
      • 7.5.2 Numerically stable computation *
      • 7.5.3 Connection with PCA *
      • 7.5.4 Regularization effects of big data
    • 7.6 Bayesian linear regression
      • 7.6.1 Computing the posterior
      • 7.6.2 Computing the posterior predictive
      • 7.6.3 Bayesian inference when σ2 is unknown *
      • 7.6.4 EB for linear regression (evidence procedure)

線形回帰のMaximum likelihood estimationから始まり、outlierに強い線形回帰の方法やリッジ回帰、PCA、Regularizationなどが説明され、最後にベイズ統計による線形回帰の話が述べられている。

リッジ回帰はペナルティ項が加わった線形回帰。overfitする可能性を減らすことが出来る。数値計算する際にも良い性質があるとのこと。

最後のベイズ推定の部分は、リッジ回帰でpointを推定できるけど、完全なwやσ^2の事後分布を知りたいことがあるのでベイズ推定を使うと良いということらしい。