SoftMax ============== .. js:function:: NeuralNetwork.SoftMax(last_delta_y_dt, last_y, batch_Y, exp_work, range_len, batch_idx) 損失関数の微分 :param float[] last_delta_y_dt: 最後のレイヤーのδy :param float[] last_y: 最後のレイヤーのy :param float[] batch_Y: 正解の出力 :param float[] exp_work: 作業用データ :param int range_len: 出力の次元 :param int batch_idx: ミニバッチ内のインデックス ソース ^^^^^^ .. code-block:: js 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; }