Python での機械学習アルゴリズムの実装: ニューラル ネットワーク

Python での機械学習アルゴリズムの実装: ニューラル ネットワーク

今日は引き続き、パーセプトロンをベースにしたニューラルネットワークモデルを紹介します。パーセプトロンは線形モデルであり、非線形問題に対する解決策を提供することは難しいことは誰もが知っています。

たとえば、よく知られている XOR 問題は典型的な線形分離不可能な問題であり、通常のパーセプトロンでは処理が困難です。

そのため、通常のパーセプトロンをベースに、隠れ層を追加してパーセプトロン構造を拡張し、パーセプトロンが非線形問題に適合できるようにしました。

隠れ層構造を持つこのパーセプトロン モデルはニューラル ネットワークであり、多層パーセプトロンとも呼ばれます。

エディターは、入力層、隠し層、出力層、活性化関数、順方向伝播、逆方向伝播、勾配降下法、重み更新など、ニューラル ネットワークに関する多くの概念や知識の詳細については説明しません。

データを生成する

このセクションでは、2 層ネットワーク、つまり単一の隠し層ネットワークを例に、NumPy を使用してニューラル ネットワーク モデルを実装する方法を説明します。ニューラル ネットワークを正式に構築する前に、データを準備しましょう。データ生成関数を定義します。

 デフcreate_dataset ():
np . ランダム. シード( 1 )
m = 400 #データ
N = int ( m / 2 ) # ラベルあたりのインスタンス数
D = 2 #データ次元
X = np . zeros (( m , D )) # データ行列
Y = np . zeros (( m , 1 ), dtype = 'uint8' ) # ラベル次元
4

j範囲2場合
ix = 範囲( N * jN * ( j + 1 ))
t = np.linspace ( j * 3.12 , ( j + 1 ) * 3.12 , N ) + np.random.randn ( N ) * 0.2 # シータ
r = a * np.sin ( 4 * t ) + np.random.randn ( N ) * 0.2 # 半径
X [ ix ] = np . c_ [ r * np . sin ( t ), r * np . cos ( t )]
Y [ ix ] = j

X = X . T
Y = Y . T


X , Y を返す

データの視覚化を以下に示します。

ニューラル ネットワークを構築するための基本的な考え方と手順を引き続き確認してみましょう。

  • ネットワーク構造を定義する(出力層、隠れ層、出力層のサイズを指定する)
  • モデルパラメータを初期化する
  • ループ操作: 順方向伝播の実行/損失の計算/逆方向伝播の実行/重みの更新

ネットワーク構造の定義

X がニューラル ネットワークの入力特徴行列であり、y がラベル ベクトルであると仮定します。単層のニューラル ネットワークの構造は次のとおりです。

ネットワーク構造の機能定義は次のとおりです。

 レイヤーサイズを定義します( X , Y ):
n_x = X . shape [ 0 ] # 入力層のサイズ
n_h = 4 #隠し層のサイズ
n_y = Y . shape [ 0 ] # 出力層のサイズ
戻り値( n_x , n_h , n_y )

入力層と出力層のサイズは、それぞれ X と y の形状に関連しています。隠し層のサイズは手動で指定できます。ここでは、隠し層のサイズを 4 に指定します。

モデルパラメータを初期化する

W1 は入力層から隠れ層への重み配列、b1 は入力層から隠れ層へのバイアス配列、W2 は隠れ層から出力層への重み配列、b2 は隠れ層から出力層へのバイアス配列であると仮定します。そこで、パラメータ初期化関数を次のように定義します。

 definitialize_parameters ( n_x , n_h , n_y ):
W1 = np . ランダム.randn ( n_h , n_x ) * 0.01
b1 = np . ゼロ(( n_h , 1 ))
W2 = np . ランダム.randn ( n_y , n_h ) * 0.01
b2 = np . ゼロ( ( n_y , 1 ))

アサート( W1 . shape == ( n_h , n_x ))
アサート( b1 . shape == ( n_h , 1 ))
アサート( W2 . shape == ( n_y , n_h ))
アサート( b2 . shape == ( n_y , 1 ))


パラメータ= { "W1" : W1 ,
"b1" : b1 ,
「W2」W2
"b2" : b2 }

戻りパラメータ

重みを初期化するために numpy の乱数​​生成モジュール np.random.randn を使用し、バイアスを初期化するために np.zeros モジュールを使用しました。辞書を設定してカプセル化し、初期化パラメータを含む結果を返します。

前方伝播

ネットワーク構造を定義し、パラメータを初期化すると、ニューラル ネットワークのトレーニング プロセスが開始されます。トレーニングの最初のステップは、順方向伝播計算を実行することです。

隠れ層の活性化関数が tanh 関数であり、出力層の活性化関数がシグモイド関数であると仮定します。順方向伝播の計算は次のように表されます。

順伝播計算関数を次のように定義します。

 def forward_propagation ( Xパラメータ):
# 各パラメータの初期値を取得する
W1 = パラメータ[ 'W1' ]
b1 = パラメータ[ 'b1' ]
W2 = パラメータ[ 'W2' ]
b2 = パラメータ[ 'b2' ]
# 順方向計算を実行する
Z1 = np . ドット( W1 , X ) + b1
A1 = np . tanh ( Z1 )
Z2 = np . ドット( W2 , A1 ) + b2
A2 = シグモイド( Z2 )
アサート( A2 . 形状== ( 1 , X . 形状[ 1 ] ))


キャッシュ= { "Z1" : Z1 ,
「A1」A1
「Z2」Z2
"A2" : A2 }


A2 を返しキャッシュする

パラメータ初期化結果辞書からそれぞれのパラメータを取得し、順方向伝播計算を実行し、順方向伝播計算の結果をキャッシュ辞書に保存します。ここで、A2 はシグモイド活性化関数による活性化後の出力層の結果です。

現在のトレーニング損失を計算する

順方向伝播計算が完了したら、現在のパラメータを使用した計算後の出力とラベル値の間の損失を決定する必要があります。注 1 と同様に、損失関数もクロスエントロピー損失として選択されます。

損失関数は次のように定義されます。

 def compute_cost ( A2 , Y , パラメータ):
# トレーニングサンプルサイズ
m = Y 字型[ 1 ]
# クロスエントロピー損失を計算する
logprobs = np.multiply (np.log ( A2 ), Y ) + np.multiply (np.log ( 1 - A2 ), 1 - Y )
コスト= - 1 / m * np . sum ( logprobs )
#次元圧縮
コスト= np . squeeze ( コスト)


アサート( isinstance ( コスト, float ))
返品費用

バックプロパゲーションを実行する

順方向伝播と現在の損失が決定したら、重みを調整するために逆方向伝播プロセスを続行する必要があります。次の図に示すように、各パラメータの勾配計算が行われます。

上記の勾配計算式によれば、バックプロパゲーション関数は次のように定義されます。

 def backward_propagation ( パラメータキャッシュXY ):
m = X . 形状[ 1 ]
#W1とW2を取得する
W1 = パラメータ[ 'W1' ]
W2 = パラメータ[ 'W2' ]
#A1とA2を取得する
A1 = キャッシュ[ 'A1' ]
A2 = キャッシュ[ 'A2' ]
#バックプロパゲーションを実行する
dZ2 = A2 - Y
dW2 = 1 / m * np . dot ( dZ2A1 . T ) です。
db2 = 1 / m * np . sum ( dZ2axis = 1keepdims = True )
dZ1 = np . dot ( W2 . T , dZ2 ) * ( 1 - np . power ( A1 , 2 ))
dW1 = 1 / m * np . dot ( dZ1 , X . T )
db1 = 1 / m * np . sum ( dZ1axis = 1keepdims = True )


grads = { "dW1" : dW1 ,
"db1" : db1 ,
"dW2" : dW2 ,
"db2" : db2 }
卒業生を返す

各パラメータの微分計算結果は辞書gradに格納されて返されます。

ここで言及する必要があるのは、数値最適化に関わる知識です。機械学習では、学習する問題が特定の形式になると、機械学習は最適化問題として形式化されます。

勾配降下法、確率的勾配降下法、ニュートン法、準ニュートン法、あるいは Adam などの高度な最適化アルゴリズムのいずれであっても、その数学的原理を習得するには時間が必要です。

体重更新

反復計算の最後のステップは、バックプロパゲーションの結果に従って重みを更新することです。更新式は次のとおりです。

重み更新関数は、次の式で定義できます。

 def update_parameters ( パラメータgrads学習率= 1.2 ):
#パラメータを取得する
W1 = パラメータ[ 'W1' ]
b1 = パラメータ[ 'b1' ]
W2 = パラメータ[ 'W2' ]
b2 = パラメータ[ 'b2' ]
#グラデーションを取得する
dW1 = グラデーション[ 'dW1' ]
db1 = 卒業生[ 'db1' ]
dW2 = グラデーション[ 'dW2' ]
db2 = 卒業生[ 'db2' ]
#パラメータの更新
W1 -= dW1 * 学習率
b1 -= db1 * 学習率
W2 -= dW2 * 学習率
b2 -= db2 * 学習率


パラメータ= { "W1" : W1 ,
"b1" : b1 ,
「W2」W2
"b2" : b2 }
戻りパラメータ

このようにして、順方向伝播 - 損失の計算 - 逆方向伝播 - 重みの更新というニューラル ネットワークのトレーニング プロセスが展開され、完了します。

ここで、以前のいくつかの講義と同様に、より Python らしくするために、さまざまなモジュールを組み合わせてニューラル ネットワーク モデルを定義します。

 nn_model を定義します( XYn_hnum_iterations = 10000print_cost = False ):
np . ランダム. シード( 3 )
n_x = レイヤーサイズ( X , Y )[ 0 ]
n_y = レイヤーサイズ( X , Y )[ 2 ]
# モデルパラメータを初期化する
パラメータ= 初期化パラメータ( n_xn_hn_y )
W1 = パラメータ[ 'W1' ]
b1 = パラメータ[ 'b1' ]
W2 = パラメータ[ 'W2' ]
b2 = パラメータ[ 'b2' ]
# 勾配降下法とパラメータ更新ループ
i が範囲( 0 , num_iterations ) 内である場合:
#順伝播計算
A2キャッシュ= forward_propagation ( Xパラメータ)
#現在の損失を計算する
コスト= compute_cost ( A2 , Y , パラメータ)
#逆伝播
grads = backward_propagation ( パラメータキャッシュXY )
#パラメータの更新
パラメータ= update_parameters ( パラメータgrads学習率= 1.2 )
# 印刷損失
print_cost かつi % 1000 == 0 の場合:
print ( "反復後のコスト %i: %f" % ( i , cost ))

戻りパラメータ

モデルの本体が完成したら、トレーニング結果に基づいて予測関数を定義することもできます。

 def predict ( パラメータ, X ):
A2キャッシュ= forward_propagation ( Xパラメータ)
予測値= ( A2 > 0.5 )
リターン予測

次に、以前に生成されたデータに基づいてモデルをテストします。

 パラメータ= nn_model ( X , Y , n_h = 4 ,
num_iterations = 10000
print_cost = True )

9000 回の反復後、損失は 0.21 に低下しました。テストの精度を見てみましょう:

 #予測精度
予測= 予測( パラメータ, X )
print ( '精度: %d' % float (( np . dot ( Y , predictions . T ) +
np . dot ( 1 - Y1 - predictions . T )) / float ( Y . size ) * 100 ) + '%' )

テスト精度は0.9に達しました。

ニューラル ネットワークの決定境界を描画する効果は次のとおりです。

上記がこのセクションの主な内容です。NumPy を使用して、単層ニューラル ネットワークを手動で構築します。

<<:  機械学習における特徴選択の3つの代替手法

>>:  スマートシティのスマートパーキング:建物が利益を上げる方法

ブログ    
ブログ    

推薦する

端から端まで道を切り開きます! OccWorld: 自動運転の未来に向けた 3D 占有世界モデルへの新しいアプローチ

序文と個人的な理解とても良い作品を見つけたので、皆さんと共有したいと思います!占有+世界モデルに関し...

人工知能はリアルタイム分析のためのより強力なツールとなる

AI と機械学習は価値の高いデータに依存しているため、IT 部門はネットワーク内で何が起こっているか...

...

...

国内の多くの大学が共同でオープンソースコミュニティLAMMを構築しています。マルチモーダル言語モデルファミリーに参加する時が来ました

ChatGPTの登場以来、大規模言語モデル(LLM)は飛躍的な発展を遂げ、自然言語に基づく人間とコン...

ジャック・マーがまた一人の世界クラスの科学者を採用しました。春節期間中に電車の切符を買うときにシステムクラッシュを心配する必要はもうありません!

アリババが中国だけでなく国際的にも素晴らしいインターネット企業であることは誰もが知っています。しかし...

単一の GPU のみを使用して 7B モデルを微調整します。ユニバーサルマルチモーダルツール LLaMA-Adapter は閾値を取り除き、その効果は驚くべきものです

LLaMA アダプタが完全にロック解除されました。一般的なマルチモーダル ベース モデルとして、画像...

...

大きなモデルが常に「事実」を間違えた場合はどうすればよいでしょうか? 300以上の論文のレビューはこちら

ビッグモデルは事実の知識を習得する上で優れた能力と可能性を示していますが、ドメイン知識の欠如、リアル...

画像ベースの AI プロジェクト用のデータセットを準備する 7 つのステップ

翻訳者 |陳俊レビュー | Chonglouご存知のとおり、データセットはおそらく機械学習プロジェク...

新たなレベルに到達しましょう!自動運転とインテリジェント交通における視覚言語モデルの最新の応用

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

トランスフォーマー+強化学習、Google DeepMindは世界を知覚するロボットの脳となる大きなモデルを作る

ロボットの学習方法を開発する際に、大規模で多様なデータセットを統合し、強力で表現力豊かなモデル (T...

...

インタビュアー: アルゴリズムの時間計算量と空間計算量についてどう思いますか?計算方法は?

[[424483]] 1. はじめにアルゴリズムとは、データを操作し、プログラムの問題を解決するた...