どこかで一度は聞いたことがある、ディープラーニングの「ニューラルネットワーク」。
どのような仕組みになっているのでしょうか? 今回は簡単な具体例を扱いつつ説明していきたいと思います。課題をクリアする、という方法で解説します。
課題
課題:5×4画素の白黒2値画像として読み取った手書きアルファベット「A」「P」「L」「E」を識別するニューラルネットワークを作成する
手書きアルファベットとして以下のような例が挙げられます。
グレーになっているところは1、白になっているところは0に対応します。
ニューラルネットワークは3つの種類の層からなっています。「入力層」「隠れ層」「出力層」です。本例では入力層は20の構成要素、隠れ層は3つの構成要素、そして、出力層は4つの構成要素からなっています。
変数名は以下のようになっています。
活性化関数としてシグモイド関数がよく使われます。それはステップ関数的な要素を持ちつつ、微分可能な関数だからです。ステップ関数は90度に曲がっているところで微分不可能になってしまいます。
計算していくうえで、微分可能だということは重要です。滑らかな関数としてシグモイド関数が使用されます。シグモイド関数は以下の関数です。
この関数は0から1の間をとる滑らかな関数です。ニューロンはある閾値を超えると信号が伝達する、という特性があり、ステップ関数的に振る舞うのでステップ関数に似ているシグモイド関数は重宝します。
シグモイド関数を利用したユニットをシグモイドニューロンと言います。シグモイドニューロンの出力は0と1の間の任意の数になります。
脳のニューロンの出力は0か1です。その点で脳のニューロンとシグモイドニューロンは違ってきます。しかし、この違いを埋め合わせるためになんとかできないかと考えると、シグモイドニューロンの出力はニューロンの反応度と表すことができます。
0に近いと反応が弱く、1に近いと反応が強い、ということです。
入力層
この層は入力をそのまま出力するだけです。入力層にあるユニット名はXiと表します。Xiの出力を表す変数は小文字のxiを使います。
隠れ層
隠れ層ユニットの名前はHjと表します。この隠れ層はとても重要です。識別のための画像の特徴抽出をするそうになるからです。
では、隠れ層に関連する変数の名称について以下にまとめます。
この隠れ層の出力の式は以下のようになります。
入力の線形和は、重みつきの信号を束ねた値、というイメージです。
出力層
出力層のユニットZkの添字kは上から数えて何番目のユニットかを表し、1から4のいずれかをとります。出力層は処理結果を提示する層です。出力層1番目のユニットZ1はニューラルネットワークに手書きの文字「A」が入力されたときに反応、他は無視する働きをします。
2番目のユニットZ2は「P」が入力されたときに反応、3番目のZ3は「L」が、4番目のZ4は「E」が入力されたときに反応する働きをします。出力層のユニットに関係する変数を以下のように定義します。
出力層において出力は以下の式で計算されます。
まとめ
まとめますと、セルi から入力層i番目のニューロンXiからxiが出力され、それに重みwjがかけられて、隠れ層Hjの閾値θjがかかったものhjが出力されます。その値に重みwkがかかり出力ユニットZkにて閾値θkがかかってzkが出力されます。
重みや閾値というのはパラメータです。適切なパラメータが選ばれていれば、出力された文字の正解率は9割以上と高い値になります。
現在の課題においては出力層には4つのユニットZ1, Z2, Z3, Z4 があります。
Z1は文字「A」に、Z2 は文字「P」に、Z3は文字「L」に、Z4は文字「E」反応します。ここで反応というのは、1に近い値を持つ、ということです。そこで、0から1までの値をとるユニットZ1, Z2, Z3, Z4 の出力値を「確信度」と解釈します。
例えば、「A」と思える画像が読み込まれたとして、以下のような確認度が出力されたとします。
一方で「正解」は
となります。出力値と正解との平方誤差をとると、以下のようになります。
これは「A」の画像を読み込んだときのニューラルネットワークの平方誤差です。
次に文字画像全体についての平方誤差を出すには、それぞれの平方誤差の和を取れば良いです。平方誤差の和を「目的関数」と呼びます。
ニューラルネットワークを決定するには、目的関数を最小化することが目標になります。目的関数の変数は「重み」と「閾値」になります。
目的関数を最小化する「重み」と「閾値」を探し、その目的関数を最小化する「重み」と「閾値」をもつニューラルネットワークが探しているモデルになります。
「AIの学習」とは「誤差を最小化する重みと閾値を探すこと」ということになります。