/ディープラーニングにおける活性化関数をPythonで作る!2019.05.04ディープラーニングにおける活性化関数をPythonで作る!Tweetニューラルネットワークに表現力を持たせるために必要な活性化関数には、様々な種類があります。ここでは代表的な活性化関数をいくつか紹介し、Pythonで関数化する所までを扱います。wat(@watlablog)です。Pythonの勉強とともに、AIや機械学習の勉強も始めました。ニューロンが多彩な表現力を持つニューロンモデルは生物の仕組みを模倣している人口知能の分野で知られるディープラーニングでは、多数のニューロンモデルと幾層ものネットワークで構成されたニューラルネットワークと呼ばれる構造を形成します。以下の図は人間のニューロンをモデル化したものです。ニューロンは入力と重みとの積にバイアスを足し、活性化関数を経て出力信号を出すものと定義されています。このページで扱うのは活性化関数ですが、上記説明だけでは数学的な言葉だけなので活性化関数について学ぶ前に、全体について少し生物学的なことも本を漁って調べてみました。ニューロンにおける神経伝達物質とは?1つのニューロンへ複数の入力がされているというのは、どうやら他の複数の神経細胞とによる神経伝達物質の授受を表現しているようです。この神経伝達物質にはグルタミン酸やガンマアミノ酪酸(GABA)等、現在では100種類以上も確認されているとのこと。この神経伝達物質の受け取りはニューロンに複数あるレセプター分子で行うとのことですが、1つのレセプター分子は1つの神経伝達物質のみしか感じない(例えばGABAだけを感じるレセプター等)ことがわかっているそうです。入力は複数ありますが、その物質から得られた信号は1つの軸索端末で処理されて次のニューロンに渡される...こうしてネットワークを形成していくということから、上図のニューロンモデルの出力は1つだけにしているそうです。pp.102-106」にわかりやすく書かれていますので、興味のある方には良書となると思います。レセプター分子で感度(重み\(w\))があり、軸索端末を伝っていく過程に活性化関数\(f\)があって、出力部で再度神経伝達物質\(y\)が放出される...という理解で良いのかな?バイアスはニューロン固有の興奮しやすさみたいなものかな?この辺は是非専門家の意見をお聞きしたいですね。活性化関数はニューロンの興奮を表現している活性化関数はニューロンの興奮状態を表しています。刺激(入力)に対して興奮するかしないか、といったことは脳にとっては極めて重要です。全ての信号に対して毎回興奮する場合、または毎回興奮しない場合でもおそらく生物的に生きていくのは厳しいと思われます。空腹時はラーメン見ると興奮するけど、満腹時はそうでもないもんね。ラーメン見てトイレ行きたくなったりしても困るし、生物ってよくできてるね。生物学的には神経伝達物質をニューロンで感じ(感じ方、感度は個々のレセプター分子やニューロン自体の感度による)、それを軸索端末で信号として伝えていき次のニューロンへ渡すということが行われているそうですが、どうやらこれだけだとただ信号を伝えているだけで、ニューロンが多彩な表現力を持つことにはならないそうです。先ほど紹介した書籍「コネクト―ム」の113ページには、「ある刺激でスパイクを起こさないニューロン(つまり行き止まり)も脳にとっては重要」と言及しています。興奮の度合いは上図モデルの重み\(w\)やバイアス\(b\)で決まりますが、どういう形のスパイク(生物学的には活動電位)をどういうレベルでどんな時に起こすかもまた重要であることから、活性化関数というものが研究されているようです。Pythonで活性化関数をコーディングしよう!前半は主に理解を得るための調査結果について長々と書きましたが、このページの主旨はPythonで活性化関数を表現することにあるので、以下に代表的な関数の種類とPythonコードを示します。yこのステップ関数は入力\(x\)に対して0か1という2値をとります。場合分けにはNumPyのwhere関数を使っています。1958年頃にパーセプトロンと呼ばれるニューラルネットワークの一種に使われていた、非常にシンプルな関数です。yシグモイド関数は入力\(x\)に対し0と1の間を滑らかに変化します。この関数は微分形が自身のシグモイド関数を用いて記述することができるため、古くからニューラルネットワークで利用されてきたそうです。yシグモイド関数が0から1だったのに対して、tanhは-1から1までを滑らかに変化する関数で、負値を許容していることが特徴です。Unit)はランプ関数とも呼ばれます。シンプルなことと、多岐にわたる値を取れることからディープラーニングではよく使われる関数とのことです。こちらも場合分けにはNumPyのwhere関数を使っています。ReLUという現象に陥る場合があるとのことです。入力\(x\)が負値の時に出力\(y\)が0にならないように小さな係数がかけてあります。y入力値をそのまま出力として返すのが恒等関数です。この関数はニューラルネットワークの出力層で主に回帰問題を扱う際によく使われるそうです。yソフトマックス関数は入力値の個数(\(x_{k}\)は同じ層のそれぞれの入力値を示す)によって値を変えますが、出力値の総和をとると1になることから、確率の要素を含む分類問題に対して使われるそうです。まとめこのページではディープラーニングで使用されるニューロンモデルと活性化関数の役割について学び、Pythonによる活性化関数のコーディングを行いました。以下にまとめのコードを示します。関数ファイル(activation_function.py)とメインファイル(main_activation.py)に分かれており、メインファイルを実行することで活性化関数がプロットされます。フォントの種類とサイズを設定する。グラフの上下左右に目盛線を付ける。軸のラベルを設定する。データの範囲と刻み目盛を明示する。データプロットの準備とともに、ラベルと線の太さ、凡例の設置を行う。フォントの種類とサイズを設定する。グラフの上下左右に目盛線を付ける。軸のラベルを設定する。データの範囲と刻み目盛を明示する。データプロットの準備とともに、ラベルと線の太さ、凡例の設置を行う。plt.show()plt.close()<広告>人工知能のプロに最速でなるには、独学よりも効果的なオンラインゼミがあります。これを機会に是非ご検討下さい!ついにディープラーニングの学習を始めました。活性化関数SNSでもご購読できます。技術系の職に就き日々実験やシミュレーションを使う仕事をしています。このブログでは初心者が科学技術プログラムを作れるようになることを目標に、学習結果を記録していきます。*メールアドレス(公開はされません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。