[딥러닝] 신경망 학습

Chris Kim·2024년 11월 15일

딥러닝

목록 보기
3/5

0. 서론

학습 이란 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 뜻한다.

1. 데이터 학습

1.1 데이터 주도 학습

이미지 인식과 관련하여, 이미지의 특징을 추출하고 그 특징의 기계학습 기술로 학습하는 방법이 있다. 여기서 특징은 이미지에서 본질적인 데이터를 정확하게 추출할 수 있도록 설계된 변환기를 가리킨다. 일반적으로 이미지의 특징은 벡터로 기술되며, SIFT, SURF, HOG등의 특징을 많이 사용한다. 이렇게 변환된 벡터를 가지고 SVM, KNN 등으로 학습할 수 있다.
반면 신경망(딥러닝)은 이미지를 '있는 그대로' 학습한다. 여기서는 사람의 개입이 전혀 없다.

1.2 훈련 데이터와 시험 데이터

우리가 원하는 모델은 범용적으로 사용할 수 있는 모델이므로, 범용 능력을 제대로 평가하기 위해 훈련 데이터와 시험 데이터를 분리해야한다.
범용 능력 이란 아직 훈련하지 않은 데이터로도 문제를 올바르게 해결하는 능력이다. 즉 처음 보는 수학문제를 풀 수 있는 것이다. 이것이 다양한 데이터셋을 필요로 하는 이유가되는데, 특정 데이터셋에만 지나치게 최적화 된 상태를 오버피팅(overfitting) 이라고 한다.

2. 손실 함수

신경망은 최적의 매개변수 값을 탐색하기 위해 손실 함수(loss fuction) 을 사용한다. 일반적으로 오차제곱합과 교차 엔트로피 오차를 손실 함수로 사용한다.

2.1 오차제곱합

오차제곱합(sum of squares for error, SSE) 은 가장 많이 쓰이는 손실 함수다.

E=12k(yktk)2E = \frac{1}{2}\sum\limits_{k}(y_k-t_k)^2
수식의미
yky_k신경망의 출력
tkt_k정탑 레이블
kk데이터의 차원 수

오차 제곱을 구하는 파이썬으로 다음과 같이 구현할 수 있다.

def sum_squares_error(y, t):
	return 0.5 * np.sum((y-t)**2)

따라서 소프트 맥스 함수의 출력과 정답 레이블을 오차제곱합 손실함수에 전달했을때, 가장 높은 확률을 가진 클래스가 정답인 경우에 손실함수는 가장 작은 값을 반환하게 된다.

2.2 교차 엔트로피 오차

또다른 손실함수로 교차 엔트로피 오차(cross entropy error) 가 있다.

E=ktklogykE = -\sum\limits_{k}t_klogy_k

tkt_k가 정답 외에는 0의 값을 가지고 자연로그 함수의 형태를 고려 했을 때, 소프트 맥스 함수 출력 값이 가장 높은 클래스가 정답일 경우 오차(EE)는 점점 작아진다.
교차 엔트로피 오차를 파이썬으로 다음과 같이 구현할 수 있다.

def cross_entropy_error(y,t):
	return -np.sum(t * np.log(y + delta)) # delta는 log 0이 마이너스 무한대로 수렴하는 것을 방지해준다. 

2.3 미니배치 학습

N개의 데이터에 대한 교차 엔트로피 오차는 다음과 같다.

E=1NnktklogykE = -\frac{1}{N}\sum\limits_{n}\sum\limits_{k}t_klogy_k

여기서는 NN으로 나누어 정규화를 수행하고, 평균 손실 함수를 구한다. 많은 데이터를 대상으로 손실함수를 일일이 계산하는 것은 현실적인 한계에 부딪히게 된다. 따라서 데이터 일부를 전체의 '근사치'로 이용한다. 그 일부가 바로 미니배치 다.

2.4 손실 함수를 설정하는 이유

정확도를 지표로 삼는 경우 매개변수의 미분이 대부분의 자소에서 0이 되기 때문에, 손실함수를 설정하는 것이다.

3. 수치 미분

3.1 미분

수치 미분을 구현하고자 하는 경우 매우 작은 수에서 반올림 오차가 발생하는 한계에 부딪힌다. 따라서 중심 차분 혹은 중앙 차분의 개념을 활용하여 수치 미분을 구현한다.

def numerical_diff(f, x):
	h = 1e-4
	return(f(x+h) - f(x-h))/(2*h)

3.2 편미분

편미분은 다음과 같이 나타낸다.

fx0,fx1,...\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial x_1}, ...

4. 기울기

(fx0,fx1)(\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial x_1}) 처럼 모든 변수의 편미분을 벡터로 정리한 것을 기울기(gradient) 라고 한다.

def numerical_gradient(f,x):
	h = 1e-4
    grad = np.zeros_like(x)
    
    for idx in range(x.size):
    	tmp_val = x[idx]
        
        x[idx] = tmp_val + h
        fxh1 = f(x)
        
        x[idx] = tmp_cal - h
        fxh2 = f(x)
        
        grad[idx] = (fxh1 = fxh2) / (2*h)
        x[idx] = tmp_val
        
    return grad

4.1 경사법

경사법은 수식으로 다음과 같이 나타난다.

x0=x0ηfx0x1=x1ηfx1x_0 = x_0 - η\frac{\partial f}{\partial x_0}\\ x_1 = x_1 - η\frac{\partial f}{\partial x_1}

여기서 η은 학습률을 의미한다.

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

신경망에서 이를 구현하면 가중치 W를 조금씩 조정할 수 있다. 행렬 WW, 손실함수 LL인 신경망을 가정했을때, 경사는 LW\frac{\partial L}{\partial W}로 나타난다. WW의 각 원소에 대해 편미분을 수행하므로 당연히 LW\frac{\partial L}{\partial W}의 형상은 WW의 형상과 동일하다.

5. 학습 알고리즘 구현

신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라고 한다. 신경망 학습은 다음과 같이 4 단계로 수행한다.

1단계: 미니배치
2단계: 기울기 산출
3단계: 매개변수 갱신
4단계: 반복

에폭(epoch) 은 하나의 단위다. 1에폭은 학습에서 훈련 데이터를 모두 소진했을 떄의 횟수에 해당한다. 예를 들어 훈련 데이터 60,000개를 100개의 미니 배치로 학습할 경우, 확률적 경사 하강법을 600회 반복하면 모든 훈련 데이터를 '소진'한 게 된다. 이 경우 600회가 1에폭이 된다.

profile
회계+IT=???

0개의 댓글