ディープラーニングフレームワークを使わずにPythonでニューラルネットワークをゼロから構築する方法

ディープラーニングフレームワークを使わずにPythonでニューラルネットワークをゼロから構築する方法

動機: ディープラーニングをより深く理解するために、Tensorflow などのディープラーニング ライブラリを使用せずに、ニューラル ネットワークをゼロから構築することにしました。ニューラル ネットワークの内部の仕組みを理解することは、データ サイエンティストを目指す人にとって非常に重要であると私は信じています。

この記事には私が学んだことすべてが網羅されており、皆さんもそこから恩恵を受けられることを願っています。

1. ニューラルネットワークとは何ですか?

ニューラル ネットワークに関する多くの入門資料では、ニューラル ネットワークを脳と比較しています。しかし、ニューラル ネットワークを、単純に入力を出力にマッピングする数学関数として理解する方が簡単だと思います。

ニューラル ネットワークは次の部分で構成されます。

  • 入力層x
  • 任意の数の隠し層
  • 出力層、ŷ
  • 各2つの層Wとbの間には重みとバイアスのセットがある。
  • 各隠れ層に対して、活性化関数 σ が選択されます。この記事では、シグモイド活性化関数を選択します。

下の図は、2 層ニューラル ネットワークの構造を示しています (ニューラル ネットワークの層の数を計算するときに、入力層は通常カウントされないことに注意してください)。

2層ニューラルネットワークの構造

Python を使用してニューラル ネットワークを構築するのは非常に簡単です。

  1. クラス NeuralNetwork:
  2. __init__(self, x, y)を定義します。
  3. 自己入力= x  
  4. 自己重み1 = np.random.rand (自己入力形状[1],4)
  5. 自己重み2 = np.ランダム.rand (4,1)
  6. 自己.y = y
  7. 自己出力= np.zeros (y.shape)

1. ニューラルネットワークのトレーニング

単純な 2 層ニューラル ネットワークの出力 ŷ は次のように表すことができます。

上記の式では、重み W とバイアス b だけが出力 ŷ に影響を与える変数であることに気付いたかもしれません。

当然のことながら、重みとバイアスの適切な値によって予測の強さが決まります。入力データに基づいて重みとバイアスを微調整するプロセスをニューラル ネットワーク トレーニングと呼びます。

トレーニング プロセスの各反復は、次の手順で構成されます。

  • 予測出力ŷを計算する(順伝播と呼ばれる)
  • 重みとバイアスを更新する(バックプロパゲーションと呼ばれる)

次のフローチャートはこのプロセスを示しています。

2. フォワードプロパゲーション

上の図からわかるように、フォワードパスは単なる単純な計算です。基本的な 2 層ニューラル ネットワークの場合、ニューラル ネットワークの出力は次のように計算されます。

これは、Python コードに順方向伝播関数を追加することで実現できます。簡単にするために、バイアスは 0 であると仮定します。

  1. クラス NeuralNetwork:
  2. __init__(self, x, y)を定義します。
  3. 自己入力= x  
  4. 自己重み1 = np.random.rand (自己入力形状[1],4)
  5. 自己重み2 = np.ランダム.rand (4,1)
  6. 自己.y = y
  7. self.output = np.zeros (self.y.shape)
  8.  
  9. defフィードフォワード(自己):
  10. self.layer1 =シグモイド(np.dot(self.input, self.weights1))
  11. self.output =シグモイド(np.dot(self.layer1, self.weights2))

しかし、予測の「良さ」を評価する方法(つまり、予測が実際の値からどれだけ離れているか)がまだ必要です。ここで損失関数が登場します。

3. 損失​​関数

損失関数には多くの種類があり、問題の性質に応じてどの損失関数を使用するかが決まります。この記事では、単純な二乗誤差の合計を使用します。

二乗誤差の合計は、各予測値と実際の値の間の差の平均です。この差は二乗されるので、差の絶対値を測定します。

トレーニング中の目標は、損失関数を最小化する最適な重みとバイアスのセットを見つけることです。

4. バックプロパゲーション

エラーを予測する方法 (損失関数) が見つかったので、重みとバイアスを更新するためにエラーを「伝播」する方法が必要です。

重みとバイアスの調整に適切な値を決定するには、重みとバイアスに関する損失関数の偏導関数を知る必要があります。

微積分の観点から見ると、関数の偏微分は関数の傾きです。

勾配降下法アルゴリズム

偏導関数がわかっている場合は、偏導関数を加算または減算するだけで重みとバイアスを更新できます (上の図を参照)。これを勾配降下法と呼びます。

ただし、損失関数の式には重みとバイアスが含まれていないため、重みとバイアスに関する損失関数の偏導関数を直接計算することはできません。したがって、計算を支援するためにチェーンルールが必要になります。

上記は、重みに関する損失関数の偏微分を計算するための連鎖律です。簡単にするために、ニューラル ネットワークの 1 つの層の偏微分のみを示します。

ふう!見た目は良くありませんが、必要な情報、つまり重みに対する損失関数の偏微分(傾き)が得られるので、それに応じて重みを調整できます。

連鎖律の式ができたので、バックプロパゲーション関数を Python コードに追加しましょう。

  1. クラス NeuralNetwork:
  2. __init__(self, x, y)を定義します。
  3. 自己入力= x  
  4. 自己重み1 = np.random.rand (自己入力形状[1],4)
  5. 自己重み2 = np.ランダム.rand (4,1)
  6. 自己.y = y
  7. self.output = np.zeros (self.y.shape)
  8.  
  9. defフィードフォワード(自己):
  10. self.layer1 =シグモイド(np.dot(self.input, self.weights1))
  11. self.output =シグモイド(np.dot(self.layer1, self.weights2))
  12.  
  13. defバックプロパゲーション(self):
  14. # 連鎖律を適用して、重み2と重み1に関する損失関数の導関数を求める
  15. d_weights2 = np .dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))
  16. d_weights1 = np .dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1)))
  17.  
  18. # 損失関数の導関数(傾き)で重みを更新します
  19. 自己の重み1 += d_重み1
  20. 自己の重み2 += d_重み2

統合

順方向伝播と逆方向伝播の両方を実行するための完全な Python コードができたので、ニューラル ネットワークを例に適用して、そのパフォーマンスを確認できます。

私たちのニューラル ネットワークは、この関数を表す理想的な重みのセットを学習できるはずです。検査だけで重みを計算するのは簡単ではないことに注意してください。

ニューラル ネットワークを 1500 回繰り返し実行すると何が起こるかを見てみましょう。下の図は、各反復における損失関数の値を示しています。損失関数が最小値まで単調に減少していることが明確にわかります。これは、先ほど説明した勾配降下アルゴリズムと一致しています。

1500 回の反復後のニューラル ネットワークの最終予測 (出力) を見てみましょう。

1500回の反復後の予測

成功しました! フォワードプロパゲーションとバックプロパゲーションのアルゴリズムによりニューラル ネットワークのトレーニングに成功し、予測が真の値に収束しました。

予測値と実際の値の間にはまだ若干の差があることに注意してください。これは、過剰適合を防ぎ、ニューラル ネットワークをより一般化できるため望ましいことです。

3. 次のステップ

幸いなことに、私たちの探求はまだ終わっていません。ニューラル ネットワークとディープラーニングについては、まだ学ぶべきことがたくさんあります。例えば:

  • シグモイド関数以外にどのような活性化関数を使用できますか?
  • ニューラルネットワークのトレーニング時に学習率を使用する
  • 画像分類タスクに畳み込みを使用する

4. ***いくつかの考え

この記事を書いている間に私は多くのことを学びました。皆さんにも役立つことを願っています。

ニューラル ネットワークの内部の仕組みを完全に理解していなくても、TensorFlow や Keras などのディープラーニング ライブラリを使用してディープ ネットワークを構築するのは簡単ですが、データ サイエンティストを目指す人にとっては、ニューラル ネットワークについてより深く理解しておくことは有益であると思います。

オリジナルリンク:

https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  人工知能は進歩しすぎているのでしょうか?この記事を読めば、誰もが人工知能の歴史を理解できる

>>:  人工知能を活用してビジネスを拡大するための 5 つの戦略

推薦する

レゴブロックを積み上げるように: ニューラルネットワークの数学をゼロから説明する

ニューラル ネットワークは、線形モジュールと非線形モジュールを巧みに組み合わせたものです。これらのモ...

重みでターゲットを選択するための Java アルゴリズム

私は現在、軍事司令官システムに取り組んでいますが、これは多くのユースケースがあるかなり複雑なシステム...

トランスワープテクノロジーの孫元浩氏が「中国の人工知能起業家30人」の一人に選出

2020 年は特別な年であり、World Innovators Meet (WIM) の 6 年目と...

WeiboにおけるSparkベースの大規模機械学習の応用

[[195122]]周知のとおり、Weibo のビジネスは 2015 年以降急速に成長しています。内...

推奨アルゴリズム集(補足) - 最近傍選択とアルゴリズム拡張

【51CTO.comオリジナル記事】 1. はじめに上記の記事を通じて、レコメンデーション アルゴリ...

2021年に注目すべき10の重要なディープラーニングアルゴリズム

[[416068]] [51CTO.com クイック翻訳]人間が未来を予測することは困難ですが、人工...

説明可能なAI: 4つの主要産業

[[267801]] AI システムがどのように意思決定を行うかを人々が理解できるようにする説明可能...

科学者らは脳の信号を読み取り「操作」できる新たな神経電子システムを開発

海外メディアの報道によると、コロンビア大学の研究チームは、脳の信号を「操作」し、病的な結合を阻害でき...

自動運転車の意思決定制御システム技術を分析した記事

自動運転システムは、環境認識、意思決定制御、行動実行を統合した総合的なシステムであり、車両と交通環境...

この病院のAI看護師は、人間の看護師の作業負荷を30%削減するためにオンライン化されました

[[270607]]看護師は医療現場を問わず需要が高いです。米国労働統計局の報告によると、看護師の求...

知識経済は死んだ! AIが生み出す「直感経済」の新時代!

AI をめぐっては興奮と恐怖が同時に存在しているのは否定できない現実です。一方では、マイクロソフト...

集める! 2017 年の主要な AI イベントを総ざらい!(動画付き)

[[219484]] 2017 年に 1 年間眠っていたのに、突然目が覚めて、今年世界で最も誇るべ...

AI開発シンポジウム:機械学習を農家に役立てる方法について議論

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

DeepMind: 畳み込みネットワークは ViT ほど優れていないと誰が言ったのですか?

ディープラーニングの初期の成功は、畳み込みニューラル ネットワーク (ConvNet) の開発による...

祭壇から一般公開へと移行する冬季オリンピックでAIブラックテクノロジーを公開

現代のスポーツ競技は、アスリート同士のタイム競争であるだけでなく、舞台裏でのさまざまなハイテクノロジ...