自分支援機構

10年後には黒歴史

『ゼロから作るDeep Learning』を読んでいる(その1)

 買ってからしばらく積んでいた、斎藤康毅著『ゼロから作るDeep Learning』(オライリー・ジャパン)をようやく読み始めています。

せっかくなので読みながらちょっとずつ読書メモを残していきます。

1章 Python入門

 1章では、Pythonとライブラリの使い方を簡単に勉強します。正直プログラミングの経験がない人がこの章だけ見ても習得は厳しい気がしますが、まあこの本の主題はPythonプログラミングを身に着けるための本ではないのでこれくらいあっさりでも大丈夫なのでしょうう。
 数値計算関係はC言語でしか書いたことがなかったのですが、PythonでNumPyを使うと自分で処理を色々と実装しなくてよいので非常に楽に感じました*1。特に、いちいちfor文を回さなくても配列とか行列の計算が出来るのが衝撃的でした。

2章 パーセプトロン

 2章では、「パーセプトロン」なる初歩的な(?)アルゴリズムの実装を学びました。一応簡単に説明します(間違っていたら遠慮なくぶっ叩いてください)。
 まず1層のパーセプトロンを簡単に説明すると、入力の配列(ベクトル)を$\boldsymbol{x}$(成分は0 or 1)、重み付けのパラメータを$\boldsymbol{w}$、バイアスを$b$としたときに
\[
\boldsymbol{x}\cdot\boldsymbol{w}+b
\]
のが$0$以下か$0$より大きいかに応じて$0$ or $1$が出力されるようなアルゴリズムのことです。簡単な2次元のインプットの場合に$\boldsymbol{w},b$の値を(人力で)調節することで、いくつかの論理関数を実現するパーセプトロンを実装しました。
 上記の1層のパーセプトロンでは非線形な領域のアウトプットを実装することができないので、パーセプトロンの層を複数重ねることにします。適当に2層の場合で説明すると、入力$\boldsymbol{x}$に対して、一層目の出力$\boldsymbol{a}$(の$i$成分)が
\[
a_i=\boldsymbol{x}\cdot\boldsymbol{w}^{(1)}_i+b^{(1)}_i
\]
終結果が
\[
\boldsymbol{a}\cdot\boldsymbol{w}^{(2)}+b^{(2)}
\]
となるような感じです。このように層を重ねることで非線形な領域を実現することができます。
 本では具体的な例や図解を用いてもっとわかりやすく説明されているので私の説明は適度に無視してください。

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

 3章ではニューラルネットワークの簡単な実装について触れます。聞いたことのあるワードが出てきてちょっと嬉しいですね。まだパラメータ(重み)の学習などについては触れないのですが、とにかく与えられたパラメータを元にデータから推定を行ってみるということをやります。
 パーセプトロンでは出力がは$0$ or $1$で与えられていて、これは関数としての名前だと「ステップ関数」に相当するものでした。ステップ関数のように「重みつき和にバイアスを加えたもの」に適用する関数を活性化関数というのですが、ニューラルネットワークでは主に他の関数を使います。この章で扱う活性化関数はシグモイド関数とReLU関数です。このようなステップ関数以外の関数を用いることで「ニューラルネットワークの世界へと進むことができる!(p.44)」そうです。
ニューラルネットワークの各層の処理は入力配列に対して行列をかける操作と見ることができます。3章の中盤では行列の掛け算の丁寧な説明も含めて3層のニューラルネットワークを実装してみます。各層での処理は、

  • 入力(前層の出力)に重みの行列をかける
  • その結果に活性化関数を適用する
  • 出力

といった感じです。「縦ベクトルに左から行列をかける」という操作に頭が慣れきっているので、「横ベクトルに右から行列をかける」操作にはちょっとだけ困惑しました*2
この章の最後では、用意されている学習済みの重みパラメータを用いて、実際のデータを処理してみます。データセットをダウンロードしてきてPythonで扱えるようにする操作にけっこう手間取ったのですが、この文章を読んでいる未来の読者には「わからなくなったら著者の方が提供しているソースコード見るといいよ」というアドバイスをしておきます*3

ここまでの感想

 前半1/3くらいしかまだ読んでないですが、難易度の上がり方が緩やかで読みやすい本だと思いました。ただし、アルゴリズムや数学的な部分の説明はとてもわかりやすい一方で、Pythonのプログラミングやライブラリの使い方などは(それがこの本の主題でないことを考えても)ちょっと不親切だなとは思いました。このブログを見た初心者の方は、著者の方が公開なさっているソースコードをダウンロードしておいてそれを見ながら読み進めるのがよいと思います*4

*1:たぶんCにもそういうパッケージとかライブラリはあるんだろうけど。

*2:全体の転置を取っているだけなのだけれど

*3:ちなみに私の失敗は、インタプリタモードでp.73の関数を見たまま入力したのでNumPyをインポートしておくのを忘れたことです。

*4:Pythonをきっちり勉強してから始める、というのもアリかもしれない?