신경망은 데이터에 따라서 가중치의 값을 자동으로 결정해준다.
위에서 정리한 퍼셉트론의 경우 사람이 직접 매개변수의 값을 정했다. 실제 신경망에서는 매개변수가 수천~수만가지 이기 때문에 퍼셉트론 방식처럼 사람이 정할수는 없기 때문에 신경망은 매우 중요하다.
신경망 학습에 필요한 손실함수
신경망 학습에서는 현재 상태를 하나의 지표로 표현한다. 가중치 매개변수를 찾아 지표를 좋게 만들어주는 값을 찾는 것이 신경망 학습이다. 여기서 하나의 지표, 즉 신경망 학습에서 사용하는 지표를 손실함수(loss function)이라고 한다. 이렇게 말하면 손실함수가 신경망 성능의 좋음을 판별한다고 생각할 수 도 있지만 손실함수는 신경망 함수 성능의 나쁨을 나타낸다.
손실함수는 일반적으로 평균 제곱 오차와 교차 엔트로피 오차를 이용한다.
- 평균제곱오차(mean squared error, MSE)
평균제곱오차는 각각의 원소의 추정값과 타겟 데이터(정답 레이블)의 차를 제곱한 다음에 그 총 합을 구한다.
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
# 0에서만 값이 1이다.
t = [1, 0, 0, 0]
# 2개의 예측 확률을 알아보면 y1은 인덱스 0이 1이라고 예측했고 y2는 인덱스 1의 확률이 가장 높았다.
y1 = [0.6, 0.1, 0.21, 0.3]
y2 = [0.6, 0.8, 0.21, 0.3]
print(mean_squared_error(np.array(y1), np.array(t)))
print(mean_squared_error(np.array(y2), np.array(t)))
# 출력값
0.15205000000000002
0.4670500000000001
위에 코드를 보면 y1이 제대로 예측된 값이고 y2는 잘못 예측된 값이다. y2의 mse가 더 높은 것을 볼 수 있다.
-교차엔트로피오차(cross entropy error, CEE)
식에서 yi는 신경망의 출력, yi'는 정답 레이블이다. yi' 는 정답 인덱스만 1이고 나머지 인덱스는 0인데 이 의미는 결과적으로 정답일때의 예측만(yi'가 1일때 yi) 로그를 계산하는 식이 된다. 밑에 코드를 보면 정답 레이블이 0 이었는데 이때의 y1의 0번 신경망의 출력은 0.6이 된다. 그러면 교차 엔트로피 오차는 -log0.6 = 0.51이 된다.
def cross_entropy_error(y, t):
delta = 1e-7
return -np.sum(t*np.log(y+delta))
# 0에서만 값이 1이다.
t = [1, 0, 0, 0]
# 2개의 예측 확률을 알아보면 y1은 인덱스 0이 1이라고 예측했고 y2는 인덱스 1의 확률이 가장 높았다.
y1 = [0.6, 0.2, 0.99, 0.01]
y2 = [0.1, 0.7, 0.15, 0.05]
print(cross_entropy_error(np.array(y1), np.array(t)))
print(cross_entropy_error(np.array(y2), np.array(t)))
# 출력값
0.510825457099338
2.302584092994546
위의 식에서 delta를 더한 이유는 로그 함수에 0을 입력하면 -inf가 되어 계산을 진행할 수 없기 때문이다.
신경망에서 빠른 계산을 위한 미니배치
신경망을 계산할 때 모든 데이터를 대상으로 손실 함수의 합을 구하려면 시간이 많이 걸린다. 그래서 데이터 중 일부만 뽑아내어서 학습을 시행한다. 이러한 학습 방법을 미니배치학습이라고 한다.
손실함수의 필요성
손실함수를 왜 이용해야 하는가? 라는 의문이 들었다. 머신러닝을 할때는 정확도를 측정할 수 있는 지표가 있었는데 왜 딥러닝은 손실함수라는 방법을 이용해서 학습할까?
만약 신경망이 하나 있고 신경망의 어느 하나의 가중치 매개변수를 보자. 그 매개변수의 손실함수를 미분해보면 '가중치 매개변수의 값을 조금 변화 시켰을 때 손실함수가 어떻게 변할까?'라는 의미가 나온다. 미분 값이 양수면 가중치 매개변수를 적게 만들고 미분값이 음수면 가중치 매개변수를 크게 만들어서 손실함수의 값을 줄일 수 있다.
'머신러닝 > 딥러닝' 카테고리의 다른 글
CNN의 오토인코더(Autoencoders) (0) | 2021.04.21 |
---|---|
이미지 분할(Image Segmentation), 이미지 증강(Image Augmentation), 객체인식(Object Recognition) (0) | 2021.04.20 |
spaCy를 이용한 자연어처리(1) (0) | 2021.04.12 |
딥러닝 독학 2) 소프트맥스 함수 (0) | 2021.04.06 |
딥러닝 독학 1)퍼셉트론에서부터 신경망 (0) | 2021.04.06 |