Pytorch 의 학습 율 감소 및 그 용법 에 대한 상세 한 설명

Pytorch 학습 율 감소 및 용법
학 습 률 감 소 는 매우 효과 적 인 연단 기법 중 하나 로 신경 망 의 훈련 과정 에서 accuracy 가 진동 하거나 loss 가 더 이상 떨 어 지지 않 을 때 적당 한 학 습 률 감 소 를 하 는 것 은 효과 적 인 수단 으로 accuracy 를 뚜렷하게 향상 시 킬 수 있다.
Pytorch 에는 두 가지 학 습 률 조정(감쇠)방법 이 있 습 니 다.
라 이브 러 리 함수 로 조정 하기;
수 동 조정.
1.라 이브 러 리 함 수 를 사용 하여 조정:
Pytorch 학 습 률 조정 전략 torch.optim.lrsheduler 인터페이스 구현.pytorch 가 제공 하 는 학습 율 조정 전략 은 세 가지 로 나 뉘 는데 그것 이 바로:
(1)질서 있 는 조정:등 간격 조정(Step),다 중 간격 조정(MultiStep),지수 감쇠(Exponential),코사인 소 둔(CosineAnnealing);
(2)자가 적응 조정:훈련 상황 에 따라 기 회 를 엿 보고 특정한 지표의 변화 상황(loss,accuracy)을 감 측 함으로써 이 기준 이 별로 변화 하지 않 을 때 학습 율 을 조정 하 는 시기(ReduceLRON Plateau)이다.
(3)사용자 정의 조정:epoch 에 대한 lambda 함 수 를 사용자 정의 하여 학 습 률(LambdaLR)을 조정 합 니 다.
모든 epoch 의 훈련 에서 scheduler.step()문 구 를 사용 하여 학습 율 을 업데이트 합 니 다.이 방법 은 optimizer.step()업데이트 모델 파라미터,즉 한 번 epoch 가 scheduler.step()에 대응 하 는 것 과 유사 합 니 다.그러나 미니-batch 훈련 에 서 는 미니-bitch 마다 optimizer.step()에 대응 합 니 다.즉 용법 은 다음 과 같다.

optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
 
def train(...):
    for i, data in enumerate(train_loader):
        ......
        y_ = model(x)
        loss = criterion(y_,y)
        loss.backward()
        optimizer.step()
        ......
 
for epoch in range(epochs):
    scheduler.step()
    train(...)
    test(...)
(1)등 간격 조정 학 습 률 StepLR

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
매 조련 stepsize 개 epoch,학 습 률 lr=lr*gamma 로 조정.
다음 내용 에 서 는 epoch 와 step 를 대등 하 게 합 니 다.epoch 마다 scheduler.step()만 진행 되 기 때문에 이 step 는 scheduler.step()의 step,즉 step 를 말 합 니 다.size 는 scheduler.step()가 진행 하 는 횟수 를 가리킨다.
인자:
optimizer:신경 망 훈련 에 사용 되 는 최적화 기,예 를 들 어 optimizer=torch.optim.SGD(...)
step_size(int):학습 율 하락 간격 수,단 위 는 epoch 이지 iteration 이 아 닙 니 다.
gamma(float):학습 율 조정 배수,기본 값 0.1
last_epoch(int):이전 epoch 수 입 니 다.이 변 수 는 학습 율 을 조정 해 야 하 는 지 여 부 를 표시 합 니 다.lastepoch 가 설 정 된 간격 에 부합 할 때 학습 율 을 조정 합 니 다.-1 일 때 학습 율 을 초기 값 으로 설정 합 니 다.
(2)다 중 간격 조정 학 습 률 MultiStepLR
(1)과 유사 하지만 학습 율 조정의 간격 은 같 지 않 습 니 다.예 를 들 어 epoch=10 시 에 한 번 조정 하고 epoch=30 시 에 한 번 조정 하 며 epoch=80 시 에 한 번 조정 합 니 다.

torch.optim.lr_sheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
인자:
milestone(list):하나의 목록 매개 변 수 는 여러 학습 율 을 조정 해 야 하 는 epoch 값 을 나타 낸다.예 를 들 어 milestones=[10,30,80].
다른 매개 변 수 는 같 습 니 다(1).
(3)지수 감쇠 조정 학 습 률 ExponentialLR
학습 율 은 지수 형 감 소 를 나타 내 고 매 훈련 마다 epoch,lr=lrgamma*epoch,즉

torch.optim.lr_sheduler.ExponentialLR(optimizer, gamma, last_epoch)
인자:
gamma(float):학습 율 조정 배수 의 밑 수,지 수 는 epoch 이 고 초기 값 은 lr 이 며 배 수 는?
기타 매개 변 수 는 같 습 니 다.
(4)여현 퇴화 함수 학 습 률 조정:
학 습 률 은 코사인 함수 형 으로 감소 하고 2*Tmax 는 여현 함수 주기 이 고 epoch=0 은 여현 형 학 습 률 조정 곡선 에 대응 하 는 epoch=Tmax 코사인 학 습 률 조정 곡선 에 대응 하 는 etamin 곳,epoch>T 에 따라max,학습 율 은 epoch 증가 에 따라 점점 상승 하고 전체 추 세 는 cos(x)와 같 습 니 다.

torch.optim.lr_sheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
인자:
T_max(int):학습 율 이 최소 치 로 떨 어 졌 을 때의 epoch 수,즉 epoch=Tmax 시 학습 율 이 코사인 함수 최소 치 로 떨 어 집 니 다.epoch>Tmax 시 학습 율 증가;
eta_min:학 습 률 조정의 최소 값,즉 epoch=Tmax 시,etamin,기본 값 0.
기타 매개 변 수 는 같 습 니 다.
(5)지표 에 따라 학 습 률 을 조정 하여 LRON Plateau 감소
어떤 지표(loss 또는 accuracy)가 최근 몇 개의 epoch 에서 변화 가 없 을 때(주어진 한도 값 을 초과 하거나 낮 출 때)학습 율 을 조정 합 니 다.
만약 에 검증 집의 loss 가 더 이상 떨 어 지지 않 는 다 면 학습 율 을 조정 합 니 다.또는 감사 검증 집의 정확성 이 더 이상 높 아 지지 않 을 때 학 습 률 을 조정 한다.

torch.optim.lr_sheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10,
 verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
인자:
mode(str):모델 선택 은 min 과 max 두 가지 모델 이 있 습 니 다.min 은 해당 기준 이 더 이상 낮 아 지지 않 는 다 고 표시 합 니 다(예 를 들 어 loss 모니터링).max 는 해당 기준 이 더 이상 높 아 지지 않 는 다 고 표시 합 니 다(예 를 들 어 모니터링 accuracy).
factor(float):학습 율 조정 배수,앞의 gamma 와 측정 기준 이 요구 에 달 할 때 lr=lr×factor。
patience(int):이 지표 가 몇 개의 epoch 변 하지 않 는 것 을 참 으 며 참 을 수 없 을 때 학습 율 을 조정 합 니 다.
verbose(bool):학 습 률 정 보 를 인쇄 할 지 여부,print('Epoch{:5d}group{}을{:.4e}.'format(epoch,i,newlr)이 정 보 를 인쇄 하지 않 는 기본 값 은 False 입 니 다.
threshold_mode(str):기준 이 가장 좋 은 모델 에 달 하 는 지 판단 하 는 두 가지 모델 이 있 습 니 다.rel 과 abs.
thresholdmode==rel,그리고 mode==max 시,dynamicthreshold = best * (1 + threshold);
thresholdmode==rel,그리고 mode==min 시,dynamicthreshold = best * (1 - threshold);
thresholdmode==abs,그리고 mode==max 시,dynamicthreshold = best + threshold;
thresholdmode==abs,그리고 mode==min 시,dynamicthreshold = best - threshold;
threshold(float):thresholdmode 사용.
cooldown(int):"냉각 시간"은 학습 율 을 조정 한 후에 학습 율 조정 전략 을 진정 시 키 고 모델 을 훈련 한 동안 훈련 시 킨 다음 에 모니터링 모델 을 다시 시작 합 니 다.
min_lr(float or list):학습 율 하한 선,float 또는 list 로 여러 매개 변수 그룹 이 있 을 때 list 로 설정 할 수 있 습 니 다.
eps(float):학습 율 이 감소 하 는 최소 치,학습 율 의 변화 치가 eps 보다 적 을 때 학습 율 을 조정 하지 않 습 니 다.

optimizer = torch.optim.SGD(model.parameters(), args.lr,
 momentum=args.momentum, weight_decay=args.weight_decay)
scheduler = ReducelROnPlateau(optimizer,'min')
for epoch in range( args.start epoch, args.epochs ):
    train(train_loader , model, criterion, optimizer, epoch )
    result_avg, loss_val = validate(val_loader, model, criterion, epoch)
    # Note that step should be called after validate()
    scheduler.step(loss_val )
(6)사용자 정의 학습 율 조정 LambdALR
서로 다른 매개 변수 그룹 에 서로 다른 학 습 률 조정 전략 을 설정 합 니 다.규칙 조정:

lr = base_lr * lambda(self.last_epoch)
fine-tune 에서 특히 유용 합 니 다.우 리 는 서로 다른 층 에 서로 다른 학습 율 을 설정 할 수 있 을 뿐만 아니 라 서로 다른 층 에 서로 다른 학습 율 조정 전략 도 설정 할 수 있 습 니 다.

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
인자:
lr_lambda(function or list):학습 율 조정 배 수 를 사용자 정의 로 계산 하 는 함수 입 니 다.보통 epoch 의 함수 입 니 다.여러 매개 변수 그룹 이 있 을 때 list 로 설정 합 니 다.
기타 매개 변 수 는 같 습 니 다.
예:

ignored_params = list(map(id, net.fc3.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params, net.parameters())
optimizer = optim.SGD([
        {'params': base_params},
        {'params': net.fc3.parameters(), 'lr': 0.001*100}], 0.001,          momentum=0.9,weight_decay=1e-4)
 # Assuming optimizer has two groups.
lambda1 = lambda epoch: epoch // 3
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()
    print('epoch: ', i, 'lr: ', scheduler.get_lr())
    
  :
epoch: 0 lr: [0.0, 0.1]
epoch: 1 lr: [0.0, 0.095]
epoch: 2 lr: [0.0, 0.09025]
epoch: 3 lr: [0.001, 0.0857375]
epoch: 4 lr: [0.001, 0.081450625]
epoch: 5 lr: [0.001, 0.07737809374999999]
epoch: 6 lr: [0.002, 0.07350918906249998]
epoch: 7 lr: [0.002, 0.06983372960937498]
epoch: 8 lr: [0.002, 0.06634204312890622]
epoch: 9 lr: [0.003, 0.0630249409724609]
                0  ?             。
                0.001, 
lambda1 = lambda epoch: epoch // 3,
  1   epoch  ,  lr = base_lr * lmbda(self.last_epoch),
    lr = 0.001 *(0//3) ,    1//3    0,         0。
            ,      ,    0.1, lr = 0.1 * 0.95^epoch , 
epoch   0  , lr=0.1 , epoch   1  , lr=0.1*0.95。

# -*- coding:utf-8 -*-
'''       pytorch       '''
__author__ = 'puxitong from UESTC'
 
import torch
import torch.optim as optim
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
import matplotlib.pyplot as plt 
 
model = AlexNet(num_classes=2)
optimizer = optim.SGD(params=model.parameters(), lr=0.1)
 
#         ,   step_size epoch,lr*gamma
# scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
 
#         ,    milestones  epoch,lr*gamma
# scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[10, 30, 80], gamma=0.1)
 
#        ,lr*gamma**epoch
# scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
 
#          ,T_max      ,lr          0           ,
#  epoch=T_max lr     , pi/2 ,         ,lr  
# scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=0)
 
plt.figure()
x = list(range(100))
y = []
for epoch in range(100):
    scheduler.step()
    y.append(scheduler.get_lr()[0])
 
plt.plot(x, y)
plt.show()
2.학습 율 수 동 조정:

def adjust_learning_rate(optimizer, epoch):
    """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
    lr = args.lr * (0.1 ** (epoch // 30))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

def adjust_learning_rate(epoch, lr):
    if epoch <= 81:  # 32k iterations
      return lr
    elif epoch <= 122:  # 48k iterations
      return lr/10
    else:
      return lr/100

for epoch in range(epochs):
    lr = adjust_learning_rate(optimizer, epoch)  #      
    optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.9, weight_decay=5e-4)
    ......
    optimizer.step()  #              
파 람 이 뭐야groups?
optimizer param 통과group 에서 매개 변수 그룹 을 관리 합 니 다.paramgroup 에 서 는 매개 변수 그룹 과 그 에 대응 하 는 학습 율,운동량 등 을 저장 합 니 다.따라서 우 리 는 param 을 변경 할 수 있 습 니 다.group[lr]의 값 으로 대응 하 는 매개 변수 그룹의 학습 율 을 변경 합 니 다.

#  1:   `param_group` ,len(optim.param_groups)==2
optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)
 
#  2:     
optim.SGD(model.parameters(), lr=1e-2, momentum=.9)
위의 첫 번 째 예 에서 우 리 는 각각 model.base 와 model.classifier 의 매개 변수 로 서로 다른 학습 율 을 설정 했다.즉,이때 optimizer.paramgrops 에는 두 개의 다른 param 이 있 습 니 다.group:

param_groups[0]: {'params': model.base.parameters()},
param_groups[1]: {'params': model.classifier.parameters(), 'lr': 1e-3}
매개 paramgroup 은 모두 사전 입 니 다.그들 은 공동으로 param 을 구성 합 니 다.groups,그래서 이때 len(optimizer.paramgrops)==2,aijust_learning_rate()함 수 는 for 순환 을 통 해 모든 param 을 꺼 내 는 것 입 니 다.group,그리고 그 중의 키'lr'의 값 을 수정 하여 수 동 으로 학습 율 을 조정 하 는 것 이 라 고 합 니 다.
두 번 째 예 에서 len(optimizer.paramgrops)=1,for 순환 을 이용 한 수정 역시 성립 됩 니 다.
매번 교체 할 때마다 실시 간 으로 학습 율 을 인쇄 하려 면 매번 step 에서 업 데 이 트 된 최신 학습 율 을 알 수 있 고 사용 할 수 있 습 니 다.

scheduler.get_lr()
이것 은 학습 율 목록 을 되 돌려 줍 니 다.매개 변수 그룹의 서로 다른 학습 율 로 구성 되 어 있 으 며,목록 색인 을 통 해 서로 다른 매개 변수 그룹의 학습 율 을 얻 을 수 있 습 니 다.
PyTorch 에서 학 습 률 감 소 를 설정 하 는 방법(learning rate decay)
在这里插入图片描述
많은 경우 에 우 리 는 학습 율(learning rate)을 감소 시 켜 야 한다.아래 의 코드 는 30 개의 epoch 마다 10%의 속도 로 감소 하 는 방법 을 시범 했다.
많은 경우 에 우 리 는 학습 율(learning rate)을 감소 시 켜 야 한다.아래 의 코드 는 30 개의 epoch 마다 10%의 속도 로 감소 하 는 방법 을 시범 했다.

def adjust_learning_rate(optimizer, epoch):
    """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
    lr = args.lr * (0.1 ** (epoch // 30))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr
파 람 이 뭐야groups?
optimizer param 통과group 에서 매개 변수 그룹 을 관리 합 니 다.paramgroup 에 서 는 매개 변수 그룹 과 그 에 대응 하 는 학습 율,운동량 등 을 저장 합 니 다.따라서 우 리 는 param 을 변경 할 수 있 습 니 다.group[lr]의 값 으로 대응 하 는 매개 변수 그룹의 학습 율 을 변경 합 니 다.

#    `param_group` ,len(optim.param_groups)==2
optim.SGD([
                {'params': model.base.parameters()},
                {'params': model.classifier.parameters(), 'lr': 1e-3}
          ], lr=1e-2, momentum=0.9)
 
#     
optim.SGD(model.parameters(), lr=1e-2, momentum=.9)
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기