BIG_PY
home
Introduce
home
🥧

Chapter 2: 딥러닝과 신경망

Note(Material)

BIG_PY-LEVEL_3-기린그린그런그림-팀-chapter-2.pdf
12781.1KB

Video

이전 챕터에서 배운 내용은?
컴퓨터 비전 파이프라인을 구성하는 각 단계를 살펴봤습니다.
컴퓨터 비전 파이프라인은 (1) 이미지 입력, (2) 전처리, (3) 특징 추출, (4) 학습 알고리즘(분류기) 단계로 구성됩니다. 고전적인 머신러닝 알고리즘에서는 알고리즘에 입력할 특징 벡터의 추출 방법을 사람이 직접 정의해야 하지만, 딥러닝에서는 신경망이 추출과 분류의 역할을 모두 수행하기 때문에 그럴 필요가 없습니다.

2.1 퍼셉트론

신경망은 많은 수의 뉴런으로 이뤄져 있으며 이들 뉴런은 층 모양으로 배열되어 출력을 예측하기 위한 계산을 수행합니다. 이러한 구조를 다층 퍼셉트론(multilayer perceptron)이라고 부릅니다.
다층 퍼셉트론의 그래프 구조에서 각 노드를 뉴런(neuron)이라고 합니다.

2.1.1 퍼셉트론이란

생물학적 뉴런은 여러 개의 수상돌기(dendrite)로부터 서로 다른 세기의 전기적인 신호를 받고 이 신호 세기의 합이 정해진 입계값을 넘으면 시냅스(synapse)를 통해 출력 신호를 보냅니다. 이 출력은 또 다른 뉴런으로 연결되어 같은 과정을 반복합니다.
인공 뉴런은 두 가지 함수를 이용해서 생물학적 뉴런에서 일어나는 현상을 모형화합니다.
가중합(weighted sum): 전체 입력 신호의 합을 구합니다.
스텝 함수(step function): 입력 신호 세기의 합이 임계값을 초과할 때만 출력 신호를 내보냅니다.
결합 가중치란?
입력 특징(x1)(x_1)은 해당 특징이 출력에 미치는 중요도를 나타내는 가중치(w1)(w_1)를 각각 부여받습니다. 큰 가중치는 해당 입력 신호를 증폭하고, 작은 가중치는 입력 신호를 약하게 하는 효과가 있습니다.
결합 가중치를 어떻게 부여하느냐와 어떻게 학습이 이루어지느냐가 신경망 학습의 핵심입니다.
입력 벡터: 뉴런에 입력된 특징 벡터입니다. 보통 XX로 나타내며, 그 요소는 (x1,x2,...xn)(x_1, x_2, ... x_n)와 같이 나타냅니다.
가중치 벡터: 각각의 입력 x1x_1에는 가중치 w1w_1이 부여됩니다. 이 가중치는 출력에 대한 해당 입력의 중요도를 나타냅니다.
뉴런 함수: 입력 신호를 변환하는 계산을 수행하기 위해 가중합 함수와 스텝 활성화 함수가 쓰입니다.
출력: 출력 노드는 퍼셉트론의 예측 결과를 나타냅니다.

가중합 함수

가중합은 선형 결합(linear combination)이라고도 하며, 각 가중치를 곱한 입력값의 합에 편향을 더한 값으로 정의됩니다.
z=xiwi+bz = \sum x_i \sdot w_i + b
z=x1w1+x2w2+x3w3+...+xmwm+bz = x_1 \sdot w_1 + x_2 \sdot w_2 + x_3 \sdot w_3 + ... + x_m \sdot w_m + b
파이썬에서는 가중합을 다음과 같이 계산합니다.
z = np.dot(w.T, X) + b
Python
복사

퍼셉트론에서 편향은 왜 필요한가요?

편향을 조정해서 데이터에 대한 예측이 더욱 정확하도록 직선의 위치를 위아래로 조절할 수 있습니다.
입력층에 항상 값이 1인 입력노드를 하나 추가하면 편향을 추가한 것과 같은 효과를 얻을 수 있습니다. 신경망의 학습 과정에서 편향은 가중치가 하나 추가된 것과 같이 취급하며 가중치와 마찬가지로 비용 함수값이 최소가 되도록 최적화됩니다.

스텝 활성화 함수

신경망의 활성화 함수는 입력 신호의 가중합 (z=xiwi+b)(z = \sum x_i \sdot w_i + b)을 입력받아 이 가중합이 미리 정해진 임계값보다 크면 뉴런을 활성화시킵니다.
파이썬에서는 스텝 함수를 다음과 같이 구현합니다
def step_function(z): if z <= 0: return 0 else: return 1
Python
복사

2.1.2 퍼셉트론은 어떻게 학습을 할까

퍼셉트론은 실수를 통해 배우는 시행착오 전략으로 학습합니다.
볼륨 손잡이로 조절하듯 가중치를 조정해가며 찾는다.
퍼셉트론의 학습 원리는 다음과 같습니다.
1.
뉴런이 입력의 가중합을 계산한 뒤 활성화 함수에 입력해서 예측값 y^\hat y을 결정합니다.
y^=activation(xiwi+b)\hat y = \text{activation}(\sum x_i \sdot w_i + b)
2.
예측값과 실제 레이블값을 비교해서 오차를 계산합니다.
오차=yy^\text{오차} = y - \hat y
3.
오차에 따라 가중치를 조정하는데, 예측값이 너무 높으면 예측값이 낮아지도록 가중치를 조정하고, 너무 낮으면 예측값이 높아지도록 가중치를 조정합니다.
4.
위 과정을 반복합니다.

2.1.3 하나의 뉴런만으로도 복잡한 문제를 해결할 수 있을까?

퍼셉트론은 선형 함수입니다. 이 말은 학습된 뉴런이 데이터를 나누는 경계가 직선이라는 뜻이죠.
예를 들어 어떤 선수가 대학 팀에 들어갈 수 있을지 예측하는 퍼셉트론을 학습하려 한다고 합시다. 작년에 팀에 지원한 선수의 키와 나이 데이터를 모아 팀에 예측할 수 있는지 예측하는 퍼셉트론을 학습하고자 합니다. 합격한 지원자와 합격하지 못한 지원자를 잘 분리하는 직선(straight line)을 정의해야 합니다. 이 직선은 다음과 같은 식으로 정의됩니다.
z=w1+나이w2+bz = \text{키} \sdot w_1 + \text{나이} \sdot w_2 + b
이를 데이터와 함께 그래프로 나타내면 다음과 같습니다.
이 데이터는 선형 분리 가능(linearly separable)한 데이터이기에 구분이 가능했습니다. 그러나 위와 같은 형태가 아니라면 직선으로 분리하기는 쉽지 않습니다.
위 경우에는 직선(퍼셉트론)이 2개가 필요합니다.
이론적으로는 뉴런 수가 많아질수록 실제 데이터에 더 부합하는 신경망의 분류 경계를 만들 수 있습니다. 그러나 뉴런 수를 너무 많이 늘리면 신경망이 학습 데이터에만 최적화되는 과적합(overfit)을 일으킬 수 있습니다.

2.2 다층 퍼셉트론

비선형 데이터셋을 제대로 분류하려면 2개 이상의 직선이 필요합니다.

2.2.1 다층 퍼셉트론의 구조

각 층은 뉴런 nn개로 이루어져 있으며, 층끼리는 가중치 결합을 통해 서로 연결되어 있습니다. 이를 한데 모은 구조가 위 그림에 실린 다층 퍼셉트론(multilayer perceptron, MLP)입니다.
신경망을 구성하는 주요 구성 요소는 다음과 같습니다.
입력층: 이 층에는 특징 벡 터가 담깁니다.
은닉층: 층 모양으로 쌓은 뉴런으로 구성됩니다. 학습 과정에서는 이 층의 입력을 제어하거나 볼 수 없기에 은닉층(hidden layer)이라 부릅니다.
결합 가중치: 노드 간의 연결에는 출력에 해당하는 입력의 영향력을 나타내는 가중치가 부여됩니다. 다이어그램에서 노드(node)를 연결하는 그래프의 엣지(edge)에 해당됩니다.
출력층: 모델의 예측 결과가 출력되는 층입니다. 출력값의 종류는 뉴런에서 사용하는 활성화 함수의 종류에 따라 결정됩니다.

2.2.2 은닉층이란

은닉층은 특징이 실제로 학습되는 곳입니다. 위 그림에서 앞쪽 층의 노드는 비교적 간단한 구상적인 특징(직선)을 학습한 데 비해 뒤로 갈수록 도형 같은 복잡한 패턴의 패턴의 패턴으로 점점 복잡한 특징을 학습합니다. 이러한 개념은 나중에 배우게 될 합성곱 신경망에서 유용하게 쓰입니다.

2.2.3 층수와 층을 이루는 노드 수

신경망을 설계할 때 중요한 결정 사항으로 층수와 층을 이루는 노드 수가 있습니다.
일반적으로 은닉층이 2개 이상인 신경망을 심층 신경망(deep neural network)이라고 부릅니다. 신경망의 층수가 많을수록 복잡한 학습 데이터에 부합할 수 있다는 것이 일반적인 원칙입니다. 하지만 층수가 많다고 좋은 것은 아니죠. 다음과 같은 문제점 등이 있습니다.
모델이 학습 데이터에 지나치게 부합(overfitting)해버리면 새로운 데이터에 대한 예측이 부정확해집니다.
계산 비용이 많이 듭니다.

전결합층

고전적인 다층 퍼셉트론에서 특히 중요시되는 것이 전결합층(fully connected layer, FC)입니다. 아래 그림을 보면 모든 노드가 각기 다음 층의 모든 노드와 연결된 것을 볼 수 있는데요, 이렇게 구성된 신경망을 전결합 신경망(fully connected network)이라고 합니다.

2.2.4 하이퍼파라미터에 대한 몇가지 중요한 사항

은닉층 수: 은닉층 수와 은닉층 뉴런 수는 마음대로 정할 수 있습니다. 그러나 뉴런이 너무 많으면 학습 데이터에는 높은 성능을 보이지만 새로운 데이터에는 정확도가 떨어지는 과적합(overfitting)이 발생합니다.
활성화 함수: 다양한 종류가 있지만, ReLU와 Softmax 함수가 가장 널리 쓰입니다. 은닉층에는 ReLU를 주로 사용하고, 출력층에는 시그모이드(이진 분류) 혹은 Softmax(다중 분류)를 사용합니다.
오차 함수: 신경망의 예측 결과가 실제 레이블값과 얼마나 다른지 측정하는 함수입니다.
최적화 기법: 최적화 알고리즘은 오차가 최소가 되게 하는 가중치를 찾는 역할을 합니다.
배치 크기: 파라미터를 한번 업데이트할 때마다 신경망에 입력되는 학습 데이터 수를 말합니다. 기본값 32로 시작해서 64, 128, 256으로 늘려가는 것을 추천합니다.
에포크 수: 학습 중 전체 학습 데이터가 신경망에 입력되는 횟수를 의미합니다.
학습률: 최적화 알고리즘에서 쓰이는 하이퍼파라미터입니다. 대부분 딥러닝 라이브러리에 지정된 기본값부터 출발하는 것이 좋습니다. 보통 이 기본값에서 자릿수를 하나씩 올리거나 내리는 식으로 조절합니다.

하이퍼파라미터

일반적으로 하이퍼파라미터는 시행착오를 통해 적절한 값을 찾습니다. 하이퍼파라미터의 의미와 작용을 고려하면 원하는 효과를 얻기 위해 어떤 하이퍼파라미터를 조정해야 하는지에 대한 감각을 기를 수 있습니다.

2.3 활성화 함수

활성화 함수는 전이 함수(transfer function) 또는 비선형성(nonlinearity)이라고도 하는데, 그 이유는 활성화 함수가 가중합의 선형 결합을 비선형 모델로 만들기 때문입니다. 활성화 함수가 있어야만 신경망에 비선형성을 도입할 수 있습니다. 활성화 함수가 없으면 모델은 그냥 숫자값을 출력할 뿐인 선형함수가 되어버립니다.

2.3.1 선형 전달 함수

항등 함수(identity function)라고도 하는 선형 전달 함수(linear transfer function)는 입력을 그대로 출력하는 함수로, 실질적으로 활성화 함수가 없는 효과를 냅니다.
activation(z)=z=wx+b\text{activation}(z) = z = wx+b

2.3.2 헤비사이드 스텝 함수(이진 분류)

스텝 함수(step function)는 0과 1 두가지 값만 출력합니다. 입력이 x>0x > 0이면 발화하고(1 출력), 그렇지 않으면 발화하지 않습니다(0 출력).

2.3.3 시그모이드/로지스틱 함수

이 함수는 이진 분류에서 두 클래스의 확률을 구할 때 자주 사용합니다.
σ(z)=11+ez\sigma(z) = \frac {1} {1+e^{-z}}
파이썬에서는 시그모이드 함수를 다음과 같이 구현할 수 있습니다
import numpy as np def sigmoid(x): return 1 / (1+np.exp(-x))
Python
복사

2.3.4 소프트맥스 함수

소프트맥스 함수는 시그모이드 함수의 일반형입니다. 소프트맥스 함수는 3개 이상의 클래스를 대상으로 한 분류에서 각 클래스의 확률을 구할 떄 사용합니다.
σ(xj)=exjiexj\sigma(x_j)= \frac {e^{x_j}} {\sum_i e^{x_j}}

2.3.5 tanh 함수

tanh 함수(하이퍼볼릭 탄젠트 함수)는 시그모이드 함수를 이동시킨 버전입니다. tanh 함수는 -1부터 1 사이의 값을 출력합니다. 이 함수는 시그모이드 함수에 비해 은닉층에서 더 좋은 성능을 냅니다. 또한 데이터를 중앙에 모으는 효과가 있어 다음 층의 학습에 유리합니다.
tanh(x)=sinh(x)cosh(x)=exexex+ex\tanh(x) = \frac {\sinh(x)} {\cosh(x)} = \frac {e^x - e^{-x}} {e^x + e^{-x}}

2.3.6 ReLU 함수

정류 선형 유닛(rectified linear unit, ReLU) 활성화 함수는 입력이 -보다 크면 노드를 발화합니다. 입력이 0보다 작으면 발화하지 않습니다. 하지만 0보다 큰 입력에 대해서는 출력값이 입력값에 비례해서 커집니다.
f(x)=max(0,x)f(x) = \max(0, x)
ReLU는 최고 성능의 활성화 함수로 평가받고 있는데요, 다양한 상황에서 잘 작동하며 은닉층에서 다른 함수보다 더 높은 성능을 보이기 때문입니다.
파이썬 코드로 나타내면 다음과 같습니다
def relu(x): if x < 0: return 0 else: return x
Python
복사

2.3.7 누설 ReLU 함수

ReLU 함수의 한 가지 단점은 xx가 음수일 때 기울기가 0이라는 점입니다. 누설 ReLU(Leaky ReLU function)는 이 문제를 해결할 수 있는 ReLU 함수의 변종입니다. 이 함수는 x<0x < 0인 구간에서 함수값이 0이 되지 않도록 하는데, 작은 기울기(약 0.01)로 함수값을 음수로 만듭니다. 드물게 사용되지만 대부분의 경우 ReLU보다 높은 성능을 보입니다.
f(x)=max(0.01x,x)f(x) = \max(0.01x, x)
파이썬 코드로 나타내면 다음과 같습니다.
def leaky_relu(x): if x < 0: return x * 0.01 else: return x
Python
복사

하이퍼파라미터 경보

활성화 함수의 종류가 많아 무엇을 골라야 할지 어렵게 느껴질 수 있는데, 다음을 기준 삼아 골라보면 좋습니다.
은닉층: 은닉층에서는 대부분의 경우 ReLU 함수(또는 Leaky ReLU)를 사용하면 됩니다. 그 이유는 다른 활성화함수에 비해 계산적으로 유리하며, 다른 함수에 비해 함수값이 포화(기울기가 0에 가까워짐)되지 않기 때문에 기울기 소실 문제를 일으킬 가능성이 낮습니다.
출력층: 상호 배타적인 분류 문제라면 대개의 경우 소프트맥스 함수가 적합합니다. 다만 회귀 문제일 경우 활성화 함수를 사용하지 않아도 됩니다.

2.4 순방향 계산

특징의 선형 결합을 활성화 함수에 통과시키는 이 계산 과정을 순방향 계산(feedforward process)이라고 합니다. 순방향 계산이라는 용어는 입력층에서 출력층 방향으로 정보가 흘러가기 때문에 붙은 이름입니다.
이 과정은 가중합과 활성화 함수를 연이어 계산하는 과정을 반복하는 형태로 되어있으며, 신경망의 각 층을 지나 예측에 이르는 과정을 나타냅니다.

2.4.1 순방향 계산 과정

위 그림에서 순방향 계산은 다음과 같이 진행한다.
a1(1)=σ(w11(1)x1+w21(1)x2+w31(1)x3) a2(1)=σ(w12(1)x1+w22(1)x2+w32(1)x3) a3(1)=σ(w13(1)x1+w23(1)x2+w33(1)x3)\begin{align*} a^{(1)}_1 &= \sigma(w^{(1)}_{11}x_1 + w^{(1)}_{21}x_2 + w^{(1)}_{31}x_3 ) \\ \space \\ a^{(1)}_2 &= \sigma(w^{(1)}_{12}x_1 + w^{(1)}_{22}x_2 + w^{(1)}_{32}x_3 ) \\ \space \\ a^{(1)}_3 &= \sigma(w^{(1)}_{13}x_1 + w^{(1)}_{23}x_2 + w^{(1)}_{33}x_3 ) \end{align*}
그 다음 두 번째 층에서 a1(2),a2(2),a3(2),a4(2)a^{(2)}_1, a^{(2)}_2, a^{(2)}_3, a^{(2)}_4를 같은 식으로 계산하고, 마지막 세 번째 층에서 예측 결과 y^\hat y를 다음과 같이 계산합니다.
y^=a1(2)=σ(w11(3)a1(2)+w12(3)a2(2)+w13(3)a3(2)+w14(3)a4(2))\hat y = a^{(2)}_1 = \sigma(w^{(3)}_{11}a^{(2)}_1 + w^{(3)}_{12}a^{(2)}_2 + w^{(3)}_{13}a^{(2)}_3 + w^{(3)}_{14}a^{(2)}_4)
하지만 은닉층의 노드가 수백개가 넘어간다면 이렇게 일일히 하나씩 계산하기엔 너무 많습니다. 이때는 행렬을 이용하면 여러 개의 입력을 한번에 계산할 수 있습니다.
y^=σW(3)σW(2)σW(1)(x)\hat y = \sigma \sdot W^{(3)} \sdot \sigma \sdot W^{(2)} \sdot \sigma \sdot W^{(1)} \sdot (x)
위 식은 아래 행렬 형태를 나타낸 것입니다.
y^=σ[w113w123w133w143]σ[w112w122w132 w212w222w232 w312w322w332 w412w422w432]σ[w111w121w131 w211w221w231 w311w321w331][x1 x2 x3]\hat y = \sigma \begin{bmatrix} w^3_{11} & w^3_{12} & w^3_{13} & w^3_{14} \end{bmatrix} \sdot \sigma \begin{bmatrix} w^2_{11} & w^2_{12} & w^2_{13} \\ \space \\ w^2_{21} & w^2_{22} & w^2_{23} \\ \space \\ w^2_{31} & w^2_{32} & w^2_{33} \\ \space \\ w^2_{41} & w^2_{42} & w^2_{43} \end{bmatrix} \sdot \sigma \begin{bmatrix} w^1_{11} & w^1_{12} & w^1_{13} \\ \space \\ w^1_{21} & w^1_{22} & w^1_{23} \\ \space \\ w^1_{31} & w^1_{32} & w^1_{33} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ \space \\ x_2 \\ \space \\ x_3 \end{bmatrix}

2.4.2 특징 학습

각 층에서 새로 만들어진 특징은 볼수도 없고 제어할 수도 없고 이해할 수도 없는 것으로, 신경망이 부리는 마술의 일종이라고 보면 됩니다. 이 때문에 은닉층이라고 부르는 것입니다. 우리는 최종 출력된 예측 결과를 보고 만족스러운 정확도가 나올 때까지 파라미터를 조정하는 것 뿐입니다.
위 그림에서는 방 수, 면적, 지역의 숫자를 통해 은닉층에 있는 a1,a2,a3,a4a_1, a_2, a_3, a_4 각각에서 특징을 추출하여 최종 예측 가격을 산출하는 과정을 나타냅니다.

2.5 오차 함수

오차 함수는 비용 함수(cost function) 또는 손실 함수(loss function)라고도 부릅니다. 딥러닝 관련 문헌에서는 이들 용어를 같은 의미로 사용되곤 합니다.

2.5.1 오차 함수란

오차 함수(error function)는 신경망의 예측 결과가 바람직한 출력과 비교해서 얼마나 ‘동떨어졌는지’ 측정하는 수단입니다. 손실값이 크다면 모델의 정확도가 낮다는 뜻이죠. 손실이 클수록 정확도를 개선하기 위해 모델을 더욱 많이 학습시켜야 합니다.

2.5.2 오차 함수가 왜 필요한가

촤적화 문제는 오차 함수를 정의하고 파라미터를 조정해서 오차 함수가 계산하는 오차를 최소가 되도록 하는 문제입니다. 최적화 문제의 최종 목표는 오차 함수값이 최소가 되게 하는 최적의 파라미터(가중치)를 찾는 것입니다. 오차를 최소로 만드는 과정을 오차 함수 최적화(error function optimization)라고 합니다.

2.5.3 오차의 값은 언제나 양수다

만약 첫 번째 점의 오차가 -10이고, 두 번째 점의 오차가 10이라면 평균 오차는 0이 될 것입니다. 숫자 상으로는 완벽하지만, 사실은 그렇지 않죠. 오차가 서로 상쇄되지 않게 값을 양수로 바꾸어 계산하는 이유입니다.
또한 같은 예측 결과라 하더라도 오차 함수에 따라 오차값이 달라지며 그만큼 모델의 성능에도 영향을 줍니다.

2.5.4 평균제곱오차

평균제곱오차(mean squared error, MSE)는 출력값이 실수인 회귀 문제(주택 가격 예측과 같은)에서 널리 사용하는 오차 함수입니다. 다음 식처럼 각 데이터 점의 오차를 제곱해서 평균을 구합니다.
E(W,b)=1Ni=1N(y^iyi)2E(W,b) = \frac {1} {N} \sum^N_{i=1} (\hat y_i - y_i)^2
오차를 제곱하기 때문에 오차가 항상 양의 값이며 오차값이 그대로 결과에 대한 평가가 되므로 계산이 간편해집니다. 위 식에서 각 notion이 의미하는 것은 다음과 같습니다
E(W,b)E(W,b)
WW
bb
NN
y^i\hat y_i
yiy_i
(y^iyi)( \hat y_i - y_i )
→ 오차 함수를 의미합니다. EE 대신 JJ로 나타내기도 합니다.
→ 가중치 행렬을 나타냅니다. θ\theta로 나타내기도 합니다.
→ 편향 벡터입니다.
→ 학습 데이터의 수 입니다.
→ 출력된 예측 결과입니다. hw,b(X)h_{w,b}(X)로 나타내기도 합니다.
→ 실제 정답(레이블값) 입니다.
→ 일반적으로 오차 또는 잔차라고 부릅니다.
MSE는 오차를 제곱하기 때문에 예외값이 민감합니다. 하지만 이 민감도가 유용할 수도 있습니다. 예를 들어 주가를 예측하는 모델에서 예외값을 논리적으로 설명하려 할 때는 예외값에 대한 민감성이 도움이 됩니다.
평균값 보다는 중위값이 중요한 경우도 있는데, 이때는 평균제곱오차가 아닌 절대제곱오차(mean absolute error, MAE)를 쓰는 것이 적합합니다. 절대제곱오차는 오차의 절대값의 평균입니다.
E(W,b)=1Ni=1Ny^iyiE(W,b) = \frac {1} {N} \sum^N_{i=1} |\hat y_i - y_i|

2.5.5 교차 엔트로피

교차 엔트로피(cross-entropy)는 두 확률 분포 간의 차이를 측정할 수 있다는 특성 덕분에 주로 분류 문제에서 많이 사용됩니다.
학습 이미지 중 개가 찍힌 이미지 한 장을 세 가지 클래스(개, 고양이, 물고기)중 하나로 분류하려고 합니다. 이 이미지의 실제 확률 분포는 다음과 같다고 합시다.
이 실제 확률 분포를 해석하자면, 이 이미지가 A(cat)에 속할 확률은 0%이며, B(dog)에 속할 확률은 100%, C(fish)에 속할 확률은 0%이라고 볼 수 있습니다. 당연하지만 해당 이미지에서 실제 어떤 클래스에 속해 있는지는 직관적으로 알 수 있기 때문에 위와 같은 확률 분포가 나타납니다.
머신러닝 모델의 예측 결과로 얻은 확률 분포가 다음과 같다고 합시다.
그렇다면 머신러닝 모델이 예측한 확률 분포와 실제 예측한 확률 분포와는 얼마나 가까울까요? 교차 엔트로피는 바로 이 거리를 평가할 수 있습니다.
yy가 대상 확률 분포, pp가 예측 확률 분포, mm이 클래스 수일 때 교차 엔트로피는 다음과 같습니다.
E(W,b)=i=1my^ilog(pi)E(W,b) = - \sum^m_{i=1} \hat y_i \log (p_i)
위 예제의 손실은 교차 엔트로피로 다음과 같이 계산할 수 있습니다.
E=(0.0log(0.2)+1.0log(0.3)+0.0log(0.5))=1.2E = - (0.0 \sdot \log(0.2) + 1.0 \sdot \log(0.3) + 0.0 \sdot \log(0.5)) = 1.2
이런 식으로 예측한 확률 분포가 실제 확률 분포와 얼마나 차이가 나는지 평가할 수 있습니다.
위 예제는 샘플이 하나일 경우에 해당되는 예시이며, 모든 학습 샘플 nn에 대해서는 다음과 같이 교차 엔트로피를 계산할 수 있습니다.
E(W,b)=i=1nj=1my^ijlog(pij)E(W,b) = - \sum^n_{i=1}\sum^m_{j=1} \hat y_{ij} \log (p_{ij})

2.5.6 오차와 가중치의 관계

오차가 최소가 되게 하려면 어떻게 해야 할까요?
다음과 같이 입력이 하나인 퍼셉트론을 예시로 들어봅시다.
입력 x=0.3x = 0.3, 레이블(정답) y=0.8y=0.8이라고 가정해보죠. 이 퍼셉트론의 예측 결과 y^\hat y은 다음과 같이 계산됩니다.
y^i=wx=w0.3\hat y_i = w \sdot x = w \sdot 0.3
그리고 오차(error)를 계산합니다.
오차=y^iyi=(wx)y=w0.30.8\begin{align*} 오차 &= |\hat y_i - y_i| \\ &= |(w \sdot x) - y| \\ &= |w \sdot 0.3 - 0.8| \end{align*}
위 식을 자세히 살펴보면, 변화할 수 있는 값은 오차와 가중치 뿐입니다. 즉 오차를 최소화하게 하려면 가중치를 조절해야 하는 것입니다.
가중치의 변화에 대한 오차 함수값의 변화를 그래프로 나타내면 다음과 같은 결과를 얻을 수 있습니다.
이 목표 지점을 찾아가는 과정은 최적화 알고리즘(optimization algorithm)을 이용해서 반복적으로 가중치를 수정해나가는 것입니다.

2.6 최적화 알고리즘

신경망의 학습 과정을 정리하면 다음과 같습니다.
1.
여러 개의 표본(학습 데이터셋)을 신경망에 입력해 순방향 계산을 통해 예측 결과를 계산한다.
2.
표본의 정답과 비교해서 오차를 계산합니다
3.
오차값이 최소가 될 때까지 신경망의 모든 가중치를 조정합니다.
이를 위해 최적의 가중치를 찾아줄 알고리즘을 만들어야 합니다.

2.6.1 최적화란

오차 함수의 가장 큰 이점은 신겨망의 학습을 오차를 최소화하는 최적화 문제로 바꿀 수 있다는 것입니다.
어떤 값이 최소(혹은 최대)가 되도록 파라미터를 수정하는 것을 최적화(optimization)라고 합니다.
신경망에서 오차 함수값을 최적화하려면 가중치와 편향을 수정해가며 최적 가중치(optimal weight)를 찾아야 합니다.
가중치가 2개라면 어떻게 최적화가 진행될까?
위 그림에서 Goal weight(global minimum)을 찾는 것과 같습니다. 사람의 인지감각으로는 3차원 이상의 공간을 이해하기 어려워 가중치가 3개 이상인 것 부터는 그림으로 표현하긴 어렵습니다.

2.6.2 배치 경사 하강법

경사(gradient, 미분(derivative)이라고도 한다)의 일반적인 정의는 주어진 지점에서 곡선에 대한 접선이 갖는 변화율 또는 기울기를 알려주는 함수입니다.
경사 하강법(gradient descent)은 간단히 설명하면 가중치를 반복적으로 수정하며 오차 함수의 최저점에 도달할 때까지 오차 함수의 언덕을 내려가는 과정입니다.

경사하강법의 원리

경사 하강법의 원리를 시각적으로 나타내볼까요? 아래 그림처럼 A는 무작의로 결정된 위치고, 우리의 목표는 함수 그래프의 언덕을 내려가 오차 함수값이 최소가 되는 가중치 w1w_1w2w_2에 도달하는 것입니다.
오차 함수 그래프의 언덕을 내려가려면 한 걸음마다 다음 두가지를 알아야 합니다.
걸음의 방향(경사)
보폭(학습률)

걸음의 방향

언덕 아래로 내려가러면 먼저 경사가 가장 가파른 방향으로 걸음을 내딛으면 됩니다. 이때 어느 방향으로 가야 할지 정해야겠죠? 가중치 (dEdw)(\frac {dE} {dw})에 대한 오차의 미분을 계산해서 가중치를 수정하는 방향으로 걸음을 내딛으면 됩니다. 이 과정을 경사 하강법(gradient descent)라고 합니다.

보폭(학습률 α\alpha)

학습률(learning rate)은 경사 하강법 수행 중 가중치를 수정할 때 이동할 보폭에 해당하며, 대부분의 경우 그리스 문자 알파(α\alpha)로 나타냅니다. 이 학습률은 학습할 때 가장 중요한 하이퍼파라미터 중 하나입니다. 학습률의 값이 크면 신경망의 학습이 빠르게 진행되고, 값이 작으면 학습 속도가 느려집니다. 그러면 무조건 큰게 좋지 않을까? 라는 생각을 할 수도 있으나, 그렇지만은 않습니다.
위 그림처럼 학습률(즉, 보폭)이 너무 크면 A,B,C 지점으로 이동하는 것 처럼 오차값이 진동(oscillating)하기만 할 뿐 감소하지 않게 됩니다.
즉, 학습률이 아주 작으면 오차의 최소점에 도달할 수 있지만 학습 시간이 오래 걸리며, 학습률이 너무 크면 오차가 진동하여 학습이 잘 진행되지 않게 됩니다.

방향과 보폭 합치기

방향(경사)과 보폭(학습률)을 곱하면 각 단계의 가중치 변화량을 계산할 수 있습니다.
Δwi=αdEdwi\Delta w_i = -\alpha \frac{dE}{dw_i}
좌변에서 마이너스가 붙은 이유는 경사는 항상 올라가는 방향이기 때문에, 반대 방향을 의미하는 마이너스를 붙인 것입니다. 즉, 경사의 반대 방향으로 이동해야 하기 때문입니다.
wnext-step=wcurrent+Δww_{\text{next-step}} = w_{\text{current}} + \Delta w

배치 경사 하강법의 문제점

1.
손실 함수 중에는 우리가 본 그래프처럼 사발 모양이 아닌 함수도 있습니다.
위 그림처럼 그래프 전체의 극소점이 아닌 지역 극소점(local minima)에 빠질 수 있습니다. 우리의 목표는 지역 극소점이 아닌 그래프 전체의 최소값에 해당하는 전역 최소점(global minima)입니다.
2.
경사를 계산하기 위해 매번 훈련 데이터 전체를 사용해야 합니다.
L(W,b)=1Ni=1N(y^iyi)2L(W,b) = \frac {1} {N} \sum^N_{i=1} (\hat y_i - y_i)^2
위 식을 살펴보면, 모든 훈련 데이터 수(N)(N)를 사용해야 합니다. 만약 훈련 데이터 수가 1억개라면, 가중치를 한번 수정하기 위해 1억 개의 손실값을 합해야 합니다.
위 두가지 문제를 해결하기 위해 고안된 것이 확률적 경사 하강법 입니다.

2.6.3 확률적 경사 하강법

확률적 경사 하강법(stochastic gradient descent, SGD)은 무작위로 데이터 점을 골라 데이터 점 하나를 이용해 가중치를 수정합니다.
이 방법은 다양한 시작점을 만들 수 있고, 여러 지역 극소점을 발견할 수 있습니다. 이렇게 찾는 지역 극소점 중 가장 작을 값을 전역 최소점으로 삼으면 됩니다.
배치 경사 하강법에는 경사르 계산하기 위해 훈련 데이터 전체를 입력하므로 오차 함수를 따라 내려가는 경로가 매끄럽거나 직선인 경우가 많습니다.
확률적 경사 하강법에서는 전역 최소점으로 내려가는 경로가 똑바르지 않고 지그재그 모양으로 나아갑니다.
최소점에 다가갈수록 그 언저리를 맴돌 뿐 정확하게 전역 최소점에 다다르지 못합니다.
다만 이 부분은 전역 최소점에 다가가는 정도로만 해도 충분하기 때문에 큰 문제가 되진 않습니다.
거의 대부분 확률적 경사 하강법이 배치 경사 하강법보다 빠르고 높은 성능을 보입니다.

2.6.4 미니배치 경사 하강법

미니배치 경사 하강법(mini-batch gradient descent, MB-GD)은 배치 경사 하강법과 확률적 경사 하강법의 절충안입니다.
경사를 계산할 때 모든 훈련 데이터나 하나의 훈련 데이터만 사용하는 대신, 훈련 데이터를 몇개의 미니배치(mini-batch, 미니배치의 크기는 256이 흔하다고 함)로 분할한 다음 이 미니배치로부터 경사를 계산합니다.
외에도 다양한 경사 하강법의 변종들이 있으며 지금도 활발하게 연구되고 있습니다. 잘 알려진 변종들은 다음과 같습니다.
네스테로프 가속 경사
RMSprop
Adam(자주 쓰임)
Adagrad

2.7 역전파 알고리즘

지금까지 신경망 학습은 다음 세 단계를 반복하는 과정이라고 배웠습니다.
1.
순방향 계산: 선형 결합(가중합)을 계산하고, 활성화 함수에 그 값을 대입하여 출려값(y^)(\hat y)을 계산합니다.
y^=σW(3)σW(2)σW(1)(x)\hat y = \sigma \sdot W^{(3)} \sdot \sigma \sdot W^{(2)} \sdot \sigma \sdot W^{(1)} \sdot (x)
2.
출력값과 정답을 비교해서 오차 함수 또는 손실 함수를 계산합니다.
E(W,b)=1Ni=1Ny^iyiE(W,b) = \frac {1} {N} \sum^N_{i=1} |\hat y_i - y_i|
3.
경사 하강법 알고리즘을 사용해서 Δw\Delta w를 계산하고 오차 함수값을 최적화합니다.
Δwi=αdEdwi\Delta w_i = -\alpha \frac{dE}{dw_i}
여기서 Δw\Delta w를 신경망 전체에 반대 방향으로 전파(역전파)하며 가중치를 수정합니다.
Wnew=Woldα(ErrorWx)W_{\text{new}} = W_{\text{old}} - \alpha \left( \frac {\partial Error} {\partial W_x}\right)

2.7.1 역전파란

역전파(backpropagation) 또는 역방향 계산(backward pass)은 가중치 수정을 위해 가중치에 대한 오차의 미분 dEdwi\frac{dE}{dw_i}를 출력층부터 첫 번째 층까지 전달하는 것을 말합니다.
다층 퍼셉트론에서는, 총 오차의 변화를 계산하려면 미분의 연쇄 법칙(chain rule)을 사용해야 합니다.
위 그림에서 처럼 dEdx\frac{dE} {dx}를 계산하기 위해 이전의 미분값을 곱하는 형식으로 진행됩니다.
그림 2.35에서는 다음과 같은 방식으로 w1,3(1)w^{(1)}_{1,3}의 가중치를 업데이트 하기 위한 미분을 진행할 수 있습니다.
dEdw1,3(1)=dEdw2,1(4)×dw2,1(4)dw2,2(3)×dw2,2(3)dw3,2(2)×dw3,2(2)dw1,3(1)×\frac{dE}{dw^{(1)}_{1,3}} =\frac{dE} {dw^{(4)}_{2,1}} \times \frac{dw^{(4)}_{2,1}} {dw^{(3)}_{2,2}} \times \frac{dw^{(3)}_{2,2}} {dw^{(2)}_{3,2}} \times \frac{dw^{(2)}_{3,2}} {dw^{(1)}_{1,3}} \times
위 식을 다음과 같이 풀어서 설명할 수 있습니다
엣지 w1,3(1)w^{(1)}_{1,3}에 전달되는 오차 = 오차가 엣지 4에 미치는 영항 ×\times 엣지 3에 미치는 영향 ×\times 엣지 2에 미치는 영향 ×\times 목표 엣지에 미치는 영향
엣지 w1,3(1)에 전달되는 오차=오차가 엣지 4에 미치는 영항×엣지 3에 미치는 영향×엣지 2에 미치는 영향×목표 엣지에 미치는 영향엣지\space w^{(1)}_{1,3}에\space전달되는\space오차 = 오차가 \space엣지 \space4에 \space미치는 \space영항 \times 엣지 \space3에 \space미치는 \space영향 \times 엣지 \space2에 \space미치는 \space영향 \times 목표 \space엣지에 \space미치는 \space영향