損失関数
メニューを表示するにはスワイプしてください
ニューラルネットワークの学習においては、モデルが正しい結果をどれだけ正確に予測できているかを測定する必要があります。これには損失関数を用い、モデルの予測値と実際の目標値との違いを計算します。学習の目的は、この損失を最小化し、予測値を真の出力にできるだけ近づけることです。
二値分類タスクでは、最も広く使用されている損失関数の一つがクロスエントロピー損失であり、確率を出力するモデルに特に効果的です。
クロスエントロピー損失の導出
クロスエントロピー損失を理解するために、最尤原理を考えます。二値分類問題では、与えられた入力がクラス1に属する確率 y^ を推定するモデルを学習することが目標です。真のラベル y は0または1のいずれかの値を取ります。
効果的なモデルは、正しい予測に高い確率を割り当てるべきです。この考え方は尤度関数によって形式化され、これはモデルの予測に基づいて実際のデータが観測される確率を表します。
単一の訓練サンプルについて独立性を仮定すると、尤度は次のように表されます:
P(y∣x)=y^y(1−y^)1−yこの式は次のことを意味します:
- y=1 の場合、P(y∣x)=y^ — モデルはクラス1に高い確率を割り当てるべきです;
- y=0 の場合、P(y∣x)=1−y^ — モデルはクラス0に高い確率を割り当てるべきです。
いずれの場合も、モデルが正しいクラスに割り当てる確率を最大化することが目的です。
P(y∣x) は、入力 x が与えられたときに実際のクラスラベル y を観測する確率を意味します。
最適化を簡単にするために、尤度関数の代わりに対数尤度が使用されます。対数を取ることで積が和に変換され、微分が容易になります。
logP(y∣x)=ylog(y^)+(1−y)log(1−y^)学習では対数尤度を最大化することが目的となるため、最適化を最小化問題に変換するために損失関数はその負の値として定義されます。
L=−(ylog(y^)+(1−y)log(1−y^))これはバイナリクロスエントロピー損失関数であり、分類問題で一般的に使用されます。
output変数が特定の訓練サンプルに対するy^を表し、target変数がこの訓練サンプルに対するyを表す場合、この損失関数は次のように実装できます:
import numpy as np
loss = -(target * np.log(output) + (1 - target) * np.log(1 - output))
なぜこの式なのか?
クロスエントロピー損失には明確な直感的な解釈があります:
- y=1の場合、損失は−log(y^)となり、y^が1に近いと損失は小さく、0に近いと非常に大きくなります。
- y=0の場合、損失は−log(1−y^)となり、y^が0に近いと損失は小さく、1に近いと非常に大きくなります。
対数関数は入力がゼロに近づくと負の無限大に発散するため、誤った予測には大きなペナルティが与えられ、モデルが自信を持って正しい予測を行うよう促します。
複数のサンプルが順伝播時に渡された場合、合計損失は全サンプルの平均損失として計算されます:
L=−N1i=1∑N(yilog(y^i)+(1−yi)log(1−y^i))ここで、Nは訓練サンプル数です。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください