私はニューラルネットワークについていくつか読んでいて、単層ニューラルネットワークの一般原則を理解しています。層を追加する必要があることは理解していますが、非線形活性化関数が使用されるのはなぜですか?
この質問の後に次の質問が続きます:バックプロパゲーションで使用される活性化関数の導関数は何ですか?
私はニューラルネットワークについていくつか読んでいて、単層ニューラルネットワークの一般原則を理解しています。層を追加する必要があることは理解していますが、非線形活性化関数が使用されるのはなぜですか?
この質問の後に次の質問が続きます:バックプロパゲーションで使用される活性化関数の導関数は何ですか?
アクティベーション関数の目的は、ネットワークに非線形性を導入することです
次に、これにより、説明変数によって非線形に変化する応答変数 (別名、ターゲット変数、クラス ラベル、またはスコア) をモデル化できます。
非線形とは、出力が入力の線形結合から再現できないことを意味します (これは、直線にレンダリングされる出力と同じではありません。これを表す単語はaffineです)。
別の考え方:ネットワークに非線形活性化関数がなければ、層の数に関係なく、NN は単層パーセプトロンのように動作します。これらの層を合計すると、別の線形関数が得られるからです。 (上記の定義を参照)。
>>> in_vec = NP.random.rand(10)
>>> in_vec
array([ 0.94, 0.61, 0.65, 0. , 0.77, 0.99, 0.35, 0.81, 0.46, 0.59])
>>> # common activation function, hyperbolic tangent
>>> out_vec = NP.tanh(in_vec)
>>> out_vec
array([ 0.74, 0.54, 0.57, 0. , 0.65, 0.76, 0.34, 0.67, 0.43, 0.53])
-2 から 2 で評価される backprop (双曲線正接) で使用される一般的な活性化関数:
線形アクティベーション関数を使用できますが、非常に限られた場合にのみ使用できます。実際、活性化関数をよりよく理解するには、通常の最小二乗法または単純に線形回帰を見ることが重要です。線形回帰は、入力と組み合わせたときに、説明変数とターゲット変数の間の垂直効果が最小になる最適な重みを見つけることを目的としています。つまり、期待される出力が以下に示すように線形回帰を反映している場合、線形活性化関数を使用できます (上の図)。しかし、下の 2 番目の図のように、線形関数では目的の結果が得られません:(中央の図)。ただし、以下に示すような非線形関数は、望ましい結果を生成します。
線形活性化関数を使用するニューラル ネットワークは、そのアーキテクチャがどれほど複雑であっても、1 層の深さでのみ有効であるため、活性化関数を線形にすることはできません。通常、ネットワークへの入力は線形変換 (入力 * 重み) ですが、現実の世界と問題は非線形です。入力データを非線形にするために、アクティベーション関数と呼ばれる非線形マッピングを使用します。活性化関数は、特定の神経機能の存在を決定する意思決定関数です。これは 0 から 1 の間でマッピングされます。0 は機能がないことを意味し、1 はその機能があることを意味します。残念ながら、重みで発生する小さな変化は、0 または 1 のいずれかしか取り得ないため、活性化値に反映できません。したがって、非線形関数はこの範囲で連続的で微分可能でなければなりません。ニューラル ネットワークは、-infinity から +infinite までの任意の入力を受け取ることができなければなりませんが、場合によっては {0,1} または {-1,1} の間の範囲の出力にマッピングできる必要があります。活性化機能が必要です。ニューラル ネットワークでの目的は、重みと入力の非線形の組み合わせによって非線形の決定境界を生成することであるため、活性化関数には非線形性が必要です。
「現在の論文では、Stone-Weierstrass の定理と、Gallant と White のコサイン スカッシャーを使用して、任意のスカッシング関数を使用する標準的な多層フィードフォワード ネットワーク アーキテクチャが、実質的に任意の目的の関数を任意の精度で近似できることを確立しています。ユニットが利用可能です。」( Hornik ら、1989 年、ニューラル ネットワーク)
スカッシング関数は、たとえば、シグモイド活性化関数のように [0,1] にマップされる非線形活性化関数です。
私が覚えているように、シグモイド関数が使用されるのは、BP アルゴリズムに適合する導関数が計算しやすく、f(x)(1-f(x)) のような単純なものだからです。数学は正確には覚えていません。実際には、導関数を持つ任意の関数を使用できます。
ニューラル ネットワーク、特に深い NN とバックプロパゲーションで非線形活性化関数を使用することが重要です。トピックで提起された質問によると、最初に、バックプロパゲーションに非線形活性化関数を使用する必要がある理由を述べます。
簡単に言えば、線形活性化関数が使用されている場合、コスト関数の導関数は (wrt) 入力に対して定数であるため、(ニューロンへの) 入力の値は weights の更新に影響しません。これは、良い結果を得るためにどの重みが最も効果的であるかを判断できないため、すべての重みを均等に変更せざるを得ないことを意味します。
より深い: 一般に、重みは次のように更新されます。
W_new = W_old - Learn_rate * D_loss
これは、新しい重みが、古い重みからコスト関数の導関数を引いたものに等しいことを意味します。活性化関数が線形関数である場合、その導関数 wrt 入力は定数であり、入力値は重みの更新に直接影響しません。
たとえば、バックプロパゲーションを使用して最後の層のニューロンの重みを更新するつもりです。重みに対する重み関数の勾配を計算する必要があります。チェーンルールを使用すると、次のようになります。
h と y は、それぞれ (推定された) ニューロン出力と実際の出力値です。x はニューロンの入力です。grad (f) は、入力 wrt 活性化関数から導出されます。上で計算された値 (係数による) が現在の重量から差し引かれ、新しい重量が取得されます。これら 2 種類のアクティベーション関数をより明確に比較できるようになりました。
1- 起動関数が次のような線形関数の場合: F(x) = 2 * x
それから:
新しい重みは次のようになります。
ご覧のとおり、すべての重みが等しく更新され、入力値が何であるかは関係ありません!!
2- しかし、Tanh(x) のような非線形活性化関数を使用する場合:
と:
これで、重みの更新における入力の直接的な効果を確認できます! 入力値が異なれば、重みも異なります。
トピックの質問に答えるには上記で十分だと思いますが、非線形活性化関数を使用することの他の利点について言及することは有用です。
他の回答で述べたように、非線形性により、NN はより多くの隠れ層とより深い NN を持つことができます。線形アクティベーター関数を持つレイヤーのシーケンスは、(前の関数の組み合わせで) レイヤーとしてマージでき、実際には、ディープ NN の利点を利用しない隠れ層を持つニューラル ネットワークです。
非線形活性化関数は、正規化された出力を生成することもできます。
複数のニューロンの層状 NN を使用して、線形分離不可能な問題を学習できます。たとえば、XOR 関数は、ステップ活性化関数を使用して 2 つのレイヤーで取得できます。