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

ブログ    

推薦する

中国人民大学高陵人工知能学院のネイチャーサブジャーナル:マルチモーダル基本モデルを使用して汎用人工知能への移行を試みている

最近、中国人民大学高陵人工知能学院の陸志武教授、孫昊准教授、温継栄学院長教授が共同責任著者として国際...

AIを使ってアニメーションを作成する方法と、さまざまなツールがあなたを待っています

生成 AI は、インターネット上の重要なコンテンツ ソースとなっています。AI によって生成されたテ...

チューリング学習:新世代のロボットは観察するだけで人間を模倣できる

[[187204]]最近、シェフィールド大学自動制御システム工学部のロデリッヒ・グロス博士は次のよう...

4kスター、AIが強化学習でポケモンをプレイ、2万ゲームを経て勝利に成功

「ポケモン」の話をすると眠くならなくなりましたか? 「Pokemon」は「ポケモン」の非公式翻訳です...

ニューラルスタイル転送アルゴリズムで絵を描くことを学習する人間は、芸術分野で人工知能に負けるのでしょうか?

人工知能はますます多用途になり、すでに私たちの仕事のすべてを人工知能が引き継ぐことができるようです。...

996の非効率性にノーと言いましょう: ChatGPTはコードコメントとドキュメントを簡単に処理するのに役立ちます

適切なコメントは、Python プロジェクトを成功させる上で非常に重要です。実際には、コメントを書く...

Google Cloud、パンデミック対策のAIモデル構築に向けCOVID-19データセットをリリース

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

デジタルビジネスにおける AI の 6 つの設計原則

人工知能 (AI) は、現在人間が行っている意思決定やタスクを補強し、自動化する機能を備えているため...

建設業界はAIとIoTの次の大きなターゲット

建設業界は、革新、破壊、あるいは何と呼ぼうと、何らかの変化が起こりやすい時期にあります。以前にも書い...

混合交通流におけるコネクテッド自動運転車の衝突回避方法: モデルベースの強化学習アプローチ

[[429494]] 2021年10月11日にarXivにアップロードされた論文「混合交通流における...

生成的敵対ネットワーク (GAN) の未解決の 7 つの謎

いくつかの指標によれば、生成的敵対的ネットワーク (GAN) の研究は過去 2 年間で大きな進歩を遂...

...

滴滴自動運転、世界初となる5時間連続無人道路テストのビデオを公開

[[391970]]画像キャプション:滴滴自動運転のCOO孟星氏とUdacityの創設者兼会長セバス...

機械学習は増加傾向にありますが、そのアルゴリズムの結果は公正なのでしょうか?

アルゴリズムは驚くべき方法で私たちの生活をコントロールしています。地元のデリのカウンターで番号を受け...