본문 바로가기

ML,DL

밑러닝 - (3)

신경망의 학습

신경망을 학습시킨다는 것은 Training Data를 활용해 신경망의 파라미터(Weight/Bias)의 최적값을 구할 수 있도록 하는 것이다.

 

신경망 학습(Deep Learning)을 통한 방식은 사람이 직접 세운 규칙을 통해 문제를 해결하는 Rule-Based 방식, 그리고 사람이 고안한 알고리즘과 기계가 데이터로부터 특징을 포착하는 방식을 결합한 기계 학습(Machine Learning) 방식과는 다르게

온전히 학습 데이터로 부터 신경망이 스스로 학습해 문제를 해결해 나가는 방식이라는 점에서 차이점이 존재한다.

데이터

신경망을 학습시키기 위한 데이터를 훈련 데이터(training data)라고 하고, 훈련 데이터를 통해 학습된 신경망의 성능 평가를 위한 데이터셋을 시험 데이터(test data)라고 한다.

(Validation Data도 존재하지만, 추후에 다루도록 하겠습니다.)

 

정확한 성능의 평가를 위해 Training Data와 Test Data는 서로 상호 배타적인 데이터로 구성되어야 하며,

학습에 사용되는 training data가 고르게 구성되어있지 않고 비슷한 데이터로만 구성되어 있다면,

특수한 경우에만 초점이 맞춰진 신경망으로 학습되기 때문에 Overfitting(과적합)문제가 발생할 가능성이 높다.

손실 함수(Loss Function / Objective Function)

신경망의 파라미터를 학습시키는 과정에서, 어떻게 학습을 시켜나갈지에 대한 가이드를 제시할 수 있는 객관적인 지표가 필요하다.

이를 위해 사용되는 지표가 바로 Loss Function인 것이다. Loss Function의 값을 기준으로 학습이 원하는 방향으로 잘 이뤄지고 있는지 아닌지에 대해 가늠해 볼 수 있다.

 

Sum of Squared Error(SSE / 오차제곱합)

가장 일반적으로 사용되는 loss function으로, 각 데이터와 데이터의 평균간의 Error의 제곱합을 계산한다. 수식은 다음과 같다.

 

$SSE= \sum_{k=1}^{n}(y_{k} - t_{k})^{2}$

여기서 $y_{k}$는 신경망의 output(출력값)이고 $t_{k}$는 실제 정답값이다.

 

Cross Entropy(CE)

또 다른 loss function은 cross entropy이다. 수식은 다음과 같다.

 

$CE = -\sum_{k=1}^{n} t_{k} \text{log}y_{k}$

 

주로 분류 문제를 위한 신경망에서 loss function으로 사용되는데, 그 이유는 수식의 의미를 잘 생각해보면 알 수 있다.

  • y  = [0.1, 0.1, 0.8]
  • t = [0, 0, 1]

한 분류 문제의 결과가 다음과 같다고 해보자,

 

cross entropy의 수식대로 loss값을 계산하게 되면 t가 0인 경우에는 결국 0의 값을 갖게 되므로, 0인 경우는 고려할 필요가 없다.

즉, t=1인 경우만 고려하면 되는 간단한 수식이다. t=1인 경우에 y=0.8의 값을 갖게되고 CE값은 $-\text{log}(0.8)$을 갖게된다.

 

또 다른 경우에서,

  • y = [0.8, 0.1, 0.1]
  • t = [0, 0, 1]

의 결과를 갖는 다면, 이 경우에 CE값은 $-\text{log}(0.1)$을 갖게 된다.

 

Log함수의 특성상 1에 가까워 질수록 Log값이 0에 가까워지고(loss가 적고)

0에 가까워 질수록 Log값이 음의 무한대에 가까워진다.(loss가 커진다.

 

따라서, 정답 레이블(t=1)에 해당하는 신경망의 Output(출력값)이 1에 가까울 수록 적은 loss가 계산되는 것이다.

 

이를 직접 구현해서 확인해보면, 정답 레이블과 동일한 index의 y값의 확률값이 높을 수록 적은 loss가 계산되는 것을 알 수 있다.

# CE
def cross_entropy(y,t):
    delta = 1e-9
    return -np.sum(t*np.log(y+delta))
    
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0])
print(cross_entropy(y,t))

y2 = np.array([0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0])
print(cross_entropy(y2,t))

# 0.510825622099324
# 2.3025850829940455

*`cross_entropy`함수를 구현할 때, `delta`값을 더해준 이유는 log0이 되어 -inf값이 되는 것을 방지하기 위함이다.

Mini-Batch 학습

각각 K개의 label이 존재하는 N개의 데이터가 있다고 할 때, 이에 대한 cross entropy loss값의 계산은 다음과 같이 할 수 있다.

$E = -\frac{1}{N} \sum_{n=1}^{N} \sum_{k=1}^{K} t_{nk} \text{log} y_{nk}$

 

위 수식을 사용해 N개의 데이터에 대한 cross entropy loss의 평균값을 구할 수 있고, 이를 지표로 삼아 학습을 진행해 나갈 수 있다.

하지만 N의 크기가 커질수록(가령 100억개의 데이터), 전체 데이터에 대한 loss값을 일일이 계산하는 것은 막대한 시간과 비용이 소모될 것이다.

 

이를 위해 정확한 loss값은 아닐지라도, 일부 sample을 통해 근사한 loss값을 사용해 학습을 진행하는 방식이 있는데,

이것이 mini-batch 학습이다.

 

전체 데이터 중에서, mini-batch의 크기 만큼의 샘플을 무작위로 추출해 이에 대한 Loss값을 계산해 parameter업데이트에 사용하게 되는 것이다.

손실 함수를 사용하는 이유

데이터의 분류를 예측하는 문제에서, 우리는 데이터 분류의 정확도를 높이는 것을 중요시 하게된다.

그렇다면 정확도를 학습의 척도로 삼아서 정확도를 높이는 방식으로 신경망을 학습시키면 되는 것이 아닌가? 라고 생각할 수 있다.

 

하지만 그럼에도 불구하고 손실 함수를 따로 사용하는 것에 대한 이유가 존재한다. 신경망은 미분을 통해 학습되는데, 정확도를 이를 위한 지표로 사용하게 된다면 불연속적인 값으로 계산되기 때문에 미분에 활용할 수 없게된다.

 

예를 들어, 100개의 데이터 중에서 32개의 데이터에 대해 정확한 분류를 해낸다면 정확도는 0.32이고 33개의 데이터에 대한 정확도는 0.33일것이다. 하지만 0.32와 0.33사이의 무수한 수들에 대해서는 전혀 고려할 수 없게 되는 것이다.

 

동일한 이유로 신경망의 활성화 함수에서 계단 함수(step function)과 같은 불연속 함수는 미분 과정에 사용할 수 없기 때문에 사용되지 않는다.

미분

신경망의 학습은 신경망에 필요한 parameter인 weight와 bias를 주어진 데이터와 목적에 맞게 조절해 나가는 과정이라고 이해할 수 있다

이 과정에서 어떤 parameter를 사용하였을때 가장 최적의 결과가 나오는지를 확인하기 위해서 신경망의 학습을 진행해 나가는 것이다.

 

어떤 한 점(parameter)을 사용해서 계산된 loss값이 최소가 되기 위해서는 어떤 방향으로 얼마나 움직여야 하는지, 즉 어떤 한 점에서의 미분값을 통해서 parameter를 업데이트 해나가기 때문에 신경망의 학습에서 미분의 역할은 매우 중요하다.

 

그리고 이와 같이 미분을 사용해서 신경망 내의 parameter를 업데이트해 최적의 값을 찾아가는 학습 과정을 경사 하강법(Gradient Descent)라고 한다.

경사 하강법

경사 하강법의 수식은 다음과 같다.

$w = w - \eta \frac{\partial f}{\partial w}$

 

여기서 $\eta$는 실수로써, 양의 실수인 경우에는 $w$의 값을 줄이며 그래프 상으로는 좌측으로 이동시키고 음의 경우에는 $w$를 키우며 우측으로 이동시키게 된다.

위의 그림에서 볼 수 있듯이, Loss function인 ($L$)을 최소화 시키기 위해서는 초록색 점에서 parameter가 형성되어야한다.

 

$W_1, W_2$는 미분값이 음수이므로 Optimal Point에 도달하기 위해서는 그 값을 증가시켜야하고(우측으로 이동), 그 중에서도 $W_1$에 대한 미분값의 절댓값이 $W_2$의 그것보다 크기 때문에 더 많이 움직여야 한다.

 

반대로, $W_3$의 경우에는 미분값이 양수이기 때문에 Optimal Point에 도달하기 위해서 그 값을 감소시켜야한다(좌측으로 이동).

 

이처럼 최적의 parameter를 찾기 위해서 미분값을 비교해 지속적으로 업데이트 시키는 것을 경사 하강법(경사법)이라 한다.

학습률(Learning Rate)

여기서 또 하나 중요한 부분은 학습률의 설정에 관한 것이다.

$w = w - \eta \frac{\partial f}{\partial w}$

 

위의 수식을 통해 알 수 있듯이 parameter의 갱신에는 학습률($\eta$)가 큰 영향을 주는데,

이 값이 너무 작다면 parameter의 이동이 너무 미세하고, 너무 크다면 parameter의 이동이 너무 과해 학습이 제대로 이뤄지지 않게 된다.

 

 

'ML,DL' 카테고리의 다른 글

Self-Supervised Learning  (1) 2025.06.15
밑러닝 - (2)  (2) 2024.11.14
Gradient Clipping  (0) 2024.08.12
밑러닝 (1) - CH.2  (0) 2024.04.22
Ensemble - Bagging, Boosting, Stacking  (0) 2023.03.08