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よりも想像能力が強い

ブログ    

推薦する

...

...

人工知能の第三の冬が来るのか?

人工知能については人々の想像力は尽きることがなく、小説や映画でも長い間最もホットな話題となってきまし...

...

暗号化アルゴリズムの鍵交換は少し安全ではない

今日は対称暗号化アルゴリズムの重要な問題についてお話ししましょう。暗号化の基本的な概念に精通していな...

詳細 | 自然言語処理におけるディープラーニング研究の概要: 基本概念から最先端の成果まで

[[181446]] 1. 自然言語処理入門自然言語処理 (NLP) とは、言語を処理または「理解」...

ファーウェイクラウドは、2021年世界インターネット会議で人工知能イノベーションの3つの要素を提案し、新たな産業エコシステムを構築

本日、2021年世界インターネット大会烏鎮サミットにおいて、ファーウェイ上級副社長、ファーウェイクラ...

ドアを早く開けてください、ロボット先生が教えに来ます

[[206421]]国慶節の連休中の数日間、河南省では新たなテクノロジードラマが繰り広げられた。コン...

デジタル変革のケーススタディ: T-Mobile が AI を活用して顧客サービスをサポートする方法

AIソフトウェアはT-Mobileのコールセンターのエージェントが顧客に対応するのに役立っており、最...

人工知能1年後:パンデミックはテクノロジーの発展にどのような影響を与えたのでしょうか?

[[389010]]消費者の行動が変化し、企業の業務ニーズが変化するにつれて、人工知能は徐々に企業...

人工知能の発展には限界が必要

一般的な理解によれば、人工知能とは、手動でしかできないタスクを、人間以​​外のツールで完了できること...

DL時代のコード補完ツールは言語モデルよりもはるかに効果的である

プログラマーからデータ エンジニアまで、プログラム コードを書くことは基本的なスキルですが、長いコー...

ディープラーニングの一般化能力についての簡単な議論

1. DNNの一般化能力に関する問題この論文では主に、過剰パラメータ化されたニューラル ネットワー...

畳み込みニューラルネットワークにおける自己注意メカニズムの理解

導入コンピューター ビジョンにおけるエンコーダー/デコーダー アーキテクチャの制限とそれを改善する方...

...