Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

최적화

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import sys
sys.path.append('..')
from module import 역전파신경망
from module import layer, loss, optimizer
def build():
    model = 역전파신경망(loss.SoftmaxCrossEntropy())
    model.add(layer.완전연결(784, 50))
    model.add(layer.Sigmoid())
    model.add(layer.완전연결(50, 100))
    model.add(layer.Sigmoid())
    model.add(layer.완전연결(100, 10))
    return model
import pickle

with open('../data/mnist/mnist_ndarray.pkl', 'rb') as f:
    (X_train, y_train), (X_test, y_test) = pickle.load(f)
    
def 전처리(X):
    X = X.astype('float32')
    X = X.reshape(-1, 28 * 28)
    X /= 255
    return X

유형수 = len(np.unique(y_train))
Y_train = np.eye(유형수)[y_train]
assert Y_train.shape[-1] == 유형수

1SGD

model = build()
history = model.fit(
    전처리(X_train), Y_train, 
    배치크기=200, 에폭수=10, 최적화=optimizer.SGD(학습률=0.01))

2Momentum

경사 하강은 가장 널리 활용되는 최적화 기법이지만 유일한 기법은 아닙니다. 경사 하강은 학습 속도가 느리다는 문제가 지적되어 왔으며, 이를 개선하기 위해 갱신에 속도를 반영하는 방법이 제시되었습니다. 속도는 방향과 크기를 가지며, 이 방식을 모멘텀(momentum)이라 합니다.

모멘텀이라는 용어는 물리학에서 가져온 것으로, 물리학에서 모멘텀은 질량과 속도의 곱입니다. 같은 질량의 공이라도 빠르게 날아오는 공에 맞는 것이 느리게 날아온 공보다 더 아픈데, 이는 모멘텀이 더 크기 때문입니다. 경사면 위에 질량이 기본 단위인 입자가 있다고 가정하면, 그 입자의 속도가 곧 모멘텀에 해당합니다. 모멘텀은 기본적인 경사 하강의 틀을 유지하면서 경사의 방향에 따른 속도를 추가로 고려합니다. 경사들이 같은 방향을 향할수록 더욱 가파르게 갱신되도록 설계되어, 잠재적으로 기존의 경사 하강보다 갱신 속도가 개선될 수 있습니다.

모멘텀은 1964년에 제안되었으며(Polyak, 1964), 이후 이를 기반으로 한 방법이 2013년에 새롭게 제시되기도 하였습니다.

model = build()
history = model.fit(
    전처리(X_train), Y_train, 
    배치크기=200, 에폭수=10, 최적화=optimizer.Momentum(학습률=0.01, momentum=0.9))

3적응형 학습률

신경망 손실 최적화에서 가장 어려운 점 중 하나는 경사 하강의 학습률을 적절하게 설정하는 것입니다. 학습률에 따라 성능이 크게 좌우되기 때문입니다. 학습률이 너무 작으면 학습이 더디게 진행되고, 너무 크면 발산해 버릴 수 있습니다. 모멘텀이 이러한 문제를 어느 정도 보완해 주지만, 속도를 조절하는 설정이 추가되어 관리해야 하는 하이퍼파라미터가 오히려 늘어납니다.

최적화 초기에는 손실이 크므로 갱신 간격을 크게 하는 것이 바람직하고, 손실이 줄어든 뒤에는 섬세하게 탐색해야 하므로 학습률을 줄이는 방식이 필요합니다. 실제로 이러한 조정을 수동으로 수행하기도 합니다. 학습을 특정 지점까지 진행한 다음 종료하고, 이후 학습률을 줄여 다시 학습하는 방식입니다. 이러한 필요에 따라 학습률이 자동으로 조정되는 방식이 개발되었습니다.

3.1AdaGrad

AdaGrad(Duchi et al., 2011)는 개별 매개변수가 갱신되어 온 정도를 반영해 각 매개변수별로 학습률을 개별적으로 조정하는 방식입니다. Ada는 Adaptive(적응형), Grad는 Gradient(경사)의 약자로, '적응형 경사’라고 할 수 있습니다. 과거의 기울기를 제곱하여 계속 누적하고, 그 값으로 학습률을 나누어 주어, 많이 갱신된 매개변수일수록 학습률이 점차 작아지도록 합니다.

3.2RMSProp

AdaGrad는 학습이 진행됨에 따라 갱신률이 너무 빨리 0에 가까워지는 문제가 발견되었습니다. 적응형 경사의 구상을 유지하면서 이를 보완한 방식이 RMSProp(Hinton, 2012)입니다. RMSProp은 지수 이동 평균을 활용하여 과거 기울기가 반영되는 정도가 특정 범위에서 유지되도록 하였습니다. AdaGrad가 적응형 학습률의 기본 골격을 제시하였지만, 실제 신경망 학습에서는 개선된 RMSProp을 사용하는 경우가 대부분입니다.

4Adam

모멘텀은 학습 속도를, AdaGrad와 이를 보완한 RMSProp은 자율적으로 조정되는 학습률을 장점으로 합니다. 이 두 방식의 장점을 융합하여 2014년 Adam(Kingma and Ba, 2014)이 개발되었습니다. Adam이라는 이름은 Adaptive와 Momentum에서 비롯되었습니다. 두 방식을 조합하여 종종 상당히 훌륭한 최적화를 수행하며, 그래서 기본 SGD와 함께 널리 사용되고 있습니다.

두 방식을 조합하다 보니 조정해야 하는 설정이 세 가지로 늘어납니다. 하이퍼파라미터가 많아지는 것은 부담이지만, 제안된 기본값이 주로 사용되며 그 기본값이 대체로 바람직한 편입니다.

5최적화 기법 선택

기본적인 SGD 이후로 신경망 학습에 사용할 수 있는 여러 최적화 기법이 개발되었습니다. 그렇다면 어떤 기법을 선택하는 것이 바람직할까요? 결론부터 말하면 아직 명확하지 않습니다. 2014년의 한 연구에서 여러 최적화 기법을 다양한 학습 상황에 적용해 비교하였는데, 대체로 적응형 학습률 기반 기법들이 좋은 결과를 보이는 경향이 있었으나, 그럼에도 어떤 특정 알고리즘이 가장 좋다는 결론에는 이르지 못하였습니다.

현재도 기본 SGD가 여전히 광범위하게 사용되고 있으며, 모멘텀, RMSProp, Adam이 널리 쓰입니다. 최적화 기법의 선택은 현재로서는 대체로 사용자의 취향에 따르며, 선택한 기법을 특정 데이터셋과 모델에 적용하면서 비교해 보는 것이 필요합니다.