前回のコラム (リンク ») では、ニューロンをニューラルネットワークの単純なビルディングブロックとして説明しました。今回のコラムでは、手書き数字(MNISTチャレンジ)を認識する機械学習の、最も有名な問題のひとつに注目して、数字を認識するように学習する小さなニューラルネットワークを考えてみます。
入力レイヤー、出力レイヤー、および活性化関数によってどのように単一のニューロンがモデル化されるかについて、前回で説明しました。活性化関数は入力を取り、与えられた重みと組み合わせて出力を計算します。手書き数字認識ネットワークに注目する前に、シンプルなニューラルネットワークがその出力をどのように計算するかを見てみましょう。
「ニューラルネットワークの出力とその計算方法」
3つのニューロン(I1,I2,I3)を有する入力層、4つのニューロン(H1,...,H4)を有する1つの隠れ層、および2つのニューロン(O1,O2)を有する出力層を仮定します。さらに、ネットワークが完全に接続されている、すなわち各ニューロンが下図の通りそれぞれのニューロンに接続されていると仮定します。
V(入力層と隠れ層の間)とW(隠れ層と出力層の間)は、接続の重みと仮定します。この場合にはV1,3はI1とH3との間の接続の重みを表します。
ネットワークの出力を計算するために、入力値から始めて、隠れ層の値を計算します。
・計算式 (リンク »)
hはある指標関数です。
次に、出力ニューロンを計算します。
・計算式 (リンク »)
数学では、通常、上記を記述するために行列/ベクトルの乗算を使用します。
・計算式 (リンク »)
ニューラルネットワークの出力を計算することができたので、その結果を使って学習させます。入力値と出力値のセットがあり、ニューラルネットワークに合わせて重みを調整します。各入力データに対して出力を計算し、計算結果と期待される出力を比較したその差を損失といいます。重みを調整することにより、この損失を最小限に抑えようとします。
「手書き数字を訓練する例」
ここで、MNISTデータセットを見てみましょう。これは手書き数字の28x28ピクセルの画像です。したがって、ニューラルネットワークの入力には28×28 = 784個のニューロンがあります。 1つの隠れ層に64個のニューロンを追加し、出力層に10個のニューロンを追加します。訓練入力は画像のピクセルであり、期待される出力は正しい数字が1で残り全てが0であるベクトルです。
下記でダウンロードできるコードはTFLearn (リンク ») というフレームワークを使ってPythonで書かれています。TFLearnはGoogleのTensorFlow (リンク ») に実装されています。TFLearnとTensorFlowをインストールした場合は、下記のコードをそのまま起動できます。
・コードのダウンロード (リンク »)
---コードの説明---
l1:tflearnフレームワークをインポートし、テンソルフローを読み込み
l2:mnistデータセット関数をインポート
l4:MNISTデータをロードし、トレーニングセットとテストセットに分割
l5-l13:学習データ、テストデータ、バリデーションデータを設定
l15-22:ニューラルネットワークを構築
l16:入力層を784個のニューロンで定義
l17:完全に接続された64個のニューロンの隠れ層
l18:出力層は10個のニューロンで構成され、10個の値の和が1になる確率を保証する特別なアクティブ化関数 `softmax 'を使用
l19:どのように重みを学習するか、ネットワークを定義
l21:モデル(深いニューラルネットワークDNN (Deep Neural Network))を作成
l22:訓練セットXとYに適合し、検証セットtestXとtestYに対するテスト
l26:Xvalに対して認識の結果を計算
l28-45:ランダムの画像を10枚を表示
------
・・・ここから先は、アクセリア株式会社で公開中のコラム本編でご覧ください。
本編では、挿絵を交えて詳しく説明しています。
(リンク »)
【Norbert Preining氏のコラム】
・第1回:今さら聞けない、機械学習/ディープラーニングとは!? (リンク »)
・第2回:最新の機械学習の代表、ニューラルネットワークとは (リンク »)
お問い合わせにつきましては発表元企業までお願いいたします。