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

ブログ    
ブログ    

推薦する

フィードフォワードネットワーク + 線形相互作用層 = 残差 MLP、Facebook の純粋な MLP 画像分類アーキテクチャが市場に参入

[[398872]]最近では、多層パーセプトロン (MLP) が CV 分野の重要な研究テーマとなっ...

テンセントクラウドが高性能アプリケーションサービスHAIを開始、すべての開発者が独自のAIアプリケーションを開発可能に

AIGC アプリケーション開発のハードルを下げることによってのみ、次の AIGC 驚異的アプリケーシ...

1780億のパラメータを持つこの言語モデルは、王者GPT-3に挑戦するためだけに作られたのでしょうか?

誰かがGPT-3の独占に挑戦しなければなりません! GPT-3 は発売以来、最大の AI 言語モデル...

英国の消費者団体が警告:AIチャットボットがオンライン詐欺をよりプロフェッショナル化

10月28日、英国の消費者団体Which?が現地時間金曜日に発表した最新の調査結果によると、犯罪者は...

...

学者は大喜び!MetaがPDFと数式を変換できるOCRツールをリリース

私たちが通常、論文や科学文献を読むときに目にするファイル形式は、基本的に PDF (Portable...

機械学習によるディープラーニングが企業の今後の方向性となる理由

機械アルゴリズムのディープラーニングは、ビジネスの世界に多くの変化をもたらしました。定義上、これは人...

Microsoft Flight SimulatorはAIを使って15億の建物を復元、宮殿がオフィスビルに変わる際にバグが発生

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AIを活用して産業データの価値を見出す

すべての業界に共通するものが 1 つあります。それは、大量のデータです。データ量は、個人用デバイス、...

マルチタスクでSOTA、UBCを実現 Googleなどが3Dポイントクラウド向けの教師なしカプセルネットワークを提案

これは、3D ポイント クラウド用に提案された教師なしカプセル アーキテクチャであり、3D ポイント...

...

3行のコードで損失なく40%高速化、You YangチームのAIトレーニングアクセラレータがICLR口頭発表論文に選出

プルーニングを使用すると、AI トレーニングを高速化し、ロスレス操作を実現できます。わずか 3 行の...

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

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

人工知能の時代では、機械があなたの仕事を奪うのでしょうか?

テクノロジーの波が押し寄せています。近年、人工知能技術の発展に伴い、ロボット宅配便や純電気無人車両の...