ゼロから作るDeep Learning(4日目)
こんにちは、筋肉めがねです。
少しだけ筋トレの話をしてみましょう。トレーニングをする目的は人それぞれありますよね。体重を落としたい、という人もいれば、現状を維持したい、もしくは筋肥大を目指す、という人もいますよね。僕は筋肥大を目指してトレーニングをしているのですが、その時に大事なのは、筋繊維を破壊した後に適切な栄養を補給する事なんですよね。それで、例えばジムに着いた時に、プロテインがない、という事に気づいた時のショックといったら。。という事で、プロテインは常に切らさずストックを持っておきたいものです。
それでは、本日も「ゼロから作るDeep Learning」を進めていきましょう。
本日は3章の続きですね。
前の記事では、「単層パーセプトロンとニューラルネットワークの違いは活性化関数にある。」という事に触れましたね。
では、活性化関数とは何なのか。上図のh()の事なんですが、これって何なのと。本書には、入力信号の総和を出力信号に変換する関数、とありますね。ふむ。そして活性化関数には、大きくステップ関数とシグモイド関数がある、と。なるほど。
ステップ関数は、ある閾値を境にして、出力値が変わるもの。そして、単層パーセプトロンはステップ関数を活性化関数として使っていると。そして、ニューラルネットワークはシグモイド関数を活性化関数として使っていると。
先ずは、ステップ関数について、理解してみましょうか。
ここで数式を書いて説明するんでなくて、別のアプローチで理解してみましょう。
という事で、ドラゴンボールの話をしてみましょう。
皆さん、ドラゴンボールを見ましたか。男の子であれば、一度はかめはめ波の練習をした事があるのでは、と思います。そして、孫悟空の筋肉を見て思う事は、あれは優にベンチプレス120kgを挙げれる体だよな、と。
それで、孫悟空の得意技ですが、みなさんご存知の元気玉ですね。
Wikipediaから一部抜粋すると、元気玉とは、人間、動物、草、木など周囲のあらゆる生物からの元気と呼ばれる微量なエネルギーだけでなく、太陽、大気、物のエネルギーにいたるまで、あらゆるエネルギーを集め攻撃エネルギーに変えて放つエネルギー弾。威力は絶大だが元気を集めるのに時間がかかり、その間は全くの無防備になるのが欠点。
そう、あらゆる存在からエネルギーを集めて、それを統合する(入力の総和)という点で、孫悟空はステップ関数、そして、孫悟空が自分で決めた閾値に元気の総和が到達しない間は、元気玉という出力を放出できない。また、元気の総和が閾値を超えたと孫悟空が判断したら、その元気の総和を元気玉という形に変換し、(入力信号の総和を出力信号に変換する)一気に出力する、という点で、孫悟空はステップ関数。そう、孫悟空そのものがステップ関数だったんですね。次にドラゴンボールを見られる際には、「孫悟空はステップ関数である。」という事を頭の片隅に置きながら見てみると、また違った楽しみ方ができるかもしれません。
では、シグモイド関数とは何なのか。 元気玉の例を使って理解しようとするならば、それは、孫悟空が閾値というものを設けずに、状況に応じて、入力された元気の総和を、元気玉として出力できる、そんなイメージです。
よし、シグモイド関数をNumPyとMatplotlibを使って描画してみましょう。
シグモイド関数
シグモイド関数はexponentialのeを使った関数で、入力(x軸)に対してとても滑らかな出力(y軸)である事が分かります。
ついでに、ステップ関数を描画してみましょう。
入力の総和がある閾値を超えるまでと超えた後で、全く出力される値が異なる事が分かりますね。
ステップ関数、シグモイド関数は両者ともに非線形な関数です。非線形な関数である事がとても重要で、何でかというと、線形関数は、単純にインプットを数倍し、それをそのまま出力するんですね。という事は、複数の層が重なる事の利点がないんですよね。なぜならy = axを、y = b(ax)とする事は、y = cxとして最初から設定しておけば解決する話なので。だから、非線形な関数を活性化関数として使う事がとても重要なんですね。そして、両者で大きく異なる部分は「滑らかさ」ですね。そう、ニューラルネットワークでは、「学習する」というプロセスにといて、この「滑らかさ」がとても重要になってくるんです。
えっ、ドラゴンボールよりも、はじめからグラフを書いてくれた方が分かりやすい?それは、ご愛嬌ということで。それでは、次回は多次元配列について、そして実際に複数のニューラルネットワークを自分で作ってみましょう。
それでは、本日は以上でございます。