Mean Square Error

우리는 궁극적으로 네트워크의 weight를 찾는 것이 목표이다. 그렇다면 네트워크는 가장 0에 가까운 예상을 해야한다. 따라서 우리는 그동안 실제 값과 출력 값 사이의 ‘Error’를 구했다.

그런데, 이 형태의 에러는 양수와 음수가 혼재되어 나온다는 단점이 있다. 이를 해결하기 위해 가장 널리 쓰이는 Error의 형태는 Sum of Squared Errors(SSE)이다:

일반적인 형태는 다음과 같다. (앞에 1/2는 나중에 수학적 편리함을 위해 붙인거다.) SSE는 두가지 이점이 있다. 첫째, 항상 0보다 크다는거. 둘째, 제곱을 해주면, outlier를 더 부각되게 만들어준다는거. (작은거 여러 개 틀리는게 큰거 하나 틀리는거보다 훨씬 나쁘다.) 그리고 덧셈 계산이라 연산하기 쉽다는거.

하지만, 우리의 Neural Network는 출력이 Input과 Weight간의 곱셈이다. 그리고 에러는 다음과 같다.

이제….. 우리는 이걸 최소화 해야한다.

2018-08-28 23-26-04 2018-08-28 23-26-20 2018-08-28 23-26-51 2018-08-28 23-28-09

너무나 간단한 결론!

아니 그래서 어쩌라고

2018-08-28 23-28-45

weight는 learning rate와 error term에 input을 곱한걸 더해주면 된다! 이렇게 간단하다니!

2018-08-28 23-30-27

output이 여러개라도 상관없다.

Weight += learning rate 곱하기 input 곱하기 error term!

error-term 구하는게 좀 헷갈리더라.

import numpy as np

#활성함수
def sigmoid(x):
    return 1/(1+np.exp(-x))

#활성함수 미분 - error term 구해야지
def sigmoid_prime(x):
    return sigmoid(x) * (1 - sigmoid(x))

learnrate = 0.5
x = np.array([1, 2, 3, 4])
y = np.array(0.5)

#초기 weight
w = np.array([0.5, -0.5, 0.3, 0.1])

#input of hidden layer
h = np.dot(x,w)

#output of hidden layer
nn_output = sigmoid(h)

#simple error
error = y-nn_output

#외우기 어렵다 그랬지?
error_term = error * sigmoid_prime(h)

#weight 업데이트
del_w = learnrate * error_term * x

print('Neural Network output:')
print(nn_output)
print('Amount of Error:')
print(error)
print('Change in Weights:')
print(del_w)

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io