人工知能技術の歴史を変える1冊が出版されました。


現在人工知能技術(AI)は、Googleが牽引しています。その技術力は世界随一です。またWeb上の検索データを掌握しています。これからのGoogleの発展は、そのまま人工知能の発展といえるでしょう。

一方本書は、人工知能技術の本命であるディープラーニングについて、極めて分かりやすく説明してくれています。いずれ古典となる本です。

一般の人にディープラーニングという最先端技術を民主化したのです。現在本書の輪読会が多数開催されています。今後本書を学んだエンジニアが、世界を変えるためにAIの開発を行っていくでしょう。この本が日本語で出版されたことを、大変うれしく思います。 

多くの日本人に本書を読んで欲しいのですが、 140字以上の文字を見ると痙攣する人もいるかもしれません。ですので、本書のエッセンスを簡単に解説します。


ディープラーニングとは何か

ディープラーニングを少しでも調べたことがある人ならば、以下の式を見たことがあるかもしれません。
  Y = W・X + b (Xは入力データ、Wは重み、bはバイアス、Yは出力データ)

これはディープラーニングの基本となる式です。Wとbは特徴量とも言われており、このWとbを自動的に学習するところが、ディープラーニングの革新的なところです。データの特徴量を捉えることが出来れば、物事を正しく判別するプログラムができます。

例えば経営判断や未来予測なども、過去のデータを集めてディープラーニングに入れることで、正しい予測を行うことも理論上は可能です。ディープラーニングは人間が特徴量設計を行わないため、集めたすべてのデータから法則を抽出することが出来るからです。
 

ディープラーニングの理論と実装

ディープラーニング(ここでは3層ニューラルネットワーク)の学習方法について、数式とPythonコードの2つで説明します。なお、ディープラーニングのプログラミング言語はPython一択です(理由はこちらを参考)。
※Pythonのコードは青色で記述

①入力データXを用意する

ニューラルネットのデータ処理は、numpyという数値計算ライブラリを利用して、ベクトルとして計算処理を行います。例えば、画像データもピクセル単位のベクトルですし、文書データも、単語単位のベクトルとなります。
X = np.array([1.0, 2.0, 3.0, ・・・],[3.0, 4.0, 5.0, ・・・])

②a1 = W・X + bを計算する(1層目)

a1 = W・X + b
a1 = np.dot(X, W1) + b1

③活性化関数に入れる

シグモイド関数:
z1 = 1/ (1 + exp(-a1))
z1 = 1 / (1 + np.exp(-a1)) 

ReLU関数:
z1 =  x (x > 0)
         0 (x =<0)
z1 = np.maximum(0, a1)

※画像処理などではReLU関数を、それ以外ではシグモイド関数を主に活用します。

④a1 = W・X + bを計算する(2層目)

a2 = W・X + b
a2 = np.dot(z1, W2) + b2

⑤活性化関数に入れる

ソフトバックス関数:
y = exp(a2) / Σexp(a2)
y = np.exp(a2)  / np.sum(np.exp(a2))

⑥勾配の計算

勾配とは、全ての変数の偏微分をベクトルとしてまとめたものです。
要は微分なので、f(x+h) - f(x) / hをすべてのパラメータに行えばいいのですが、これだと計算時間が膨大にかかります。そこで計算時間の短縮のため、誤差逆伝播法という方法が導入されました。コードを見ると、層の逆から勾配が求められていることが分かります。だから"逆"伝播なのです。
dy = (y - t) / x.shape[0]
grads['W2'] = np.dot(z1.T, dy)
grads['b2'] = np.sum(dy, axis=0)

da1 = np.dot(dy, W2.T)
dz1 = np.dot(1.0 - z1) * z1
grads['W1'] = np.dot(z1.T, dy)
grads['b1'] = np.sum(dy, axis=0)


⑦パラメータの修正

上記の勾配gradsを元に、各パラメータを修正します。今回はfor文で順番に修正しています。なお、0.1は学習率です。
for key in ('w1', 'b1', 'w2', 'b2'):
network.params[key] -= 0.1 * grads[key]

⑧損失の計算

パラメータの修正が終わったら損失を計算します。

2乗和誤差:
E = 1/2Σ(y - t)^2
loss = 0.5 * np.sum((y - t)**2)

交差エントロピー誤差:
E = -1/N * ΣΣt*logy
loss = -np.sum(np.log(y[np.arange(y.shape[0]), t])) / y.shape[0]

⑧の損失計算が終わったならば、②に戻り再度ニューラルネットの計算を行います。
こうやって②~⑧を繰り返すことで、パラメータが最適化され損失が最小化されていくのです。

要は、ディープラーニングとは、微分して、パラメータ修正して、損失計算するという事を、何度もぐるぐる回しているだけなんです。すると損失が最小化されるプログラムを自動的に作ることが出来ます。驚くほど簡単ですが、だからこそ汎用的に利用できます。

ディープラーニングの開発で人間が行う事

ディープラーニングがあれば、人間は何もしなくても良いのでしょうか。残念ながら人間がいくつか設定をする必要があります。それは、ハイパーパラメータの設定とアルゴリズムの選択です。

例えば、この計算回数は何回繰り返すか、パラメータ修正の学習率はどうするかは人間が決めます。
また、勾配計算のアルゴリズムの選択も人間が決めます。しかも計算結果がブラックボックスのため、どの設定値が良いかは試行錯誤する必要があります。経験的に効果の高いアルゴリズムはありますが、それも完璧なものではなくケースバイケースです。

ここがディープラーニングの難しいところでもあり、面白いところでもあります。
神はサイコロを降らないと言いますが、神ではない私たちは、試行錯誤というサイコロを振り続けなければパターンという法則を発見することはできないようです。

国産ディープラーニングフレームワーク"chainer"

「いや難しい理論や理屈はどうでもいい、とにかく実装できればいいんだ」という人も多いと思います。

最低限の理論は把握しないとそもそも何をすれば分からなくなるので、この記事の内容くらいは抑えて欲しいです。ただ、とにかくまずは動かせればいいんだいう人は、chainerというディープラーニングのフレームワークをインストールして、サンプルプログラムを動作してみてください。

chainerがあれば、ディープラーニングを簡単に実装できます。しかし、何がどう動いているのか分からなくなるためプログラムの解説があると便利です。おすすめは清水さんの本を読みながら動かしてみることです。私もこの本を写経してchainerの理解を深めました。


一方、じっくり理論を理解したい、きちんと基本を押さえたいという人は、「ゼロから作るDeepLerning」を買うべきです。値段の100倍の価値はあります。少なくとも私は本書を読んで、ディープラーニングを理解し、文字通りゼロから実装することが出来るようになりました。この本をぼろぼろになるまで読み込めたことが今年一番の収穫でした。

著者の方は企業勤務の方とのことですが、これだけ丹念に説明してくれるところを見ると、きっと性格も優しい人なんだと思います。

想定読者ターゲット
・ディープラーニングを作れるようになりたい人
・ディープラーニングを作って金儲けを企む人

読者に求められるスキル
・高校レベルの数式を見て、ある程度我慢できる人
・Pythonのデータ処理を多少は理解している人(こちらの内容がなんとなくわかる人)
 

ディープラーニングは世界を変える技術

「いやでもやっぱり難しそうだな、勉強大変そうだな」と思う人もいるかもしれません。
確かに大変と言えば大変ですが、これだけ騒がれている最新技術を理解できることはとてもエキサイティングです。なぜなら、この技術で世界を変えられるかもしれないという予感があるからです。

世界を変えるには切符が必要です。その切符を買うためには、市場の理解やアイデアが必要ですが、最も大事なことは実装力です。実装力があって初めて世界を変える切符を手にできるのだと思います。その切符を使ってどの電車に乗るかは、各個人が見極めていけばよいのではないでしょうか。

なお、実装よりではなく人工知能(AI)ビジネスを考える立場の方はこちらをご参考して貰えば、AIの企画業務は十分可能と思います。企画やビジネスモデルも大事です。なぜなら今のAI市場でマネタイズできている業者は、世界にほぼ存在しないのですから。

合わせて読みたい
scikit-learnのディープラーニング実装簡単すぎワロタ