[51CTO.com クイック翻訳] この 2 部構成のシリーズでは、numpy Python ライブラリのみを使用して人工ニューラル ネットワーク (ANN) をゼロから構築する方法を紹介します。 前回の記事では、入力層 1 つと出力層 1 つだけを持ち、隠れ層がない非常にシンプルな ANN の構築について紹介しました。 次の記事では、1 つの入力層、1 つの隠れ層、1 つの出力層を持つ ANN の構築について説明します。 なぜゼロから始めるのですか?わずか数行のコードでニューラル ネットワークを構築できるディープラーニング ライブラリ (Keras、TensorFlow、PyTorch など) は数多くあります。ただし、ニューラル ネットワークの基本的な仕組みを本当に理解したい場合は、Python またはその他のプログラミング言語を使用して、ニューラル ネットワークをゼロからプログラミングする方法を学ぶことをお勧めします。 ランダムなデータセットを作成しましょう。 図1. 簡潔にするために2進値を持つランダムデータセット 上記の表には、Person、X1、X2、X3、Y の 5 つの列があります。 1 は真、0 は偽を意味します。私たちのタスクは、X1、X2、X3 の値に基づいて Y の値を予測できる人工ニューラル ネットワークを作成することです。 入力層 1 つ、出力層 1 つ、隠し層なしの人工ニューラル ネットワークを作成します。プログラミングを始める前に、ニューラル ネットワークが理論的にどのように動作するかを見てみましょう。 ANN理論 人工ニューラル ネットワークは教師あり学習アルゴリズムです。つまり、独立変数を含む入力データと従属変数を含む出力データを提供します。たとえば、この例では、独立変数は X1、X2、X3 であり、従属変数は Y です。 まず、ANN はランダムな予測をいくつか行い、これらの予測を正しい出力と比較し、誤差 (予測値と実際の値の差) を計算します。実際の値と伝播された値の差を求める関数はコスト関数と呼ばれます。ここでのコストはエラーを指します。私たちの目標はコスト関数を最小限に抑えることです。ニューラル ネットワークをトレーニングするということは、基本的にコスト関数を最小化することを意味します。このタスクを実行する方法については、以下で説明します。 ニューラル ネットワークは、フィードフォワード フェーズとバックプロパゲーション フェーズの 2 つのフェーズで実行されます。以下では、これら 2 つの手順について詳しく説明します。 フィードフォワード 図2 出典: 単層ニューラルネットワーク(パーセプトロンとも呼ばれる) ANN のフィードフォワードフェーズでは、入力ノードの値と重みに基づいて予測が行われます。上の画像のニューラル ネットワークを見ると、データセットに X1、X2、X3 の 3 つの特徴があり、最初のレイヤー (入力レイヤーとも呼ばれます) に 3 つのノードがあることがわかります。 ニューラル ネットワークの重みは、基本的に、出力を正しく予測できるように調整する文字列です。入力機能ごとに重みは 1 つだけであることに注意してください。 以下は、ANN のフィードフォワード フェーズ中に実行される手順です。 ステップ1: 入力と重みのドット積を計算する 入力層のノードは、3 つの重みパラメータを通じて出力層に接続されます。出力層では、入力ノードの値が対応する重みで乗算され、加算されます。最後に、バイアス項 b が合計に追加されます。 なぜバイアスが必要なのでしょうか? 誰かが入力値 (0,0,0) を持っていると仮定すると、入力ノードと重みの積の合計はゼロになります。この場合、アルゴリズムをどのようにトレーニングしても、出力は常にゼロになります。したがって、人物に関するゼロ以外の情報がない場合でも予測を行うには、バイアス項が必要です。バイアス項は、堅牢なニューラル ネットワークを構築するために不可欠です。 数学的には、ドット積の合計は次のようになります。 XW=x1.w1 + x2.w2 + x3.w3 + b ステップ2: ドット積の合計(XW)を活性化関数に渡す ドット積 XW は任意の値のセットを生成できます。ただし、出力には 1 と 0 の形式の値が含まれます。出力は同じ形式にしたいです。これを行うには、入力値を 0 から 1 の間に固定する活性化関数が必要です。したがって、もちろんシグモイド活性化関数を使用します。 図3. シグモイド活性化関数 入力が 0 の場合、Sigmoid 関数は 0.5 を返します。入力が大きな正の数値の場合は、1 に近い値を返します。負の入力の場合、シグモイド関数によって出力される値はゼロに近くなります。 したがって、出力として確率を予測するモデルに特に適しています。概念は 0 と 1 の間にのみ存在するため、シグモイド関数は私たちの問題に適した選択肢です。 上の図では、z はドット積 XW の合計です。 数学的には、シグモイド活性化関数は次のようになります。 図4. シグモイド活性化関数 これまでに行った作業を要約します。まず、入力特徴量(独立変数行列)と重みのドット積を求める必要があります。次に、ドット積の合計が活性化関数に渡されます。活性化関数の結果は、基本的に入力機能の予測出力です。 バックプロパゲーション 最初、トレーニングの前に、ニューラル ネットワークはランダムな予測を行いますが、これは当然ながら間違っています。 まず、ネットワークにランダムな出力予測を行わせます。次に、ニューラル ネットワークの予測出力と実際の出力を比較します。次に、重みとバイアスを更新し、予測出力が実際の出力に近くなるようにします。このフェーズでは、アルゴリズムをトレーニングします。バックプロパゲーションフェーズに含まれる手順を見てみましょう。 ステップ1: コストを計算する このフェーズの最初のステップは、予測コストを見つけることです。予測コストは、予測された出力値と実際の出力値の差を求めることで計算できます。差が大きければコストも大きくなります。 平均二乗誤差または MSE コスト関数を使用します。コスト関数は、与えられた出力予測のコストを求める関数です。 図5. 平均二乗誤差 ここで、Yi は実際の出力値、Ŷi は予測出力値、n は観測数です。 ステップ2: コストを最小限に抑える 私たちの最終的な目標は、ニューラル ネットワークの重みを微調整し、コストを最小限に抑えることです。注意深く観察すると、私たちが制御できるのは重みとバイアスだけであり、他のすべては制御できないことがわかります。入力を制御することも、ドット積を制御することも、シグモイド関数を操作することもできません。 コストを最小限に抑えるには、コスト関数が最小値を返すことを保証する重みとバイアス値を見つける必要があります。コストが小さいほど、予測の精度が高まります。 関数の最小値を見つけるには、勾配降下アルゴリズムを使用できます。勾配降下法は数学的には次のように表現できます。 図6. 勾配降下法による重みの更新 𝛛Errorはコスト関数です。上記の式は、各重みとバイアスに関するコスト関数の偏微分を求め、その結果を既存の重みから減算して新しい重みを取得することを示しています。 関数の導関数は、任意の点における関数の傾きを示します。コストが増加しているか減少しているかを調べるには、重み値が与えられている場合、その特定の重み値に対する関数の導関数を見つけることができます。重量が増加するにつれてコストが増加する場合、導関数は正の値を返し、それが既存の値から減算されます。 一方、重量が増加するにつれてコストが減少する場合は、負の値が返され、2 つの負の値は 1 つの正の値に相当するため、既存の重量値に加算されます。 上記の式では、a は学習率と呼ばれ、導関数を掛けたものです。学習率によって、アルゴリズムが学習する速度が決まります。 コストが最小化され、コスト関数によって返される値がゼロに近くなるまで、すべての重みとバイアスに対して勾配降下法の操作を繰り返す必要があります。 ここで、これまで学習してきた人工ニューラル ネットワークを実装します。入力層 1 つと出力層 1 つを持つ単純なニューラル ネットワークを Python で作成します。 NumPy を使用した人工ニューラル ネットワークの実装図7 画像出典: hackernoon.com 実行する手順: 1. 独立変数と従属変数を定義する 2. ハイパーパラメータを定義する 3. 活性化関数とその導関数を定義する 4. モデルのトレーニング 5. 予測する ステップ 1: まず、独立変数または入力機能セットと、対応する従属変数またはラベルを作成します。
入力セットには 7 つのレコードが含まれています。同様に、入力セット内の各レコードに対応するラベルを含むラベル セットを作成します。ラベルは、ANN に予測させたい値です。 ステップ 2: ハイパーパラメータを定義します。 以下のコードを実行した際に同じランダムな値が得られるように、numpy の random.seed 関数を使用します。 次に、正規分布からの乱数を使用して重みを初期化します。入力には 3 つの特徴があるため、重みのベクトルも 3 つあります。次に、バイアス値を別の乱数で初期化します。最後に、学習率を 0.05 に設定します。
ステップ 3: 活性化関数とその導関数を定義します。ここでの活性化関数はシグモイド関数です。
それでは、シグモイド関数の微分を計算する関数を定義しましょう。
ステップ 4: ANN モデルをトレーニングします。 まずエポックの数を定義します。エピソードとは、データセット上でアルゴリズムをトレーニングする回数です。データに対してアルゴリズムを 25000 回トレーニングするので、エポックは 25000 になります。コストをさらに削減するには、さまざまな数値を試すことができます。
各ステップを理解してから、予測の最終ステップに進みましょう。 input_set の値が各反復で変更されないように、input_set の値を入力変数に格納します。
次に、入力と重みのドット積を計算し、それにバイアスを加えます。 (フィードフォワードフェーズのステップ1)
次に、ドット積をシグモイド活性化関数に渡します。 (フィードフォワードフェーズのステップ2)
これでアルゴリズムのフィードフォワード部分が完了し、バックプロパゲーションを開始します。 変数 z には予測出力が含まれます。バックプロパゲーションの最初のステップはエラーを見つけることです。
コスト関数は次のようになります。 図8 この関数を各重みに関して微分する必要がありますが、これは微分連鎖律を使用して簡単に行うことができます。導出部分は省略しますが、興味のある方はコメントを残してください。 したがって、任意の重みに対するコスト関数の最終導関数は次のようになります。
ここで、傾斜は次のように簡略化できます。
dcost と dpred の積を含む z_del 変数があります。各レコードをループして入力を対応する z_del で乗算する代わりに、入力特徴行列の転置を z_del で乗算します。 最後に、学習速度を上げるために、学習率変数 lr に導関数を掛けます。 重みを更新するだけでなく、バイアスも更新する必要があります。
サイクルが始まると、合計エラーが減少し始めることがわかります。トレーニングの終了時には、エラーは非常に小さいままになります。
ステップ5: 予測を立てる いくつか予測を立てる時間です。まずは[1,0,0]で試してみましょう:
出力:
ご覧のとおり、出力は 1 よりも 0 に近いため、0 に分類されます。 [0,1,0]でもう一度試してみましょう。
出力:
ご覧のとおり、出力は 0 よりも 1 に近いため、1 に分類されます。 結論はこの記事では、numpy Python ライブラリを使用して、入力層 1 つと出力層 1 つだけの非常にシンプルな人工ニューラル ネットワークをゼロから作成する方法を学びました。この ANN は線形に分離可能なデータを分類できます。 非線形に分離可能なデータがある場合、ANN はこのタイプのデータを分類できません。次の記事では、そのような ANN の構築方法を紹介します。 人工ニューラル ネットワークをゼロから構築する: パート 1、Nagesh Singh Chauhan 著 [51CTOによる翻訳。パートナーサイトに転載する場合は、元の翻訳者と出典を51CTO.comとして明記してください] |
<<: マイクロソフトの新しい研究:ドローンは推論能力を獲得し、画像を見るだけで判断できるようになる
マンハッタンのファストカジュアルチェーン「ダルプ・モダン・インディアン」にあるドーサを自動で作る機械...
9月24日のニュース、本日早朝、テスラ オプティマスの公式Twitterアカウントが新しいビデオをア...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
レコメンデーション システムは、ディープラーニングとグラフ ニューラル ネットワークの影響を受けて大...
過去 1 年間で、人工知能 (AI) は私たちの日常生活のより大きな部分を占めるようになり、さまざま...
[[243140]] 1. 背景2017年6月に電子商取引認知マップが発表されて以来、実践から体系...
海外メディアは、情報分析プロバイダーRELXの新しいレポートによると、回答者の95%が人工知能の人材...
物理学者協会のウェブサイトが28日に伝えたところによると、カナダのコンピューター科学者と生物学者は、...
海外メディアの報道によると、人工知能(AI)は医療とヘルスケアを根本的に変えるだろう。心電図、脳波、...
Amazon Web Services Inc. は本日、自社のエコシステムにおいて、企業顧客が独自...