【book review】ゼロから作るDeep Learning (Chapter 1~4)

今回読んでいる本

週末は少し時間が取れて, 4章まで読み進めることができた.
この本はGW前に頂いた本で, 他のことにかまけてしばらく蔵書になっていた本だ. ついにその時が来たというわけである. 基礎を体系的に学ぶことは大事だね. 統一された言語体系で最小単位を理解すれば, 文脈が変わってもアナロジーで理解できるから.

ところでreviewという単語には「詳しく調べる」という意味の他に「振り返る」という意味がある. タイトルに書評でも読書感想でも紹介でもなく, book reviewと付けたのは, 日本語にはそういう意味の言葉が無くてやむを得ずである.

本の1章~4章は次のような構成になっている:

  1. Python入門
  2. パーセプトロン
  3. ニューラルネットワーク
  4. ニューラルネットワークの学習

まず手始めに各章について私が学んだことを列挙していこう.

1章. Python入門

新しく学んだことは少ないが, Chap. 1.6のMatplotlibだけ使ったことが無かったので実行方法が載っていたのはありがたかった. 図示する目的で新しいPCを買うたびいつもR言語をインストールしてたのだけど, それと同じようなことができるようなのでこれから使っていくかも知れない.

2章. パーセプトロン

(単純) パーセプトロンと呼ばれる二値関数[1] {1, 0}値. 3章で書籍内でも言ってるが, 単純パーセプトロンは単関数 (値域が有限集合の関数) のことらしい.を最も基本的な構成単位として, より複雑なシステムを構築することができることを説明. その際 (NAND, OR, AND)でXORを表現する例を紹介[2]ブール束の言葉で書けば\lnot(x\wedge y)\wedge (x\vee y) = {\rm XOR}(x,y) のことである..

著者はさらにNANDの組み合わせのみでコンピュータを構築できると続ける (それは直感的に正しいだろう. 単関数近似のようなものだね).

3章. ニューラルネットワーク

この章では学習済みのネットワークが与えられている状況で, 推論処理を実装するまでをやる.

その前に, パーセプトロンからニューラルネットワークへ移行するためにカギとなるのが活性化関数 (activation function)のようである. それはパーセプトロンの出力の重み和を入力とし [0,1] に値を取る関数のことで, 以下のような違いがあるようである:

層数活性化関数
(単純) パーセプトロン1単関数
ニューラルネットワークn自由度が高く, しばしば滑らか (sigmoid関数等). 勿論単関数を含むこともできる. 線形関数のみから成ることは(定義上)できない.

※活性化関数の基準について少し調べると, 理論(関数の存在性保証等)または応用上(計算コスト, 学習が進みやすい等)の理由で, 区分的に可微分な単調関数くらいの条件があると良さそうだ. 単調であることは前の層 (パーセプトロン) の重みを尊重するという意味で重要に見えるが, 正規化すれば良いので有界条件は本質的ではないだろう.

著者は続けて出力層 (最後のパーセプトロンの層) について説明する. ニューラルネットワークからの最終的な出力が(入力に応じて) 離散有限か連続かでそれぞれ分類問題と回帰問題どちらの解として適しているかを説明している. 出力層の活性化関数には, 前者ではソフトマックス関数が, 後者では恒等関数が使われることが多い (ソフトマックス関数はクラスに属する確率配列を返す1の分割関数).

個人的にはコンピュータ特有の問題 — 丸め込み誤差や不定値への対処, バッチ処理で見られるようなパフォーマンスへの配慮等 — への補足は助かる (ソフトマックス関数を適用させる前に, 要素の最大値を引いておく等).

4章. ニューラルネットワークの学習

この章では最終的に与えられた(未学習)ネットワークを学習させるところまでをやってる. 中心差分による数値微分[3]差分商による微分の近似についての優位性についてはApproximating feature advantage of the Symmetric Difference Quotient over the Divided Difference を参照.損失関数として

  • sum of squared error
  • cross entropy error

を導入し, 勾配法による学習を行う. 損失関数が分かりやすく, ニューラルネットワークの性能の悪さを表す指標, つまり正解からどれくらい離れてるかを表す値と説明されている.

可微分関数の勾配が消える点をcritical pointと言うが, そこは最小と限らないしsaddle pointかも知れない, まさにそうである. にも関わらず, ともかくそのcritical point (の逆方向) に向かって(予め与えた) 学習率を掛けるというアルゴリズムにもやもやが残った. 後でそのもやもやは解けるだろうか. そして勾配法以外のアルゴリズムも知りたいが, 後の章で出てくるだろうか.

認識精度の評価方法、図示方法についても実装で説明があり, とても有用.

ともかくこれで簡単なニューラルネットワーク設計と勾配法による学習と推論処理の実装はできることが分かった. それにしても, 有効かつ十分な教師データを集める(作る)のは骨が折れそうやで.

次回へ

Footnotes

Footnotes
1 {1, 0}値. 3章で書籍内でも言ってるが, 単純パーセプトロンは単関数 (値域が有限集合の関数) のことらしい.
2 ブール束の言葉で書けば\lnot(x\wedge y)\wedge (x\vee y) = {\rm XOR}(x,y) のことである.
3 差分商による微分の近似についての優位性についてはApproximating feature advantage of the Symmetric Difference Quotient over the Divided Difference を参照.