Untitled

이번 글을 시작하기전 위의 이미지를 참조하면 좋습니다. 정확히 특징들만을 가져와서 적어두었습니다. 또한 각 최적화 기법의 코드에서 수렴하는 Loss 값들의 변화를 살펴볼 수 있도록 5에폭정도의 Loss 출력을 확인하도록 해두었습니다. 데이터셋이 Fake로 구성되어 있어서 어느정도 훈련에 한계점이 있음을 기억해야 합니다. 기본적으로 공통으로 들어가는 코드는 아래와 같습니다.

그리고 파이토치 버전에 따라서 사용할 수 있는 알고리즘에 제한이 있으니 현재 작성된 알고리즘이 없다면, 버전을 확인해보시길 바라겠습니다.

import torch
import torch.optim as optim
import torch.nn as nn
import torchvision
train_dataset = torchvision.datasets.FakeData(transform= torchvision.transforms.ToTensor(), size = 100)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=4, shuffle=False)

torch.manual_seed(0)
torch.cuda.manual_seed(0)
torch.cuda.manual_seed_all(0)

1. Adadelta

설명 :

Adagrad의 확장판 버전입니니다. 이는 SGD 알고리즘에서 각 파라미터별로 LR을 최적화하여 훈련할 수 있도록 만든 방법입니다. SGD는 lr이 고정된 반면 Adadelta는 lr이 파라미터가 급하게 변화할수록 크고, 적게 변화할수록 적게 가져서 동적으로 값 변환이 가능합니다. 여기까지는 Adagrad에도 존재하는 내용인데 Adagrad는 계속해서 lr이 너무 작아져 훈련이 안되는 문제가 있었습니다. 이를 해결하기 위해 나온것이 Adadelta입니다.

특징 :

사용 방법 :

model = torchvision.models.resnet18(pretrained=True)

device = torch.device("cuda:0")
optimizer = optim.Adadelta(model.parameters(), lr = 0.001)
criterion = nn.CrossEntropyLoss()
model = model.to(device)
for epoch in range(5):
    running_loss = 0.0
    for i, data in enumerate(train_loader):
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    print('Loss: {}'.format(running_loss))

print('Finished Training')

----

Loss: 210.03848838806152
Loss: 195.503568649292
Loss: 182.0458164215088
Loss: 169.31831550598145
Loss: 157.1712408065796
Finished Training

2. Adam

설명 :

최근까지도 많이 사용하는 옵티마이저입니다. Momentum과 RMSprop을 사용해서 lr의 최적화와 기울기의 방향성을 유지하는 기법입니다. 또한 기본값으로 설정된 두 개의 베타 값이 작업에 따라 달라지지 않고 거의 일정하게 좋은 성능을 내는 방법입니다.

또한 안정되고, 빠른 수렴성을 자랑하는 대표적인 최적화 방법입니다.

Untitled

Untitled

참고 사항 :