不確定な世界

科学の話題を中心に、勉強したことや考えたことを残していきたいと思います

「ゼロからつくるPython機械学習プログラミング入門」;八谷大岳著 読書感想

本日紹介するのは、八谷大岳著「ゼロからつくるPython機械学習プログラミング入門」。
私はこれまで機械学習の本を何冊か読んできたが、古典的な機械学習に関する入門書は、実質的にscikit-learnのチュートリアルで終わっていることも多い。機械学習の中身をもう少し踏み込んで理解したいと思い、本書を読んでみた。

書名からはコーディング中心の本という印象を受けるが、本書の性格はどちらかと言えば「サンプルコード付きの理論書」である。「理屈はともかく写経しろ」という内容を想定していると面食らうことになるが、そもそも昔ながらの機械学習は深層学習以上に数学そのものであり、その中身を理解するうえで数学は避けて通れない。一方、理論さえ理解してしまえば、アルゴリズムのコアはたった数行程度のコードでスクラッチ実装できてしまうということが、本書を読めば分かる。本書では純理論の本を読んでいるとありがちな、式の意図やイメージの掴みづらさに悩まされることがない。本文中の数式に沿ったコードが掲載されているので、例えばテンソルの形状だとか総和の対象(軸)などもコードを確認すれば誤解なく理解することができる。

章ごとの感想

第3章

まず勉強になったのは第3章の数学の復習。本書では特に最適化数学の解説に力が入っており、ラグランジュの未定乗数法が機械学習アルゴリズムのベースにあることが理解できた。私は最適化数学になじみがなく、特にベクトルの内積をベクトルで微分するような表記は苦手意識を持っていたので、本書で多少なりともこの分野に慣れることができたのは良かったと思う。本書を読む中で、この章は何度も読み返すことになった。

第4章

回帰アルゴリズムとして線形回帰とロジスティック回帰を学ぶ。線形回帰について、本の方針によっては単回帰(y=ax+b)に限定して係数を表す式を直接導く場合も多いが、本書のように線形代数に基づく表記では、重回帰に拡張したときに式に一切変更がないという圧倒的メリットがあることに気が付いた。また、ロジスティック回帰が実質的に分類モデルであるにも関わらず回帰と呼ばれるのは、交差エントロピー誤差の最小化がロジットを回帰していることに対応するため、という記述には目からウロコが落ちた。

第5章、第6章

分類モデルの章では、線形判別分析(LDA)、サポートベクトルマシン、ナイーブベイズ、決定木が扱われている。この章では特に、サポートベクトルマシンの理論から逃げていないことに好感を持った。ある程度のレベルの数式を扱っている本でも、サポートベクトルマシンの理論については「難解すぎる」としてscikit-learnやLIBSVMといったライブラリの使い方を説明するだけで終わってしまう場合が多い。本書では第6章のカーネルトリック*1まで含めて、サポートベクトルマシンの数式&スクラッチ実装を学ぶことができる(ただし、ここだけは行列の計算にcvxoptライブラリを用いている)。

第7章、第8章

 第7章はニューラルネットワーク、第8章は強化学習がテーマである。ニューラルネットワークについては他書で十分に学んでいるという人は、ここは飛ばしてもいいだろう。ただ、Adamをきちんと実装している点は参考になるかもしれない。強化学習に関しては、ページ数も少ないし、本書全体のテーマからはやや外れている印象を受けた。同じ機械学習スタートアップシリーズから強化学習も出ているようなので、強化学習に興味があるならそちらを読んだ方がいいだろう。

第9章

教師なし学習アルゴリズムとして、主成分分析と因子分析、k-means法が扱われている。PCAは分散を最大化する軸を見つけると説明されることが多いが、その根底には残差の二乗和の最小化があるという意味で、線形回帰に似ているということが理解できた。k-means法はアルゴリズムの概念はわかりやすいが実装は面倒くさそうという印象を持っていたが、重心からデータ点の距離を計算→データ点をクラスタに割り当て→クラスタの平均値を重心に再設定の流れがあまりに簡潔で驚いた。特に、カーネル法のところでも使われていた、np.tile関数を用いてデータの全ペアの計算を一度の行列演算で行うトリックは自分では絶対に思いつきそうにない。応用範囲が広そうなので、ぜひ自分のレパートリーに加えたいテクニックである。

まとめ

ここまで紹介したように、本書はかなり数式が多い本なので、想定読者は大学生や研究者、または研究寄りのエンジニアになるだろう。アルゴリズムの中身をきちんと勉強したいが、純理論の本にはハードルを感じるという人にお勧めである。機械学習の仕組みはもちろんであるが、もう少し一般化して、理論や数式をプログラムに実装するということも学ぶことができる。

全体として、非常に読み応えのある良い本であるが、一つ不満点を挙げるとすると、コードが書籍中で完結しないことだろうか。もちろんアルゴリズムのコア部分のコードは載っているのだが、グラフのプロットや性能評価などの補助的なコードは書籍中には載っていない。本書はかなり分厚いので、これ以上コードを載せることは現実的ではないのかもしれないが、「ゼロからつくる」と銘打っている以上は、もう少し読者に自分でコードを打ち込ませるように誘導する構成の方が良かったのではないかと感じた*2

*1:まったくの余談だが、データを写像することでモデルが非線形に対応するという話は、量子力学において状態ベクトルを回転させてから測定するのは測定器を回転させるのと同じ、という議論を連想した。

*2:例えばオライリー本はそういう思想で書かれていることが多いと思う