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;
}