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

推薦する

スマート建設現場: 2021 年に注目すべき 5 つのスマート建設技術

革新的な建設技術により、大規模建設プロジェクトの安全性、効率性、生産性が大幅に向上します。建設業界に...

phind: 開発者に特化したAI検索エンジンの誕生!

みなさんこんにちは、三元です。前回の記事では、AIを使いこなせない人は本当に将来淘汰されていくのか?...

3 つの AIOps プラクティス: 可視化、自動化からインテリジェンスまで

2018年5月18日〜19日、51CTO主催のグローバルソフトウェアおよび運用技術サミットが北京で開...

アリババ、1秒でフェイクニュースを暴く「AI噂クラッシャー」を正式リリース

[[261230]]エイプリルフールは私たちにとってただ楽しい日です。親にとって、ネット上の噂は日々...

2023年振り返り、大型模型産業の急速な発展の365日

4兆度(345MeV)は、2010年に米国ニューヨークのブルックヘブン国立研究所が相対論的重イオン衝...

IEEE テクノロジー分野賞発表: ML パイオニアがリストに、中国本土から受賞した唯一の学者は清華大学の学生

[[409353]] IEEE が再び栄誉を授与する時が来ました。 7月2日、米国電気電子学会(IE...

...

アップルが従業員を解雇し調整、好景気の時代とは真逆! Apple AI の堀とは何でしょうか?

ウォール・ストリート・ジャーナルによると、アップルは最近、経営陣の再編と人事異動を行う措置を講じたと...

この世界的に有名な旅行ウェブサイトは、150の独自の機械学習モデルを分析し、6つの教訓を学びました。

多くのメディア記事では、「機械学習がXX業界に力を与える」という言葉を目にしますが、この「エネルギー...

グラフディープラーニングで複雑な研究​​タイプのタスクを実装するのは、あまりにも面倒ですか?この新しいツールキットは、

ディープラーニングは、AI分野で最も注目されている分野の1つです。現在、PyGやDGLなどの主流のグ...

オンラインレビューの 7 分の 1 は偽物です。人工知能は役に立つでしょうか?

目視で観察すると、コメント欄は中国文学の巨匠の密度が比較的高く、侮辱やおどけのレベルも比較的高く、A...

ディープラーニングの基本的な概念と手法についての簡単な説明

この記事は、数学的および理論的な詳細にはあまり触れずに、ディープラーニングの基本的な概念を取り上げ、...

ジェネレーティブ AI がサプライ チェーンと調達の役割をどのように変革しているか

実際、生成 AI は近い将来、企業全体の販売、マーケティング、調達、サプライ チェーンにおける人間の...

2018年世界大学AIランキングが発表、中国の大学が好成績!

この記事では、CSranking の計算に基づいて、コンピューターサイエンスの分野システムと学部の観...

...