매개변수 초기값
1최적화와 가중치 초기값¶
신경망의 학습은 손실 함수를 최소화하는 최적화 문제입니다. 최적화 기법 중에는 반복 없이 방정식을 풀어 해를 직접 구하는 방식도 있지만, 그것은 선형 회귀처럼 매우 단순한 경우로 한정됩니다. 딥러닝에서는 그런 해석적 접근을 적용할 수 없으며, 경사 하강이 현재로서는 신경망 학습, 즉 손실 함수 최적화의 사실상 유일한 방법입니다.
경사 하강은 출발점에 크게 영향을 받습니다. 곧 학습 매개변수인 가중치와 편향의 초기값에 따라 결과가 달라집니다. 경사 하강은 현재 지점의 경사 정보만 가질 뿐 전체 지형에 대한 정보를 갖지 못하기 때문입니다. 전체 지형을 알 수 있다면 방정식을 푸는 것과 같지만, 그것이 불가능하기에 경사 하강에 의존합니다. 신경망의 구조 자체는 이미 결정된 알고리즘이지만, 그것이 상대하는 데이터는 진정한 확률 분포를 알 수 없는 표본입니다. 따라서 데이터가 만들어 내는 손실 함수의 지형은 근본적으로 불확정적입니다.
수집된 데이터에 대해 지형이 결정되더라도, 그 지형을 특정한 함수로 표현할 수 있는지는 별개의 문제입니다. 주어진 지형에는 둘 이상의 극점이 존재할 수 있고, 어디서 출발하는지와 학습률 같은 설정에 따라 국소적 극점을 넘어 전역 최저점에 도달할 수 있을지가 달라집니다. 지형이 불확정적이기 때문에 최적화는 여러 방식을 시도해 볼 뿐 분석적으로 접근하기 어렵고, 그 출발점인 초기값에 대한 논의 역시 어렵습니다. 사실상 확실하게 알려진 것은 많지 않습니다.
다만 분명하게 알려진 한 가지가 있습니다. 은닉층의 각 뉴런이 동일한 값을 내지 않도록 비대칭성을 부여해야 한다는 것입니다. 가중치를 0으로 초기화하는 것이 대칭적 출력을 낳는 대표적인 경우입니다. 모든 학습 매개변수를 0으로 두면 어떤 입력이든 첫 번째 은닉층의 모든 뉴런 출력이 0이 되고, 두 번째 층의 입력도 모두 0이 됩니다. 두 번째 층의 가중치가 0이 아니더라도 입력이 전부 동일하게 0이라면 어떤 정보도 담겨 있지 않습니다. 입력이 이미지라면 첫 은닉층에서 모든 출력이 0이 되는 것은 이미지를 백지로 만드는 것과 같아, 어떤 정보도 추출할 수 없습니다. 그러므로 초기값은 은닉층 출력의 비대칭성을 보장하도록 설정되어야 합니다.
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers# CPU only
tf.config.set_visible_devices([], 'GPU')2가중치 초기값의 생성과 크기¶
각 뉴런이 서로 다른 출력을 내도록 비대칭성을 부여하기 위해, 현재는 정규 분포나 균등 분포에서 난수를 생성하는 방식이 주로 쓰입니다. 정규 분포와 균등 분포 중 어느 것을 택하는지는 대체로 크게 중요하지 않은 것으로 보이지만, 아직 충분한 비교 연구가 이루어지지 않았습니다. 이렇게 설정하는 것은 주로 가중치이며, 편향은 실험적으로 적당한 상수를 두는데 대체로 0을 초기값으로 하는 경우가 많습니다.
확률 모델의 선택보다 더 큰 영향을 미치는 것은 가중치 초기값의 크기입니다. 초기값의 크기는 최적화 결과와 일반화 성능을 크게 좌우합니다. 초기값이 크면 출력값 자체가 커져 비대칭성이 강화되고, 같은 입력에 대해 뉴런 간 출력 차이가 커집니다. 경사를 구할 때도 전체적으로 큰 값으로 연산하는 편이 유리하며, 값이 너무 작으면 경사가 작아져 경사 하강이 효과적으로 이루어지지 않습니다. 그러나 값이 너무 크면 갱신이 지나치게 급격해져 발산할 수 있고, 시그모이드 같은 활성화 함수에서는 출력이 양 끝으로 수렴해 사실상 계단 함수처럼 동작합니다. 이때 경사가 거의 0이 되는 현상을 기울기 소실이라 합니다. 결론적으로 가중치 초기값은 너무 작지도 크지도 않은 적당한 크기여야 합니다.
3은닉층 출력 관찰¶
각 은닉층의 출력은 궁극적으로 손실에 영향을 주므로, 가중치 초기값에 대한 연구는 초기값에 따른 은닉층 출력을 관찰하는 것을 주요한 방법으로 삼습니다. 아래에서는 표준편차가 1.0인 정규 분포로 가중치를 초기화한 뒤, 시그모이드로 활성화되는 다섯 개 은닉층의 출력 분포를 관찰합니다. 초기값이 큰 탓에 출력이 0과 1 부근으로 몰리는, 곧 기울기 소실이 나타나는 양상을 확인할 수 있습니다.
def activation_model(inputs, **configs):
계층출력 = []
x = inputs
for _ in range(5):
x = layers.Dense(100, **configs)(x)
계층출력.append(x)
model = keras.Model(inputs=inputs, outputs=계층출력)
return model
configs = dict(activation='sigmoid', kernel_initializer=keras.initializers.RandomNormal(stddev=1.0))
model = activation_model(inputs=layers.Input(shape=(100,)), **configs)
X = np.random.randn(1000, 100)
outputs = model(X)
# x1, x2, x3, x4, x5 = outputs
plt.figure(figsize=(10, 3))
for i, x in enumerate(outputs):
plt.subplot(1, len(outputs), i+1)
plt.title(f'layer {i+1}')
plt.hist(x.numpy().flatten(), 30, range=(0, 1))4가중치 초기화 기법¶
가중치 초기값에 대해서는 아직 많은 부분이 밝혀지지 않았고, 결정적인 결론도 없습니다. 그럼에도 시행착오를 통해 경험적인 설정들이 제시되어 왔으며, 그 가운데 널리 쓰이는 몇 가지를 살펴봅니다.
4.1초기값 정규화 (Glorot and Bengio, 2010)¶
가중치 초기값을 정규 분포나 균등 분포로 생성한다는 점을 받아들이더라도, 그 분포를 어떻게 설정할지는 여전히 논의 대상입니다. 애초에 특정 확률 모델을 택하는 근거가 약하기 때문에 그 설정에 대한 논의 역시 쉽지 않습니다. 그동안 제시된 방법 중 하나는 각 은닉층 뉴런의 개수를 근거로 분포를 설정하는 것입니다. 2010년에 제안된 '초기값 정규화’가 이러한 방법으로, 오늘날 많은 딥러닝 라이브러리의 기본값으로 쓰입니다. 논문 첫 저자의 이름을 따 ‘Glorot 초기값’ 또는 'Xavier 초기값’으로도 불립니다. 균등 분포와 정규 분포 각각에 대해 은닉층의 입력 수와 출력 수를 함께 고려합니다. 다만 이 기법은 은닉층이 비선형으로 활성화된다는 점을 고려하지 않고 선형 활성화를 가정한다는 한계가 있습니다. 실제 은닉층은 반드시 비선형 활성화가 필요하므로 가정 자체가 모순적입니다. 그럼에도 널리 기본값으로 쓰이는 것은, 선형 모델을 가정해 개발한 전략이 비선형 모델에도 어느 정도 통한다는 경험과, 마땅한 대안이 부족하다는 사정 때문입니다.
4.2He 초기값 (He et al., 2015)¶
특정한 신경망 구성에서 더 유리한 초기값들이 꾸준히 제시되어 왔습니다. 2015년의 He 초기값은 Glorot 초기값을 약간 수정한 것입니다. Glorot 초기값이 입력과 출력 뉴런의 개수를 함께 반영하는 반면, He 초기값은 입력 뉴런의 개수만 반영합니다. Glorot 초기값은 선형 활성화를 가정하므로 선형에 가까운 시그모이드에서 근사적으로 효과를 기대할 수 있습니다. He 초기값은 ReLU 활성화에 초점을 두고 제시되어, ReLU로 활성화하는 특정 구성에서 더 도움이 될 수 있습니다. 다만 Glorot 초기값에서 조금 변형된 것이므로 기존 초기값 설정의 장점과 한계를 큰 틀에서 그대로 이어받습니다.
4.3배치 정규화 (2015)¶
배치 정규화(batch normalization)는 깊은 신경망의 훈련 어려움을 극복하기 위해 2015년에 제시된 기법입니다. 확률적 경사 하강에서 은닉층의 입력은 앞선 모든 은닉층의 매개변수에 영향을 받습니다. 선행하는 층들의 학습 매개변수 변화가 누적되어 층이 깊어질수록 그 효과가 증폭되고, 은닉층 입력의 분포가 계속 변하면서 각 층이 새로운 분포에 끊임없이 적응해야 합니다. 학습 시스템에서 입력 분포가 변하는 이 문제를 공변량 이동(covariate shift)이라 하며, 신경망 내부에서 일어나는 것을 내부 공변량 이동(internal covariate shift)이라 합니다.
계층의 입력이 표준 정규 분포를 따르면 학습이 더 빠르게 수렴한다는 점은 오래전부터 알려져 있었습니다. 배치 정규화는 각 계층의 입력을 표준 정규 분포로 변환하여 다음 계층에 전달함으로써 내부 공변량 이동을 줄입니다. 이 기법은 깊은 신경망의 학습 속도를 크게 높여 주며, 드롭아웃 같은 규제 기법이 필요 없어지는 경우도 있어 빠르게 널리 도입되었습니다.