Python で多層パーセプトロン ニューラル ネットワークを実装する

Python で多層パーセプトロン ニューラル ネットワークを実装する

[[341199]]

何かを学べない限り、車輪の再発明をしないでください。

TensorFlow、PyTorch、Keras などの強力なライブラリがすでに存在しています。 Python で多層パーセプトロン (MLP) ニューラル ネットワークを作成する基本について説明します。

パーセプトロンはニューラル ネットワークの基本的な構成要素です。パーセプトロンの入力関数は、重み、バイアス、および入力データの線形結合です。具体的には、in_j = 重み入力 + バイアスです。各パーセプトロンでは、活性化関数 g を指定できます。

活性化関数は、入力が一定レベルに達した後にのみパーセプトロンが「発火」または活性化することを保証する数学的手法です。一般的な非線形活性化関数には、シグモイド、ソフトマックス、正規化線形単位 (ReLU)、または単に tanH があります。

活性化関数には多くのオプションがありますが、この記事ではシグモイドとソフトマックスについてのみ説明します。

図1: パーセプトロン

教師あり学習の場合、入力データを一連の隠し層を経由して出力層に転送します。これを順方向伝播と呼びます。出力層では予測yを出力できます。予測値 y を使って、誤差 |y*-y| を計算し、その誤差をニューラル ネットワークを通じて逆方向に伝播させることができます。これをバックプロパゲーションと呼びます。確率的勾配降下法 (SGD) プロセスを通じて、隠れ層の各パーセプトロンの重みとバイアスが更新されます。

図2: ニューラルネットワークの基本構造

基礎を説明したので、ニューラル ネットワークを実装してみましょう。私たちのニューラル ネットワークの目標は、MNIST データベースからの手書きの数字を分類することです。基本的な行列計算には NumPy ライブラリを使用します。

私たちの問題では、MNISTデータは[748,1]行列内の8ビットカラーチャネルで表されます。本質的には、[0,1,....255] から始まる [748,1] の数字の行列があり、0 は白を表し、255 は黒を表します。

結果

手書き数字の MNIST データベースには、トレーニング目的の手書きサンプルが 60,000 件、テスト目的のサンプルが 10,000 件含まれています。 60,000 個の例で 30 エポックのトレーニングを行った後、トレーニング済みのニューラル ネットワークをテスト データセットで実行し、93.2% の精度を達成しました。ハイパーパラメータを調整することでさらに最適化することもできます。

どのように機能しますか?

この記事は5つのパートに分かれています。これらの部品は次のとおりです。

  1. 活性化関数
  2. 重みの初期化
  3. バイアスの初期化
  4. トレーニングアルゴリズム
  5. 予測を立てる

1. 活性化関数

シグモイドは、1 /(1 + exp(-x)) という式で定義される活性化関数であり、隠れ層パーセプトロンで使用されます。

Softmax は活性化関数であり、通常、入力を複数のカテゴリに分類する場合に出力層で使用されます。この例では、数値を 10 個のバケット [0、1、2、...、9] のいずれかに分類します。行列内の各エントリの確率を計算します。確率の合計は 1 になります。最大確率を持つエントリは、その予測、つまり 0、1、…、9 に対応します。 Softmax は exp(x)/sum(exp(x)) として定義されます。

図3: 活性化関数の実装

2. 重みの初期化

それぞれの隠し層について、重み行列を初期化する必要があります。これを行うにはいくつかの方法がありますが、ここでは 4 つ紹介します。

ゼロ初期化 - すべての重みを 0 に初期化します。

ランダム初期化 - 重みを完全にランダムではなく、乱数で初期化します。通常、標準正規分布 (平均 0、分散 1) からの乱数を使用します。

Xavier 初期化 - 設定された分散を持つ正規分布からの乱数を使用して重みを初期化します。前のレイヤーのサイズに基づいて分散を設定します。

前述のように、パーセプトロンに入るエッジには重み行列が掛けられます。重要な点は、マトリックスのサイズは現在のレイヤーとその前のレイヤーのサイズによって決まるということです。具体的には、重み行列のサイズは [currentLayerSize, previousLayerSize] になります。

前述のように、パーセプトロンに入るエッジには重み行列が掛けられます。重要な点は、マトリックスのサイズは現在のレイヤーとその前のレイヤーのサイズによって決まるということです。具体的には、重み行列のサイズは [currentLayerSize, previousLayerSize] になります。

100 個のノードを持つ隠し層があるとします。入力層のサイズは[748, 1]で、目的の出力層のサイズは[10, 1]です。入力層と最初の隠れ層の間の重み行列のサイズは[100,748]です。隠れ層間の各重み行列のサイズは[100,100]です。最後に、最終の隠れ層と出力層の間の重み行列のサイズは[10,100]になります。

教育目的のため、単一の隠し層を使用しますが、最終モデルでは複数の層を使用します。

図4: 重み初期化の実装

3. バイアスの初期化

重みの初期化と同様に、バイアス マトリックスのサイズはレイヤー サイズ、特に現在のレイヤー サイズに依存します。バイアスを初期化する 1 つの方法は、バイアスをゼロに設定することです。

実装では、各隠し層と出力層にバイアスを提供する必要があります。バイアス行列のサイズは、隠れ層ごとに100個のノードに基づいて[100,1]になり、出力層のサイズは[10,1]になります。

図5: バイアス初期化の実装

4. トレーニングアルゴリズム

前述したように、トレーニングは確率的勾配降下法 (SGD) の概念に基づいています。 SGD では、一度に 1 つのトレーニング ポイントのみを考慮します。

この例では、出力層でソフトマックス活性化を使用します。損失は​​「クロスエントロピー損失」式を使用して計算されます。 SGD の場合、クロスエントロピー損失の導関数を計算するためにソフトマックスを使用する必要があります。つまり、この導関数は y -y となり、予測された y から期待値 y を引いたものになります。

図6: クロスエントロピー損失とソフトマックス活性化に対するその導関数

シグモイド活性化関数の導関数も記述する必要があります。図7では、S字型関数とその導関数を定義しています。

図7: シグモイド関数(上)とその導関数(下)

通常、ニューラル ネットワークでは、ユーザーは複数の「ハイパーパラメータ」を指定できます。私たちの実装では、ユーザーがエポック、バッチ サイズ、学習率、および運動量を指定できるようにすることに重点を置きます。他にも最適化テクニックはあります!

  • 学習率 (LR): 学習率は、ネットワークがパラメータを学習および更新する速度をユーザーが指定できるパラメータです。適切な学習率を選択することは芸術です。 LR が高すぎると、許容可能なトレーニング エラーに収束しない可能性があります。 LR が低すぎると、計算時間が大量に無駄になる可能性があります。
  • エポック: エポックはトレーニング セット全体の反復です。初期のサンプルでデータが過剰に適合しないようにするために、各エポックの後にデータをシャッフルします。
  • バッチ サイズ: Epoc2h の各反復で、データをバッチでトレーニングします。バッチ内の各トレーニング ポイントについて、勾配を収集し、バッチが完了した後に重み/バイアスを更新します。
  • 運動量: これは、過去の勾配の移動平均を収集し、その方向への移動を許可することで学習を高速化するために使用するパラメーターです。ほとんどの場合、これにより収束が速くなります。典型的な値の範囲は0.5〜0.9です。

以下に、バックプロパゲーション学習アルゴリズムの概要をシミュレートするための一般的な疑似コードをいくつか記述しました。出力の計算やトレーニング データのバッチ分割などのタスクは、読みやすくするためにコメントとして記述されています。

ここで擬似コードで実装を示します。

5. 予測する

現在、この実装には 1 つの重要な側面が欠けているだけです。予測アルゴリズム。バックプロパゲーション アルゴリズムの作成作業の大部分はすでに完了しています。予測を行うには、同じ順方向伝播コードを使用するだけです。出力層のソフトマックス活性化関数は、サイズ[10,1]の行列内の各エントリの確率を計算します。

私たちの目標は、0 から 9 までの数字を分類することです。したがって、aj2 行列のインデックスは予測に対応します。最大確率を持つインデックスは np.argmax() によって選択され、予測値となります。

結論は

これで完了です。ニューラル ネットワークの実装を Python で記述しました。

しかし、最適なパラメータを選択するにはどうすればよいでしょうか? アルゴリズムの一般的な知識を使用して、意味のあるハイパーパラメータを選択できます。データを一般化しつつも過剰適合しないハイパーパラメータを選択する必要があります。目標を達成するために、勢い、学習率、エポック数、バッチ サイズ、隠しノードの数を調整できます。さらに一歩進んで、これを行うためのアルゴリズムをさらに記述することができます。

遺伝的アルゴリズムは、最適なパラメータを選択するために使用できる AI アルゴリズムです。遺伝的アルゴリズムの考え方は、異なるパラメータを持つ子孫のセットを作成し、パラメータに関連するテストエラーを生成させることです。最適なハイパーパラメータを使用してニューラル ネットワークを育成および変異させ、より優れたパフォーマンスを持つパラメータを見つけることができます。多くの時間を費やすと、ハイパーパラメータの状況について多くのことを学び、新しい最適なハイパーパラメータ値を見つけることができます。

テストエラーを減らすために他に何かできることはありますか? はい、入力データをスケーリングできます。多くのアルゴリズムと同様に、数値が増えるとアルゴリズムの結果に大きな影響を与える可能性があります。この例では、数値の範囲は [0 ~ 255] です。数値を [0 から 1] の範囲になるようにスケーリングすると、このバイアスを減らすことができます。

<<:  なんて想像力豊かなんでしょう! AIは実際にこのようにプレイできます! 同意できない場合は、比較してみてください。

>>:  このモデルはGAN、ETH超解像モデルSRFlowよりも想像能力が強い

ブログ    
ブログ    
ブログ    

推薦する

...

Google DeepMind共同創設者:2028年までに人類がAGIを達成する可能性は50%

10月31日、テクノロジー系ポッドキャスト「Dwarkesh Patel」によると、Googleの...

...

...

...

私の国は自動運転とスマート輸送のパイロットプロジェクトを実施します

運輸省によると、運輸省はこのほど「自動運転とインテリジェント船舶の試験運用を組織することに関する通知...

...

レゴブロックを積み上げるように: ニューラルネットワークの数学をゼロから説明する

ニューラル ネットワークは、線形モジュールと非線形モジュールを巧みに組み合わせたものです。これらのモ...

責任ある AI 導入: IT 共生の青写真

AI ツールが合法化され、職場に導入されるようになると、人々は当然、その使用例や AI ツールに依存...

トレンド | AIを学ぶには、まず2018年の人工知能に関する13の予測を理解する必要があります

[[214541]] 2017 年は、ウォール ストリート ジャーナル、フォーブス、フォーチュンなど...

産業用AIoTが「新たな人気」となった4つの主な要因

最近発表された産業用人工知能および人工知能市場レポート 2021-2026 のデータによると、わずか...

Verdict、2020年第1四半期のTwitterにおけるIoTトレンドトップ5を発表

私たちは、企業や専門家が IoT についてどう考えているかを知りたいと思っていますが、一般の人々はど...