반응형


안녕하세요!


오늘은 손실함수에 대해 알아보도록 하겠습니다!!



손실함수란?


신경망 성능의 '나쁨'을 나타내는 지표로,

현재의 신경망이 훈련데이터를 얼마나 잘 처리하지 '못'하느냐 나타냅니다.



굳이 손실함수를 사용하는 이유?


우리의 궁극적인 목표는 높은 '정확도'를 끌어내는 매개변수 값을 찾는 것입니다.



그렇다면 '정확도'라는 지표를 놔두고

'손실함수의 값' 이라는 우회적인 방법을 택하는 이유는 무엇일까요?



신경망 학습에서는

최적의 매개변수(가중치와 편향)을 탐색할 때

손실함수의 값을 가능한 작게하는 매개변수 값을 찾습니다.



손실함수에서 미분이란

'가중치 매개변수의 값을 아주 조금 변화시켰을 때,

손실 함수가 어떻게 변하나' 라는 의미입니다.



'정확도'를 지표로 삼으면 안되는 이유는

미분값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기때문입니다.




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


가장 많이 쓰이는 손실함수는 '평균 제곱 오차' 입니다.



(y: 신경망 출력, t: 정답레이블, k: 데이터의 차원 수)


평균 제곱 오차 함수는 회귀에서 많이 쓰이는 손실함수입니다.



파이썬으로는 아래와 같이 구현합니다.


def MSE(y,t):
    return (1/2)* np.sum((y-t)**2)



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


또 다른 손실함수로서 교차엔트로피 오차도 자주 사용합니다.



(여기서 log는 밑이 e 인 자연로그 입니다.

y: 신경망 출력, t: 정답레이블, k: 데이터의 차원 수)


교차 엔트로피 오차 함수는 분류에서 많이 쓰이는 손실함수입니다.



파이썬으로는 아래와 같이 구현합니다.


def cross_entrpy_error(y,t): delta = 1e-7 return -np.sum(t*np.log(y+delta))



delta를 더해주는 이유?


밑수가 자연상수이고 진수가 0인 로그의 값은 -inf가 출력되어

수치연산이 불가능해집니다.


따라서 연산이 가능하도록 아주 작은 값인 delta를 더합니다.




미니 배치 학습


훈련 데이터 중 일부만 골라서 학습하는 방법으로


통계적인 관점으로 봤을 때, 표본을 뽑아서 학습을 시키는 학습방법입니다.



즉,

훈련데이터가 100개 있으면,

그로부터 계산한 100개의 손실함수들의 합을 지표로 삼는 것입니다.



[교차 엔트로피 오차_미니배치]



(N: 데이터 개수, t: n번째 데이터의 k번째 값)


좀 복잡해보이지만, N으로 나눔으로써 '평균 손실 함수'를 구하는 것입니다.



배치용 교차 엔트로피 오차함수를 파이썬으로 구현해보도록 하겠습니다.


def crossEntropyError(y, t): delta = 1e-7 return -np.sum(t*np.log(y+delta)) / y.shape[0] # y.shape[0] : batch_size




신경망 학습 알고리즘 구현하는 절차


전제

: 신경망에는 적응 가능한 가중치와 편향이 있고,

이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라고 합니다.



1단계

: 미니배치


선별된 데이터인 미니 배치의 손실함수 값을 줄이는 것이 목표합니다.



2단계

: 기울기 산출


미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구합니다.

기울기는 손실함수의 값을 가장 작게 하는 방향을 제시합니다.


추가:

경사하강법은 이전 포스팅에서 다뤘습니다!



3단계

: 매개변수 갱신


가중치 매개변수를 기울기 방향으로 갱신합니다.



4단계

: 1 - 3 단계를 반복합니다.




자! 오늘은 여기까지!


다음은 오차를 효율적으로 갱신하는 방법


오차 역전파에 대해 알아보도록 하겠습니다.



내용 출처: Deep Learning from Scratch | 사이토 고키

반응형

+ Recent posts