주요 딥러닝 개념들을 요약·정리해뒀습니다. 딥러닝 이론을 기초부터 차근히 설명하려는 목적이 ‘아니므로’ 정독하실 필요는 없습니 다. 궁금한 개념이 있다면 가볍게 살펴본 후 바로 다음 장의 경진대회에 도전하시기 바랍니다. 경진대회 문제를 풀다가 언뜻 떠오르지 않는 개념이 있을 때 이 번 장을 참고해주세요.
학습 순서
인공 신경망(Artificial Neural Network)은 인간의 생물학적 신경망과 유사한 구조를 갖는 인공 시스템입니다. 사람 뇌의 기본 단위는 뉴런인데, 인공 신경망은 뉴런 구조에서 영감을 얻어 고안한 것입니다. 딥러닝 구조의 핵심이죠.
다음은 가장 기본적인 신경 세포인 뉴런의 구조입니다.
▼ 뉴런 구조
뉴런의 동작 원리는 이렇습니다. 가지 돌기에서 신호를 받아들이고, 이 신호가 축삭 돌기를 지나 말단까지 전달됩니다. 그런데 신호가 특정 임곗값을 넘으면 말단까지 잘 전달되고, 임곗값을 넘지 않으면 말단까지 전달되지 않습니다. 신호가 말단까지 잘 전달되어야 다음 뉴런의 가지돌기가 그 신호를 이어받습니다. 정리하면 뉴런은 신호를 입력에서 출력으로 전달하는 역할을 합니다.
퍼셉트론
퍼셉트론(Perceptron)은 뉴런의 원리를 본떠 만든 인공 구조입니다. 다음과 같이 뉴런과 유사한 방식으로 동작합니다.
▼ 퍼셉트론
𝑥𝟷, 𝑥𝟸, 𝑥𝟹은 입력 신호, 즉 입력값 입 니 다 . 𝑤𝟷 , 𝑤𝟸 , 𝑤𝟹은 각 입력값에 주어지는 가중치입니다. 이 때 퍼셉트론의 출력값을 구하는 절차는 이렇습니다.
- 입력값과 가중치를 곱합니다.
- 곱한 값들의 총합을 구합니다.
- 총합이 0을 넘으면 1, 넘지 않으면 0을 출력합니다.
3번 단계에서 0 초과 여부에 따라 출력값을 결정하는 역할을 활성화 함수가 합니다(앞의 그림에는 활성화 함수가 생략되었습니다). 활성화 함수는 입력값을 최종적으로 어떤 값으로 변환해 출력할지를 결정하는 함수입니다. 활성화 함수에 대해서는 ‘활성화 함수’에서 다시 알아보겠습니다. 앞의 퍼셉트론 출력값을 수식으로 나타내면 다음과 같습니다.
다시 정리하면, 퍼셉트론은 입력값, 가중치, 활성화 함수로 이루어진 간단한 구조입니다. 입력값이 같더라도 가중치를 조정하면 출력값이 바뀌겠죠. 원하는 출력값을 내보내도록 가중치를 조정해가는 작업을 훈련training 혹은 학습이라고 합니다. 즉, 모델을 훈련시켜 최적인 가중치를 구할 수 있습니다.
하지만 단순 퍼셉트론은 선형 분류 문제밖에 풀지 못한다는 한계가 있습니다. 다음 그림을 보시죠.
▼ 선형,비선형 분류 예시
왼쪽 그림은 선형 분류 예입니다. 직선 하나로 검은색 점과 흰색 점을 구분할 수 있습니다. 반면 오른쪽 그림에서는 직선 하나만으로는 검은색 점과 흰색 점을 구분할 수 없습니다. 구분하려면 곡선(비선형)이 필요합니다. 퍼셉트론은 입력값과 가중치의 선형 결합으로 이루어진 구조입니다. 그래서 퍼셉트론 하나로는 비선형 분류 문제를 풀지 못하는 거죠.
비선형 분류 문제를 풀려면 어떻게 해야 할까요? 퍼셉트론을 여러 층으로 쌓아 다층 퍼셉트론(multi-layer perceptron)을 만들면 해결됩니다. 인공 신경망은 다층 퍼셉트론 구조로 구성돼 있습니다.
신경망
지금까지 실제 신경망과 구분해 설명하기 위해 인공 신경망이라고 했습니다. 앞으로는 간단히 신경망이라 표현하겠습니다. 신경망이라고 해도 인공 신경망을 지칭한다는 점 기억해주세요!
신경망은 입력층, 은닉층(중간층), 출력층으로 구성됩니다.
▼ 신경망 구조
신호는 입력층에서 출발해 은닉층을 거쳐 출력층에 도달합니다. 은닉층은 아예 존재하기 않거나 1개 층 이상 존재할 수 있습니다.
활성화 함수
활성화 함수(Activation Function)는 입력값을 어떤 값으로 변환해 출력할지 결정하는 함수입니다. 입력값과 가중치를 곱한 값들은 활성화 함수를 거쳐 출력값이 됩니다.
신경망에서 이용하는 대표적인 활성화 함수로는 시그모이드 함수와 ReLU 함수가 있습니다.
시그모이드 함수
시그모이드 함수(Sigmoid Function)는 S자 곡선을 그리는 수학 함수입니다. 그래프로 그리면 다음과 같은 모양입니다.
▼ 시그모이드 함수 그래프
보다시피 출력값은 0과 1 사이이며, 입력값이 커질수록 출력값은 1에 가까워지고, 작아질수록 출력값은 0에 가까워집니다.
ReLU 함수
ReLU 함수(Rectified Linear Unit Function)는 입력값이 0보다 크면 입력값을 그대로 출력하고, 입력값이 0 이하이면 0을 출력합니다. 활성화 함수로 시그모이드를 사용할 때보다 대체로 성능이 좋아서 ReLU 함수가 더 많이 활용됩니다.
* 시그모이드 함수의 양극단 기울기(미분값)는 0에 가깝습니다. 그러면 신경망 학습을 거듭할수록 기울기가 0에 수렴할 수 있어 학습이 제대로 이루어지지 않습니다. 이런 현상을 ‘기울기 소실’이라고 합니다. ReLU는 기울기 소실 현상을 일부 해결해 시그모이드에 비해 성능이 좋습니다.
수식과 그래프는 다음과 같습니다.
𝑚𝑎𝑥(0, 𝑥)
▼ ReLU 함수 그래프
Leaky ReLU 함수
Leaky ReLU는 ReLU를 약간 변형한 함수로, 역시 자주 쓰입니다. ReLU와 달리, 입력값이 0 이하일 때 약간의 음숫값을 살려둡니다.
그래프를 보면 ReLU와 음수 부분만 약간 다릅니다. 완전히 0이 아니라 음숫값을 약간 살려둔 거죠.
▼ Leaky ReLU 함수 그래프
경사 하강법
신경망 훈련의 목표는 최적 파라미터를 찾는 것입니다. 여기서 파라미터는 가중치와 편향을 일컫습니다. 최적 파라미터는 손실 함수가 최솟값일 때의 파라미터를 말합니다. 매 훈련 단계마다 손실값이 줄어드는 방향으로 파라미터를 갱신하며 최적 파라미터를 찾습니다.
손실 함수(Loss Function)란 모델 성능이 얼마나 나쁜지를 측정하는 함수입니다. 구체적으로 말하면 모델로 예측한 값과 실젯값의 차이(손실)를 구하는 함수입니다. 예측과 실제의 차이는 당연히 작을수록 좋으니 손실 함수의 값이 작을수록 좋은 모델이라고 볼 수 있습니다. 대표적인 손실 함수로는 회귀문제에서 사용하는 평균 제곱 오차(Mean Squared Error, MSE)와 분류문제에서 사용하는 교차 엔트로피(Cross Entropy)가 있습니다.
정리하면, 신경망 훈련이란 다양한 값을 넣어보면서 손실 함수의 값이 최소가 되는 가중치와 편향을 구하는 작업입니다. 그런데 무작위로 다양한 값을 대입해볼 수는 없겠죠? 시간도 걸리고 비효율적이니까요. 이때 경사 하강법을 이용하면 됩니다.
경사 하강법gradient descent이란 말 그대로 경사를 따라 내려가는 방법을 일컫습니다. 납치를 당해 눈이 가려진 채로 산 중턱에 버려졌다고 가정해봅시다. 너무 추워지기 전에 서둘러 산 아래로 내려가야 살 수 있습니다. 어떻게 해야 할까요? 발바닥 감각에 집중하여 지금 서 있는 위치에서 경사가 가장 가파른 아래 방향으로 조금씩 발을 내딛으면 될 것입니다. ****‘가장 가파른 아래 방향’과 ‘조금씩’. 이 두 단어가 경사 하강법의 핵심 키워드입니다.
경사 하강법의 일반적인 절차는 이렇습니다.
- 현재 위치에서 기울기(경사)를 구합니다.
- 기울기 아래 방향으로 일정 거리를 이동합니다.
- 손실 함수가 최소가 될 때까지,즉 현재 위치의 기울기가 0이 될 때까지 1~2단계를 반복합니다.
* 비용 함수(cost function)라고도 합니다. 엄밀히 말하면 손실 함수는 데이터 하나의 손실을 계산하는 함수고, 비용 함수는 전체 데이터의 손실을 계산하는 함수입니다. 하지만 일반적으로 둘을 엄격하게 구분하지 않고 같은 의미로 봅니다.
* 물론 현실에서는 너무 가파른 곳은 피해야 합니다. 알고리즘을 설명하기 위해 100% 안전하다는 가정 하에 드는 예시입니다.
▼ 경사 하강법
여기서 기울기 방향으로 얼마만큼 이동할지 결정하는 값을 학습률(Learning Rate)이라고 합니다. 즉, 학습률이 가중치를 한 번에 얼마나 갱신할지 결정합니다. 다음의 경사 하강법 수식과 같이 기존 가중치에서 ‘학습률과 기울기를 곱한 값’을 뺀 값이 다음 가중치가 됩니다. 편향 갱신도 마찬가지입니다.
학습률에 따라 훈련 속도가 달라집니다. 산 아래로 내려가는 예를 다시 떠올려보시죠. 한 걸음에 얼마만큼 이동할지 결정하는 게 학습률입니다. 이 값이 작으면 종종걸음으로 내려가고, 크면 큰 보폭으로 내려갑니다. 학습률이 너무 크면 훈련 속도는 빠르지만, 더 빠른 길로 이어지는 지점을 건너뛰어서 최적 가중치를 찾지 못할 수도 있습니다. 반면 학습률이 너무 작으면 훈련 속도가 느려집니다. 학습률은 하이퍼파라미터라서 우리가 직접 설정해줘야 합니다. 상황에 따라 다르지만 보통 0.1~0.0001 범위의 값을 사용합니다.
전체 학습 데이터에서 개별 데이터를 무작위로 뽑아 경사 하강법을 수행하는 알고리즘을 확률적 경사 하강법(Stochastic Gradient Descent, SGD)이라고 합니다. 그런데 신경망 학습 때는 대체로 데이터가 너무 많아서 단순한 확률적 경사 하강법만으로는 학습 효율이 너무 떨어집니다. 그래서 데이터를 미니배치(Mini Batch) 단위로 무작위로 추출해 경사 하강법을 수행하는데, 이를 미니배치 경사 하강법(Mini Batch Gradient Descent)이라고 합니다. 미니배치란 여러 데이터의 묶음을 뜻합니다. 데이터를 하나씩 훈련하기보다는 여러 개를 한 묶음으로 처리하는 게 더 효율적입니다. 미니배치 경사 하강법은 신경망 모델을 훈련하는 주요 알고리즘입니다.
순전파와 역전파
순전파(Forward Propagation)는 신경망에서 입력값이 입력층과 은닉층을 거쳐 출력층에 도달하기까지의 계산 과정을 말합니다. 각 층을 통과할 때마다 입력값에 가중치를 곱해 다음 층으로 출력할 값을 계산합니다.
역전파(Back Propagation)는 순전파의 반대 개념으로, 신경망 훈련에서 가장 중요한 내용입니다.
▼ 순전파와 역전파
순전파와 역전파를 기반으로 신경망 훈련 절차를 설명하면 이렇습니다.
- 순전파를 진행하여 입력값으로부터 출력값을 계산합니다. 여기서 출력값은 우리가 구하고자 하는 타깃 예측값입니다.
- 순전파로 구한 타깃 예측값과 실제 타깃값의 차이( 손실)를 구합니다.
- 손실값을 줄이는 방향으로 가중치의 기울기를 구합니다( 경사 하강법을 생각하면 됩니다).
- 기울기를 바탕으로 가중치를 갱신합니다. 이때 출력층 → 입력층 방향으로 차례로 가중치를 갱신합니다(이 과정을 역전파라고 합니다).
- 갱신된 가중치를 바탕으로 1~4단계를 반복합니다. 반복할수록 타깃 예측값이 실제 타깃값과 가까워집니다. 다시 말해, 손실값이 줄어듭니다.
이렇게 순전파와 역전파를 반복하며 최적 가중치를 찾아 신경망 학습이 이루어집니다. 훈련을 마친(최적 가중치로 설정된) 신경망에 새로운 입력을 주면 실제 타깃값과 가까운 값을 예측해주게 됩니다.
정리하면 순전파는 입력값과 가중치를 활용해 출력값(타깃 예측값)을 구하는 과정이며, 역전파는 손실값을 통해 기울기를 구해 가중치를 갱신하는 과정입니다.
다시 살펴보는 딥러닝 주요 개념 2편에서는 합성곱 신경망(CNN)에 대해 알아봅시다.