シンプルな人工ニューラル ネットワークをゼロから構築する: 入力層 1 つと出力層 1 つ

シンプルな人工ニューラル ネットワークをゼロから構築する: 入力層 1 つと出力層 1 つ

[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: まず、独立変数または入力機能セットと、対応する従属変数またはラベルを作成します。

  1. #独立変数 
  2. 入力セット = np.array([[0,1,0],  
  3. [0,0,1],  
  4. [1,0,0],  
  5. [1,1,0],  
  6. [1,1,1],  
  7. [0,1,1],  
  8. [0,1,0]])#従属変数 
  9. ラベル = np.array([[1,  
  10. 0,  
  11. 0,  
  12. 1、  
  13. 1、  
  14. 0,  
  15. 1]])  
  16. labels = labels.reshape(7,1) # ラベルをベクトル変換する

入力セットには 7 つのレコードが含まれています。同様に、入力セット内の各レコードに対応するラベルを含むラベル セットを作成します。ラベルは、ANN に予測させたい値です。

ステップ 2: ハイパーパラメータを定義します。

以下のコードを実行した際に同じランダムな値が得られるように、numpy の random.seed 関数を使用します。

次に、正規分布からの乱数を使用して重みを初期化します。入力には 3 つの特徴があるため、重みのベクトルも 3 つあります。次に、バイアス値を別の乱数で初期化します。最後に、学習率を 0.05 に設定します。

  1. np.ランダムシード(42)  
  2. 重み = np.random.rand(3,1)  
  3. バイアス = np.random.rand(1)  
  4. lr = 0.05 #学習率

ステップ 3: 活性化関数とその導関数を定義します。ここでの活性化関数はシグモイド関数です。

  1. シグモイド(x)を定義します:  
  2. 1/(1+np.exp(-x))を返す

それでは、シグモイド関数の微分を計算する関数を定義しましょう。

  1. sigmoid_derivative(x)を定義します。  
  2. シグモイド(x)*(1-シグモイド(x))を返す

ステップ 4: ANN モデルをトレーニングします。

まずエポックの数を定義します。エピソードとは、データセット上でアルゴリズムをトレーニングする回数です。データに対してアルゴリズムを 25000 回トレーニングするので、エポックは 25000 になります。コストをさらに削減するには、さまざまな数値を試すことができます。

  1. エポック範囲(25000)場合:  
  2. 入力 = input_set  
  3. XW = np.dot(入力, 重み) + バイアス 
  4. z = シグモイド(XW)  
  5. エラー = z - ラベル 
  6. 印刷( error.sum ())  
  7. dcost = エラー 
  8. dpred = シグモイド導関数(z)  
  9. z_del = dcost * dpred  
  10. 入力 = input_set.T  
  11. 重み = 重み - lr*np.dot(入力、z_del)  
  12. z_delnumの場合:  
  13. バイアス = バイアス - lr*num

各ステップを理解してから、予測の最終ステップに進みましょう。

input_set の値が各反復で変更されないように、input_set の値を入力変数に格納します。

  1. 入力 = input_set

次に、入力と重みのドット積を計算し、それにバイアスを加えます。 (フィードフォワードフェーズのステップ1)

  1. XW = np.dot(入力, 重み) + バイアス

次に、ドット積をシグモイド活性化関数に渡します。 (フィードフォワードフェーズのステップ2)

  1. z = シグモイド(XW)

これでアルゴリズムのフィードフォワード部分が完了し、バックプロパゲーションを開始します。

変数 z には予測出力が含まれます。バックプロパゲーションの最初のステップはエラーを見つけることです。

  1. エラー = z - ラベル 
  2. 印刷( error.sum ())

コスト関数は次のようになります。

図8

この関数を各重みに関して微分する必要がありますが、これは微分連鎖律を使用して簡単に行うことができます。導出部分は省略しますが、興味のある方はコメントを残してください。

したがって、任意の重みに対するコスト関数の最終導関数は次のようになります。

  1. 傾き = 入力 x コスト x 予測値

ここで、傾斜は次のように簡略化できます。

  1. dcost = エラー 
  2. dpred = シグモイド導関数(z)  
  3. z_del = dcost * dpred  
  4. 入力 = input_set.T  
  5. 重み = weight-lr*np.dot(入力、z_del)

dcost と dpred の積を含む z_del 変数があります。各レコードをループして入力を対応する z_del で乗算する代わりに、入力特徴行列の転置を z_del で乗算します。

最後に、学習速度を上げるために、学習率変数 lr に導関数を掛けます。

重みを更新するだけでなく、バ​​イアスも更新する必要があります。

  1. z_delnumの場合:  
  2. バイアス = バイアス - lr*num

サイクルが始まると、合計エラーが減少し始めることがわかります。トレーニングの終了時には、エラーは非常に小さいままになります。

  1. -0.001415035616137969  
  2. -0.0014150128584959256  
  3. -0.0014149901015685952  
  4. -0.0014149673453557714  
  5. -0.0014149445898578358  
  6. -0.00141492183507419  
  7. -0.0014148990810050437  
  8. -0.0014148763276499686  
  9. -0.0014148535750089977  
  10. -0.0014148308230825385  
  11. -0.0014148080718707524  
  12. -0.0014147853213728624  
  13. -0.0014147625715897338  
  14. -0.0014147398225201734  
  15. -0.0014147170741648386  
  16. -0.001414694326523502  
  17. -0.001414671579597255  
  18. -0.0014146488333842064  
  19. -0.0014146260878853782  
  20. -0.0014146033431002465  
  21. -0.001414580599029179  
  22. -0.0014145578556723406  
  23. -0.0014145351130293877  
  24. -0.0014145123710998  
  25. -0.0014144896298846701  
  26. -0.0014144668893831067  
  27. -0.001414444149595611  
  28. -0.0014144214105213174  
  29. -0.0014143986721605849  
  30. -0.0014143759345140276  
  31. -0.0014143531975805163  
  32. -0.001414330461361444  
  33. -0.0014143077258557749  
  34. -0.0014142849910631708  
  35. -0.00141426225698401  
  36. -0.0014142395236186895  
  37. -0.0014142167909661323  
  38. -0.001414194059027955  
  39. -0.001414171327803089  
  40. -0.001414148597290995  
  41. -0.0014141258674925626  
  42. -0.0014141031384067547  
  43. -0.0014140804100348098  
  44. -0.0014140576823759854  
  45. -0.0014140349554301636  
  46. -0.0014140122291978665  
  47. -0.001413989503678362  
  48. -0.001413966778871751  
  49. -0.001413944054778446  
  50. -0.0014139213313983257  
  51. -0.0014138986087308195  
  52. -0.0014138758867765552  
  53. -0.0014138531655347973  
  54. -0.001413830445006264  
  55. -0.0014138077251906606  
  56. -0.001413785006087985  
  57. -0.0014137622876977014  
  58. -0.0014137395700206355  
  59. -0.0014137168530558228  
  60. -0.0014136941368045382  
  61. -0.0014136714212651114  
  62. -0.0014136487064390219  
  63. -0.0014136259923249635  
  64. -0.001413603278923519  
  65. -0.0014135805662344007  
  66. -0.0014135578542581566  
  67. -0.0014135351429944293  
  68. -0.0014135124324428719  
  69. -0.0014134897226037203  
  70. -0.0014134670134771238  
  71. -0.0014134443050626295  
  72. -0.0014134215973605428  
  73. -0.0014133988903706311

ステップ5: 予測を立てる

いくつか予測を立てる時間です。まずは[1,0,0]で試してみましょう:

  1. シングルポイント = np.配列([1,0,0])  
  2. 結果 = シグモイド(np.dot(single_pt, weights) + バイアス)  
  3. 印刷(結果)

出力:

  1. [0.01031463]

ご覧のとおり、出力は 1 よりも 0 に近いため、0 に分類されます。

[0,1,0]でもう一度試してみましょう。

  1. シングルポイント = np.配列([0,1,0])  
  2. 結果 = シグモイド(np.dot(single_pt, weights) + バイアス)  
  3. 印刷(結果)   

出力:

  1. [ 0.99440207]

ご覧のとおり、出力は 0 よりも 1 に近いため、1 に分類されます。

結論は

この記事では、numpy Python ライブラリを使用して、入力層 1 つと出力層 1 つだけの非常にシンプルな人工ニューラル ネットワークをゼロから作成する方法を学びました。この ANN は線形に分離可能なデータを分類できます。

非線形に分離可能なデータがある場合、ANN はこのタイプのデータを分類できません。次の記事では、そのような ANN の構築方法を紹介します。

人工ニューラル ネットワークをゼロから構築する: パート 1、Nagesh Singh Chauhan 著

[51CTOによる翻訳。パートナーサイトに転載する場合は、元の翻訳者と出典を51CTO.comとして明記してください]

<<:  マイクロソフトの新しい研究:ドローンは推論能力を獲得し、画像を見るだけで判断できるようになる

>>:  人工知能があなたの生活を変える10の方法

ブログ    
ブログ    

推薦する

...

ロボット「シェフ」がニューヨークに登場、1時間で300個の巻き寿司を作れる!

マンハッタンのファストカジュアルチェーン「ダルプ・モダン・インディアン」にあるドーサを自動で作る機械...

...

テスラのオプティマスヒューマノイドロボットが再び進化:視覚に基づいて物体を自律的に分類し、ヨガもできる

9月24日のニュース、本日早朝、テスラ オプティマスの公式Twitterアカウントが新しいビデオをア...

中国人の「専門用語」データセット、AI:あなたはDBQさえ理解していない

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

HKU がオープンソースの推奨システムの新しいパラダイム RLMRec を公開!ユーザー/製品のテキストポートレートを正確に抽出するための大規模なモデルサポート

レコメンデーション システムは、ディープラーニングとグラフ ニューラル ネットワークの影響を受けて大...

...

2022年にAIがサイバーセキュリティにもたらすもの

過去 1 年間で、人工知能 (AI) は私たちの日常生活のより大きな部分を占めるようになり、さまざま...

電子商取引用に作成されたナレッジグラフは、ユーザーのニーズをどのように感知するのでしょうか?

[[243140]] 1. 背景2017年6月に電子商取引認知マップが発表されて以来、実践から体系...

...

RELX: 回答者の95%がAI人材の採用は課題であると考えている

海外メディアは、情報分析プロバイダーRELXの新しいレポートによると、回答者の95%が人工知能の人材...

...

コロナウイルスを分類する機械学習はわずか数分で完了

物理学者協会のウェブサイトが28日に伝えたところによると、カナダのコンピューター科学者と生物学者は、...

科学者らが病気の早期発見と治療のための埋め込み型人工知能システムを開発

海外メディアの報道によると、人工知能(AI)は医療とヘルスケアを根本的に変えるだろう。心電図、脳波、...

Amazon が企業による生成 AI の利用を支援する新機能と Bedrock を発表

Amazon Web Services Inc. は本日、自社のエコシステムにおいて、企業顧客が独自...