斎藤康毅著「ゼロから作るDeep Learning …」を読む

本日は、最近注目されております斎藤 康毅著「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 」を読むことといたしましょう。

ニューラルネットを簡潔に表現するコンピュータ言語

同書の章立てと概要は以下の通りです。

1章 Python入門:この章は、同書がコーディングに使用しておりますコンピュータ言語“Python”について解説いたします。

Pythonは、昔よく使われておりましたBasicと同じインタープリター言語で、ベクトルや行列の演算が簡単にできるという特徴があります。たしかに、行列の形で式を書き下せば、ニューラルネットワークの演算は、非常にシンプルに表現することができます。

実は、以前のこのブログでもご紹介いたしましたが、私が現在取り組んでおりますパイプライン処理のための言語“mhdl”も、これに類似した機能があります。言語仕様につきましては、こちらでご紹介いたしましたが、ざっと見たところでは、行列の乗算やベクトルのスカラー積に対応するPythonNumPyライブラリ関数“dot”をmhdlでも準備すれば、ほとんど同じ機能が実現できそうです。

その意味するところは、現在計画中のmhdlは、今をときめくAIをつくるための有力な道具にもなりえるということ。Pythonが通常のPC、つまりはCPUでの演算を前提としているのに対し、mhdlは並列処理を前提としており、処理がきわめて高速であるという特徴もあります。これは一つ、mhdlの応用分野として取り込んでおくのが良さそうです。これにつきましては、稿を改めて検討することといたしましょう。


mhdlへの行列計算導入に関してはシグナル・プルセス・ロジック業務日誌を、一般のプログラミングへのテンソル演算導入に関してはこちらをご覧ください。

パーセプトロンとニューラルネットワーク

2章 パーセプトロン:パーセプトロンは入力に重みをかけて加算した値の閾値に対する大小を出力する演算装置で、これをPythonで記述する手法が紹介されます。たしかに、Pythonの行列演算機能を用いると、ソースコードは極めて簡単に書き下すことができます。一段のパーセプトロンでは非線形演算ができないのですが、これを複数段組み合わせることで排他論理和などの非線形演算もできるようになります。(1/15追記:この章と次章の内容を一部修正しました。)

3章 ニューラルネットワーク:パーセプトロンは、出力が階段状に変化するのに対し、シグモイド関数を用いて出力が滑らかに変化するようにしたものをニューラルネットワークと呼びます。これを用いた手書き文字認識の例が紹介されます。この段階では、ニューラルネットワークの重み係数は人手で与えられます。

それにしても、シグモイド関数やソフトマックス関数に、なにゆえにネイピア数(自然対数の底:e)の冪を使用するのでしょうか。デジタル演算を行うのであれば、2の冪を用いたほうが、よほど簡単であるような気がするのですが、、、まあ、mhdl版をつくるときは、これによる簡素化も、ちょっと検討してみることといたしましょう。

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

4章 ニューラルネットワークの学習:この章では、山登り法による係数の自動決定法が示されます。この手法は、ピークが複数ある場合に偽の解に収束する恐れがあるのですが、ニューラルネットワークの評価関数は、ピークが一つであるという保証はあるのでしょうか? この点が少々気になるところではあります。

5章 誤差逆伝搬法:山登り法は微係数の決定が大変なのですが、この章では、出力側から逆に追うことで微係数が容易に求まる手法を紹介します。

6章 学習に関するテクニック:この章では、山登りを高速に行う手法と、初期値の与え方についての紹介がなされます。

そしてディープラーニング

7章 畳み込みニューラルネットワーク:この章では、画像処理などに有効なフィルタリング手法について解説がなされます。

8章 ディープラーニング:この章は、最近の研究の紹介が主体で、期待しておりましたディープラーニングのPythonコードはサンプルへのリンクがあるのみで、内容への言及はありません。ニューラルネットワークと誤差逆伝搬法まではかなり古くから知られた技術ですから、この本のタイトルは、少々、羊頭狗肉的な印象も受けます。出版社には大成功のタイトルでしょうが、中には怒り出す読者がいるのではないかと、心配になります。

まあ、これまでの章で紹介されたコードを組み合わせれば、ディープラーニングもできないことはなさそうですが、ニューラルネットワークの巨大化には、それ相応の技術も必要となりそうで、実はその部分が重要なポイントではないかと思うのですが。

この本の意義

というわけで、同書は少々期待外れの面もあるのですが、囲碁やチェスでプロのプレーヤに勝つようなものを簡単に作れるなどと考えるのがそもそもの間違いであるともいえます。同書に書かれたニューラルネットワークの技術自体には、あまり目新しいものはないのですが、これをPythonで簡潔に記述しているところは、一読の価値があるでしょう。

特に、私にとりましては、開発中のmhdlコンパイラの一つの応用がみえてきたという点で、大いに価値のある書物でした。それと同時に、mhdlコンパイラにリンクリストを組み込むという作業は、ひょっとするとPythonコンパイラをつくるような、とんでもない作業量があるかもしれないとの悪い予感もしてまいりました。

リンクリストを含むmhdlコンパイラをDAシンポジウムで発表するためには、6月までにめどをつけなくてはなりません。このためには、開発に多少多めの時間を配分し、作業を急ぐ必要がありそうです。どうなりますことやら、、、