ニューラルネットワーク(Neural Network:NN)とは、人間の脳内にある神経細胞(ニューロン)とその回路網を、人工ニューロンという数式的なモデルで表現したものです。ニューラルネットワークモデルは、シナプスの結合強度を学習によって調整することで、入力データを識別する能力を獲得していきます。
人間の脳の中にはニューロンという神経細胞が約千億個あり、各ニューロンがシナプスと呼ばれる接合部位によって繋がっています。ニューロンは入力される電気信号の総和がある一定の量を超えると発火し、次のニューロンに電気信号を出力します。
この仕組みを模したのが「人工ニューロン(artificial neuron)」で、1943年に神経生理学者ウォーレン・マカロックと数学者ウォルター・ピッツが発表した「形式ニューロン(formal neuron 別名:Threshold Logic Unit )」がその最初のものです。 右図は1個の形式ニューロンの模式図で、中心のCELLが細胞。x1〜xn が入力信号で、それぞれが一定の重み(w:値の大きいものが影響力大)で、細胞に接続されています。その総和が閾値(θ)を超えると、細胞が「発火」して次の細胞へと信号を送り出します。式で表すと以下のようになります。
y = f ( w1・x1 + w2・x2 + ・・・・ + wn・xn - θ )
W = ( w1, w2, ・・wn )は、多次元空間における法線ベクトルで、関数式の内部ではまず、これとデータ X = ( x1, x2, ・・xn ) との内積をとっていることになります。法線ベクトルと同じ向きにあれば内積は + 、反対向きにあれば内積は - で、要するに、上の関数式は、データが存在する空間を分割する多次元空間上の境界(2次元なら直線、3次元なら平面)であるということができます(詳細は次節)。
一般に、出力 y は0または1。つまり、細胞は抑制されるか興奮するかの2状態しかありません。このような細胞が何個も並び、それが何層にも連結されたものがニューラルネットワークになります。
W の調整はどう行うのか、視覚的に説明してみましょう。x0, x1 を2軸とした平面に、データ X (x0,x1) が散布されていて、それらがTYPE A と TYPE B の2クラスに分類できる状態を仮定します(下図を参照)。
以下の式は、原点を通る直線で、その法線ベクトルは(w0, w1)です。
w0・x0 + w1・x1 = 0
図の状態を仮定して識別問題を考えた場合、w0, w1 が適切な値をとると、データは直線によってきれいに識別されることになります。学習による最適化とは、境界線の位置を学習データを読みながら調整する、すなわちこの場合、法線ベクトルの向きを回転させて2つのタイプの境界に位置するように調整する作業であるということができます。
(x0,x1)と法線ベクトルの内積 = w0・x0 + w1・x1 を計算すると同時に、それを正解ラベル( 1:TYPE A , -1:TYPE B )と照らすと、境界線が正しく2者を分離しているかどうかを判定することができます。
つまり、ひとつのサンプルについての判定とその後の作業は以下のように記述することができます。
修正は、以下のように行います。正解ラベル を学習率( Learning_Rate )を 0.1 とすると、学習は以下の式で実現できます。
W = W + X * 正解ラベル * 0.1
正解ラベルが 1, -1 に設定されていることで、2種類のエラータイプに対して、同じ計算式を適用できるわけです。
学習率とは「どの程度強く修正をかけるか」を意味する値で、これは人間が設定するしかない・・という意味で、ハイパーパラメータといいます。
以上、学習率を正しく見極めた上で、この手順で、データを読んでは修正を繰り返せば、境界線は正しい位置に収まります。
右図はニューラルネットワークのイメージです。Input Layer(入力層)は、最初のデータが入ってくる部分、Hidden Layer(隠れ層)は入力信号を受けて様々な興奮状態をつくる中間処理機関、そして Output Layer(出力層)は結果としての興奮状態を表現する部分す。例えば、気温、湿度、現在時刻という3種類のデータから、1時間後が「晴れている」か「雨が降る」かを予測する(ちょっと無理がありますが例え話です)という場合は、入力層が3、出力層が2となるモデルをつくって、過去の大量の気象データから、気温・湿度・時刻(説明変数)、そして 1時間後の天気(目的変数)というデータセットをつくって学習させることになります。
ニューラルネットワークにおいて線形変換(重み付き入力の総和)後に最終的な出力を決める関数のことを「活性化関数(Activation Function)」と言います。中間層と出力層では用いる関数が異なるのが一般的で、以下のように分類できます。
ニューラルネットの文脈では、最適化とは「出力の誤差が最小になるように調整すること」を意味します。誤差を表す関数は何らかのカーブを示しますが、このカーブをたどって、最下点に至るように、パラメータを調整するわけです。その方法には様々あります。以下リンクで紹介します。
ニューラルネットワークの基本的なアイデアは3層構造ですが、中間層の数を数十〜百段階程度まで増やして、多段階の神経接続で出力を得よう・・という発想から誕生したのがディープラーニングです。多層化に耐えられるだけの計算力(演算速度向上とメモリの増大)が実現したことで、現在の人工知能はこの技術が主役になっています。
手書き数字の画像データ(28 × 28px) と正解ラベルのペアを学習用 60,000個、評価用 10,000個をセットにしたデータサンプル、MNISTを使用します。
MNIST(エムニスト):手書き文字認識用のサンプルデータ
http://yann.lecun.com/exdb/mnist/
JupyterNotebook形式(.ipynb)でプログラムを提供します。
ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
このリンクを知っているインターネット上の全員が閲覧できます。
-[[ニューラルネットワーク(MNIST)>https://colab.research.go・・=sharing]]
手書き文字認識のプログラムについて解説します。
Iris は、植物学者 R. Fisher による「あやめ」のデータで、統計ソフトの練習用として最も有名です。 Iris setosa、 Iris virginica、Iris versicolor 3種について、がく片の長さ、がく片の幅、花弁の長さ、花弁の幅の4つの計測データが、各 50、計 150 件含まれます。
IRIS:植物学者 R. Fisher による「あやめ」のデータ
https://archive.ics.uci.edu/ml/datasets/iris
以下の項目をもつ150の計測データ
JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience/blob/main/NeuralNetworkIris.ipynb
model = Sequntial() model.add(Dense(32, input_dim=4)) model.add(Activation('relu')) model.add(Dense(4)) model.add(Activation('softmax'))
分類の手法は NN だけではなく、SVM(サポートベクターマシン)など、他の手法でも可能です。Python の機械学習ライブラリ Scikit-learnを使って手書数字を認識するプログラムを概説します。
JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience/blob/main/DigitRecognition.ipynb
という流れが開発の定番スタイルです。
以下は、JavaScript用の機械学習ライブラリーを用いて、ブラウザ上で画像の認識を行うサンプルです。参考までにご紹介します。
MobileNetの学習済みモデルと TensorFlow.jsを利用して、画像の対象物を推論するサンプルです。手元の画像のドラッグ&ドロップで、対象を推論するサンプルです。上位4件の候補を、その確率とともに表示します(人や人物の顔は対象外なので、人物の画像を投入すると「T-シャツ」や「ネクタイ」が検知されます。)。
ml5.js というJavaScriptAPI を利用した画像の分類その他について、以下のページにまとめています。
> ml5.js