SoftMax¶
-
NeuralNetwork.
SoftMax
(last_delta_y_dt, last_y, batch_Y, exp_work, range_len, batch_idx)¶ 損失関数の微分
引数: - last_delta_y_dt (float[]) – 最後のレイヤーのδy
- last_y (float[]) – 最後のレイヤーのy
- batch_Y (float[]) – 正解の出力
- exp_work (float[]) – 作業用データ
- range_len (int) – 出力の次元
- batch_idx (int) – ミニバッチ内のインデックス
ソース¶
SoftMax(last_delta_y_dt, last_y, batch_Y, exp_work, range_len, batch_idx) {
var cost_sum = 0;
// last_yの最大値を探す。
var max_val = -10000;
for (var i = 0; i < range_len; i++) {
var k = batch_idx * range_len + i;
if (max_val < last_y[k]) {
max_val = last_y[k];
}
}
var sum = 0;
for (var i = 0; i < range_len; i++) {
var k = batch_idx * range_len + i;
var d = Math.exp(last_y[k] - max_val);
if(! isFinite (d) || d <= 0){
d = 0.0000001;
}
sum += d;
exp_work[i] = d;
}
for (var i = 0; i < range_len; i++) {
var k = batch_idx * range_len + i;
var y = exp_work[i] / sum;
last_delta_y_dt[k] = y - batch_Y[k];
var log_y = Math.log(y);
if(! isFinite (log_y)){
continue;
}
cost_sum += (batch_Y[k] * log_y);
if(! isFinite(cost_sum)){
Assert(false);
}
}
return - cost_sum;
}