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