본 글은 「밑바닥부터 시작하는 딥러닝」 책을 공부하고 정리한 내용입니다.
신경망의 학습은 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 얻는 것을 말합니다.
손실 함수는 신경망이 학습할 수 있도록 해주는데 이 손실 함수의 결과값을 가장 작게 만드는 가중치 매개변수를 찾는 것이 목표입니다.
기계학습엔 크게 세 가지의 접근법이 존재합니다.
- 사람이 생각한 알고리즘으로 결과를 창출
- 사람이 특징을 설계하고 기계학습 후 결과 창출
- 인간의 개입없이 딥러닝을 통해 결과 창출
딥러닝은 인간의 개입이 없으므로 종단 간 기계학습이라고도 한다.
기계학습 문제는 훈련 데이터와 시험 데이터로 나눠 학습과 실험을 수행하는 것이 일반적입니다.
(먼저 훈련 데이터만 사용하여 학습하면서 최적의 매개변수를 찾고 그 후에 시험 데이터를 사용하여 앞서 훈련한 모델의 실력을 평가합니다.)
왜 나눌까요?
우리는 모든 데이터를 다 학습시킬 수는 없기 때문에 아직 보지 못한 데이터가 존재합니다.
이 보지 못한 데이터로도 문제를 올바르게 풀어낼 수 있는 능력을 범용 능력이라고 하는데, 이 범용 능력을 획득하는 것이 기계학습의 최종 목표입니다.
범용 능력이 낮으면 수중의 데이터셋만 맞고 다른 데이터셋에는 엉망인 일이 벌어지는데 이를 오버피팅이라고 합니다.
손실 함수
앞에서 신경망이 학습할 수 있도록 해주는 지표라고 했는데요.
이 손실 함수는 일반적으로 오차제곱합과 교차 엔트로피 오차를 사용합니다.
오차제곱합
수식은 다음과 같습니다.
$y_k$: 신경망의 출력(신경망이 추정한 값)
$t_k$: 정답 레이블
k: 데이터의 차원 수
다음은 손글씨 숫자 인식 결과 예시입니다.
(각각의 인덱스는 0부터 9까지의 숫자를 나타냅니다.)
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
출력 y는 소프트맥스 함수의 출력이고, 확률로 해석합니다.
출력 t는 정답을 가리키는 위치의 원소입니다.
출력 t처럼 정답 원소를 1로 하고 그 외는 0으로 나타내는 표기법을 원-핫 인코딩이라고 합니다.
한 글씨로도 여러 번 학습시키는 과정에서 신경망의 출력이 다르게 나올 수 있는데 오차제곱합 수식에 대입했을 때 더 작은 결과값(위 예시에선 첫 번째 값이 더 작음)이 정답에 더 가깝다고 판단할 수 있습니다.
교차 엔트로피 오차
수식은 다음과 같습니다.
log: 밑이 e인 자연로그
$y_k$: 신경망의 출력
$t_k$: 정답 레이블
오차 제곱합처럼 t_k는 원-핫 인코딩으로 나타냅니다. 그러면 정답 원소를 제외한 원소들은 0이 곱해지면서 상쇄됩니다.
반대로 정답 원소는 y_k의 자연로그를 계산하는 식이 됩니다.
교차 엔트로피 오차도 구해보면 앞서 말한 오차제곱합의 판단과 일치합니다.
미니배치 학습
기계학습 문제는 훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아냅니다.
이렇게 하려면 모든 훈련 데이터를 대상으로 손실 함수 값을 구해야 합니다.
예를 들어, 100개의 훈련 데이터가 있다면 그로부터 계산한 100개의 손실 함수 값들의 합을 지표로 삼는 것 입니다.
앞에서 설명한 오차제곱합과 교차 엔트로피 오차는 데이터 하나에 대한 손실 함수를 따진 것이고
이제는 모든 훈련 데이터에 대한 손실 함수의 합을 구하는 방법을 알아보겠습니다.
예를 들어, N개의 훈련 데이터가 있는 교차 엔트로피 오차 수식은 이러합니다.
t_nk: n번째 데이터의 k번째 값
마지막에 N으로 나누면서 평균 손실 함수를 구합니다. 이렇게 평균을 구해 사용하면
훈련 데이터 개수와 관계없이(1000개, 10,000개,...) 언제든 통일된 지표를 얻을 수 있습니다.
하지만 MNIST 데이터셋(60,000개)처럼 데이터가 많아질수록 손실 함수 합을 구하려면 시간이 좀 걸립니다.
이런 경우 데이터를 일부 추려 전체의 근사치로 이용할 수 있습니다.
이 일부를 미니배치(mini-batch)라고 합니다.
예를 들어 60,000개의 훈련 데이터 중에서 100장을 무작위로 뽑아 사용했을 때, 미니배치 학습이라고 합니다.
손실 함수를 지표로 설정하는 이유
신경망 학습에서는 매개변수의 미분을 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복합니다.
그렇다면 왜 정확도(얼마나 잘 처리하냐)를 지표로 두지 않는 것일까요?
손실 함수를 다시 정의해보자면 실제값과 예측값의 차이를 나타냅니다.
이는 맞다, 맞지않다로만 나타낼 수 있는 정확도와는 다르게 연속적인 값으로 나타낼 수 있습니다.
예를 들어, 100장의 훈련 데이터 중 32장을 올바르게 인식한다고 하면 정확도는 32% 입니다.
아무리 매개변수를 조정 한다한들 정확도는 33%,34%와 같이 띄엄띄엄 움직입니다.
하지만 손실 함수는 실제값과 예측값의 차이를 나타내기 때문에 값이 0.92543와 같이 섬세한 숫자로 나타내어집니다.
매개변수를 조정한다면 0.92542처럼 연속적으로 변화하는 것이죠.
따라서 손실 함수와 정확도는 다음과 같이 표현할 수 있습니다.
손실 함수 ≒ 시그모이드 함수
정확도 ≒ 계단 함수
계단 함수 같은 경우 대부분의 장소에서 기울기가 0이지만, 시그모이드 함수에선 어느 장소라도 기울기가 0이 되는 곳이 없습니다.
매개변수의 작은 변화가 주는 파장을 계단 함수가 말살하기 때문에 손실 함수의 값에는 아무런 변화가 나타나지 않기 때문에 의미가 없어집니다.
기울기
$f(x_{0}, x_{1}) = x_{0}^{2} + x_{1}^{2}$ 함수에서
$(x_{0}, x_{1})$ 양쪽의 편미분을 묶어서 $\left ( \frac{\partial f}{\partial x_{0}},\frac{\partial f}{\partial x_{1}} \right )$을 계산한다고 했을 때, $\left ( \frac{\partial f}{\partial x_{0}},\frac{\partial f}{\partial x_{1}} \right )$ 처럼
모든 변수의 편미분을 벡터로 정리한 것을 기울기라고 합니다.
위 함수 기술기의 결과에 마이너스를 붙인 벡터를 그려보면 이러합니다.
위 그림에서는 가장 낮은 장소를 가리키지만 실제로는 반드시 그런 것은 아닙니다.
각각의 화살표의 의미는 각 지점에서 낮아지는 방향을 가리킬 뿐이고, 극솟값이나 안장점일 가능성을 고려해야 합니다.
경사법(경사하강법)
기계학습 문제 대부분은 학습 단계에서 최적의 매개변수를 찾아냅니다.
신경망 역시 최적의 매개변수(가중치와 편향)를 학습 시에 찾아야 하지만 일반적인 문제의 손실 함수는 매우 복잡하기 때문에 기울기를 이용해 함수의 최솟값을 찾으려는 것이 경사법입니다.
쉽게 말하면 경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동하고, 이동한 곳에서도 기울기를 구하고 그 방향으로 나아가는 것을 반복합니다.
경사법은 기계학습을 최적화하는 데 흔히 쓰는 방법입니다.
수식으로 나타내면 이러합니다.
$\eta$(에타): 갱신하는 양, 학습률
(한 번의 학습으로 얼마만큼 학습해야 되는지, 즉 매개변수 값을 얼마나 갱신하느냐를 정하는 것)
이 학습률 값은 0.01이나 0.001 등 특정 값으로 미리 정해두어야 합니다.
값이 너무 크거나, 작아도 좋은 장소를 찾아갈 수 없기 때문에 학습률을 변경해가면서 올바르게 학습하고 있는지를 확인하면서 진행하여야 합니다.
코드로 나타내면 이렇습니다.
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
f: 최적화하려는 함수
init_x: 초깃값
lr: learning rate를 의미하는 학습률
step_num: 경사법에 따른 반복 횟수
numerical_gradient(f, x): 함수의 기울기
학습률 같은 매개변수를 하이퍼파라미터라고 합니다.
신경망의 가중치 매개변수는 훈련 데이터와 학습 알고리즘에 의해서 '자동'으로 획득되는 매개변수인 반면,
학습률 같은 하이퍼파라미터는 사람이 '수동'으로 설정해야하는 매개변수 입니다.
여러 후보 값 중에서 시험을 통해 가장 잘 학습하는 값을 찾는 과정을 거쳐야 합니다.
신경망에서의 기울기
신경망 학습에서도 가중치 매개변수에 대한 손실 함수의 기울기를 구해야 합니다.
예를 들어 형상이 2*3, 가중치가 W, 손실 함수가 L인 신경망이 있다고 가정합니다. 이 경우 경사는 $\frac{\partial L}{\partial W}$로 나타낼 수 있습니다.
$\frac{\partial L}{\partial W}$의 각 원소는 각각의 원소에 대한 편미분입니다. 예를 들어 1행 1번째 원소인 $\frac{\partial L}{\partial w_{11}}$은 ${w_{11}}$을 조금 변경했을 때 손실 함수 L이 얼마나 변화하느냐를 나타냅니다.
W의 형상과 $\frac{\partial L}{\partial W}$ 형상은 모두 2*3으로 같은 것을 알 수 있습니다.
학습 알고리즘 구현하기
신경망의 학습 절차는 이렇습니다.
전제
신경망에는 정응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라고 합니다.
신경망 학습은 4단계로 수행됩니다.
1단계 - 미니배치
훈련 데이터 중 일부를 무작위로 가져옵니다. 이렇게 선별한 데이터를 미니배치라 하며, 그 미니배치의 손실 함수 값을 줄이는 것이 목표입니다.
2단계 - 기울기 산출
미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구합니다. 기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시합니다.
3단계 - 매개변수 갱신
가중치 매개변수를 기울기 방향으로 아주 조금 갱신합니다.
4단계 - 반복
1~3단계를 반복합니다.
데이터를 무작위 미니배치로 선정하기 때문에 확률적 경사 하강법(Stochastic Gradient Descent)이라고 부릅니다.
대부분의 딥러닝 프레임워크는 확률적 경사 하강법 약자를 따서 SGD라는 함수로 이 기능을 구현합니다.
신경망 학습의 원래 목표인 범용적인 능력을 익히기 위해서는 학습 도중 정기적으로 훈련 데이터와 시험 데이터를 대상으로 정확도를 기록해야 합니다.
이 단위를 epoch(에폭)이라고 합니다. 예를 들어, 10,000장의 훈련 데이터 중 100개의 미니배치로 학습할 경우 확률적 경사 하강법을 100회 반복하면 모든 훈련 데이터를 소진한 게 됩니다. 이 경우 100회가 1 에폭이 됩니다.
이번 장에서는 신경망 학습에 대해 설명하였고, '지표'에 대해 알아보는 시간을 가졌습니다. 감사합니다!
'AI > Deep Learning' 카테고리의 다른 글
합성곱신경망, CNN(Convolutional neural network) (0) | 2023.07.12 |
---|---|
신경망, 인간의 두뇌 (0) | 2022.09.02 |
퍼셉트론(Perceptron) : 딥러닝의 기원 (0) | 2022.08.31 |