『ゼロから作るDeep Learning 2』読んでみた,むずい。
読んでみた感想
『ゼロから作るDeep Learning』に続いて読んでみたのですが,率直に言って難しかったです…。読んでいてもちろん面白かったのですが,1と比べると苦しみながら読んでいた感が否めません。何が難しかったのかはまた後半で分析したいと思いますが,同じくらいの難易度で読めるとは思わない方が良いですね。3はもっと難しいのでしょうか?
完了には15時間程度かかりましたが,私はきちんと理解できないまま写経を続けてしまった部分が多々あるので,十分に理解するにはもっと時間が必要でしょう。
機械学習の学習コンテンツとしては
- 分かりやすさ ★★★☆☆
- 数式の少なさ ★★★☆☆
- プログラミングの簡単さ ★★★☆☆
です。
対象読者
読むと力になると思われるのは,
- 『ゼロから作るDeep Learning』を既に読んで理解している人
- 読んでいなくても誤差逆伝播法などのニューラルネットワークの基本的な知識があり,計算グラフを用いて機械学習モデルを表現することに慣れている人
ですね。ゼロつく1を読んでいる方がほとんどだと思いますが,読んでいれば大きな流れ,雰囲気は同じなので戸惑うことはないと思います。1を読んでいなくても読めるとは思いますが,上記の通り計算グラフの概念は理解していないとかなりきついと思います。あとは当然基本的な微分と行列の積はある程度は知っている必要がありますが,この本を読もうとしている人は問題ないでしょう。
大まかな流れ
この本の大まかな流れを書きました。本当にとても大まかな流れなので全然わからないかもしれません。ただ,大事なワードは青色で強調したので,その中に興味のあるものがある方はぜひ読んでみてはいかがでしょうか。
1章 ニューラルネットワークの復習
主にゼロつく1で扱った内容をざっくりと振り返ります。基本的な数学やPythonの文法,ニューラルネットワークの学習と推論などを扱っています。
ここの内容を知らない人はこの部分だけを読んでも十分理解できないと思うので,他の書籍等で勉強してから戻ってくることをお勧めします。
2章 自然言語と単語の分散表現
ある単語について,周辺にある単語(コンテキスト)の出現回数を様々な文章で調べることによって(カウントベースの手法で)単語をベクトル化する手法を学びます(例えば,"apple"を[0.8, 0.07, 0.02]に変換するなど)。
3章 word2vec
2章の方法では,ベクトル化する際の計算量が実用上耐えられないほど大きくなってしまうので,「推論ベースの手法」によってニューラルネットワークを用いて単語のベクトル表現を学習させます。この手法をword2vecと呼び,それを用いてCBOWというモデルを作っています。
4章 word2vecの高速化
3章では2章よりも少ない現実的な計算量で単語をベクトル化しましたが,より効率的な実装を行うことでさらに高速化します。手法の名称としては,EmbeddingレイヤとNegative samplingを実装します。
5章 リカレントニューラルネットワーク(RNN)
3章のword2vecでは,前後の2つの単語から目的の単語を推論させたのですが,目的の単語の前の全ての単語から推論させるのがリカレントニューラルネットワーク(RNN)です。
6章 ゲート付きRNN
5章の単純なRNNでは学習を行う際に「勾配消失」や「勾配爆発」が起こってしまい,うまく学習できないことがあります。そこで勾配爆発には「勾配クリッピング法」,勾配消失には「記憶セル」と「ゲート」を導入することで対応します。このようなモデルをLSTMと呼びます。
7章 言語モデルを使った文章作成
6章で実装したLSTMを用いて実際に"you"から始まる文章を生成させてみます。ある程度意味の通る文章が生成されて感動します。
また,これまではある単語の前までの情報を与えることでその次を推論させていました(時系列データから単一のデータ)が,次に日本語から英語への翻訳などの時系列データから時系列データへの推論を扱います。ここで用いるのは2つのRNNを利用するseq2seqという手法です。
8章 Attention
7章の手法では,新しい時系列データを生成する際に,元の時系列データのどの部分に注目(Attention)するべきなのかをうまく伝えられません(例えば「吾輩は猫である」を英訳する際に,1単語目("I"を推論して欲しい)には元の文章の「吾輩」の部分に注目できるのが望ましい)。
8章ではAttentionレイヤを実装することでこの問題を改善します。
内容の評価
分かりやすさ ★★★☆☆
これは分かりやすさというより内容の簡単さと言った方が適切です。日本語だけの説明は非常に分かりやすいです。様々な概念や,手法の導入理由などを大まかに理解するのはとても理解しやすかったです。ただ,私の頭が追いついていないのか,扱っている内容が難しいからなのか,実装する際には「どうしてこう実装するんだ?」と戸惑うことがよくありました。(結局きちんと理解できていないということなんでしょうね泣)
ゼロつく1と比べるとかなり難しかったように感じました。
数式の少なさ ★★★☆☆
数式はそれほど多くはないです。特に,ゼロつく1を読んでいればびっくりするような難しい関数などは出てこないです。逆に言えばゼロつく1で学んだ内容はバンバン出てくるので,理解が曖昧な部分はしっかりと復習してから読まないと苦労すると思います。
私はAffineレイヤなどの誤差逆伝播法がよくわかっていなかったので,この本の中で頻出で苦労しました。やっぱり微分は大切…。
プログラミングの簡単さ ★★★☆☆
使っているPythonの文法一つ一つが難しいわけではないので,その意味ではむずかしくないです。しかし,実装しようとしているクラスがかなり複雑で巨大になってくるに従って実装も複雑になっていくので体感としてはかなり難しく感じました。
結局内容をきちんと理解していないと実装なんかできるわけないよねってことですね。頑張ります。
その他の特徴
知らないときつい知識が多い
前述の通り,ゼロつく1の内容は既知として進むので,読んでいないと厳しいものがあると思います。しかもかなり当然のものとして飛ばされてしまうので,例えば「Affineレイヤってなんだ?」などの部分があると置いていかれてしまうと思います。自分も含め,1をしっかり読み込んでから2に進んだほうがいいですね。
GPUを使う部分がある
この本の中には普通のパソコンに積んであるCPUだと数日かかるような学習が数ヶ所あります。GPUを使えば数時間程度で完了するのでGPUを使いましょう。と言ってもGPUを持っていない人が多数派だと思います。「Google Colaboratory」を使えば誰でも無料でGPUを使えるのでぜひ利用してみてください。
総括
ゼロつく1は思ったよりすんなり読めたので油断していました。でも1の中にもまだしっかりわかっていない部分があると気づいただけでもよしとしたいと思います。また1から読み直したいと思います。
難しいですが読んでてとても面白かったのは1と同じです。1を読んだ人は2も読んで後悔することはないはずです!