이번에는 손실 함수가 무엇인지, 왜 중요한지, 그리고 어떻게 구현하는지에 대해 알아보겠습니다.
손실 함수에는 여러 알고리즘이 있는데 교차 엔트로피 오차, 오차 제곱합, 그리고 평균 제곱 오차를 Python 코드 구현해보겠습니다.
손실함수(Loss Function)
신경망 구현하기
신경망을 구현하기 전, 활성화 함수가 무엇인지와 왜 비선형 함수를 사용해야 하는지에 대해 살펴보겠습니다. 그 다음, 여러 종류의 활성화 함수(계단 함수, 시그모이드 함수, ReLU 함수 등)를 알
gogomake.tistory.com
이전 글에서는 신경망의 기본 구조를 만들었습니다. 하지만, 그 신경망에는 한가지 문제점이 있습니다. 바로 신경망이 스스로 매개변수를 업데이트하지 못한다는 점입니다. 신경망이 정확한 예측을 하려면, 매개변수 업데이트가 필수적입니다.
만약 매개변수가 2~3개라면, 사람이 직접 그 값을 조정하며 신경망을 조작할 수 있습니다. 하지만 매개변수가 수천이나 수억에 이르면, 이는 사실상 불가능한 일입니다. 따라서, 신경망이 스스로 매개변수를 업데이트할 수 있는 방법을 마련해야합니다. 그렇다면 신경망이 어떻게 스스로 학습할 수 있을까요?
먼저, 신경망을 만든 목적은 어떠한 값을 정확하게 예측하는 것 입니다. 이러한 예측은 실제값과 차이가 작아야 의미가 있습니다. 이 차이, 즉 '오차'를 계산하는 함수를 '손실함수'라고 부릅니다. 신경망은 손실함수를 이용해서 스스로 학습하는 과정을 거치게 됩니다. 이 학습 알고리즘에 대해서는 다음시간에 자세하게 알아보겠습니다.
이번에는 손실함수에 대해 알아보겠습니다. 손실함수의 종류는 굉장히 다양합니다. 그 중 대표적으로 교차엔트로피(CEE), 오차제곱합(SSE), 평균 제곱 오차(MSE)가 많이 사용됩니다.
교차엔트로피오차(Cross Entropy Error, CEE)
교차 엔트로피 오차(Cross Entropy Error, CEE)
손실함수에서 교차엔트로피는 대표적으로 사용되는 기법 중 하나입니다. 이번 글에서는 그 개념에 대해 알아보겠습니다. 교차 엔트로피 오차의 수식은 다음과 같습니다. $$ E = -\sum_{k}t_k\log y_k $$
gogomake.tistory.com
교차엔트로피오차에 대한 자세한 설명은 제 블로그 글에서 확인할 수 있습니다.
교차 엔트로피 오차(CEE)의 수식은 다음과 같습니다.
$$ E = -\sum_{k}t_k\log y_k $$
이 수식을 코드로 작성하면 다음과 같습니다.
# 미니배치용
def CEE(y,t):
delta = 1e-7 # y가 0일 때 log가 무한이 되는 것을 방지
if y.ndim == 1:
# 데이터가 1장일 때(차원이 1차원 일 때)
t = t.reshape(1,t.size)
y = y.reshape(1,y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y + delta)) / batch_size
여기서 데이터가 1차원(y.ndim == 1)일 때 reshape을 통해 차원을 변경합니다. shape가 (1,)인 데이터를 reshape을 진행하면 (1,1)로 변경됩니다.
위 코드는 일반적인 경우에 사용됩니다. 하지만, 데이터가 원 핫 인코딩된 경우 다음과 같이 코드를 작성합니다.
# 원 핫 인코딩
def CEE(y,t):
delta = 1e-7 # y가 0일 때 log가 무한이 되는 것을 방지
if y.ndim == 1:
# 데이터가 1장일 때(차원이 1차원 일 때)
t = t.reshape(1,t.size)
y = y.reshape(1,y.size)
batch_size = y.shape[0]
return -np.sum(t * np.log(y[np.arange(batch_size),t] + delta)) / batch_size
여기서 y[np.arange(batch_size),t]를 설명하겠습니다.
크로스 엔트로피에서 원 핫 인코딩 일 때는 정답 데이터만 계산합니다. 예를 들어 원 핫 인코딩이 [0, 0, 1, 0, 0]이라면 1이 표시된 위치만 계산합니다. 여기서 't'는 원 핫 인코딩에서 정답 위치 정보만 저장하고 있습니다.
np.arange(batch_size)는 [0, 1, ..., batch_size-1]이런 결과가 나옵니다. 따라서, y[np.arange(batch_size),t]는 배치사이즈만큼 정답 위치에 있는 예측값을 가져오게 됩니다.
오차제곱합(Sum of Squares for Error, SSE)
오차제곱합(Sum of Squares for Error, SSE)
손실함수에서 오차제곱합는 대표적으로 사용되는 기법 중 하나입니다. 이번 글에서는 그 개념에 대해 알아보겠습니다. 오차제곱합을 알아보기 전에, 먼저 오차를 구해보겠습니다. $$ Error = Ture -
gogomake.tistory.com
오차제곱합에 대한 자세한 설명은 제 블로그 글에서 확인할 수 있습니다.
오차제곱합(SSE)수식은 다음과 같습니다.
$$ \frac{1}{2} \sum_k (y_k-t_k)^2 $$
이를 코드로 구현하면 다음과 같습니다.
def SSE(y, t):
return 0.5 * np.sum((y - t) ** 2)
위의 함수는 두 벡터, y(실제값)와 t(예측값), 사이의 오차제곱합을 계산합니다. 각 요소의 차이의 제곱을 계산한 후, 그 결과들을 모두 합산합니다. 최종적으로 이 합산값에 0.5를 곱하여 결과를 반환합니다. 이렇게 계산된 값이 작을수록 신경망의 예측이 실제 값에 가깝다는 것을 의미합니다.
평균 제곱 오차(Mean Squared Error, MSE)
평균 제곱 오차(Mean Squared Error, MSE)
이전 시간에 오차제곱합의 개념을 설명했습니다. 오차제곱합(Sum of Squares for Error, SSE) 손실함수에서 오차제곱합는 대표적으로 사용되는 기법 중 하나입니다. 이번 글에서는 그 개념에 대해 알아
gogomake.tistory.com
평균오차제곱에 대한 자세한 설명은 제 블로그 글에서 확인할 수 있습니다.
평균오차제곱(MSE)수식은 다음과 같습니다.
$$ \frac{1}{2} \frac{1}{n} \sum_{k}^{n} (y_k-t_k)^2 $$
이를 코드로 구현하면 다음과 같습니다.
def MSE(y, t):
return 0.5 * np.sum((y - t) ** 2).mean()
마무리
신경망 학습의 핵심 요소 중 하나인 손실 함수에 대해 알아보았습니다. 손실 함수는 신경망이 얼마나 잘 학습하고 있는지를 평가하는 기준이 되며, 이를 최소화하는 방향으로 매개변수를 업데이트하여 신경망을 학습시킵니다.
교차 엔트로피 오차와 오차 제곱합, 그리고 평균 제곱 오차와 같은 다양한 손실 함수들을 알아보았습니다. 각각의 손실 함수가 어떻게 작동하는지, 그리고 Python 코드로 어떻게 구현할 수 있는지도 살펴보았습니다.
다음 시간에는 신경망 학습 알고리즘에 대해서 알아보겠습니다.