ディープラーニング | 3 | 多層パーセプトロンを開く正しい方法

単層パーセプトロン

ここに画像の説明を挿入
パーセプトロンと線形回帰の本質的な違い:出力が異なります

  • 線形回帰の出力は連続実数値です

  • パーセプトロンの出力は離散クラス {0, 1} または {-1, 1} です。

したがって、パーセプトロンは二項分類の分類器とみなすことができます。出力が 0 の場合は最初のカテゴリを示し、出力が 1 の場合は 2 番目のカテゴリを示します

パーセプトロントレーニング法

  1. wとbを初期化する
  2. サイクル:
  3.    ~~  如果yi × ( < wi , xi > + b ) ≤ 0 y_i \times (<w_i, x_i> + b) \leq 0y私は×( <w私はバツ私は>+ b )0の場合:
  4.      ~~~~    w ← w + yixi , b ← b + yiw \leftarrow w + y_ix_i, b \leftarrow b + y_iww+y私はバツ私はbb+y私は
  5. すべてのカテゴリが正しく分類されるまで

上記のプロセスでは、損失関数は次のように記述できます。

l = max ( 0 , − y < w , x > ) \mathcal{l}=\text{max}(0, -y<\pmb{w, x}>)=最大( 0 ,y<バツ>

AI の最初の危機: XOR 問題

パーセプトロンは XOR 問題を解決できません。XOR 問題を一次関数で分割するのは困難です。

このとき、問題を解決するために多層パーセプトロンが登場します。

多層パーセプトロン

ここに画像の説明を挿入
多層パーセプトロンによって提案される目的の 1 つは、XOR 問題を解決できるようにすることです。

いくつかの特徴については、いくつかの特徴が最初に分類され、別の部分が分類されます。2 つの部分からなる分類の結果とその後の分類により、XOR 問題を解決できます。
直観的に言えば、多層パーセプトロンの最大の特徴は、隠れ層がもう 1 つあることです。

dim=m の入力が与えられた場合、最終的に dim=n の出力ベクトル (カテゴリ) を出力する必要があります。これを達成する直感的な方法は次のとおりです。

[ h 1 ⋮ hk ] = [ w 1 1 ( 0 ) ⋯ w 1 m ( 0 ) ⋮ ⋱ ⋮ wk 1 ( 0 ) ⋯ wnm ( 0 ) ] ⋅ [ x 1 ⋮ xm ] + [ b 1 ( 0 ) ⋮ bk ( 0 ) ] \left[\begin{行列} h_1 \\ \vdots \\ h_k\\ \end{行列}\right]=\left[\begin{行列} w_11^{(0)} & \cdots & w_1m^{(0)} \\ \vdots & \ddots & \vdots \\ w_k1^{(0)} & \cdots & w_nm^{(0)} \\ \end{matrix}\right]\cdot \left[\begin{行列} x_1 \\ \vdots \\ x_m\\ \end{行列}\right] + \left[\begin{行列} b_1^{(0)} \\ \vdots \\ b_k^ {(0)}\\ \end{行列}\right] h1h = w11( 0 )w1( 0 )w1メートル( 0 )wメートル( 0 ) バツ1バツメートル + b1( 0 )bk( 0 )

[ o 1 ⋮ on ] = [ w 1 1 ( 1 ) ⋯ w 1 k ( 1 ) ⋮ ⋱ ⋮ wn 1 ( 1 ) ⋯ wnk ( 1 ) ] ⋅ [ h 1 ⋮ hk ] + [ b 1 ( 1 ) ⋮ bn ( 1 ) ] \left[\begin{行列} o_1 \\ \vdots \\ o_n\\ \end{行列}\right]=\left[\begin{行列} w_11^{(1)} & \cdots & w_1k^{(1)} \\ \vdots & \ddots & \vdots \\ w_n1^{(1)} & \cdots & w_nk^{(1)} \\ \end{matrix}\right]\cdot \left[\begin{行列} h_1 \\ \vdots \\ h_k\\ \end{行列}\right] + \left[\begin{行列} b_1^{(1)} \\ \vdots \\ b_n^ {(1)}\\ \end{行列}\right] ああ1ああ = w11( 1 )w1( 1 )w1k( 1 )wk( 1 ) h1h + b1( 1 )bn( 1 )

上記を行列形式で書くと、

h = W ( 0 ) x + b ( 0 ) \pmb{h=W^{(0)}x+b^{(0)}}h=W( 0 ) ×+b( 0 )

o = W ( 1 ) h + b ( 1 ) \pmb{o=W^{(1)}h+b^{(1)}}ああ=W( 1 )時間+b( 1 )

しかし、実際にはまだ単層ネットワークであり、
上記の式を導入すると、次の形式になります。

o = W ( 1 ) ( W ( 0 ) x + b ( 0 ) ) + b ( 1 ) \pmb{o=W}^{(1)}(\pmb{W}^{(0)}\pmb {x+b}^{(0)})+\pmb{b}^{(1)}ああ=W( 1 ) (W( 0 ) ×+b( 0 ) )+b( 1 )

展開後は次のように記述できます。

o = W ( 1 ) W ( 0 ) x + W ( 1 ) b ( 0 ) + b ( 1 ) \pmb{o=W}^{(1)}\pmb{W}^{(0)}\ pmb{x+W}^{(1)}\pmb{b}^{(0)}+\pmb{b}^{(1)}ああ=W( 1 ) W( 0 ) ×+W( 1 ) b( 0 )+b( 1 )

ただし、W ( 0 ) ∈ R k × m 、 W ( 1 ) ∈ R k × n 、 b ( 0 ) ∈ R k × 1 、 b ( 1 ) ∈ R n × 1 \pmb{W}^{(0 )}\in\mathbb{R}^{k\times m}, \pmb{W}^{(1)}\in\mathbb{R}^{k\times n}, \pmb{b}^{ (0)}\in\mathbb{R}^{k\times 1}、\pmb{b}^{(1)}\in\mathbb{R}^{n\times 1}W( 0 )Rk × mW( 1 )Rk × nb( 0 )Rk × 1b( 1 )Rn × 1

那么,W = W ( 1 ) × W ( 0 ) ∈ R n × m , b = W ( 1 ) b ( 0 ) + b ( 1 ) ∈ R n × 1 \pmb{W}=\pmb{W} ^{(1)}\times\pmb{W}^{(0)}\in\mathbb{R}^{n\times m}, \pmb{b}=\pmb{W}^{(1) }\pmb{b}^{(0)}+\pmb{b}^{(1)}\in\mathbb{R}^{n\times 1}W=W( 1 )×W( 0 )Rn × mb=W( 1 ) b( 0 )+b( 1 )Rn × 1

基本的に、式は次のように書くことができます。

o = W x + b \pmb{o=Wx+b}ああ=×+b

したがって、本質的には依然として単層ニューラル ネットワークです。

上記の問題の最大の理由は、ニューロンの伝達過程における非線形性の欠如です。

1 つの入力に複数の行列を乗算することは、基本的に 1 つの行列を乗算することと同じです。

行列の乗算は線形プロセスであるため、変換後に元に戻すことができます。

線形変換の基本形式は次のとおりです。

y = W x \pmb{y}=\pmb{Wx}y=×

この状況を変える方法は、モデルに非線形変換を追加することです。

非線形変換、活性化関数を追加

シグモド関数

x = 1 1 + exp ( − x ) \text{x}=\frac{1}{1 + \text{exp}(-x)}バツ=1+exp ( x )1
イメージを描く

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

import torch
import matplotlib.pyplot as plt

plt.figure(figsize=(2, 2))

x = torch.arange(-5, 5, 0.1, requires_grad=True)
y = x.sigmoid()
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

ここに画像の説明を挿入

どのような状況でシグモイド活性化関数を使用するのが適切ですか?

シグモイド関数の出力の範囲は 0 から 1 です。
出力として予測確率を持つモデルの場合、出力値は 0 から 1 に制限されるため、各ニューロンの出力が正規化されます。確率の範囲は 0 から 1 であるため、シグモイド関数は非常に適しており、
出力値の「ジャンプ」を避けるために勾配が滑らかであり、
関数は微分可能です。これは、任意の 2 点のシグモイド曲線の傾き、
つまり 1 または 0 に非常に近い明確な予測を見つけることができることを意味します。

シグモイド活性化関数の欠点:

勾配消失: 注: シグモイド関数が 0 および 1 に近づくと、つまりシグモイドの勾配が 0 に近づくと、変化率は平坦になります。ニューラル ネットワークがバックプロパゲーションにシグモイド活性化関数を使用する場合、出力が 0 または 1 に近いニューロンの勾配は 0 に近づく傾向があります。これらのニューロンは飽和ニューロンと呼ばれます。したがって、これらのニューロンの重みは更新されません。また、そのようなニューロンに接続されているニューロンの重みは非常にゆっくりと更新されます。この問題は勾配消失と呼ばれます。したがって、大規模なニューラル ネットワークにシグモイド ニューロンが含まれており、その多くが飽和している場合、ネットワークはバックプロパゲーションを実行できないと想像してください。
ゼロを中心としていない: シグモイド出力がゼロを中心としていない場合、出力は常に 0 より大きく、非ゼロ中心の出力により次の層のニューロンの入力がバイアスされます (バイアス シフト)。さらに、これにより、勾配降下法の収束速度が遅くなります。
計算コストが高い: exp() 関数は、他の非線形アクティベーション関数に比べて計算コストが高く、コンピューター上で実行すると時間がかかります。

y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

ここに画像の説明を挿入

タン関数

x = 1 − exp ( − 2 x ) 1 + exp ( − 2 x ) \text{x}=\frac{1-\text{exp}(-2x)}{1 + \text{exp}(-2x )}バツ=1+exp ( 2 x )1exp ( 2 x )

y = x.tanh()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

ここに画像の説明を挿入

タンの欠点:

シグモイドと同様に、Tanh 関数にも勾配消失の問題があるため、勾配が飽和したとき (x が大きいか小さいとき) に勾配が「消滅」します。
注: 一般的なバイナリ分類問題では、tanh 関数が隠れ層に使用され、シグモイド関数が出力層に使用されますが、これは修正されていないため、特定の問題に合わせて調整する必要があります。

x.grad.zero_()
y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

ここに画像の説明を挿入

ReLU関数

relu ( x ) = { 0 , x ≤ 0 x , x > 0 \text{relu}(x)= \begin{cases} 0, & \text{x} \leq0 \\ x, & \text{x > 0} \end{件}再読( x )={ 0 × ,バツ0x > 0

y = x.relu()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

ここに画像の説明を挿入

x.grad.zero_()
y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

ここに画像の説明を挿入
実際には、relu 関数はより簡潔な式になります。

relu ( x ) = max ( x , 0 ) \text{relu}(x)=\text{max}(x, 0)再読( x )=最大( x ,0 )

ReLU 関数は深層学習でよく使われる活性化関数であり、シグモイド関数やtanh 関数と比較して次のような利点があります。

入力が正の場合、導関数は 1 となり、勾配消失の問題がある程度改善され、勾配降下法の収束速度が加速され、計算速度が大幅に
速くなります。ReLU 関数には線形関係のみがあるため、シグモイドやタン関数よりも高速に計算できます。
片側性の抑制、広い興奮境界(つまり、興奮度が非常に高くなる可能性がある)など、生物学的妥当性(Biological Plausibility)があると考えられます。

ReLU 関数の欠点:

死んだ ReLU 問題。ReLU は入力が負の場合には完全に失敗しますが、これは順伝播では問題になりません。敏感な領域もあれば、そうでない領域もあります。ただし、バックプロパゲーションの過程で、負の数を入力すると、勾配は完全にゼロになります;
[Dead ReLU 問題] ReLU ニューロンは、学習中に比較的簡単に「死滅」します。学習中に、不適切なパラメーター更新後に最初の隠れ層の ReLU ニューロンがすべての学習データでアクティブ化できない場合、ニューロン自身のパラメーターの勾配は常に 0 になり、その後の学習プロセス中にアクティブ化することはできません。この現象はデッド ReLU 問題と呼ばれ、他の隠れ層でも発生する可能性があります。
ゼロを中心にしない: シグモイド活性化関数と同様に、ReLU 関数の出力はゼロを中心にせず、ReLU 関数の出力は 0 または正の数になります。次の層のニューラル ネットワークにバイアス オフセットを導入します。勾配降下効率に影響します。

各ニューロンには、活性化関数が設定されています。

その物理的な意味は、しきい値が十分に大きい場合はアクティブ化され (下位層に渡され)、そうでない場合は渡されません。

実際、この物理的な意味には神経科学的な説明があります。

したがって、多層パーセプトロンの全体的な形式は次のようになります。

h = δ ( W ( 0 ) x + b ( 0 ) ) \pmb{h}=\delta(\pmb{W}^{(0)}\pmb{x+b}^{(0)})h=d ( W( 0 ) ×+b( 0 ) )

o = ソフトマックス ( W ( 1 ) h + b ( 1 ) ) \pmb{o}=\text{ソフトマックス}(\pmb{W}^{(1)}\pmb{h+b}^{(1) })ああ=ソフトマックス( W( 1 )時間+b( 1 ) )

要約する

多層パーセプトロンは、ニューラルネットワークに基づく多層分類モデルです。

その出力はソフトマックス後の出力、つまり、出力は確率です。

その複数の層は、活性化関数の非線形性に由来します。

最も一般的に使用される活性化関数は、計算が最も便利な Relu 関数です。

おすすめ

転載: blog.csdn.net/weixin_51672245/article/details/131128833