관리 메뉴

HeeJ's

[06] 신경망 학습 (1) 본문

<Machine Learning>

[06] 신경망 학습 (1)

meow00 2020. 11. 4. 01:05

신경망 학습: 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것

-> 데이터에서 학습한다는 것은 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 것.

손실 함수: 신경망이 학습할 수 있도록 해주는 지표

 

알고리즘을 직접 '설계'하는 대신, 주어진 데이터를 활용해 특징의 패턴을 기계학습 기술로 학습한다.

(직접 설계하면 수천, 수만개의 노드를 다 설계해야하기 때문에 효율이 낮다)

*특징? 입력 데이터에서 중요한 데이터를 정확하게 추출할 수 있도록 설계된 변환기

하지만, 이미지를 벡터로 변환할 때 사용하는 특징은 사람이 설계해야 한다.

-> 적합한 특징을 설계하지 않으면 좋은 결과를 얻을 수 없다.

 

기계학습을 진행할 때 데이터를 훈련 데이터와 시험 데이터로 나눠 학습과 실험을 수행한다.

훈련 데이터로만 학습하며 최적의 매개변수를 찾는다. 그리고 훈련 모델의 실력을 평가한다.

 

데이터를 두 종류로 나누는 이유는 범용 능력을 제대로 평가하기 위해서이다.

범용 능력? 아직 보지 못한 데이터로도 문제를 올바르게 풀어내는 능력. 기계학습의 최종 목표이다.

범용 능력이 떨어지는 것을 (한 데이터셋에만 지나치게 최적화되는 것) 오버피팅상태라고 한다.

 

딥러닝에서 사용되는 손실함수

오차제곱합(sum of squares for error, SSE)

각 관측치와 해당 그룹 평균 간의 차이 제곱 합

가장 많이 사용된다.

y_k = 신경망이 추정한 값

t_k = 정답 레이블

k = 데이터의 차원의 수

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

#인수 y와 k는 넘파이 배열이다.

오차 제곱 합의 파이썬 구현

 

교차 엔트로피 오차(cross entropy error, CEE)
다른 사건의 확률을 곱해서 엔트로피를 계산한 것

- 정보량(information content): 사건에 가치를 매겨놓은 것. 어떤 결과값의 발생 가능도가 작아질수록, 그 정보량은 커지고, 더 자주 발생할수록 그 정보량은 작아진다.

- 엔트로피(entropy): 실제로 한 사건이 일어났을 때, 얻을 것으로 기대되는 평균 정보량 측정

= 크로스 엔트로피(cross-entropy): 다른 사건의 확률을 곱해 엔트로피를 계산한 것

y_k = 신경망의 출력

t_k = 정답 레이블. 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0이다.

=> 정답일 때의 추정(t_k가 1일때의 y_k)의 자연로그를 계산하는 식

 

def cross_entropy_error(y, t):
	delta = 1e - 7
    return -np.sum(t * np.log(y + delta))
    
#y와 t는 넘파이 배열이다.

교차 엔트로피 오차를 파이썬으로 구현

 

np.log를 계산할 때 delta를 더한 이유: np.log()에 0을 입력하면 -inf가 되어 더이상 계산을 진행할 수 없기 때문에 -inf가 발생하지 않도록 하기 위해서

 

 

 

손실 함수를 사용해야하는 이유

신경망 학습에서는 최적의 매개변수(가중치&편향)를 탐색할 때 손실 함수의 값을 가능한 작게 하는 매개변수 값을 찾는다. 이때 매개변수의 미분(기울기)을 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다.

가중치 매개변수의 손실 함수의 미분이란 '가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수가 어떻게 변하나'의 의미이다. 만약 미분 값이 음수면 가중치 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다. 반대로, 미분 값이 양수면 가중치 매개변수를 음의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다. 하지만 기울기가 0이라면 가중치 매개변수를 어느 쪽으로 움직여도 손실 함수의 값은 줄어들지 않는다. 이 때, 가중치 매개변수의 갱신은 멈추게 된다.

 

미분

한순간의 변화량을 표시한 것.

def numerical_diff(f, x):
	h = 10e - 50
    return (f/(x+h) - f(x)) / h

미분식을 파이썬으로 나타낸 것

 

하지만 이 수치 미분(numerical differentiation)을 그대로 사용한다면, 오류가 발생한다.

1) 반올림 오차(rounding error)

작은 값이 생략되어 최종 계산 결과에 오차가 생기게 한다.

2) f의 차분

x+h와 x 사이의 함수 f의 차분을 계산하고 있지만, 오차가 있다.

미분이란 x에서의 함수의 기울기에 해당하지만, (x+h)와 x 사이의 기울기에 해당하게 된다.

이 차이는 h를 무한하게 0으로 좁히는 것이 불가능해 생기는 한계이다.

 

이러한 오차를 줄이기 위해 (x+h)와 (x-h)일 때의 함수 f의 차분을 계산하는 방법을 사용한다. (중심 차분)

 

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

중심 차분을 이용해 파이썬으로 미분 구현

 

 

 

'<Machine Learning>' 카테고리의 다른 글

[08] Metadata, 메타 데이터  (0) 2022.02.08
[07] 신경망 학습 (2)  (0) 2020.11.14
[05] 항등 함수와 소프트맥스 함수  (0) 2020.10.07
[04] 신경망(2)  (0) 2020.10.07
[03] 신경망(1)  (0) 2020.09.30