Caffe の使用方法を見つけようとしています。そのために、別の.prototxt
ファイルはexamplesフォルダーにあります。理解できないオプションが1つあります。
# The learning rate policy
lr_policy: "inv"
可能な値は次のとおりです。
"fixed"
"inv"
"step"
"multistep"
"stepearly"
"poly"
誰かがそれらのオプションを説明してもらえますか?
/caffe-master/src/caffe/proto/caffe.proto
ファイルの内部を見ると(オンラインで見つけることができます ここ )、次の説明が表示されます。
// The learning rate decay policy. The currently implemented learning rate
// policies are as follows:
// - fixed: always return base_lr.
// - step: return base_lr * gamma ^ (floor(iter / step))
// - exp: return base_lr * gamma ^ iter
// - inv: return base_lr * (1 + gamma * iter) ^ (- power)
// - multistep: similar to step but it allows non uniform steps defined by
// stepvalue
// - poly: the effective learning rate follows a polynomial decay, to be
// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
// - sigmoid: the effective learning rate follows a sigmod decay
// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
//
// where base_lr, max_iter, gamma, step, stepvalue and power are defined
// in the solver parameter protocol buffer, and iter is the current iteration.
最適化/学習プロセスが進行するにつれて、学習率(lr)を低下させるのが一般的な方法です。ただし、反復数の関数として学習率をどの程度正確に下げる必要があるかは明確ではありません。
[〜#〜] digits [〜#〜] をCaffeへのインターフェースとして使用すると、さまざまな選択が学習率にどのように影響するかを視覚的に確認できます。
fixed:学習プロセス全体を通して学習率は固定されたままです。
inv:学習率は〜1/T
step:学習率は区分的に一定であり、X反復ごとにドロップします
multistep:任意の間隔で区分的に一定
関数で学習率がどのように計算されるかを正確に見ることができます SGDSolver<Dtype>::GetLearningRate
(solvers/sgd_solver.cpp行〜30)。
最近、私は学習率の調整に対する興味深くかつ型破りなアプローチに出会いました: レスリーN.スミスの作品「これ以上厄介な学習率推測ゲーム」 。彼のレポートでは、レスリーはlr_policy
学習率の減少と増加を交互に繰り返します。彼の研究は、Caffeでこのポリシーを実装する方法も提案しています。