脳はニューラル ネットワークに匹敵します。 これは、機械学習や人工ニューラル ネットワークの背後にあるアイデアを理解するために、この分野に不慣れな人を支援するために通常使用されるアナロジーです。
数学的および統計的計算が舞台裏で行われているため、これらのネットワークを数学関数として定義することは、より高度な方法です。
これは、実際に機械学習に興味があり、Python ニューラル ネットワーク コードがどのように記述されているかを知りたい人向けです。
この記事では、完全に接続されたディープ ニューラル ネットワーク (DNN) をゼロから構築する方法を示します。 Python 3.
Python ニューラル ネットワーク コードのファイル構造の概要
ここに XNUMX つのファイルが作成されます。 XNUMX つ目は単純な nn.py ファイルです。これについては、「ヘルパー関数の設定」および「ゼロからのニューラル ネットワークの構築」で説明します。
「MNIST データのロード」で説明されているように、テスト データをロードするための mnist loader.py という名前のファイルもあります。
最後に、ニューラル ネットワークをテストするためにターミナルで起動される test.py という名前のファイルがあります。
このファイルについては、「テストの実行」で詳しく説明しています。
インストール
このチュートリアルに従うには、NumPy Python ライブラリをダウンロードする必要があります。 これは、ターミナルで次のコマンドを使用して実行できます。
モジュールのインポートとヘルパー機能の設定
必要なライブラリは random と NumPy の XNUMX つだけで、すぐにインポートします。 ニューラル ネットワークの初期の重みについては、ランダム ライブラリを使用してシャッフルします。
計算を高速化するために、NumPy または np を使用します (慣例により、np としてインポートされることがよくあります)。 XNUMX つのヘルパー関数は、インポート後に作成されます。 XNUMX つのシグモイド関数: XNUMX つとシグモイド素数。
ロジスティック回帰はシグモイド関数を使用してデータを分類しますが、バックプロパゲーションはシグモイド プライム関数を使用してデルタまたは勾配を計算します。
ネットワーク クラスの作成
完全にリンクされたニューラル ネットワークの構築は、このセクションの唯一の焦点です。 ネットワーク クラスには、その後に続くすべての機能が含まれます。 関数 Object() { [ネイティブ コード] } は、ネットワーク クラスで最初に作成されます。
関数 Object() { [ネイティブ コード] } には、XNUMX つの引数 size が必要です。 サイズ変数は、ニューラル ネットワークの各層に存在する入力ノードの数を表す数値のコレクションです。
__init__ メソッドで XNUMX つのプロパティを初期化します。 入力変数 size は、レイヤー サイズのリストとレイヤー数 num レイヤーをそれぞれ設定するために使用されます。
最初のステップは、ネットワークの初期バイアスを、入力層に続く各層にランダムに割り当てることです。
最後に、入力層と出力層の間の各リンクには、ランダムに生成された重みがあります。 Np.Random.Randn() は、コンテキストの正規分布から抽出されたランダム サンプルを提供します。
フィードフォワード機能
ニューラル ネットワークでは、フィードフォワード機能によって情報が転送されます。 この関数には、現在のアクティベーション ベクトルを示す XNUMX つの引数 a が必要です。
この関数は、ネットワーク内のすべてのバイアスと重みを反復することにより、各層の活性化を推定します。 与えられた答えは、最後の層の活性化である予測です。
ミニバッチ勾配降下法
私たちの Network クラスの主力は Gradient Descent です。 このバージョンでは、勾配降下法の修正版であるミニバッチ (確率的) 勾配降下法を使用します。
これは、データ ポイントの小さなバッチがモデルの更新に使用されることを示しています。 このメソッドには、XNUMX つの必須引数と XNUMX つのオプション引数が渡されます。 必要な XNUMX つの変数は、トレーニング データ セット、エポック数、ミニバッチのサイズ、および学習率 (eta) です。
ご要望に応じてテストデータをご提供いたします。 最終的にこのネットワークを評価するときに、テスト データを提供します。 この関数のサンプル数は、トレーニング データがリスト タイプに変換されると、最初はリストの長さに設定されます。
与えられたデータのテストにも同じプロセスを適用します。これは、リストとして返されるのではなく、実際にはリストの zip であるためです。 後で MNIST データ サンプルを読み込むときに、これについてさらに学習します。
両方の種類のデータをリストとして提供できることを確認できれば、この型キャストは必ずしも必須ではありません。
データを取得したら、トレーニング エポックをループで調べます。 トレーニング期間は、ニューラル ネットワーク トレーニングの XNUMX ラウンドのみです。 ミニバッチのリストを作成する前に、最初に各エポックのデータをシャッフルしてランダム性を確保します。
以下で説明する更新ミニバッチ関数は、ミニバッチごとに呼び出されます。 テスト データが利用可能な場合は、テスト精度も返されます。
コスト微分ヘルパー関数
逆伝播コードを実際に作成する前に、まずコスト微分と呼ばれるヘルパー関数を開発しましょう。 出力層に誤りがあると、コスト微分関数がそれを示します。
XNUMX つの入力が必要です。出力アクティベーション配列と、予想される出力値の y 座標です。
バックプロパゲーション機能
現在のアクティベーション ベクトル、アクティベーション、その他のアクティベーション ベクトル、アクティベーション、および z ベクトル、zs をすべて念頭に置いておく必要があります。 入力レイヤーと呼ばれるレイヤーが最初にアクティブになります。
バイアスと重みを配置した後、各バイアスと重みをループします。 各ループには、重みと活性化の内積として z ベクトルを計算し、それを z のリストに追加し、活性化を再計算し、更新された活性化を活性化のリストに追加することが含まれます。
最後に、数学。 zs ベクトルの最後の要素のシグモイド素数を乗算した前のレイヤーからのエラーに等しいデルタは、後方パスを開始する前に計算されます。
nabla b の最後のレイヤーはデルタに設定され、nabla w の最後のレイヤーは、デルタとアクティベーションの最後から XNUMX 番目のレイヤーのドット積に設定されます (実際に計算できるように転置されます)。 .
前と同じように、XNUMX 番目のレイヤーから開始して最後のレイヤーで終了し、これらの最後のレイヤーが完了したらプロセスを繰り返します。 その後、ナブラはタプルとして返されます。
ミニバッチ勾配降下法の更新
以前からの SGD (確率的勾配降下) メソッドには、ミニバッチ更新が組み込まれています。 SGD で利用されていますが、backprop も必要なので、この関数をどこに置くかを議論しました。
最後に、ここに投稿することにしました。 backprop 関数が行ったように、バイアスと重みのナブラの 0 ベクトルを生成することから始めます。
XNUMX つの入力として、ミニバッチと eta 学習率が必要です。 ミニバッチでは、backprop 関数を使用して、各入力 x と出力 y の各 nabla 配列のデルタを取得します。 nabla リストは、これらのデルタで更新されます。
最後に、学習率と nablas を使用して、ネットワークの重みとバイアスを更新します。 各値は、学習率を差し引いた最新の値に更新され、ミニバッチ サイズを掛けてから、nabla 値に追加されます。
評価関数
評価関数は、最後に記述する必要がある関数です。 テスト データは、この関数の唯一の入力です。 この関数では、ネットワークの出力を予想される結果 y と比較するだけです。 入力 x を順方向にフィードすることにより、ネットワークの出力が決定されます。
完全なコード
すべてのコードを組み合わせると、このようになります。
ニューラル ネットワークのテスト
MNIST データの読み込み
MNISTデータ .pkl.gz 形式で、GZIP を使用して開き、pickle でロードします。 このデータをトレーニング、検証、およびテスト データに分割されたサイズ XNUMX のタプルとしてロードする簡単な方法を書きましょう。
データを管理しやすくするために、y を 10 項目の配列にエンコードする別の関数を作成します。 配列は、画像の適切な数字に一致する 0 を除いて、すべて 1 になります。
基本的なロード データと 784 つのホット エンコード メソッドを使用して、データを読み取り可能な形式にロードします。 x 値を画像の 784 ピクセルに一致するサイズ XNUMX のリストに変換し、y 値を単一のホット エンコードされたベクトル形式に変換する別の関数を作成します。
次に、一方のインデックスが他方と一致するように x と y の値を結合します。 これは、トレーニング、検証、およびテスト データ セットに適用されます。 次に、変更されたデータを返します。
テストの実行
テストを開始する前に、以前に確立したニューラル ネットワーク (単純な nn) と MNIST データ セット ローダーの両方をインポートする「mnist loader」という新しいファイルを作成します。
このファイルでは、データをインポートし、入力層のサイズが 784、出力層のサイズが 10 のネットワークを構築し、トレーニング データに対してネットワークの SGD 関数を実行し、テスト データを使用してテストするだけです。
入力レイヤーのリストでは、784 から 10 までの数字がどれであっても違いはないことに注意してください。他のレイヤーは好きなように変更できます。 入力と出力のサイズだけが固定されています。
XNUMX つのレイヤーは必要ありません。 XNUMX つ、XNUMX つ、または XNUMX つだけを使用することもあります。 楽しんで実験してください。
まとめ
ここでは、Python 3 を使用して、ゼロからニューラル ネットワークを作成します。 高レベルの数学に加えて、実装の詳細についても説明しました。
ヘルパー関数を実装することから始めました。 ニューロンが機能するには、シグモイド関数とシグモイド素数関数が重要です。 次に、ニューラル ネットワークにデータを入力するための基本的なプロセスであるフィードフォワード機能を実行します。
次に、ニューラル ネットワークを駆動するエンジンである Python で勾配降下関数を作成しました。 「極小値」を特定し、その重みとバイアスを最適化するために、ニューラル ネットワークは勾配降下法を使用します。 以下を使用してバックプロパゲーション関数を作成しました。 勾配降下.
出力が適切なラベルと一致しない場合に更新を配信することで、この関数はニューラル ネットワークが「学習」できるようにします。
最後に、真新しい Python を配置します ニューラルネットワーク MNISTデータセットを使用したテストに。 すべてがスムーズに機能しました。
ハッピーコーディング!
コメントを残す