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

「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の事後分布を知りたいことがあるのでベイズ推定を使うと良いということらしい。

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

前回の続き。難しくなってきたが細々と読み続けている。これを読み切ったら大抵の機械学習本は読めるようになるのではという感覚がある。

第6章は、Frequentist statistics 頻度統計について。この章は比較的知っている内容が多いので読みやすかったと思う。

目次は以下の通り。

  • 6 Frequentist statistics
    • 6.1 Introduction
    • 6.2 Sampling distribution of an estimator
      • 6.2.1 Bootstrap
      • 6.2.2 Large sample theory for the MLE *
    • 6.3 Frequentist decision theory
      • 6.3.1 Bayes risk
      • 6.3.2 Minimax risk
      • 6.3.3 Admissible estimators
    • 6.4 Desirable properties of estimators
      • 6.4.1 Consistent estimators
      • 6.4.2 Unbiased estimators
      • 6.4.3 Minimum variance estimators
      • 6.4.4 The bias-variance tradeoff
    • 6.5 Empirical risk minimization
      • 6.5.1 Regularized risk minimization
      • 6.5.2 Structural risk minimization
      • 6.5.3 Estimating the risk using cross validation
      • 6.5.4 Upper bounding the risk using statistical learning theory *
      • 6.5.5 Surrogate loss functions
    • 6.6 Pathologies of frequentist statistics *
      • 6.6.1 Counter-intuitive behavior of confidence intervals
      • 6.6.2 p-values considered harmful
      • 6.6.3 The likelihood principle
      • 6.6.4 Why isn’t everyone a Bayesian?

著者はベイジアンなアプローチを取った方が一回限りのイベントなどから上手くモデルを構築出来ると述べられているが、頻度主義の統計に慣れしたんでおくことは機械学習の分野で広く使われているため有用であると述べている。

頻度主義とベイズ統計の違いは、頻度主義がデータはランダムでありパラメータが固定されていると考えるのに対して、ベイズ統計ではデータが固定されており、得られたデータから最尤推定によりランダムなパラメータを確定させる、ということです。

最後の6.6節では、頻度統計の望ましくない振る舞いであるpathologyが述べられている。信頼区間やp値に関する問題点などが挙げられる。最後になぜ皆がベイジアンではないのか?という話が書かれており、その中で20世紀はノンベイジアンの時代であったが、21世紀はベイジアンの時代になると述べられている。これが正しかったかは時間が証明するだろう、と締めくくられており、少しカッコいい。

自然言語処理 画像キャプションのデータセット Cornell NLVR

Hacker Newsで取り上げられていた自然言語処理のデータセット Cornell NLVRの紹介です。

公式ページ:http://lic.nlp.cornell.edu/nlvr/

データセット:https://github.com/clic-lab/nlvr

論文:http://alanesuhr.com/suhr2017.pdf

これは、色の付いた図形が複数描かれた画像とキャプションのセットが与えられて、そのキャプションが正しく図を説明しているかを true/ falseで判定するタスクのためのデータセットです。データ数は92,244個でクラウドソーシングでデータを集めたそうです。

例えば、以下の画像のキャプションとして「There is exactly one black triangle not touching any edge」(他のエッジに触れていない黒い三角形がただ一つある)が与えられており、この正解ラベルは「true」となっています。

他にも、例えば次の画像のキャプションとして「There is a box with multiple items and only one item has a different color」(複数アイテムとともに一つ箱があり、ただ一つのアイテムが異なった色を持つ)が与えられ、この正解ラベルは「false」といったようになっています。

 

現在の、トップのテスト精度は公開データに対して約67%程度であり、ランダムに答えた場合よりも少し良いといった程度でしょうか。まだまだ、発展させる余地があるテストデータのようです。

Rustで書かれたNeural Network実装:Jaggernaut

Rust言語で書かれたJaggernautというNeural Networkの実装を見つけた。WebAssemblyに変換されて、ブラウザ上で動作させることが出来る。

Juggernaut: Neural Networks in a web browser

デモページでは3種類のデータセットに対して、学習率とエポック数を設定して、データが分類されていく過程が見れる。デモの実装にはReactとD3.jsを使っているが、Neural Networkの学習部分にはJavaScriptは一切使っておらずRustのみで書かれているとのこと。

まだ機能的にはフィードフォワードネットワークのみ対応しているようだが、数種類の活性化関数やコスト関数を用意しているとのこと。

こういったアプリケーションが増えて、将来的にRustは果たしてC/C++を置き換える言語に成りえるのか見守っていきたい。

Kerasによるニューラルネットワーク本「Deep Learning with Keras」を読んだ

Deep Learningの基本的な仕組みなどについては大体把握してきたと思うので、実際に動くコードを書くにはどうすればよいのかということを学ぶために、Kerasによるニューラルネットワーク本、「Deep Learning with Keras」を読みました。

Kerasはご存知の通り、TensorflowやTheanoなどのDeep Learning基盤を使いやすくするためのフレームワークです。実際にKerasを使ってみると、難しそうなイメージがあるDeep Learningは積み木のように構築出来て、結構簡単じゃないかという自信を得られるので、一般的なユーザーには生のTensorflowを使うよりもお勧めです。

この本の内容は、Kerasのインストール、基本的なフィードフォワードNNから始まり、CNN、RNN、WordEmbedding、GAN、転移学習、強化学習、などと幅広くカバーされています。すべての内容にサンプルコードが付いているので、実際に動かすことができます。段々と後ろの章に進むにつれて、学習に時間がかかるコードが増えてくるので、手元の環境で動かそうとする場合にはGPUがあったほうが良いかと思います。サンプルコードはKeras2.0で書かれていますが、現在の最新版だと微妙にAPIが変わっている部分もあるようで修正が必要な個所もありましたが、調べればすぐに出てくるレベルの違いなので(少なくとも現時点では)特に大きな問題にはならないかと思います。

基本的にはサンプルはそんなに複雑な内容を扱っているわけではなく、コードを部分ごとに解説とともに説明されているので、Kerasの深い知識が無くてもサクサク読むことが出来ました。実際に自分が作りたいアプリケーションに向けて参考にするにはとても良いサンプルが揃っていると思います。

個人的にはGANについて概要レベルで仕組みを知ることが出来たのが大きな収穫でした。何となく理論は知っているんだけど、いざ実際にコードに落とすにはどうしたら良いのか?と思う方にはお勧めです。日本だとChainerがこの手のフレームワークとして人気だと聞きますが、世界的にみるとKerasの人気は強いとも聞きます。今後の開発がどのように進んでいくのかにもよりますが、こういったフレームワークは一つ手を付けておけば他のフレームワークを使う際も似た部分は多いかと思うので、応用が効くかと思います。

次はもう少し数学的な基礎を固めようかと思うので、統計の教科書やMurphy本あたりを読んでみようかと思っています。

Deep Learningによる自然言語処理の教科書「Neural Network Methods for Natural Language Processing」を読んだ

タイトルの通り、Deep Learningによる自然言語処理の教科書「Neural Network Methods for Natural Language Processing」を読みました。全体として色々と理解が深まった部分があるのでお勧めです。

まさにタイトルの通り、自然言語処理とDeep Learningに特化した本でした。そもそもニューラルネットワークとは、というようなところから始まっているのでDeep Learningの深い知識が無くても読み始めることは可能だと思います。

また、自然言語処理の部分についても適宜基本的な内容が解説されながら進んでいくので読みやすいと思います。

図が多いので、CNNやRNNなどのネットワーク構造がどのようになっているのかというのも理解しやすいです。個人的にはこの本で、モヤモヤしていたLSTMやGRUといった内容やAttention機構がどういった仕組みであるかが理解できたのが収穫でした。

最近出たばかりの本なので、いまだ発展途上であるDeep Learningによる自然言語処理という分野で数多くの論文が参照されており、新しいものだと2017年に出た論文もカバーされているところが素晴らしいと思います。

どちらかというと理論的な面が重視して解説されているので、ここからどのように実装に落とし込んでいくかは別途TensorflowやKerasなどの記事を読むことになるかと思います。