一般に勾配ブースティングやニューラルネット等の一部の機械学習アルゴリズムにおいては、学習率 (learning rate) というハイパーパラメータを訓練前に設定する必要があります。
一方、勾配ブースティングの実装の一つであるCatBoostでは、デフォルトでは、学習率として特定の値が設定されておらず、場合によっては自動的に決定される旨がドキュメントに記載されています。
学習率の自動決定は、現時点ではlightGBMやXGBoostには未実装の機能であり、CatBoostにおいて具体的にどのような仕組みでこれが実現されているのか興味があったので、調査しました。
結果
自動決定されない場合について
下記に引用した公式ドキュメントの該当部分を読めば分かることですが、誤解のないように明記しておくと、すべての場合で学習率が自動決定されるわけではありません。
The default value is defined automatically for Logloss, MultiClass and RMSE loss functions depending on the number of iterations if none of parameters leaf_estimation_iterations, leaf_estimation_method, l2_leaf_reg is set. In this case, the selected learning rate is printed to stdout and saved in the model.
In other cases, the default value is 0.03.
(引用元: https://catboost.ai/docs/en/references/training-parameters/common)
日本語で整理すると、自動決定機構が動作するのは、下記の2条件を両方とも満たすときだけということになります。:
- 損失関数がLogloss、MultiClass、RMSEのどれかに設定されていること
- ハイパーパラメータとして、leaf_estimation_iterations、leaf_estimation_method、l2_leaf_regのどれも設定されていないこと
自動決定されない場合の学習率のデフォルト値は0.03です。
自動決定の仕組み
自動決定のロジックの主要な部分は、下記のファイルのGetLearningRate関数に書かれていました。もっと言うと、この関数のreturn文から読むのが分かりやすいと思います。
基本的には、データサイズで決まるdefaultLearningRateは、イテレーション数が1000のときに最適と期待される学習率で、これに実際に設定されているイテレーション数に応じた倍率を掛け算して調整するという手順です。ただし、学習率は最大でも0.5を超えないように上限が設定されています。
また、defaultLearningRateはデータサイズの関数、customIterationConstantとdefaultIterationConstantはイテレーション数の関数として計算されているものの、各計算式の係数・定数は、損失関数の種類等のハイパーパラメータの組み合わせごとに、異なる値が参照される仕組みになっています。
この係数・定数は、ハードコーディングされているため、どのようにして算出されたものかは定かではありませんが、ハイパーパラメータのセットごとにさまざまなデータサイズとイテレーション数で実際にモデルを訓練し、最適な学習率を目的変数とした回帰で求めた数値と想像します。
結論と考察
自動決定が有効になるケースでは、学習率はデータサイズとイテレーション数に応じて所定の計算式で決定されます。このとき使われる計算式の係数・定数は、いくつかのハイパーパラメータに応じて、予め用意された数値が使われます。
学習率の決定に使われる計算式は、対数や指数に目をつぶればデータサイズやイテレーション数の一次関数であり、学習率との間にシンプルな関係を想定しています。係数・定数は再計算する必要があるとは思いますが、CatBoost以外の勾配ブースティングやニューラルネットのモデルを訓練する場合にも、このような式を使うことで無難な学習率を推定することができるかもしれません。
また、学習率以外のハイパーパラメータの設定によっては、自動決定がoffになって学習率が0.03となってしまうことには留意が必要です。自動決定のon/offに影響を与えるハイパーパラメータを探索する場合には、自動決定のon/offで学習率が不連続に変化することを避けるために、学習率を明示的に設定して自動決定はoffとした方が良さそうです。