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乗の割合で学習率を減衰させていく.