ニューラル ネットワーク トレーニングの基本的なコツ

前回の記事では、学習の目的を達成するために、最適化関数を使用して重みパラメータを更新し、損失関数の最小値に継続的に近づける方法を紹介しました。最適化関数の基本的な考え方は勾配降下法であり、重みパラメータの更新では損失関数に対するすべての重みの勾配を計算する必要があります。ニューラル ネットワークの紹介に関する前回の記事から、重みに影響を与える勾配係数には、損失関数の導関数、活性化関数の導関数、ノードの入力値、重み値が含まれることがわかります

次に、この記事では、勾配消失と勾配爆発の概念と、ニューラル ネットワークのトレーニング中に勾配消失と勾配爆発を防ぐいくつかのトリックを紹介します。

消滅するグラデーションと爆発するグラデーション

ニューラル ネットワーク、特にディープ ニューラル ネットワークをトレーニングするときの大きな問題は、勾配が消失するか勾配が爆発する、つまり損失関数に対する重みの導関数が非常に大きくなったり、非常に小さくなったりすることです。勾配の消失または爆発の問題は、一般に、ネットワーク層の数が増加するにつれて、ますます明らかになります。

消失勾配をシミュレートする

下図に示すように、各層にはニューロンが 1 つだけあると仮定し、各層は次の式で表すことができます。ここで、σ \sigmaσ为激活函数,在这里以sigmoid为例。
a i = σ ( z i ) = σ ( w i ∗ x i ) , 其中 x i = a i − 1 a_i = \sigma{(z_i)} = \sigma{(w_i * x_i)}, 其中x_i = a_{i-1} ある私は=s ( z私は)=s ( w私はバツ私はここでx私は=あるi 1
画像.png
次に、次の式を導出できます。
α L α w 1 = α L α a 4 ∗ α a 4 α z 4 ∗ α z 4 α a 3 ∗ α a 3 α z 3 ∗ α z 3 α a 2 ∗ α a 2 α z 2 ∗ α z 2 α a 1 ∗ α a 1 α z 1 ∗ α z 1 α w 1 \frac{\alpha{L}}{\alpha{w_1}} = \frac{\alpha{L} } {\alpha{a_4}}*\frac{\alpha{a_4}}{\alpha{z_4}}*\frac{\alpha{z_4}}{\alpha{a_3}}*\frac{\alpha{a_3 } }{\alpha{z_3}}*\frac{\alpha{z_3}}{\alpha{a_2}}*\frac{\alpha{a_2}}{\alpha{z_2}}*\frac{\alpha{ z_2 }}{\alpha{a_1}}*\frac{\alpha{a_1}}{\alpha{z_1}}*\frac{\alpha{z_1}}{\alpha{w_1}}ああ_1αL _=αa _4αL _z _4αa _4αa _3z _4z _3αa _3αa _2z _3z _2αa _2αa _1z _2z _1αa _1ああ_1z _1
= α L α a 4 ∗ σ ′ z 4 ∗ w 4 ∗ σ ′ z 3 ∗ w 3 ∗ σ ′ z 2 ∗ w 2 ∗ σ ′ z 1 ∗ x 1 =\frac{\alpha{L}}{\ alpha{a_4}}*{\sigma'{z_4}}*w_4*{\sigma'{z_3}}*w_3*{\sigma'{z_2}}*w2*{\sigma'{z_1}}*x_1=αa _4αL _p z」4w4p z」3w3p z」2w2 _p z」1バツ1
シグモイド関数の導関数を次の図に示します。
画像.png
Visible, σ ' ( x ) \sigma'(x)p' (x)1 4 \frac{1}{4}です41一方、一般的なネットワーク トレーニングでは、平均 0、標準偏差 1 のガウス分布がネットワークの重みの初期化に使用されます。つまり、初期化された重みの値は通常 1 未満であるため、σ ' ( x ) ∗ w ≤ 1 4 \ sigma '(x)*w ≤ \frac{1}{4}p( × )_w41したがって、上式の連鎖導出では層数が増えると導出結果が小さくなり、最終的には勾配が消失してしまいます。

勾配爆発

σ ' ( x ) ∗ w > 1 \sigma'(x)*w > 1p( × )_w>1時ですよwwwが比較的大きい場合。すると、入力層に近い隠れ層の勾配が大きく変化し、勾配爆発の問題が発生します。

正規化された入力

ニューラル ネットワークをトレーニングする場合、トレーニングを高速化する方法の 1 つは入力を正規化することです。入力の正規化は、次の 2 つの手順で構成されます。

  • ゼロ平均: すべてのサンプルの平均を計算しますμ = 1 m ∑ i = 1 mxi \mu=\frac{1}{m}\sum_{i=1}^m{x^{i}}メートル=メートル1i = 1メートルバツiの場合、各サンプルは平均値を減算します。xi = xi − μ x^i = x^i - \muバツ=バツメートル
  • 正規化された分散: 分散σ 2 = 1 m ∑ i = 1 m ( xi ) 2 \sigma^2 = \frac{1}{m}\sum_{i=1}^m(x^i)^2 を計算します。p2=メートル1i = 1メートル( ×2であり、各サンプルは平均xi = xi σ 2 + ϵ x^i = \frac{x^i}{\sqrt{\sigma^2 + \epsilon}} で除算されます。バツ=p2 +ϵ バツ私は

画像.png

重みの初期化

重みを初期化する理由

前の重み勾配計算から、重み値も勾配計算に関与していることがわかります。つまり、重みの初期化の目的は、深すぎるニューラル ネットワークが順伝播プロセス中に無効になることを防ぐことです。重みが小さく、逆伝播プロセスにより勾配が消失または爆発します

順伝播

活性化関数のない単純な 100 層ニューラル ネットワークを例として、torch.randn を使用して標準正規分布データを生成し、順伝播用の入力 x と重み行列 a を初期化します。 x = x 1 ∗ w 1 + x 2 ∗
w 2 + . . . + x 100 ∗ w 100 x = x_1*w_1 + x_2*w_2 + ... + x_{100}*w_{100}バツ=バツ1w1+バツ2w2+...+バツ100w100

>>> x = torch.randn(512)
>>> for i in range(100):
...     a = torch.randn(512, 512)
...     x = a @ x
...
>>> x.mean()
tensor(nan)
>>> x.std()
tensor(nan)

特定の演算で行列の乗算を 100 回行った後、レイヤーの出力が非常に大きくなり、コンピューターがその標準偏差と平均を認識できなくなることがわかります。つまり、勾配爆発が発生します。
平均 0、分散 0.01 の正規分布を使用して重みが初期化されると、順伝播が実行されます。

>>> x = torch.randn(512)
>>> for i in range(100):
...     a = torch.randn(512, 512) * 0.01
...     x = a @ x
...
>>> x.mean()
tensor(0.)
>>> x.std()
tensor(0.)

このとき、層の出力値は限りなく 0 に近いことがわかります。つまり、重みの初期値が大きすぎても小さすぎても、モデルはうまく学習できません。

重みの初期化方法

一般的な重みの初期化方法には、Xavier 初期化、Kaimming He 初期化、0 への初期化の 3 つがあります。

ザビエルの初期化

Xavier 初期化は古典的な重みの初期化方法です. 入力と出力の次元に従って, 重みパラメータの初期値が適応的に設定され, 各層の重みは有界ランダム一様分布に設定されます. 式は次のとおりです: W
〜 U [ − 6 ni + ni + 1 , 6 ni + ni + 1 ] W\sim{U[-\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}, \ frac {\sqrt{6}}{\sqrt{n_i + n_{i+1}}}]}W[ n私は+ n+ 1 6 n私は+ n+ 1 6 ]
其中 n i n_i n私はニューロンの入力接続の数を示します、ni + 1 n_{i+1}n+ 1発信接続の数を示します。ザビエル重みの初期化により、活性化関数とバックプロパゲーション勾配の分散がニューラル ネットワークの各層に上または下に確実に伝播されます。

Kaimming He の初期化

Xavier 初期化と同様に、He 初期化も入力と出力の次元に応じて重みパラメータの初期値を適応的に設定します。違いは、He 初期化メソッドが ReLU 活性化関数によりよく適合するように設計されていることです。Xavier 活性化関数は、0 付近の対称および線形活性化関数に適していますが、ReLU 活性化関数はこれらの条件を満たしていません。

0に初期化される

次の図の単純な 2 層ニューラル ネットワークを例として、重みを 0 に初期化して順伝播と逆伝播のプロセスをシミュレートします。

順伝播:
z 1 [ 1 ] = w 11 [ 1 ] ∗ x 1 + w 21 [ 1 ] ∗ x 2 = 0 ; a 1 [ 1 ] = σ ( z 1 [ 1 ] ) = 0.5 z_1^{[ 1 ]} = w_{11}^{[1]} * x_1 + w_{21}^{[1]} * x_2 = 0;a_1^{[1]}=\sigma(z_1^{[1]} ) =0.5z1[ 1 ]=w11[ 1 ]バツ1+w21[ 1 ]バツ2=0 ;ある1[ 1 ]=s ( z1[ 1 ])=0.5
z 2 [1] = 0 ; a 2 [ 1 ] = 0.5 z_2^{[1]}=0;a_2^{[1]}=0.5z2[ 1 ]=0 ;ある2[ 1 ]=0.5
z 3 [1] = 0 ; a 3 [ 1 ] = 0.5 z_3^{[1]}=0;a_3^{[1]}=0.5z3[ 1 ]=0 ;ある3[ 1 ]=0.5
z 1 [2] = 0 ; a 1 [ 2 ] = 0.5 z_1^{[2]}=0;a_1^{[2]}=0.5z1[ 2 ]=0 ;ある1[ 2 ]=0.5
重みがすべて 0 に初期化されると、ニューロンの出力値はすべて同じになります。次にバックプロパゲーションをシミュレートします:
α L α w 11 [ 2 ] = α L α a 1 [ 2 ] ∗ α a 1 [ 2 ] α z 1 [ 2 ] ∗ a 1 [ 1 ] = α L α a 1 [ 2 ] ∗ σ ( z 1 [ 2 ] ) ( 1 − σ ( z 1 [ 2 ] ) ) ∗ 0.5 = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\ alpha{w_ {11}^{[2]}}}=\frac{\alpha{L}}{\alpha{a_{1}^{[2]}}}*\frac{\alpha{a_1^{ [2] }}}{\alpha{z_{1}^{[2]}}}*a_1^{[1]}=\frac{\alpha{L}}{\alpha{a_{1}^{ [2] }}}*\sigma(z_1^{[2])}(1-\sigma(z_1^{[2])})*0.5 = \frac{\alpha{L}}{\alpha{a_ {1} ^{[2]}}}*(0.5)^3ああ_11[ 2 ]αL _=αa _1[ 2 ]αL _z _1[ 2 ]αa _1[ 2 ]ある1[ 1 ]=αa _1[ 2 ]αL _s ( z1[ 2 ] )( 1s ( z1[ 2 ] ))0.5=αa _1[ 2 ]αL _( 0.5 )3
α L α w 21 [ 2 ] = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\alpha{w_{21}^{[2]}}}=\ frac{\alpha{L}}{\alpha{a_{1}^{[2]}}}*(0.5)^3ああ_21[ 2 ]αL _=αa _1[ 2 ]αL _( 0.5 )3
α L α w 31 [ 2 ] = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\alpha{w_{31}^{[2]}}}=\ frac{\alpha{L}}{\alpha{a_{1}^{[2]}}}*(0.5)^3ああ_31[ 2 ]αL _=αa _1[ 2 ]αL _( 0.5 )3
而对于 w 11 [ 1 ] , w 21 [ 1 ] , w 31 [ 1 ] w_{11}^{[1]},w_{21}^{[1]},w_{31}^{[1]} w11[ 1 ]w21[ 1 ]w31[ 1 ]の偏微分。乗算された値には重み値が含まれているため、すべて 0 になります。
要約すると、重みがすべて 0 に初期化されると、ニューロンの各層は最初の順方向伝播では同じ出力値を持ちますが、バックプロパゲーションでは重みが更新されますが、最後の層の重みのみが更新されるため、ネットワークの学習に失敗します。

学習率の低下

ミニバッチ勾配降下法では、損失関数の勾配計算が少数のサンプルに依存するため、サンプルのランダム性により勾配変動の大きな分散が生じる可能性がありますが、学習率を継続的に低下させることで、徐々に最小値に収束していきます

学習率減衰法

一般的な学習率減衰方法には、指数関数的減衰、固定ステップ減衰、マルチステップ減衰、コサイン アニーリング減衰の 4 つがあります。変更ルールを次の図に示します。
画像.png

指数関数的減衰

学習率を指数関数的に減衰させるのが一般的な戦略です。pytorchでの使用方法は以下の通りです。

ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)

パラメーターガンマは減衰のベースを表し、次のように、さまざまなガンマ値を選択することでさまざまな減衰曲線を取得できます。ガンマ
画像.png
値が小さいほど、学習率の減衰が速くなります。

ステップ減衰を修正

つまり、学習率は、特定のステップ数 (またはエポック) ごとに元のガンマの 1 部分に減少します。

StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)

このうち、ガンマパラメータは減衰の度合いを示し、step_sizeパラメータは学習率を何ステップごとに調整するかを示します。
画像.png

多段階減衰

固定ステップ サイズの減衰により、固定間隔の長さに応じて学習率を更新できますが、利点は、異なる間隔で異なる更新頻度を使用できることです。

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[200, 300, 320, 340, 200], gamma=0.8)

マイルストーンパラメータは学習率更新の開始と終了の間隔であり、[0, 200]の区間では学習率を更新せず、それ以降の区間は1回更新することを意味します。
画像.png

コサインアニーリング

厳密に言えば、コサイン アニーリング戦略は学習率を周期的に変化させるため、学習率減衰戦略であってはなりません。

CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

ここで、T_max はコサイン関数の周期を表し、eta_min は学習率の最小値を表します。
画像.png

バッチノルム

BatchNorm は、トレーニングを高速化し、モデルのパフォーマンスを向上させるために設計されたニューラル ネットワークで一般的に使用される正則化手法です。

BatchNorm を使用する理由

BatchNorm の役割は、ディープ ニューラル ネットワークのトレーニング プロセス中に、それによってネットワークのトレーニング速度を向上させることです。

内部共変量シフト問題

ディープニューラルネットワークでは、通常、各層の入力データ分布は学習の進行とともに変化します。つまり、各層の入力分布は常に変化するため、ネットワークの学習法則を安定させることが困難になります。トレーニング プロセス中、各層のパラメーターは常に変化するため、隠れ層の入力分布も常に変化します。これは、いわゆる「内部共変量シフト」問題です。
BatchNorm の基本的な考え方: 各隠れノードの活性化入力zzを持たせるZ分布は固定されるため、「内部共変量シフト」問題が回避されます。非線形変換前のディープ ニューラル ネットワークの活性化入力値のはトレーニング プロセス中に徐々にシフトまたは変更されるため、全体の分布は徐々に非線形関数 (例としてシグモイド) の値の範囲の上限と下限に近づき).バックプロパゲーション中に低レベル ニューラル ネットワークの勾配が消失し、ニューラル ネットワークの収束がますます遅くなります。
BN は、正規化手段によって各ニューロンのを平均 0、分散 1 の標準正規分布に強制的に戻すことで活性化入力値zzzは非線形活性化関数の変化率が大きい領域にあり、小さな入力変換で損失関数に大きな変化を引き起こすことができ、勾配消失の問題を回避でき、同時に、非線形活性化関数は勾配に大きな変化を引き起こす可能性があり、トレーニングをスピードアップします
同時に、すべての分布を標準正規分布に戻すと、多層ニューラル ネットワークの各層が固定的な表現になり、つまりネットワークの表現力が低下し、深さの意味が存在しなくなります。この問題を解決するために、BN は変換された標準正規分布に対してスケールおよびシフト演算を実行します。これら 2 つのパラメーターはトレーニングによって学習されます。

BatchNormとは何ですか

ミニバッチ トレーニングの場合、トレーニング プロセスには m 個のトレーニング インスタンスが含まれます。BN の具体的な演算プロセスは次のとおりです:

まず、ニューロンの入力活性化値を平均 0、分散 1 の標準分布に引き込みます。ネットワークの発現能力が低下するのを防ぐため、ネットワークのフィッティング能力を高めるために各ニューロンに 2 つの調整パラメーター (スケールとシフト) が追加されます。

トレーニング段階

トレーニング フェーズでは、BN は各入力値 (サンプル) を標準化し、指数加重移動平均法を使用して平均と分散を保存し、サンプル セット全体の平均と分散を近似します。サンプルセット全体で、(サンプルの総数/BatchSize) グループγ \gammaが生成されます。cb \betab

def bn_simple_for_train(x, gamma, beta, bn_params):
    '''
    X : 输入数据
    gamma:缩放因子
    beta:平移因子
    bn_params: batch norm所需要的一些参数
    running_mean: 滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
    running_var: 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    '''
    running_mean = bn_params["running_mean"]       # shape = [B]
    running_var = bn_params["running_var"]
    
    x_mean = x.mean(axis=0)
    x_var = x.var(axis=0)
    # 归一化
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    # bn
    res = gamma * x_normalized + beta
    
    # 滑动平移方式
    running_mean = momentum * running_mean + (1- momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    
    # 记录新的参数值
    bn_params["running_mean"] = running_mean
    bn_params["running_var"] = running_var
    
    return res, bn_params

推理段階

テスト中の入力サンプルは 1 つだけであるため、平均と分散は計算できません。つまり、トレーニング フェーズで取得されたグローバル統計が予測に使用されます。

def bn_simple_for_test(x, gamma, beta, bn_params):
    '''
    X : 输入数据
    gamma:缩放因子
    beta:平移因子
    bn_params: batch norm所需要的一些参数
    running_mean: 滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
    running_var: 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    '''
    running_mean = bn_params["running_mean"]      
    running_var = bn_params["running_var"]

    # 归一化
    x_normalized = (x - running_mean) / np.sqrt(running_var + eps)
    # bn
    res = gamma * x_normalized + beta

    return res, bn_params

活性化関数

機械学習と深層学習では、活性化関数を使用してニューラル ネットワークに非線形要素を導入することがよくあり、ネットワークが入力データと出力データに複雑な非線形関係を構築できるようになります。アクティベーション関数には次のプロパティが必要です。

  1. 非線形性: 入力データと出力データの間に非線形関係が存在するように、アクティベーション関数は非線形である必要があります。
  2. 連続性: 勾配が更新されるときに活性化関数の導関数を計算する必要があるため、活性化関数は連続的で微分可能である必要があります。
  3. 高い計算効率: 計算負荷の高いアクティベーション関数により、トレーニング プロセスが大幅に遅くなる可能性があります。

なぜ活性化関数が必要なのか

活性化関数が使用されない場合、活性化関数はf ( x ) = xf(x)=xとなります。f ( x )=x、このとき、各ノードの入力は上位層の出力の線形関数となり、ニューラルネットワークが何層あっても、出力は入力の線形結合となり、非線形関係を扱うことができません。そしてネットワークの表現能力には限界があります。活性化関数を導入し、ネットワークの非線形特性を高めることで、ネットワークの表現力がより強力になり、あらゆる関数を当てはめることが可能になります。さらに、活性化関数により、ニューラル ネットワークに一定のノイズ耐性を持たせ、ノイズの多いデータを処理できるようにすることもできます。

さまざまな活性化関数の違いと特徴

一般的な活性化関数には、シグモイド関数、tanh 関数、ReLU 関数などが含まれます。

  1. シグモイド関数

シグモイドは一般的に使用される非線形活性化関数であり、数学的形式は次のとおりです:
f ( x ) = 1 1 + e − zf(x)=\frac{1}{1 + e^{-z}}f ( x )=1 + e−z _1
幾何学的な画像は次のとおりです。
シグモイド.png
その導関数の式は次のとおりです。
f ' ( x ) = σ ( x ) ( 1 − σ ( x ) ) f'(x) = \sigma(x)(1-\sigma (バツ))f( × )_=σ ( x ) ( 1σ ( x ))
幾何学的な画像は次のとおりです
シグモイド.png

  • シグモイド関数の出力範囲は [0,1] の間で、出力を特定の範囲に制限できます。
  • シグモイド関数の導関数はそれ自体で表現できるため、計算に便利です。
  • シグモイド関数は滑らかな連続性を持っており、ニューラル ネットワークの連続性を保証できます。

欠点:

  • シグモイド関数の勾配は、入力値が大きくても小さくても 0 に近くなります。これにより、勾配消失の問題が発生し、ニューラル ネットワークが学習を継続できなくなります。
  • シグモイド関数の出力は 0 を中心としたゼロ中心ではないため、バックプロパゲーション中に、勾配の方向が両側に均等に分散されるのではなく、片側に偏り、トレーニング プロセスが不安定になる可能性があります。
  • シグモイド関数の計算は、指数演算が必要なため、ReLU 関数や Tanh 関数よりも遅くなります。
  1. タン関数

Tanh は、出力範囲が [-1,1] の一般的に使用される活性化関数です。Tanh 関数もシグモイド関数と同様に S 型関数ですが、出力範囲がより広いです。その数式は次のとおりです。tanh
( x ) = ex − e − xex + e − x Tanh(x) = \frac{e^x- e^{-x}}{e^x+e^{-x } }英語( x ) _=ex +e×exe ×
幾何学的イメージは次のようになります。
シグモイド.png
Tanh 関数の導関数は次のとおりです。
ddxtanh ( x ) = 1 − ( Tanh ( x ) ) 2 \frac{d}{dx}tanh(x) = 1- {(tanh(x) )}^2dx _d英語( x ) _=1( ( x ) ) _2 つの
幾何学的イメージを以下に示します。
シグモイド.png
利点:

  • 出力範囲は [-1, 1] で、データをより狭い範囲に正規化できます。これは、モデルの安定性と収束速度に役立ちます。
  • ゼロ中心の特徴により、モデルのトレーニングと最適化に統合されます。

欠点:

  • グラデーション消失の問題が発生しやすいです。
  • Tanh 関数は計算量が多く、シグモイド関数の 2 倍の計算量があり、モデルの学習速度に影響します。
  • 入力データが大きいか小さい場合、tanh 関数は飽和し、モデルのトレーニング効率に影響を与える勾配飽和問題も発生します。
  1. ReLU関数

ReLU 活性化関数は一般的に使用される非線形活性化関数であり、その式は次のとおりです。
relu ( x ) = max ( 0 , x ) relu(x) = max(0, x)もう一度読んでください( x ) _=最大( 0 , _x )
の幾何学的イメージは次のとおりです。
シグモイド.png
利点:

  • 計算速度が速い。
  • グラデーション消失の問題を解決しました。
  • ReLU 活性化関数の導関数が 0 または 1 であるため、収束速度が速く、滑らかな遷移領域がないため、学習中に収束しやすくなります。

欠点:

  • 一部のニューロンは「死んでいる」可能性があります。つまり、出力が常に 0 であるため、これらのニューロンはモデルのトレーニングに参加できなくなります。
  • 負の入力を避けるために入力データを正規化または標準化するには、データの前処理が必要です。
  1. リーキーReLU(2013)

Leaky ReLU 活性化関数の関数は
次のように定義されます。悪い_ _ _rエルユー( x )=マックス( x , _α x )
ここで、α は非常に小さな正の定数で、通常は 0.01 に設定されます。その幾何学的イメージを以下の図に示します
シグモイド.png

  • ニューロンの「死」の可能性の問題を解決しました。
  • 高い計算効率。
  1. ソフトプラス(2010)

Softplus アクティベーション関数は次のように定義されます。softplus
( x ) = ln ( 1 + ex ) Softplus(x)=ln(1+e^x)so f tplus ( x ) _ _=l n ( 1+ex )
その幾何学的イメージを以下の図に示します。
シグモイド.png
Softplus 活性化関数は、滑らかで連続的などこでも ReLU 関数として近似できます。ReLU関数と比較すると以下のような特徴があります。
アドバンテージ:

  • 連続性: ソフトプラス関数は連続一次微分関数であり、勾配の更新を容易にします。
  • ゼロ以外: ReLU 関数によって生成される出力値が 0 または正のいずれかであるのとは異なり、softplus 関数は正の出力値を生成します。
  • ゼロ以外の勾配: Softplus 関数には、負の入力値に対してゼロ以外の勾配があり、これにより、瀕死の ReLU 問題を防ぐことができます。

欠点:

  • SoftPlus の出力値は 0 を中心としていません。
  • その導関数は 1 未満であることが多く、勾配の消失の問題が発生する可能性があります。
  1. スウィッシュ(2017)

Swish 活性化関数は次のように定義されます。
Swish ( x ) = x ∗ σ ( β ∗ x ) Swish(x)=x*\sigma(\beta*x)スイス( x ) _ _ _=バツs ( bx)
其中 β \beta βは学習可能なパラメータ、σ \sigmaσはシグモイド関数です。

  1. シルー(2017)

SiLU (Sigmoid Linear Unit) 活性化関数は、シグモイド活性化関数要素と線形活性化関数要素を組み合わせたもので、次のように定義されます。
S i LU ( x ) = x 1 + e − x SiLU(x)=\frac{x}{1+e ^{ -x}}シルー( × ) _ _=1 + e××
その幾何学的イメージは次のとおりです。

シグモイド.png
アドバンテージ:

  • 滑らかな勾配: SiLU 関数には滑らかな導関数があり、勾配の消失の問題を回避できます。
  • 非単調性: SiLU 関数は非単調であり、正と負の両方の値を持つため、SiLU 関数は入力データ内の複雑なパターンをキャプチャできます。
  • 高い計算効率。
  1. ハードスウィッシュ(2019)

HardSwish 活性化関数は、Swish 関数の簡略版である区分線形活性化関数であり、次のように定義されます:
hardswish ( x ) = { 0 , if ( x ≤ − 3 ) x , if ( x ≥ 3 ) x ( x + 3 ) 6、それ以外の場合は、hard_swish(x) = \begin{cases} 0、\quad if(x\le-3) \\x、\quad if(x\ge3) \\ \frac{x( x+3) {6}、それ以外の場合は \quad \end{cases}ハード_ _sウィッシュ( x ) _ _ _= 0 i f ( x3 )× i f ( x3 )6x ( x + 3 )その他バイス_ _ _ _
Hardswish 活性化関数は、
シグモイド.png
swish 活性化関数を改良したもので、ニューラル ネットワークの精度をある程度向上させることができますが、組み込みモバイル デバイスでの使用には適していません。 「S」タイプ関数 組み込みモバイルデバイスの計算コストは​​高く、導出はより複雑です。
アドバンテージ:

  • 計算速度が速い。
  • ReLU と比較して、勾配消失の問題を効果的に軽減できます。

欠点:

  • 低度の非線形性: Swish および Mish 活性化関数と比較すると、HardSwish の非線形性は比較的低く、データ内の非線形特徴を十分に活用できない可能性があります。
  1. ミッシュ(2019)

Mish 活性化関数には、** 上限なし、下限なし、滑らかな導関数、および非単調である ** という 4 つの利点があり、その数式は次のとおりです。 f ( x ) = x ∗ Tanh (softplus (
x ) ) = x ∗ Tanh ( ln ( 1 + exp ( x ) ) ) f(x)=x*tanh(softplus(x)) = x * Tanh(ln(1+exp(x)))f ( x )=バツt anh ( so f tplus ( x ) ) _=バツt英語( l n ( 1+e x p ( x ))) の
ジオメトリは次のとおりです。
シグモイド.png
特徴:

  • 非単調性 (非線形性): 導関数を通じて、Mish 関数がさまざまな間隔で単調増加または単調減少する可能性があり、入力データ内の複雑なパターンを捕捉できることがわかります。
  • 連続性: Mish 活性化関数は連続性が高く、どこでも微分可能であるため、モデルをより適切に更新できます。
  • 上限と下限はありません。上限がなければ飽和問題を回避できませんが、下限は強力な正則化効果を達成するのに役立ちます。

適切な活性化関数を選択する方法

適切なアクティベーション関数を選択する際には、次の点を考慮することができます。

  • モデルの収束を高速化するために、ゼロ中心特徴を使用する活性化関数を選択するようにしてください。
  • 勾配消失の問題を考慮し、ReLU、Leaky ReLU など、勾配消失が起こりにくい活性化関数を選択します。
  • 計算効率を考慮してください。

参考リンク

おすすめ

転載: blog.csdn.net/hello_dear_you/article/details/129432976