Learning rate๋ backpropagation ๊ณผ์ ์์ ๋ชจ๋ธ์ weight์ธ gradient์ ๋ณํ(์
๋ฐ์ดํธ์ ๋ณดํญ step-size)์ด๋ค.
์ญ์ ํ ๊ณผ์ ์์ ๋ชจ๋ธ์ ๊ฐ์ค์น(Weight)๋ ์์ค ํจ์์ ์ค๋ฅ ์ถ์ ์น๋ฅผ ์ค์ด๊ธฐ ์ํด ์
๋ฐ์ดํธ๋๋ค.
ํ์ต๋ฅ * ์ถ์ ๊ฐ์ค์น ์ค๋ฅ(๊ฐ์ค์น์ ๋ํ ๊ธฐ์ธ๊ธฐ or ์ ์ฒด ์ค๋ฅ ๋ณํ) >>>> Weight ์
๋ฐ์ดํธ
Learning rate๋ Optimizer๊ฐ Loss function์ ์ต์๊ฐ์ ๋๋ฌํ๋๋ก ๋ง๋๋ ๋ณํ์ ํฌ๊ธฐ๋ฅผ ์ ์ดํ๋ค.
์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋ ์์์ธ learning rate๋ฅผ ์๋ชป ์ค์ ํ๋ฉด ์์ ํ์ต์ด ์๋ ์๋ ์๋ค.
๊ทธ๋์ ๋ชจ๋ธ ํ์ต์์๋ learning rate๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ ์ง๊ฐ ๋งค์ฐ ์ค์ํ ์์์ด๋ค.
ํ์ต๋ฅ ์ด ํฌ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฅด๊ฒ ํ์ตํจ.
but ์๊ณ ๋ฆฌ์ฆ์ด ์ต์๊ฐ์ผ๋ก ๊ฐ์ง์๊ณ ์๋ค๊ฐ๋คํ๊ฑฐ๋ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๋ฐ์ด๋์ ์๋ ์์.
+ ๊ฐ์ค์น ์
๋ฐ์ดํธํ๋ ์์ค์ด ์ปค์ ๊ฐ์ค์น๊ฐ overflow ๋ ์๋ ์์ต๋๋ค.
ํ์ต๋ฅ ์ด ๋ฎ์ผ๋ฉด ๊ฐ์ค์น ์ ๋ฐ์ดํธ๊ฐ ์์์ ์ตํฐ๋ง์ด์ ๊ฐ ์ต์๊ฐ์ ํฅํด ์ฒ์ฒํ ์์ง์.
= ์ตํฐ๋ง์ด์ ๊ฐ ์๋ ดํ๋ ๋ฐ ๋๋ฌด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ ์ฒด ์ํ ๋๋ ๊ธ๋ก๋ฒ ์ต์๊ฐ์ด ์๋ ๋ก์ปฌ ์ต์๊ฐ์ ๊ฐํ ์ ์์.
ํ์ต๋ฅ ์ ์ ์ค์ ํ ์๋ง ์๋ค๋ฉด ์ฑ๋ฅ ๋๋ฐ๋จ.
์๊ณ ๋ฆฌ์ฆ์ด ๋น ๋ฅด๊ฒ ์๋ ด ๊ฐ๋ฅํ ์ ์์.
์๊ณ ๋ฆฌ์ฆ์ด ๊ธ๋ก๋ฒ ์ต์๊ฐ์ ๋๋ฌํ์ง ์๊ณ ์๋ค๋ก ์ ํํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ฌ.
๊ทผ๋ฐ ์ด ํ์ต๋ฅ ์ ์ ํํ๊ฒ ์ฐ๊ธฐ๊ฐ ์ด๋ ค์. ๋ ธ๊ฐ๋ค์.
์ ์ ํ ํ์ต๋ฅ ์ ์ฐพ๋ ์ด๋ก ์ ์ธ ์๋ฆฌ๋ ๊ฐ๋จํ์ง๋ง, ๋๋ฌด ํฌ์ง๋ ์๊ณ ๋๋ฌด ์์ง๋ ์๋, ์ ๋ง ๋ฑ ๋ง๋ ํ์ต๋ฅ ์ ์ฐพ๋ ๊ฒ์ ์ด๋ ค์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฒ >>> "Learning rate schedule"
๋ชจ๋ธ ํ์ต ๊ณผ์ ์์ ์ฒ์๋ถํฐ ๋๊น์ง ๋๊ฐ์ learning rate๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, ํ์ต๊ณผ์ ์์ learning rate๋ฅผ ์กฐ์ ํ๋ learning rate scheduler๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ข์ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์์.
์ฒ์์ ํฐ learning rate(๋ณดํญ)์ผ๋ก ๋น ๋ฅด๊ฒ optimize๋ฅผ ํ๊ณ , ์ต์ ๊ฐ์ ๊ฐ๊น์์ง์๋ก learning rate(๋ณดํญ)๋ฅผ ์ค์ฌ ๋ฏธ์ธ์กฐ์ ์ ํ๋ ๊ฒ์ด ํ์ต์ด ์๋๋ค๊ณ ์๋ ค์ ธ์์.
learning rate๋ฅผ ๊ทธ๋ฅ ์ญ decay(๊ฐ์ )ํ๋ ๋ฐฉ๋ฒ ๋ง๊ณ , learning rate๋ฅผ ์ค์๋ค ๋๋ ธ๋ค ํ๋ ๊ฒ์ด ๋ ์ฑ๋ฅํฅ์์ ๋์์ด ๋๋ค๋ ์ฐ๊ตฌ๊ฒฐ๊ณผ๊ฐ ์์.
Learning rate schedule = ํ์ต์ด ์งํ๋จ์ ๋ฐ๋ผ epoch or iteration ๊ฐ์ ํ์ต๋ฅ ์ ์กฐ์ ํ๋ ์ฌ์ ์ ์๋ ํ๋ ์์ํฌ.
Learning rate schedule์ ๋ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ ๊ฐ์ง ๊ธฐ์
- ์ผ์ ํ Learning rate:
ํ์ต๋ฅ ์ ์ด๊ธฐํํ๊ณ ํ๋ จ ์ค์ ๋ณ๊ฒฝ X
- Learning rate ๊ฐ์:
์ด๊ธฐ ํ์ต๋ฅ ์ ์ ํํ ๋ค์ ์ค์ผ์ค๋ฌ์ ๋ฐ๋ผ ์ ์ฐจ์ ์ผ๋ก ๊ฐ์.
ํ๋ จ ์ด๊ธฐ์ ํ์ต๋ฅ > ์ถฉ๋ถํ ๊ด์ฐฎ์ ๊ฐ์ค์น์ ๋๋ฌํ๊ธฐ ์ํด ํฌ๊ฒ ์ค์ .
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ์ค์น๋ ์์ ํ์ต๋ฅ ์ ํ์ฉํ์ฌ ๋ ๋์ ์ ํ๋์ ๋๋ฌํ๋๋ก ๋ฏธ์ธ ์กฐ์ .
์ฆ, ์ ์ ์ค์ด๋๋๊ฑฐ.
๋ค๋ฅธ ์์
์์ ๋ชจ๋ธ ๋๋ฆด ๋ ๋ง๋ค, ์ํฉ๋ง๋ค ์กฐ๊ฑด์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ์ธ์ ํ์ต๋ฅ ์ ์ฆ๊ฐ๋ฅผ ๊ท์ (Learning Rate Decay)ํด์ผ ํ๋ ์ง๋ฅผ ํ์คํ ์๋ ๊ฒ์ ์ฝ์ง ์์ ์ ์์.
Learning Rate๊ฐ ๋์ผ๋ฉด, loss ๊ฐ์ ๋น ๋ฅด๊ฒ ๋ด๋ฆด ์๋ ์์ง๋ง, ์ต์ ์ ํ์ต์ ๋ฒ์ด๋๊ฒ ๋ง๋ค๊ณ ,
Learning Rate๊ฐ ๋ฎ์ผ๋ฉด, ์ต์ ์ ํ์ต์ ํ ์ ์์ง๋ง ๊ทธ ๋จ๊ณ๊น์ง ๋๋ฌด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋.
๋ฐ๋ผ์, ์ฒ์ ๋ชจ๋ธ ๋๋ฆด ๋ Learning Rate ๊ฐ์ ํฌ๊ฒ ์ค ๋ค์, ์ผ์ epoch ๋ง๋ค ๊ฐ์ ๊ฐ์์์ผ์ ์ต์ ์ ํ์ต๊น์ง ๋ ๋น ๋ฅด๊ฒ ๋๋ฌํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ Learning Rate Decay๋ผ๊ณ ๋งํจ.
Step Decay > Learning Rate Decay๋ฅผ ํน์ epoch๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ๊ณ๋ณ๋ก learning rate์ ๊ฐ์์ํค๋ ๊ฒ์.
ํน์ epoch ๊ตฌ๊ฐ(step) ๋ง๋ค ์ผ์ ํ ๋น์จ๋ก ๊ฐ์ ์์ผ์ฃผ๋ ๋ฐฉ๋ฒ์ Step Decay๋ผ๊ณ ๋ถ๋ฆ.
์ค์ ๋ก ํ์ต๋ฅ ์ ์กฐ์ ํ๋๋ฐ ์์ด ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด Step Decay์.
์์๊ฐ์ ๋น์จ๊ณผ Epoch ๋จ์๋ง์ผ๋ก ํ์ต๋ฅ ์ ์กฐ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๋ณต์กํ ์ฐ์ฐ์ ์ดํด๋ฅผ ์๊ตฌํ์ง ์์ผ๋ฏ๋ก ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์.
๊ทผ๋ฐ, Step Decay๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด๋ณด๋ค ์๊ฐํด์ผํ๋ Hyper Parameter๊ฐ ๋์ด๋๋ ์ธํ ํด์ผํ๋ ๊ฐ๋ค์ด ์ฆ๊ฐํ๊ณ ์ธํ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ ๋ง์ด ์๊ฒจ์, ๋น์ ์ฌ๋๋ค์ Hyper Parameter๋ฅผ ์กฐ๊ธ ๋ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ๊ฒ ๋์์.
๊ทธ๋ ๊ฒํด์ ๋์จ ์ฐ์์ ์ธ ๋ฐฉ๋ฒ์ด Cosine Decay.
Cosine Decay์ loss ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด Step Decay์๋ ๋ฌ๋ฆฌ ์์ ์ ์ผ๋ก ๋๊น์์ด loss๊ฐ ๊ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์.
Hyper Paremeters๋ฅผ ์ข ๋ ์ฌ์ฉํ๊ณ learning rate๋ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๋ Cosine Decay๋ฅผ Learning Rate Decay๋ก ์ข ๋ ๊ณ ๋ ค๋ฅผ ๋ง์ด ํ๋ค๊ณ ํจ.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก Linear Decay, Inverse Sqrt(Inverse Square Root) Decay ๋ฑ์ด ์์.
from transformers import get_cosine_schedule_with_warmup
from transformers import AdamW
# ์ตํฐ๋ง์ด์ ์ค์
optimizer = AdamW(
model.parameters(),
lr = 1e-5, # ํ์ต๋ฅ
eps = 1e-8 # 0์ผ๋ก ๋๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ epsilon ๊ฐ,
)
epochs = 3
# ์ด ํ๋ จ ์คํ
total_steps = len(train_dataloader) * epochs
# Learning rate decay๋ฅผ ์ํ ์ค์ผ์ค๋ฌ
scheduler = get_cosine_schedule_with_warmup(
optimizer,
warmup_steps=5,
base_lr=0.3,
final_lr=0.01
)
ex)
Optimizer = AdamW
Epoch= 3
์ด ํ์ต ๋จ๊ณ ์ = ( ํน์ ํ batch๋ก ๋๋์ด์ง ๋ฐ์ดํฐ์ ์ batch ์ * epoch )
Scheduler์ ์ด๋ฅผ ํ์ฉํ์ฌ ์ด ํ์ต ๋จ๊ณ ์(num_training_steps)๋ฅผ ์ ์ํด์ค.
num_warmup_steps๋ ํ์ฉํ์ง ์์ 0์ผ๋ก ์ค์ ์ด ๋์ด์์.
์ด๋ ๊ฒ ํด์ ์ ํด์ง ํ์ต๋ฅ (lr)์ด, ๋งค ํ์ต ๋จ๊ณ๋ง๋ค ์ ์ด๋๋ฉฐ, Step Decay๋ฅผ ํ์ฉํ ํ์ต๋ฅ Scheduling์ ์ ์ฉํ๊ฒ ๋.
LambdaLR
Lambda ํํ์์ผ๋ก ์์ฑํ ํจ์๋ฅผ ํตํด learning rate๋ฅผ ์กฐ์ .
์ด๊ธฐ learning rate์ lambdaํจ์์์ ๋์จ ๊ฐ์ ๊ณฑํด์ค์ learning rate๋ฅผ ๊ณ์ฐ
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.LambdaLR(optimizer=optimizer,
lr_lambda=lambda epoch: 0.95 ** epoch)
MultiplicativeLR
LambdaLR๋ ๋๊ฐ์
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer=optimizer,
lr_lambda=lambda epoch: 0.95 ** epoch)
StepLR
step size๋ง๋ค gamma ๋น์จ๋ก lr์ ๊ฐ์์ํด. (step_size ๋ง๋ค gamma๋ฅผ ๊ณฑํจ)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)
MultiStepLR
step size๊ฐ ์๋๋ผ learning rate๋ฅผ ๊ฐ์์ํฌ epoch์ ์ง์ ํด์ค.
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.5)
ReduceLROnPlateau
์ฑ๋ฅ์ด ํฅ์์ด ์์ ๋ learning rate๋ฅผ ๊ฐ์์ํด.
validation loss๋ metric(ํ๊ฐ ์งํ)์ learning rate stepํจ์์ input์ผ๋ก ๋ฃ์ด์ฃผ์ด์ผ ํจ.
๊ทธ๋์ metric์ด ํฅ์๋์ง ์์ ๋, patienceํ์(epoch)๋งํผ ๋๊ธฐํ๋ค๊ฐ, ๊ทธ ์ดํ์๋ learning rate๋ฅผ ์ค์.
optimizer์ momentum์ ์ค์ ํด์ผ ์ฌ์ฉํ ์ ์๋ค.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'min') # min์ metric์ด ๊ฐ์๋ฅผ ๋ฉ์ถ ๋/ max๋ metric์ด ์ฆ๊ฐ๋ฅผ ๋ฉ์ถ ๋
for epoch in range(100):
train(...)
val_loss = validate(...)
# Note that step should be called after validate()
scheduler.step(val_loss)
#patience: metric์ด ํฅ์ ์๋ ๋, ๋ช epoch์ ์ฐธ์ ๊ฒ์ธ๊ฐ?
#threshold: ์๋ก์ด optimum์ด ๋ ์ ์๋ threshold (์ผ๋ง ์ฐจ์ด๋๋ฉด optimum update๋์๋ค๊ณ ๋ณผ ์ ์๋?)
#threshold_mode: dynamic threshold๋ฅผ ์ค์ ํ ์ ์๋ค. 'rel' ์ด๋ 'abs' ์ค ํ๋์ ๋ชจ๋๋ก ์ค์ ํ๋ค. 'rel'๋ชจ๋์ด๋ฉด min์ผ ๋, best(1-threshold) max์ผ ๋, best(1+threshold)/ 'abs'๋ชจ๋์ด๋ฉด best+threshold
#cool_down: lr์ด ๊ฐ์ํ ํ ๋ช epoch๋์ lr scheduler๋์์ ์ด์ง
#min_lr: ์ต์ lr
#eps: ์ค์ด๊ธฐ ์ , ์ค์ธ ํ lr์ ์ฐจ์ด๊ฐ eps๋ณด๋ค ์์ผ๋ฉด ๋ฌด์ํ๋ค.
get_cosine_schedule_with_warmup
0 ~ ์ตํฐ๋ง์ด์ ์ ์ค์ ํ ์ด๊ธฐ ํ์ต๋ฅ
์ด ์ฌ์ด์์ ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ ์๋ฐ์ ๊ธฐ๊ฐ ํ์ ์ตํฐ๋ง์ด์ ์์ 0์ผ๋ก ์ค์ ๋ ์ด๊ธฐ lr ์ฌ์ด์ ์ฝ์ฌ์ธ ํจ์ ๊ฐ์ ๋ฐ๋ผ ๊ฐ์ํ๋ ํ์ต๋ฅ ๋ก ์ค์ผ์ค์ ์์ฑ.
total_samples = 968
bs = 32
n_epochs = 10
num_warmup_steps = (total_samples // bs) * 2
num_total_steps = (total_samples // bs) * n_epochs
model = nn.Linear(2, 1)
optimizer = optim.SGD(model.parameters(), lr=0.01)
scheduler = transformers.get_cosine_schedule_with_warmup(optimizer,
num_warmup_steps=num_warmup_steps,
num_training_steps=num_total_steps)
lrs = []
for i in range(num_total_steps):
optimizer.step()
lrs.append(optimizer.param_groups[0]["lr"])
scheduler.step()
https://i0.wp.com/neptune.ai/wp-content/uploads/Learning-rate-scheduler.png?resize=1024%2C384&ssl=1
https://wikidocs.net/157282