Pytorch의 optimizer 사용 설명

4957 단어 Pytorchoptimizer
최적화 함수와 관련된 부분은torch에 있습니다.optim 모듈에는 현재 유행하는 최적화 방법이 대부분 포함되어 있다.

Optimizer 사용 방법


optimizer를 사용하려면optimizer 대상을 만들어야 합니다. 이 대상은 현재 상태를 저장하고 사다리에 따라 파라미터를 업데이트합니다.

Optimizer 구축 방법


Optimizer를 구성하려면 모든 매개 변수 (Tensor 형식) 를 포함하는 iterable를 사용하여 관련 매개 변수 (예를 들어learning rate,weight decay 등) 를 넣어야 합니다.
사용하려면 주의하십시오.cuda() 방법으로 모델을 GPU로 옮기려면 이 단계가 Optimizer를 구축하기 전에 반드시 확보해야 한다.호출 때문에.cuda () 이후 모델 안의 매개 변수는 이전의 매개 변수가 아닙니다.
예제 코드는 다음과 같습니다.

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

공통 매개변수


last_epoch는 지난번 epoch의 값을 대표합니다. 초기 값은 -1입니다.

개별 매개변수 지정


dict의iterable로 인자를 지정할 수도 있습니다.이곳의 모든dict는params라는 키를 필요로 합니다.params는 자신이 속한 매개 변수 목록을 포함합니다.이외에 키는 SGD와 같은 Optimizer의 매개변수가 있어야 합니다.
You can still pass options as keyword arguments. They will be used as defaults, in the groups that didn't override them. This is useful when you only want to vary a single option, while keeping all others consistent between parameter groups.
이것은 특정 부분을 조작할 때 매우 유용하다.예를 들어 지정된 몇 개의 층에만 학습률을 단독으로 설정하기를 원한다.

optim.SGD([
  {'params': model.base.parameters()},
  {'params': model.classifier.parameters(), 'lr': 0.001}
  ],
  
  lr = 0.01, momentum = 0.9)
위의 코드에서 모델.base는 기본 학습률 0.01을 사용하고 모델입니다.classifier의 매개 변수인 장환은 0.001의 학습률을 사용한다.

어떻게 단일 최적화를 진행합니까


모든optimizer는 step() 방법을 실현했습니다. 이 방법을 사용하면 파라미터를 업데이트할 수 있습니다. 이 방법은 다음과 같은 두 가지 사용 방법이 있습니다.

optimizer.step()


대부분의optimizer에서 이렇게 할 수 있습니다. 매번 backward () 같은 방법으로 사다리를 계산한 후에 이 방법으로 매개 변수를 업데이트할 수 있습니다.
예제 프로그램:

for input, target in dataset:
 optimizer.zero_grad()
 ouput = model(input)
 loss = loss_fn(output, target)
 loss.backward()
 optimizer.step()

optimizer.step(closure)


일부 최적화 알고리즘은 함수 (예를 들어 Conjugate Gradient, LBFGS) 를 여러 번 다시 계산합니다. 그러면 여러 번 모델을 계산하는 동작을 지원하기 위해 패키지 (closure) 를 사용해야 합니다.
이closure의 운행 과정은 사다리를 지우고loss를 계산하고loss를 되돌려주는 것입니다.
(이것은 잘 이해하지 못한다. 왜냐하면 이런 최적화 알고리즘은 익숙하지 않기 때문이다.)
예제 프로그램:

for input, target in dataset:
  def closure():
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    return loss
  optimizer.step(closure)

최적화 알고리즘


문서의 내용을 완전하게 소개하지 않고 기류만 소개합니다.구체적인 알고리즘의 매개 변수는 그들의 원리를 이해해야만 이해할 수 있다. 이것은 다음에 단독으로 한 편의 문장으로 소개한다.

Optimizer


 class torch.optim.Optimizer(params, defaults)
이것은 모든optimizer의 기본 클래스입니다.
각 매개 변수의 순서는 매번 운행이 일치해야 한다는 것을 주의해야 한다.어떤 데이터 구조는 이 조건을 만족시키지 못한다. 예를 들어dictionary의iterator와set이다.

매개 변수

params(iterable)torch입니다.Tensor 또는 dict의 iterable.이 매개변수는 업데이트할 Tensor를 지정합니다.defaults(dict)은dict로 기본적인 최적화 옵션을 포함합니다.

방법


add_param_group(param_group)
이 방법의 작용은 매개 변수 그룹을 추가하여finetuning에서 미리 훈련된 네트워크를 만들 때 유용하다.

load_state_dict(state_dict)
이 방법의 역할은optimizer를 불러오는 상태입니다.

state_dict()
최적화된 상태 (dict) 를 가져옵니다.zero_grad() 방법은 사다리를 비우는 데 쓰인다.step(closure) 단일 업데이트에 사용됩니다.

Adam


class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
추가:pytorch의 Optimizer와 optimizer.step () 사용법

우리가 각 층의 학습률을 지정하고 싶을 때:


optim.SGD([
          {'params': model.base.parameters()},
          {'params': model.classifier.parameters(), 'lr': 1e-3}
        ], lr=1e-2, momentum=0.9)
이것은 모델을 의미한다.베이스의 매개 변수는 1e-2의 학습률, 모델을 사용합니다.classifier의 매개 변수는 1e-3의 학습률을 사용하고 0.9의momentum는 모든 매개 변수에 사용됩니다.

단일 최적화 수행


모든optimizer는 step () 방법을 실현했습니다. 이 방법은 모든 매개 변수를 업데이트합니다.그것은 두 가지 방식으로 사용할 수 있다.

optimizer.step()
이것은 대부분의optimizer가 지원하는 간소화 버전입니다.일단 사다리가 백워드 () 와 같은 함수에 의해 계산되면 우리는 이 함수를 호출할 수 있다.
예제

for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()
optimizer.step(closure)
일부 최적화 알고리즘, 예를 들어 Conjugate Gradient와 LBFGS는 여러 번 계산 함수를 반복해야 하기 때문에 클러치를 불러와 모델을 다시 계산할 수 있도록 해야 한다.
이 패키지는 사다리를 비우고 손실을 계산한 후에 돌아와야 한다.
예:

for input, target in dataset:
  def closure():
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    return loss
  optimizer.step(closure)
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기