見出し画像

第17話 ニューラルネットワーク(単一ニューロン)を実装する

いよいよ今回からニューラルネットワークの実装に入ります。
ニューラルネットワークは複数の層から成り立ちますが、いきなり難しいところから入っても理解できないので、まずは簡単な単一ニューロンを実装します。

今回の内容は次のとおりです。
・ニューラルネットワーク(単一ニューロン)の実装
・ニューロンの特性を掴む(重みとバイアスの影響)

それでは学習をスタートします。
(教科書「はじめてのディープラーニング」我妻幸長著)

単一ニューロンの実装

簡単な単一ニューロンを実装していきましょう。

まず、次のような2つの配列(要素数10)を生成します。
 x1:-1.0, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8
 x2:-1.0, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8
そして入力信号をx1,x2のすべての組合せとします。
 (x1,x2) = (-1.0,-1.0), (-1.0,-0.8), (-1.0,-0.6)…(0.8,0.6),(0.8,0.8)
 全部で100個(要素数10×10)

次に、入力x1,x2それぞれに対応する重みをw1,w2とし、ニューロンのバイアスを設定します。
最後に、活性化関数(ニューロンの発火条件)には、シグモイド関数を使用するものとします。

図にまとめるとこのような感じです。

名称未設定2

これを数式化すると次のようになります。

名称未設定

さて、これで実装するための設定条件が揃いました。
ソースコードはこのようになります。

スクリーンショット 2020-04-19 21.48.47

順番に解説していきます。

入力信号は100点あるので、出力信号も100点になります。それを格納するためZという箱を作っています。
w_1,w_2,biasは適当な値にしました。後ほどこれらを変えて遊んでみます。
for分をiとjで二重で組んでいますが、x1とx2がすべての組み合わせになるようにしています。こんなイメージです。

名称未設定

あとは先ほどの数式を100回計算させて箱Zに格納してプロットというコマンドです。
さあ、単一ニューロンの出力は一体どうなるのでしょうか!?
こんな感じです。ドドン!

スクリーンショット 2020-04-19 21.07.09

・・・うーん、なにこれ?w

AIに期待をかけて1ヶ月ちょい、初めて回したAIの出力結果がこれって・・・地味過ぎてAIの勉強やめようかと思いました^^;

というのは半分冗談です。
気を取り直して出力結果をみていくことにします。

ヒートマップをみると値は0〜1を取っていますね。
これはシグモイド関数が0〜1の値を返す関数だからです。

ヒートマップの(0,0)のところは(x1,x2)=(-1.0,-1.0)と対応して一番小さい値0に、(9,9)のところは(x1,x2)=(0.8,0.8)と対応して一番大きい値1になっています。
あとはそれらをつなぐようにグラデーションになっていますね。
グラデーションが綺麗ですね。ちゃんちゃん…

ではなくて!
1を示す黄色は、実はニューロンの発火を意味しています。
出力を計算する式は入力信号100点について全て同じ計算式を使用しているので、入力信号によって発火するかしないかを活性化関数が決めています。
これはすなわち、ニューロンが入力信号によって発火するかしないかを判断していると言えます。
信号を受け取って機械が判断を下しているという点では、これは確かにAIと言って良いかと思います。(このレベルでは全く役に立たないと思いますが)

ニューロンの特性を掴む(重みとバイアスの影響)

先ほどのコードの重みを変化させると出力にどう影響するのかをみていこうと思います。
重み、バイアスの順で変えていきましょう。

重みを負にしてみる
w1,w2をマイナスにするとどうなるでしょうか?
やってみます。

名称未設定

出力が真反対になりました。

片方の重みを0にしてみる
w1,w2を0にするとどうなるのでしょうか?
やってみます。

名称未設定2

名称未設定

グラデーションが横縞か縦縞になりました。
w_1=0の場合、x_1が大きくなってもx_2が変わらなければ色は変わりません。
同様にw_2=0の場合はこれと反対で、x_2が大きくなってもx_1が変わらなければ色は変わりません。
片方の重みを0にすると、もう片方の入力信号の大きさに出力が依存していることがみて取れました。

バイアスを変えてみる
バイアスを変えるとどうなるのでしょうか?
やってみます。

名称未設定

ヒートマップの色がシフトしましたね。
つまり、発火するニューロンの数がバイアスによって増減しています。
バイアスが大きくなるほど、ニューロンは発火しやすくなるということが確認できました。


というわけで、今回は単一ニューロンの実装とその特性について勉強しました。
次回は3層のニューラルネットワークの実装を学習します。

それではまた(^_^)ノシ

よろしければサポートお願いします!いただいたサポートは書籍代等に活用いたします!