学習率とは
Learning Rate
勾配降下法においてパラメータを1回の更新でどれだけ動かすかを決めるハイパーパラメータ
ひとことで言うと
AIが一歩ごとにどれくらい大きく答えを調整するかを決める、学習のペースを示す数値。
概要
学習率は、勾配降下法でパラメータを更新する際に、計算された勾配に掛け合わせる係数で、1回の更新でパラメータをどれだけ大きく動かすかを制御するハイパーパラメータ。 学習率が大きすぎると、損失を最小化する方向を飛び越えてしまい学習が発散したり不安定になったりする一方、小さすぎると収束までに非常に多くの更新回数(学習時間)が必要になる。 学習の進行に応じて学習率を徐々に小さくする学習率スケジューリングや、パラメータごとに実質的な学習率を自動調整するAdamなどの適応的最適化アルゴリズムが広く使われ、手動でのチューニング負担を軽減している。 大規模言語モデルの事前学習では、学習初期に学習率を徐々に上げるウォームアップと、その後緩やかに下げるスケジュールを組み合わせるのが一般的。
背景
勾配降下法は勾配の大きさと方向だけを教えてくれるが、実際にどれだけパラメータを動かすかは別途決める必要がある。 学習率はこの更新幅を制御し、学習の速度と安定性のトレードオフを直接左右する最も重要なハイパーパラメータの1つとされる。
歴史
勾配降下法の一部として、19世紀のCauchyによる最急降下法や1950年代のRobbins-Monroによる確率的近似法の時点から、更新幅を制御するパラメータとして存在していた。 1986年の誤差逆伝播法の普及によりニューラルネットワークの学習で重要なハイパーパラメータとして注目され、2014年のAdamオプティマイザ以降は学習率を自動的に調整する適応的最適化アルゴリズムが標準的に使われるようになった。
コード例
PyTorchでの学習率とスケジューラ
import torch
model = torch.nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)
for epoch in range(30):
optimizer.step()
scheduler.step()
if epoch % 10 == 0:
print(optimizer.param_groups[0]["lr"]) # 10エポックごとに半減利点
- 適切に設定すれば、少ない更新回数で効率的に損失を減らせる
- スケジューリングや適応的最適化アルゴリズムと組み合わせることで、学習の安定性と速度を両立しやすい
- 多くのフレームワークで学習率の探索・調整を自動化するツールが整備されている
欠点
- 設定を誤ると発散(大きすぎる場合)や極端に遅い収束(小さすぎる場合)を招く
- モデルやデータセットごとに最適な値が異なり、経験的な探索が必要になることが多い
- パラメータ全体に同じ学習率を使う単純な手法では、パラメータごとに異なる勾配のスケールへ対応しにくい
比較
関連用語
よくある質問
学習率が大きすぎるとどうなる?
パラメータの更新幅が大きくなりすぎ、損失を最小化する点を飛び越えて損失がかえって増加したり、学習が発散したりする。
学習率スケジューリングとは?
学習の進行度に応じて学習率を変化させる手法。学習初期は小さい学習率から始めて徐々に上げるウォームアップの後、緩やかに下げていく方式などがよく使われる。