zekeの日記

素人です、記事内容に間違いなどがあればご連絡ください。

「ゼロから始めるDeepLearning」読書記録

年末年始で以前半分ほど読んでいた本書を読んだため、読書記録を残しておく

f:id:zekehamp:20210101142824p:plain

ゼロから作るDeep LearningPythonで学ぶディープラーニングの理論と実装

www.amazon.co.jp

読んだきっかけ

「PyTorch 公式チュートリアル」をやっていて、途中かなり説明が端折られている部分があることに気づいた。ディープラーニングの中身をしっかり理解したかったため、半分だけ読んでいた本書を引っ張り出してきて最初から読み始めた。

中身

全体的な特徴

本書はディープラーニング本では一番有名な本と思われるが、Tensorflowなどのフレームワークの使い方を解説したものではない。ディープラーニングの内部で実際どのような動作が行われているのかを順序だてて説明している。TensorflowやPytorchなどをやっていて疑問に思ったことが説明されていたので、初学者が基礎知識を得てより専門な分野に踏み込むための橋渡しとしてぴったりな本のように感じた。また、説明されているほとんどがPythonで実装されているので、実際に動いている様子も観測することができる。

第一章

Pythonを触ったことない人向けに一通りの説明がなされている。しかし、この章だけでPythonに慣れることは困難なので、以降の章の内容を自分で実装するなどして慣れる必要があるように思えた。

第二章

パーセプトロンの解説がなされている。ここで挫折しないようにかなり丁寧に書いてある印象を受けた。ネットワークの構成部品であるパーセプトロンをAND,OR,XORなどの例を出してどのように実装されるかが説明されている。層を重ねることで非線形な表現を可能にするということをこの章では言いたいのだと思う。余談だが、この章の最後に紹介されていた「コンピュータシステムの理論と実装」(通称Nand2Tetoris)に興味を持ったので実際に読み進めている。ハードウェア層を読破したので本書についても記事を書くかもしれない。

第三章

パーセプトロンを組み合わせたニューラルネットワークの説明がされている。ここで機械学習を勉強しているとよく見るグラフ構造を初めて見ることができる。ニューラルネットワークの概観、活性化関数、ネットワークの中で使う行列計算、出力層の設計の順番で解説が進んでいき、最終的にはMNISTの推論のみを行うことまでやっている(学習はまだ)。行列計算に関しては未学者でもわかるように基礎から説明がされているので、ここで躓くことは少ないと思われた。しかし、ここで出てくる活性化関数とニューラルネットワーク中での行列の扱い方などは今後重要になってくるので、ここでマスターしておく必要がある。

第四章

ニューラルネットワークの学習の章である。挫折するとしたら、この章以降なのではないかと思う。前章ではニューラルネットワークの設計をしたが、この章では実際に重みパラメータを自動で適切な値に決定させる手法を紹介している。損失関数、ミニバッジ学習、行列数値微分の順番で解説が進む。ここでは数値微分が大事になってくるのだが、以前読んだときはこのあたりの理解が生半可で第五章で詰んでしまったので、しっかり押さえておく必要がある。また、この章あたりから実装が大変になってくるのでJupyterNotebookなどを利用してネットワーククラスを設計しながら慎重に理解を進めた。うまくいくと実際に学習が進む様子を観測することができたのでモチベを上げることができた。ニューラルネットワークの原点がこの章にあるので何度も読み返した。

第五章

誤差逆伝播法の章である。以前読んでいた際にはここで挫折した。この章では前章で紹介のあった数値微分を改良した誤差逆伝播法の理解を目的としている。数値微分だとパラメータを一つずつ微小変化させて計算しなくてはいけないので時間がかかる。そこで、「出力が1増えたときにパラメータがどのくらい変化するか」という課題を連鎖律を用いることで高速に求めるという理論を紹介している。この章でうれしかったのは、数式によって読者を圧倒させる解説をせずに、計算グラフを用いた視覚的な解説を提供してくれたところにある。これらを踏まえて乗算、加算、ReLU、Sigmoid、Affine、Softmaxレイヤの実装を行うが、この辺りは美しい実装がなされていたので勉強になった。この章が本書の山場ではないかと思われる。

第六章

前章までとは異なってやや補足的内容が続く。パラメータ更新手法、パラメータの初期化、Batch Normalization,正則化、ハイパーパラメータの検証など、DeepLearningをするうえでよく使われる手法が紹介されている。個人的には更新手法の比較が興味深かった。ここら辺の手法はKaggleで勝つデータ分析の技術 でも説明されているものばかりである。何も知らずに最適化関数としてAdamを選んでいた自分にとっては大変おもしろい章であった。

第七章

CNN(畳み込みニューラルネットワーク)の章である。いままでのAffine層に代替してConvolution層、Pooling層を導入し空間的情報を保存するらしい。この章から多次元情報を多用するので、こんがらがってしまわないようにしたい。個人的にはim2colの実装がややこしいと感じたので読むのに時間がかかった。しかし、わかってしまえば今までと同じようにレイヤを設計することができるようになる。最終的な実装は次元の順番に気を付けないといけない。またCNNの可視化が行われており、層によってどのような特徴量が抽出されているかが見て取れる。有名なCNNの例とともに確認した。

第八章

今現在の機械学習における最前線を紹介している章である。現在よく使用されるCNNは何重もの層を重ねたもので認識精度は非常に高いらしい。層を深くすれば認識精度が上がるということを、やや定性的に説明している。その後はGPUの並列演算による高速化の話、ディープラーニングの将来の話などが続く。CUDAもやりたいし、Deep Q-Networkも気になる…

まとめ

本書は「ゼロから始める」と言っている通り、この分野の初学者が前知識なしで取り組める良書だと思う。しかし完走するのには少なくとも30~50時間を要したと思う。これは本書の内容を理解するとともに、ソースコードを読み実装する手間がかかるからである。それでも機械学習フレームワークを触るのならば事前に一読しておきたい本であることには間違いない。