이 글의 핵심
- 신경망 학습은 사람이 직접 데이터의 특징을 설계해야 하는 기존 머신러닝의 한계를 극복하고, 원본 데이터로부터 스스로 최적의 가중치 매개변수를 찾아내는 과정이다
- 최적의 가중치를 찾기 위한 지표로 불연속적인 ‘정확도’ 대신 미분(기울기) 계산이 가능한 연속적인 ‘손실 함수(SSE, CEE 등)‘의 값을 최소화하는 방향을 목표로 한다
- 전체 데이터를 한 번에 계산하는 대신 일부만 무작위로 추려내는 ‘미니배치’ 방식을 사용하여 물리적 메모리 한계를 극복하고 가중치 업데이트 속도와 정확도를 향상시킨다
- 각 매개변수에 대한 편미분 벡터인 기울기를 계산한 후, 오차가 가장 크게 줄어드는 방향으로 조금씩 이동시키는 ‘경사 하강법’을 반복하여 최적해를 탐색한다
- 이러한 과정을 훈련 데이터 전체에 대해 여러 번(Epoch) 반복하여 학습을 마친 후에는, 학습에 사용되지 않은 시험 데이터로 최종 평가를 진행해 모델의 범용성을 검증한다
1. 신경망 학습이란
신경망의 주요 특징은 데이터를 통해 스스로 학습해서 최적의 매개변수 값을 자동으로 결정한다.
1.1 기존 머신러닝의 한계
손글씨 이미지를 보고 숫자를 분류하는 프로그램을 설계한다고 하자.
일반적인 흐름은 이미지들의 특징(feature)을 추출하고, 그 패턴을 머신러닝 기술로 학습하는 방법이 있다. 이때 특징은 원본 이미지에서 중요한 데이터를 의미한다. 이처럼 특징을 추출하기 위해 변환기(Transformer)를 이용하고, 이를 통해 벡터 데이터로 변환한다.
이렇게 변환된 이미지 벡터 데이터를 대표적인 지도 학습 모델인 SVM, KNN 등으로 학습하여 원하는 프로그림을 설계할 수 있다.
그러나, 이미지에서 특징을 추출하는 변환 과정은 여전히 사람이 설계하므로 자칫 잘못된 변환기를 생성할 수 있다.
즉, 잘못된 변환기로 이미지의 특징을 추출하지 못한다면 목적을 이룰 수 없고, 이미지 분류 성격마다 ‘사람’이 적절한 특징을 생각해야 한다.
1.2 신경망 학습의 장점
반면에 신경망은 이미지 데이터를 있는 그대로 학습한다. 위 머신러닝 과정에서 이미지에서 특징을 추출하는 변환 과정과 추출된 특징을 기반으로 분류하는 모델 적용까지 신경망이 스스로 학습한다.
이처럼 신경망은 이미지의 성격마다 따로 설계할 필요가 없어서 모든 문제를 동일한 맥락으로 해결할 수 있다. 즉, 신경망은 주어진 데이터 그대로 입력 데이터로 활용해 end-to-end로 학습이 가능하다.
2. 손실 함수
2.1 개념
손실 함수(loss function)는 최적의 가중치 매개변수를 탐색하는데 활용하는 지표로, 일반적으로 신경망 성능의 ‘나쁨’을 나타내므로 최소화시키는 것이 목적이다(목적 함수라고도 한다).
오차제곱합(SSE)
가장 많이 쓰이는 손실 함수 오차제곱합(SSE)으로 출력 값이 실제 값과의 차이에 대한 총합을 의미한다.
- : 신경망의 출력(추정값)
- : 정답 레이블
- : 데이터의 차원 수
교차 엔트로피 오차(CEE)
SSE 외 자주 사용하는 손실 함수는 교차 엔트로피 오차(cross entropy error, CEE)로 자연로그를 계산한다.
로그함수는 입력값이 1미만일 때, 음수 값을 가진다. 여기서 분류 문제의 경우 는 확률 값으로 1 미만이므로 음수 값을 가지므로 끝에 음수를 곱해서 교차 엔트로피 오차를 계산한다.
즉, 확률이 높을 수록 결과 값이 작아져서 손실 함수로 활용한다.
2.2 미니배치
학습은 손실 함수를 줄이는 최적의 매개변수를 찾아낸다. 그러나 지금까지 데이터 하나에 대한 손실 함수만 생각했는데, 데이터 100개인 경우 손실 함수를 100번 계산해야 한다.
아래는 개의 데이터에 대한 손실 함수 교차 엔트로피 오차를 평균한 수식이다. 이를 통해 데이터에 수와 관계없이 평균 손실 함수를 구할 수 있다. 그러나 모든 데이터에 대한 손실 함수의 합을 구하려면 시간이 오래 걸리고, 빅데이터 수준이 되면 현실적이지 않다.
이를 해결하기 위해 데이터의 일부만 추려 학습을 수행하고 이 데이터의 일부를 미니배치(mini-batch) 라고 한다. 예를 들어 60,000만장의 이미지 훈련 데이터 중에서 100장을 무작위로 뽑아 100장을 학습하는 것을 미니배치 학습이라고 한다.
여기서 핵심은 미니 배치를 이용하면 매개변수를 100번 업데이트 할 수 있다는 의미이다. 즉, 60,000개의 데이터는 동일한데 미니 배치를 적용하지 않으면 매개변수가 1회 업데이트 되는 반면에 미니 배치를 이용하면 매개변수가 100번 업데이트 된다. 따라서, 더 빠르게 최적의 매개변수를 찾을 수 있다.
추가로 CPU에서는 1개의 미니배치(100장)에 대한 처리를 1장씩 순서대로 계산한다. 그러나 GPU는 100장의 이미지의 행렬 곱셈 연산을 한 번에 동시에 처리한다. 따라서, GPU 성능이 좋아질수록 미니배티의 크기를 256장, 512장으로 늘릴 수 있다.
미니배치를 사용하는 이유
- 메모리의 물리적 한계 (VRAM): 전체 훈련 데이터 10,000장(실제로는 수백만 장)을 한 번에 메모리에 올리는 것 자체가 물리적으로 불가능하므로 메모리가 터지는 것을 막기 위해 쪼개서 올린다
- 빠른 가중치 업데이트 (수렴 속도): 데이터를 다 보고 한 번 업데이트하는 것보다, 일부만 보고 빠르게 자주 업데이트하는 것이 목표 지점에 훨씬 빨리 도달한다
- 국소 최솟값(Local Minima) 탈출: 전체 데이터로 정확한 방향을 잡고 훈련하면 자칫 엉뚱한 구덩이(Local Minima)에 빠졌을 때 빠져나오기 힘들다. 미니배치는 데이터의 일부만 보기 때문에 학습 방향이 약간 지그재그(노이즈)로 흔들리는데, 이 흔들림 덕분에 구덩이에서 쉽게 빠져나와 진짜 최적해(Global Minimum)를 찾을 확률이 높아진다
2.3 손실 함수를 사용하는 이유
궁극적인 목적인 이 모델을 정확하게 하는 매개변수를 탐색하는 것이다. 근데 왜 정확도 지표가 아닌 손실함수의 값을 선택하는 이유가 무엇일까?
그 이유는 신경망 학습에서 미분의 역할이 중요하기 때문이다. 신경망 학습에서 최적의 매개변수(가중치와 편향)를 탐색하기 위해 손실 함수를 가능한 최소로 하는 매개변수 조합을 찾는다. 이때 매개변수의 미분(기울기)를 계산하고, 그 미분값을 단서로 최적의 매개변수를 갱신하는 과정을 반복한다.
즉, 매개변수의 손실 함수의 미분은 매개변수 값이 변할 때 손실 함수가 어떻게 변하냐는 의미이다.
만약 미분값이 음수면 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다. 반대로 미분값이 양수면 매개변수를 음의 방향으로 변화시켜 손실 함수의 값을 줄인다.
정확도를 지표로 삼으면 안되는 이유
정확도를 사용할 경우, 매개변수의 미분 값이 대부분 0이다. 예를 들어 훈련 데이터의 정확도가 32%일 때, 매개변수를 미세하게 조정해도 정확도는 그대로 32%로 일정하게 유지된다. 그러면 매개변수 값에 대한 정확도 지표의 미분값은 0이 되므로 매개변수가 갱신되지 않는다.
또한, 매개변수 조정으로 정확도가 개선된다 해도 연속값이 아닌 33%나 34%로 불연속적인 값을 갖는다. 반면에 손실 함수는 매개변수 값에 따라 연속적으로 변한다.
활성화 함수로 계단함수를 이용하지 않는 이유
이처럼 정확도 지표로 사용할 경우 매개변수의 미세한 변화에 대한 반응을 하지 못하고, 불연속적인 값으로 변화한다. 이는 계단 함수를 활성화 함수로 사용하지 않는 이유와 동일하다.
계단 함수는 신경망 학습이 잘 이루어지지 않는데, 그 이유는 대부분의 장소에서 미분값이 0이기 때문이다. 따라서, 손실 함수를 이용해도 의미가 없어진다.
반면에 시그모이드 함수는 값 뿐만 아니라 미분(기울기)도 연속적인 값으로 변하기 때문에 신경망 학습에서 활성화 함수로 이용된다.
3. 기울기
3.1 개념
편미분
편미분이란 아래 함수와 같이 변수가 개인 함수에 대한 미분을 의미한다. 일반 미분과 크게 다르지 않다. 다만, 특정 변수에 대한 미분을 할 때, 다른 변수는 고정된 상태에서 미분을 한다는 점이 다르다.
기울기(gradient)란, 다른 변수를 고정한 체 변수별로 미분을 하는게 아니라 모든 변수의 편미분을 벡터로 정리한 것을 의미한다. 즉, 양쪽의 편미분을 벡터로 정리한다.
이러한 기울기에 음수를 곱하면 그림과 같이 방향을 가진 벡터들을 확인할 수 있다. 이때 각 기울기는 각 지점 기준에서 가장 낮은 장소(최솟값)를 가리키는 방향이다. 멀어질수록 그 방향의 크기는 커진다.
다시 말하면, 기울기가 가리키는 방향은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향이다.
3.2 경사 하강법
경사법은 기울기를 이용해서 손실 함수의 최솟값을 찾는 방법을 의미한다. 주의할 점은 각 장소에서 함수의 값을 낮추는 방안으로 사용하는 지표는 기울기이다. 그러나 기울기는 가리키는 곳이 실제로 함수의 최솟값을 가리키는 방향인지 보장할 수 없다.
함수의 기울기가 0이 되는 장소는 다양하다. 실제 최솟값(Global Minimum)일수도 있고, 특정 구간에서의 최솟값(Local Minimum)일 수 있다. 즉, 경사법은 기울기가 0이 되는 방향을 찾지만 반드시 함수의 최솟값을 의미하는 것이 아니라 그 방향으로 가야 함수의 값을 줄일 수 있다는 의미이다.
경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동하고 이동한 지점에서 다시 기울어진 방향으로 일정 거리만큼 이동하는 과정을 반복해서 함수의 값을 점차 줄이는 기법이다.
아래는 2개의 변수에 대한 경사법을 수식으로 나타냈다. 여기서 학습률(learning rate, )가 등장한다. 학습률은 한 번의 학습에서 이 미분값을 얼마나 이용할지에 대한 가중치를 의미한다. 즉 기울어진 방향으로 얼마나 이동할지 이동 거리를 조절하는 가중치다. 일반적으로 학습률을 0.01 이나 0.001로 특정값을 사용한다.
왜냐하면, 학습률을 너무 크게 사용하면 이동거리 폭이 커서 값이 발산하거나 특정 값들로 반복될 수 있다. 반면에, 너무 작게할 경우 갱신되는 정도가 너무 작아서 제한된 학습 횟수에 최적의 매개변수를 구하지 못할 수 있다.
3.3 신경망에서의 기울기
반복해서 다루지만, 신경망 학습의 핵심은 최적의 매개변수(가중치와 편향)를 구하는 지표 중 하나인 손실 함수의 최솟값을 구하기 위해 기울기를 이용한다.
따라서, 신경망 학습에서 기울기는 가중치 매개변수에 대한 손실 함수의 기울기로 가중치 매개변수가 변할 때 손실 함수가 변하는 정도를 의미한다.
아래는 2 x 3 크기의 가중치가 , 손실 함수가 인 신경망 기울기 에 대한 수식이다. 여기서 은 을 조금 변경했을 때 손실 함수 이 얼마나 변화하냐를 의미한다. 추가로, 와 의 크기는 2x3으로 동일하다.
위에서 계산된 기울기를 통해 각 원소의 값을 통해 어느 가중치에 따라 손실 함수가 크게 변하는 지도 확인할 수 있고, 각 가중치의 기울기를 통해 어떤 방향으로 이동시켜 갱신할 지 사용된다.
4. 학습 평가
신경망 학습 과정에서 미니배치를 통해 데이터의 일부만 활용하여 손실 함수의 최솟값을 찾아 최적의 매개변수를 탐색한다. 여기서 손실 함수의 값은 훈련 데이터의 미니 배치에 대한 손실 함수의 값이다. 이는 다른 데이터에서도 제대로 작동할 지는 의문이다.
우리의 목표는 학습된 모델이 범용적으로 사용되는 것이다. 따라서, 매개변수를 찾는데 사용된 훈련 데이터가 아닌 시험 데이터로 모델의 정확도를 평가한다.
이때 1 에포크(epoch)별로 훈련 데이터와 시험 데이터에 대한 정확도를 산출한다.
에포크(epoch)란?
에포크는 하나의 단위로 학습과정에서 훈련 데이터를 모두 소진했을 때의 횟수를 의미한다. 예를 들어 60,000 장의 데이터 중 40,000장을 훈련 데이터로 사용한다고 하자. 추가로 신경망을 학습할 100개의 데이터를 미니배치로 학습할 경우, 총 400번 반복하면 모든 훈련 데이터를 소진하게 된다. 이 경우 400회가 1에포크가 된다.
학습 과정 중 병렬 처리와 순차 처리
학습률, 미니배치, 에포크 등 생소한 언어들의 등장으로 학습과정이 어떻게 이뤄지는지 헷갈려서 아래와 같이 정리해보았다.
병렬 처리(미니배치 내부 연산)
- 100장의 이미지가 1개의 미니배치로 묶여서 GPU에 들어가면, GPU는 수많은 코어를 활용해 이 100장에 대한 행렬 곱셈과 오차 계산 등을 동시에(병렬로) 처리한다
- 이 병렬 연산 덕분에 딥러닝의 어마어마한 계산량을 현실적인 시간 내에 처리할 수 있다
순차 처리 (미니배치 간 이동 및 에포크)
- 미니배치 스텝: 첫 번째 미니배치(1
100번 이미지)의 연산이 끝나고 매개변수가 업데이트된 후에야, 두 번째 미니배치(101200번 이미지)가 그 새로운 매개변수를 넘겨받아 학습을 시작한다 - 에포크: 마찬가지로 1에포크(전체 데이터 1회전)가 완전히 끝나서 최종적으로 업데이트된 매개변수가 나와야만, 그 결과물을 바탕으로 2에포크가 시작될 수 있다. 앞의 결과가 뒤의 기준점이 되기 때문에 시간 순서대로 진행될 수밖에 없다
5. 신경망 학습 과정
지금까지 다뤘던 신경망 학습에 대한 순서를 정리하였다. 예시는 6만장 이미지(훈련 4만장, 시험 2만장, 미니배치 100장)에 에포크 10으로 설정했다.
- 매개변수 초기화: 가장 먼저 신경망의 뇌세포 역할을 하는 매개변수(가중치와 편향)를 무작위 값으로 초기화한다
- 미니배치 추출 (Mini-batch): 훈련 데이터 40,000장 중에서 무작위로 100장의 이미지를 뽑는다 (데이터의 순서를 외우는 것을 방지하기 위해 보통 에포크마다 데이터를 무작위로 섞는다)
- 예측 및 손실 함수 계산 (Loss Function): 뽑아낸 100장의 이미지를 신경망에 통과시켜 예측값을 얻어낸다. 그 후, 신경망이 예측한 값과 실제 정답(라벨)을 비교하여 얼마나 틀렸는지를 점수로 매기는데, 이때 사용하는 것이 손실 함수(Loss Function) 이다
- 기울기 계산: 목표는 이 손실 함수의 값(오차)을 최대한 줄이는 것이다. 그러기 위해서는 매개변수를 어느 방향으로 수정해야 오차가 줄어들지 알아야 하는데, 이를 위해 손실 함수를 기준으로 각 매개변수의 기울기(경사) 를 구한다
- 매개변수 업데이트 (경사 하강법): 계산된 기울기를 바탕으로, 오차가 줄어드는 방향(경사가 낮아지는 방향)으로 매개변수를 아주 조금(학습률) 수정한다
- 미니배치 반복 (1 Epoch 완성): 다시 새로운 100장을 뽑아 3~5번의 과정을 반복한다. 이렇게 총 400번(스텝) 을 반복하면 40,000장의 훈련 데이터를 모두 한 번씩 사용하게 되고, 비로소 1에포크(Epoch) 가 끝난다
- 에포크 반복: 1에포크가 끝났다고 학습이 완료되는 것은 아니다. 설정해 둔 10에포크를 채울 때까지 2번~6번 과정을 반복한다. 10에포크가 끝나면 매개변수는 총 4,000번(400스텝 * 10에포크) 업데이트되어 최적의 상태가 된다
- 최종 평가 (Test): 학습이 완전히 끝나면, 모델이 한 번도 본 적 없는 시험 데이터 20,000장을 입력하여 최종적으로 정확도를 평가한다
참고사이트
- 밑바닥부터 시작하는 딥러닝1