Darknetの設定中の"policy"

cfgファイルの中にpolicyというのがあって,よくわからなかったので調べてみた.
policyは学習率を決定するパラメータらしい.
darknetのnetwork.cを読むと,以下のようになっている.

switch (net->policy) {
    case CONSTANT:
        return net->learning_rate;
    case STEP:
        return net->learning_rate * pow(net->scale, batch_num/net->step);
    case STEPS:
        rate = net->learning_rate;
        for(i = 0; i < net->num_steps; ++i){
            if(net->steps[i] > batch_num) return rate;
            rate *= net->scales[i];
        }
        return rate;
    case EXP:
        return net->learning_rate * pow(net->gamma, batch_num);
    case POLY:
        return net->learning_rate * pow(1 - (float)batch_num / net->max_batches, net->power);
    case RANDOM:
        return net->learning_rate * pow(rand_uniform(0,1), net->power);
    case SIG:
        return net->learning_rate * (1./(1.+exp(net->gamma*(batch_num - net->step))));
    default:
        fprintf(stderr, "Policy is weird!\n");
        return net->learning_rate;
}

何も指定しないと,学習率は一定.
これはconstantを指定したときと同じ挙動.
stepの場合,scaleパラメータで指定した値のbatch_num/net->step乗の割合で学習率を減衰させていく.

コメントする