ディープラーニングの知識に関する面接で最もよく聞かれる質問の 1 つは、「ニューラル ネットワークをトレーニングするのに 2 次コスト関数を使用できないのはなぜですか? 」です。この記事では、この質問に対する答えについて説明します。数学的な要素は多くありますが、難しいものではありません。シンプルかつ正確な内容にします。
まずはニューラルネットワークの一般的なアーキテクチャについて考えてみましょう
バイナリ分類問題では、一連の入力が「入力層」を形成し、「隠れ層」の一連のニューロンと 1 つのニューロンが「出力層」を形成します。この質問では、バイナリ分類器を扱っていると仮定し、ネットワークからの出力値は 1 つだけになります。
次に、入力層を緑色、出力ニューロンを赤色、隠れ層のニューロンの 1 つをオレンジ色で強調表示した次の図をご覧ください。すべての緑色からオレンジ色まで、すべての入力がオレンジ色のニューロンに接続されていることがわかります。言い換えると、オレンジ色のニューロンの「アクティブ化」は、入力層のすべての緑色のニューロンの「集約」を使用して行われます。このプロセスは、最終的な赤色の出力ニューロンに到達するまで、すべての層のニューロンすべてに複製されます。
オレンジ色のニューロンを赤色のニューロンに置き換えると、つまり、隠れ層を削除して赤色のニューロンを緑色のニューロンに直接接続するとどうなるでしょうか?
次のものが得られます。
この質問では、前述の「単純なアーキテクチャ」を前提としており、結果は完全なアーキテクチャにも一般化できます。
それでは、数学を段階的に紹介しましょう。
上記は、ニューラル ネットワークの基本的な「重み更新」方程式です。学習係数やサブサンプリング (最小バッチ) などの余分なハイパーパラメータは削除しました。w_k は重みのベクトルで、重みはニューラル ネットワーク モデルの「パラメータ」です。w_k は、列ベクトルに集められた個々の重みで構成されます。これらの重みは、モデルへの入力 (アーキテクチャ内の緑色のニューロン) に関連付けられています。コスト関数 C_i があり、i = 1 から n はサンプル内のデータ インスタンスの数です。コスト関数 C は、実際の出力 y とニューラル ネットワーク (赤色のニューロン) からの出力の間の「誤差」です。各データ インスタンスは、実際の出力に対して予測された出力を生成するため、すべてのデータ インスタンスにコストまたは誤差があります。モデルの目的は、データセット全体の平均でこのコスト関数を最小化することです。ご存知のように、最小化の手順では、モデル パラメータ (重み) に関して導関数を取得します。これは、ベクトル w_k の偏微分を使用して行います。つまり、コスト C は重み w_1 から w_q の式/集計になり、各重み w を微分してベクトルにまとめることになります。これは負の「勾配ベクトル」と呼ばれます。これは、k 回目の反復から (k+1) 回目の反復までの重みベクトルを更新するために使用されます。この手法は確率的勾配降下法ですが、この記事では省略します。
簡単に言うと、ニューラル ネットワークは、すべてのサンプルで平均化され、w_k について計算された負の勾配ベクトルを介して重みを更新することで学習します。これにより、コスト関数の最小化に進み、ネットワークの学習と精度の向上に役立ちます。負の勾配がゼロに向かっているため、重みの更新が行われていない場合は、学習が停止していることは明らかです。これは、必ずしも最小値に到達したことを意味するわけではありません。コスト関数は非常に複雑であり、多次元空間で最小値を見つける必要があるためです。したがって、勾配がゼロでネットワークが学習を停止する局所的最小値が多数存在する可能性があります。いずれにせよ、この問題ではそのことを心配する必要はありません。
次の表現を見てみましょう。
この式は、z_i を入力 x_ji の加重合計として定義します。これらの入力は、アーキテクチャ内の緑のニューロンであることに注意してください。隠れ層がないため、入力 x_ji と重み w_j を結合し、バイアス項を追加して z_i を取得します。これは、アーキテクチャ内の緑のニューロンから赤のニューロンへの接続矢印によって表されます。q 個の入力があるため、x_j と w_j があり、j = 1 から q です。
しかし、赤のニューロンには z_i は渡しません。それに「活性化関数」を適用します。この活性化関数は、ニューラル ネットワークごとに異なる場合があります。この問題の目的上、活性化関数は「シグモイド」または「ロジスティック」であると想定します。ここでは、読者がこの関数を認識していることを前提として、先に進みます。
次に、主な問題の説明があります。コスト関数 (C) をどのように定義するかです。バイナリ分類の場合、コスト関数は「クロスエントロピー」であることはよく知られていますが、ここでの疑問は、なぜ「二次関数」にできないのかということです。
両方のコスト関数の式を定義しましょう。
二次コスト関数 –クロスエントロピーコスト関数 –
2 次コスト関数は単純ですが (実際の出力 y_i と予測出力 a_i の間の最小二乗最小化を考えてください)、クロスエントロピー コスト関数についてはいくつか説明できます。これは、回帰モデルにおける負の対数尤度に似ています。括弧の外側に負の符号があることに注意してください。これは、コストを正に保つために使用されます (a_i は 0 から 1 の間になるため、シグモイドの出力であり、括弧内の項は常に負になります)。また、a_i が y_i に非常に近づくと、コストが 0 に非常に近づくことにも注意してください。これは、y_i = 1 かつ a_i ~ 1 の場合、ln(a_i) がほぼ 0 になるためです。同様に、y_i= 0 かつ a_i ~ 0 の場合、ln(1-a_i) がほぼ 0 になります。したがって、この関数は、モデルの予測が適切である場合にコストを正かつ最小限に保ちます。しかし、同じことは2次コスト関数についても言えます。しかし、私たちはそれを使いません。なぜでしょうか?ここで説明しましょう。
先ほど見た基本的な重み更新方程式に戻り、二次コスト関数を入力します。次の式が得られます。
簡単にするために、ここでは 1 つのデータ ポイント、つまり i=1 と n=1 のみを検討します。そして、重み w_j ごとに部分微分します。次のようになります。
i = 1なので、
zの値を代入すると、
つまり、ネットワークの重みを更新する役割を果たす勾配ベクトルは、2 次コスト関数を使用する場合、シグモイド関数の導関数を持ちます。
次に、シグモイド関数の微分の動作を見てみましょう。
上記のグラフから、シグモイド関数の傾きを表す導関数は、入力 z が大きくなるとすぐに 0 に近づくことがわかります。これは何を意味するのでしょうか。つまり、活性化入力 z が大きい場合、勾配ベクトルは 0 になります。したがって、重みが更新されないため、ネットワークは学習を停止します。これは最小値に達したことを意味するわけではないことに注意してください。これは、望ましくないポイントで、最小値から遠い可能性のある関数空間で立ち往生していることを意味します。これは「学習のスローダウン」として知られています。ただし、これはクロスエントロピーコスト関数では発生しません。
クロスエントロピーコスト関数を使用して同じ置換を実行すると、次のようになります。
次の用語に注目すると興味深いです:
2次コストの勾配にも同様のことが起こります。しかし、これを単純化するために使用するトリックがあります。シグモイド関数の勾配は次のように表すことができます。
これを元の式に代入すると、次のようになります。
つまり、クロスエントロピーコスト関数を使用する場合、ネットワークの重みを更新する役割を果たす勾配ベクトルにはシグモイド関数の導関数がありません。したがって、このコスト関数を使用した学習では速度低下は発生しません。
見やすくするために、もう一度グラデーションを並べます。
これで当初の質問に対する答えがわかりました。つまり、学習の速度低下につながるため、2 次コスト関数は使用しません。
上記の分析は出力層(1 つのニューロン)に対してのみ行われましたが、一般的なニューラル ネットワークにも一般化できることに注意してください。