손실함수(Loss function)과 미니배치(Mini-batch)

 손실함수는 쉽게 말해 판단지표이다. 신경망의 학습에는 목표가 있어야 하는데 이는 손실함수를 줄이는 방향으로 진행된다. 손실 함수는 따로 정해진 함수는 없지만 보통은 오차제곱합과 교차엔트로피 오차로 이뤄져 있다. 

1. 오차제곱합

오차제곱합의 수식은 다음과 같다.

Yt는 출력값 Tk는 정답값 k는 데이터 차원의 수이다. 즉 실제 값에서 정답을 빼고 제곱해 합하는 단순한 산수이다. 그럼 파이썬으로는 다음과 같이 구현된다.

import numpy as np

def sum_sq(dap, gap):
return 0.5*np.sum((gap-dap)**2)

t = [0, 0, 1, 0]
k1 = [0.2, 0.1, 0.6, 0.1]
k2 = [0.4, 0.4, 0.1, 0.1]

print(sum_sq(np.array(t),np.array(k1)))
print(sum_sq(np.array(t),np.array(k2))) 

수식에 대한 설명은 생략한다, 다만 sum_sq 함수에 입력시 np.array형태로 변환 후 대입하지 않으면 일반적인 lsit 형태로 인식되어 오류가 나니 주의해야 한다.

위의 코드에서 t는 원하는 답 즉 [2]위치에 있는 것을 답으로 원한다. k1, k2는 출력값의 예시이다. k1은 [2]를 0.6으로 가장 높게 출력했고 k2는 [0]과[1]을 가장 높게 출력했다. 

그리고 이를 대입해 실행시키면 k1의 경우 Loss가 약 0.11 k2의 경우 0.57로 이를 통해 k1이 더욱 정확하다는 것이 판단 가능하다.

2. 교차 엔트로피 오차

다른 손실함수로는 교차엔트로피 오차가 있다. 

수식은 다음과 같다. 이때 Tk는 one-hot인코딩이며 정답에 해당된다. 즉 이 수식을 해석하면 정답에 해당되는 출력만을 이용해 판단한다는 뜻이다. 
파이썬 함수로 구현하면 다음과 같다. 

import numpy as np

def sum_sq(dap, gap):
return -np.sum(dap*np.log(gap))

t = [0, 0, 1, 0]
k1 = [0.2, 0.1, 0.6, 0.1]
k2 = [0.4, 0.4, 0.1, 0.1]

print(sum_sq(np.array(t),np.array(k1)))
print(sum_sq(np.array(t),np.array(k2))) 

생각보다 간단히 구현 가능하다. 이때 사용한 추가적인 numpy function은 np.log이다. 

여기서 하나 생각해 볼 점은 이번 출력은 k1이 약 0.5 k2는 약2.3라는 값이 나왔다. 이는 k1이 더 정확하다는 뜻이며 오차제곱합과 일치한다. 하지만 자료값에 따라 오차제곱합 또는 교차엔트로피 오차를 적절히 사용하여야 한다는 뜻이다. 

3.Mini batch 

현재는 t라는 하나의 답만을 비교했다. 하지만 실제 딥러닝에서는 수백만, 수천만 또는 그 이상의 정답과 출력 값을 비교하고 Loss를 구해야 한다. 그럼 이때는 컴퓨터의 퍼포먼스가 현저히 저하될 수도 있다. 따라서 우리는 일부의 인덱스를 뽑아내 학습을 진행할수 있는데 이를 미니배치라고 한다. 미니배치를 진행할 경우 무작위로 자료를 뽑아 진행해야하기 때문에 보통 np.random함수를 이용해 구현한다.
  
 

댓글

이 블로그의 인기 게시물

다양한 계층 구현을 통한 오차역전파법 구현하기(2)

퍼셉트론(Perceptron)

[논문리뷰] 3. CNN에 대하여