경사 하강법을 이용한 신경망 학습 - BD-SEARCH/MLtutorial GitHub Wiki
기존 머신러닝과 딥러닝의 차이점
- 사람이 생각한 알고리즘을 이용한 분류
- 사람이 생각한 특징(SIFT, HOG 등)을 추출하고, 기계학습(SVM, KNN 등)으로 분류
- 신경망을 통해 분류. 데이터만 주어지면 특징 추출, 분류 모두 자동으로 진행된다.
손실 함수
신경망 성능의 나쁨을 나타내는 지표로, 평균 제곱 오차나 교차 엔트로피 오차 등을 사용한다. 신경망은 이 함수의 값을 줄이는 것을 목표로 학습한다.
- 평균 제곱 오차(Mean Squared Error, MSE)
- y_k는 신경망의 출력, t_k는 One-Hot Encoding된 정답 레이블, k는 데이터의 차원 수.
- 교차 엔트로피 오차(Cross Entropy Error, CEE)
- t_k 값은 정답 레이블에선 1, 나머지는 0이므로 정답 레이블의 y_k의 자연로그값을 의미한다.
훈련 데이터에 대하여 손실 함수를 구한 뒤 합친 값을 최소화하는 방향으로 학습을 진행해야 한다. 그러나 데이터가 많아지면 전부 다 계산하는 것도 시간이 오래 걸린다. 대신 임의로 데이터를 선택하여 학습을 수행하는 미니배치 학습(Mini-batch)을 수행한다.
신경망의 출력이 달라지면 손실 함수 값도 변한다. 그러나 손실함수가 변한다고 해서 정확도가 무조건 변한다고 볼 수는 없다. 정확도를 지표로 하면 대부분의 경우 미분값이 0이 되기 때문에, 학습할 때 정확도를 지표로 볼 수 없다. 따라서 손실함수를 미분한 값을 기반으로 하여, 손실 함수를 최소화할 수 있는 방향으로 학습을 수행한다.
수치 미분
위와 같이 작은 차분으로 미분하는 것을 수치 미분이라 한다. 그 중에서도 위 수식은 중앙 차분에 기반한 수치 미분이다. 도함수를 이용해 해석적으로 미분하는 대신 수치 미분을 통해 근사치를 구한다.
편미분을 할 때엔 미분할 변수가 아닌 값을 대입하여 만든 함수를 위 식에 대입하여 미분값을 구할 수 있다.
경사 하강법
벡터를 각 변수마다 편미분을 하면 현재 위치에서의 기울기를 구할 수 있다. 기울기에 전부 -1을 곱하면 극솟값 방향을 나타낸다. 이런 식으로 기울기를 구한 뒤 극솟값 방향으로 조금씩 이동하고, 이 것을 계속 반복하는 것이 경사 하강법이다. 경사 하강법을 수행하여 손실 함수의 값을 최소화하는 것을 목표로 한다.
η 값은 학습률(learning rate)인데, 한 번의 학습으로 얼마만큼 학습해야 하는지, 즉 매개변수 값을 얼마나 갱신해야 하는지 나타내는 값이다.
신경망에서는 각 가중치별로 편미분값을 구한 뒤, 위 식을 이용하여 매개변수를 업데이트한다. 편미분값의 절대값이 크면 클수록 학습에 기여하는 양이 크다고 볼 수 있다. 편미분값에 -1을 곱하면, 그 값은 손실 함수를 최소화하는 방향을 가리킨다.
확률적 경사 하강법 (SGD)
- 미니배치: 훈련 데이터를 일부 무작위로 가져오는데, 이 것을 미니배치라고 한다.
- 기울기 산출: 각 가중치 매개변수의 기울기를 구한다.
- 매개변수 갱신: 가중치를 구한 기울기 방향으로 learning rate만큼 갱신한다.
- 1번으로 돌아가 반복.
Reference
- 밑바닥부터 시작하는 딥러닝 (4장 신경망 학습)