전 포스팅에서 신경망 학습과 손실 함수에 대해 알아봤습니다.
이번에는 미니배치, 수치 미분, 기울기에 대해 다뤄보겠습니다.
이 전의 포스팅과 같이 구현과 관련된 내용은 제 깃허브 링크를 참고해주시기 바랍니다.
https://github.com/Kingnamji/BigAI/blob/main/%EB%B0%91%EC%8B%9C%EB%94%A51_re/04_NNTrain.ipynb
미니배치
신경망의 학습은 훈련데이터로부터 이뤄진다고 했습니다. 학습동안 훈련데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾습니다. ( 이 내용은 https://kingnamji.tistory.com/18 에서 다뤘습니다. )
MNIST 데이터셋의 경우 훈련 데이터의 갯수가 60,000개 입니다. 이렇게 많은 데이터가 있는데 모든 데이터를 대상으로 손실 함수의 합을 구하려면 시간이 오래 걸립니다.
따라서 신경망 학습에서는 훈련 데이터로부터 일부를 골라 학습을 수행합니다. 이 일부를 미니배치(mini-batch)라고 합니다.
배치 ? 미니배치?
딥러닝을 처음 공부할 때 배치와 미니배치를 많이 헷갈려합니다.
(Ian Goodfellow 도 그렇게 책에 써놨습니다.)
원래 배치(batch)는 전체 훈련 데이터 (total training dataset)을 말합니다. 하지만 데이터를 분할해서 다룰 때도 그냥 배치(batch)라고 부르는 경우가 있습니다. 그래서 사람들이 많이 헷갈려합니다.
데이터를 분할해서 다룰 때도 배치(batch)라고 하는 경우는 엄밀히 미니배치(mini-batch)를 의미하지만, 편의상 혼용해서 사용한다고 생각하시면 되겠습니다. 딥러닝을 공부할 때는 이렇게 용어들을 저자마다 다르게 쓰는 경우가 많아.. 맥락상 이해하면 될듯 합니다.
수치 미분
손실 함수의 값을 줄이기 위해서는 기울기를 활용합니다. 기울기를 구하기 위해 미분에 대한 얘기를 해보겠습니다.
미분은 한순간의 변화량을 표현합니다. 수식은 아래와 같습니다
$\frac{d f(x)}{dx} = \displaystyle\lim_{h \rightarrow 0} \frac{f(x+h)-f(x)}{h}$
이때 미분을 해석적 미분과 수치 미분의 두 갈래로 나눠보겠습니다.
해석적 미분(Analytical Differentiation)
수식을 전개해 미분하는 방식, 우리가 일반적으로 수학 시간에 배우는 미분을 뜻합니다.
수치 미분(Numerical Differentiation)
수치적 미분은 해석적 미분 방식으로는 풀 수 없는 문제가 있을 때 수치적 접근을 통해 근사 값을 찾는 방식입니다.
위의 식에 h=0을 대입할 수는 없고, 근사치로 미분 값을 찾는 방식입니다. 따라서 오차가 포함됩니다
위의 수식처럼 수치 미분을 계산하는 방법을 전방 차분이라고 합니다. ( (x+h) 와 x의 차분 )
오차를 더욱 줄이기 위해 전방 차분보다 중앙 차분(중심 차분)을 사용하는 것이 낫습니다.
중앙 차분은 ( (x+h)와 (x-h)일 때의 차분 )을 말합니다. 수식으로는 아래와 같습니다.
$\frac{d f(x)}{dx} = \displaystyle\lim_{h \rightarrow 0} \frac{f(x+h)-f(x-h)}{2h}$
중앙 차분을 이용한 수치 미분을 구현해보겠습니다.
def numerical_diff(f,x):
h = 1e-4
return (f(x+h) - f(x-h)) / (2*h)
$h$ 값을 $10^{-50}$ 처럼 매우 작게 잡게 되면 반올림 오차 문제를 일으키므로 적당히 작은 값을 사용했습니다.
함수 $f(x) = 0.01x^2 + 0.1x$ 에 대해
수치 미분을 적용해보고, 접선을 그려보겠습니다.
x가 5일 때와 10일 때를 예시로 보겠습니다.
print(numerical_diff(function_1,5))
print(numerical_diff(function_1,10))
0.1999999999990898
0.2999999999986347
해석적 미분으로 구하면 0.2와 0.3인데 실제 값과 오차가 매우 적습니다.
수치 미분 값을 기울기로 하는 접선을 그려보겠습니다.
편미분
위의 식은 변수가 x 하나였습니다. 이번에는 변수가 2개인 함수를 한번 보겠습니다.
$f(x_0, x_1) = x_0^2 + x_1^2$
해당 함수의 그래프를 그려봅시다.
이제 우리는 $x_0, x_1$에 대한 미분을 구별해야합니다.
변수 $x_0$에 대해 미분한다면 $\frac{\partial{f}}{\partial{x_0}}$
반대로 변수 $x_1$에 대해 미분한다면 $\frac{\partial{f}}{\partial{x_1}}$ 로 나타낼 수 있습니다.
이렇게 변수가 여럿인 함수 (다변수 함수)에 대해 특정 변수를 제외한 나머지 변수를 상수로 간주하고 미분하는 것을 편미분이라고 합니다.
모든 변수에 대한 편미분을 좌표로 갖는 벡터를을 기울기(gradient)라고 합니다.
위 함수에 대한 기울기를 예시로 써보면
$\begin{pmatrix}\ \frac{\partial{f}}{\partial{x_0}}, \frac{\partial{f}}{\partial{x_1}} \end{pmatrix}$
로 나타낼 수 있습니다.
다음 포스팅에서는 이제 우리가 기울기를 구할 수 있으니 어떻게 기울기를 활용할 지에 대해 알아보겠습니다.
감사합니다^^
[참고자료]
[1] 밑바닥부터 시작하는 딥러닝1 (사이토 고키)
'머신러닝, 딥러닝 ML, DL > 이론' 카테고리의 다른 글
[Deep Learning] 7.시그모이드 함수 역전파 (미분, 구현) (0) | 2021.08.11 |
---|---|
[Deep Learning] 6. 경사 하강법, 기울기 (2) | 2021.08.04 |
[Deep Learning] 4.신경망 학습, 손실 함수(오차제곱합, 교차 엔트로피 오차) (2) | 2021.07.28 |
[Deep Learning] 3. 출력층의 소프트맥스 함수(Softmax), 항등 함수 (0) | 2021.07.25 |
[Deep Learning] 2. 신경망, 활성화 함수(시그모이드 Sigmoid, 렐루 Relu) (2) | 2021.07.24 |