Machine Learning

신경망 학습 - (1) 손실함수( MSE, CEE)

BEOKS 2020. 1. 19. 11:35

신경망의 기본구조를 다룬 지난 글에 이어서 이번에는 신경망의 학습에 대해서 다루도록 하겠습니다.

 

우리가 여러가지 경험을 통해서 학습을 하듯이 신경망은 데이터를 통해서 학습을 할 수 있습니다.

신경망은 데이터를 주도적으로 학습함으로서 신경망 안에 있는 수만개의 또는 그 이상의 매개변수(가중치, 편향)의 값을 조절하여 사람의 간섭없이 스스로 학습능력을 향상 시킬 수 있습니다. 

 

잠깐 컴퓨터 학습의 변천에 대해서 알아보고 가겠습니다. 본격적인 학습 방법은 손실함수에서부터 다루도록 하겠습니다.


1. 컴퓨터 학습의 변천

 사람의 알고리즘

신경망이 개발되기 전 컴퓨터는 스스로 학습을 할 수 없으며 어떤 결정을 하던지 사람이 프로그래밍한 명령대로만 행동하는 형식이었습니다.

 

 사람의 알고리즘  + 머신러닝

머신러닝과 신경망이 등장하게 되면서 컴퓨터가 스스로 학습을 할 수 있는 능력을 가질 수 있게 되었습니다. 컴퓨터가 데이터를 학습하기 전에 사람이 데이터에서 특징추출( SIFT, SURF, HOG 등)을 하여 신경망에 전달해주고 머신러닝( SVM, KNN 등)을 통해서 학습을 하여 컴퓨터가 효율적으로 학습할 수 있도록 하는 방식이 등장하였습니다. 아직까지 컴퓨터가 스스로 학습을 하는 단계는 아닙니다.

 

 신경망(딥러닝)

일체의 사람의 간섭없이 컴퓨터가 주어진 데이터를 통해서 스스로 학습을 하는 종단간 기계학습(end-to-end machine learning)이 등장하게 되었습니다. 여기서는 특징까지 스스로 추출하고 학습하는 단계입니다. 

학습의 변천


2.손실 함수

 

본격적인 신경망 학습의 시작입니다.

신경망 학습을 위해서는 신경망이 어느정도의 학습능력을 가지고 있는지 표현할 하나의 지표가 필요합니다. 이를 위해서 손실함수(신경망의 데이터 분석결과(성능)의 나쁨 정도)라는 개념을 사용합니다. 손실함수라는 지표를 통해서 신경망내의 매개변수들을 최적화하여 결과적으로 신경망의 성능을 최대화 할 수 있습니다.

 

손실함수는 출력층에서 나오는 수 많은 가중치와 편항의 계산 결과값과 실제 정답의 차이를 수학적으로 구현한 함수입니다. 실제정답과의 차이를 정하는데 크게 두가지의 함수를 사용합니다.

 

1. 평균 제곱 오차( Mean Squared Error, MSE )

 

평균제곱오차 (Mean Squared Error,MSE)

 

위의 공식에서 y는 신경망의 출력층 결과 리스트이고 t는 실제 데이터의 정답을 의미합니다. 

식에서 표현한 그대로 출력결과와 데이터의 차이를 제곱하여 평균을 내어 손실함수를 표현하고 있습니다. MSE의 특징은 실제 정답에 대한 정답률의 오차뿐만 아니라 다른 오답들에 대한 정답률 오차또한 포함하여 계산한다는 것이 특징입니다. 

 

계산결과 예시

import numpy as np
def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)

t=[0,0,1,0,0,0,0,0,0,0]
#정답은 2
y=[0.1,0.05,0.6,0.05,0.1,0,0.1,0,0,0]
#예 1: 정답이 2일 확률이 0.6으로 최대 (60%)
print(mean_squared_error(np.array(y),np.array(t)))

y=[0.1,0.05,0,0.05,0.1,0,0.1,0,0,0.6]
#예 1: 정답이 9일 확률이 0.6으로 최대 (60%)
print(mean_squared_error(np.array(y),np.array(t)))

https://colab.research.google.com/drive/1eqVqXNzOJE06vwv42TAsYzHAP30KsvtP#scrollTo=sPNs6K5Mtswe&line=11&uniqifier=1

 

Google Colaboratory

 

colab.research.google.com

 

2.교차 엔트로피(Cross Entropy Error, CEE)

교차엔트로피(Cross Entropy Error,CEE)

교차 엔트로피는 평균제곱오차와는 달리 오직 실제 정답과의 오차만을 파악하는 손실함수입니다. 

실제 정답이 원핫 인코딩인 경우 t의 값이 0일경우 y의 값이 무시되기 때문입니다. 

y의 값이 0~1이고 로그함수는 변수가 0일 경우 음의 무한대로 발산하여 실제 계산을 할 수 없으므로 실제 공식에서는 y에 아주작은 델타값을 입력하여 계산합니다.

 

계산결과 예시

import numpy as np
def cross_entropy_error(y, t):
    delta=1e-6
    return -np.sum(t*np.log(y+delta))

t=[0,0,1,0,0,0,0,0,0,0]
#정답은 2
y=[0.1,0.05,0.6,0.05,0.1,0,0.1,0,0,0]
#예 1: 정답이 2일 확률이 0.6으로 최대 (60%)
print(cross_entropy_error(np.array(y),np.array(t)))

y=[0.1,0.05,0,0.05,0.1,0,0.1,0,0,0.6]
#예 1: 정답이 9일 확률이 0.6으로 최대 (60%)
print(cross_entropy_error(np.array(y),np.array(t)))

https://colab.research.google.com/drive/1eqVqXNzOJE06vwv42TAsYzHAP30KsvtP#scrollTo=sPNs6K5Mtswe&line=14&uniqifier=1

 

Google Colaboratory

 

colab.research.google.com