現在、MATLAB でロジスティック損失関数を含む機械学習アルゴリズムを実装しようとしています。残念ながら、数値のオーバーフローが原因で問題が発生しています。
一般に、特定の入力に対してs
、ロジスティック関数の値は次のようになります。
log(1 + exp(s))
ロジスティック損失関数の傾きは次のとおりです。
exp(s)./(1 + exp(s)) = 1./(1 + exp(-s))
私のアルゴリズムでは、 の値はs = X*beta
. これは、データ ポイントとデータ ポイントごとの特徴 (つまり) を含むX
行列で、は各特徴の係数のベクトルであり、となります。N
P
size(X)=[N,P]
beta
P
size(beta)=[P 1]
の与えられた値に対するロジスティック関数の平均値と勾配を計算することに特に興味がありbeta
ます。
の値に対するロジスティック関数の平均値beta
は次のとおりです。
L = 1/N * sum(log(1+exp(X*beta)),1)
の値に対するロジスティック関数の勾配の平均値b
は次のとおりです。
dL = 1/N * sum((exp(X*beta)./(1+exp(X*beta))' X, 1)'
ご了承くださいsize(dL) = [P 1].
私の問題は、これらの式が数値オーバーフローを生成し続けることです。問題は事実上、exp(s)=Inf
いつs>1000
、exp(s)=0
いつ、という事実から生じます。s<-1000.
s
浮動小数点演算で任意の値を取ることができるソリューションを探しています。理想的には、ベクトル化された/効率的な方法で値と勾配を評価できるソリューションも本当にありがたいです。