모델을 학습할때 보통 손실함수의 값이 적어지는 것을 지표로 학습한다. 손실함수 loss 값은 모델의 예측값과 실제 레이블값이 얼마나 떨어져있는지를 보통 나타내기 때문이다. 그럼 손실함수의 최솟값을 구하려면 어떻게 해야할까. 여러 방법 중 하나는 손실함수를 미분해서, 기울기를 구한다음 그 기울기가 0 이라면 해당 함수의 최솟값을 구할 수 있을 것이다. 그렇기 때문에 모델 학습을 위한 과정 중, 미분 함수에 대해 이해하고 구현할 필요가 있다.
다음의 단순한 미분함수를 수식으로 구현하면 문제가 발생한다.
왜냐하면,,, 컴퓨터로 lim x→0 을 표현하기 어렵기 때문이다. 예를 들어 0 에 가까운 아주 작은 수 1e-50 을 파이썬에서 32비트 부동소수점 즉 float32 형으로 나타내려 하면 0이 되어버린다.
이 문제를 해결하기 위해 두 가지 방법을 함께 사용할 수 있다.
첫번째로, h 를 반올림 오차를 발생하지 않는 적정한 숫자로 설정하는 것이다.
기초 딥러닝 수업이나 코드들을 보면 자주 사용하는 1e-4 가 있다.
두번째로, x 지점의 미분값을 구할때, 오차를 고려해 주위값을 미분하는 것이다.
이때 다음의 함수를 활용할 수 있다.
위의 해결방법을 적용하여, h = 1e-4 로 설정하고, 두번째 미분식을 편미분으로 구현한다. 미분을 사용하는 이유는 모델을 학습할 때 여러 변수에 대해 미분이 필요하기 때문이다. 예를 들어 w1x1 + w2x2 = y 라는 식에 대해 x1, x2 라는 1개 이상의 다른 변수들에 대해 미분해야하기 때문에 편미분을 사용한다.
넘파이 배열의 특징을 활용하면 쉽게 구현할 수 있다.
# 편미분이 필요한 수식의 기울기 구하기
def gradient(func, x) :
h = 1e-4
grad = np.zeros_like(x)
for i in range(x.size) :
tmp_val = x[i]
x[i] = tmp_val + h
fxh1 = func(x)
x[i] = tmp_val - h
fxh2 = func(x)
grad[i] = (fxh1 - fxh2) / (2*h)
x[i] = tmp_val
return grad
gradient 값만을 구하는 것이기에 tmp_val 에 기존 값을 저장해놓고 사용한다.
그런데ㅡ 이 책을 공부하면서 해당 코드를 테스트해본 결과 정수형과 실수형 배열을 사용했을 때 grad 값이 달랐다.
gradient(test_func, np.array([3, 4]))
# 결과 array([25000, 35000])
gradient(test_func, np.array([3.0, 4.0]))
# 결과 array([6., 8.])
각 배열의 dtype 을 찍어보고, 위에서 구현한 함수를 다시 차례대로 수행해보니 이유를 찾을 수 있었다. 위 그라디언트 함수에서 계산한 실수 값 tmp_val + h 를 정수형 배열에 넣었기때문에 실수값이 정수로 변해버려서 위와 같은 잘못된 결과가 나왔다. 사실 이때까지 귀찮아서 더미 배열을 만들거나할 때 모조리 정수값으로 사용했는데... 그러면 안되겠구나...
위 미분 함수들과 함께 다음의 개념들을 이해할 수 있다.
- 기울기 ( gradient )
기울기란 모든 변수들에 대해 손실함수를 미분하여 ( 편미분 ) 계산한 벡터들의 집합이라고 말할 수 있다. 그리고 이 벡터들을 그래프로 그리면, 벡터는 방향을 가지므로 함수의 최솟값을 점점 가리키게 된다. - 경사 하강법
기울기 벡터를 이용해 손실함수의 최솟값을 더듬더듬 찾아가는 것 - 학습률
최솟값을 더듬더듬 찾아갈 때 얼마나 큰 보폭으로 최솟값을 향해갈지 정하는 것 - 확률적 경사 하강법
경사 하강법으로 학습할 때, 미니배치를 사용한다면 전체 데이터에서 일부만 랜덤으로 떼와서 학습하기 때문에 확률적 경사 하강법이라고 말한다.
#참조
밑바닥부터 시작하는 딥러닝
'인공지능 > 이론 정리' 카테고리의 다른 글
최적화 & 최적화 함수 (0) | 2022.02.12 |
---|---|
신경망 학습 : 손실함수, 활성화함수, 파라미터 (0) | 2022.01.13 |
배치용 교차 엔트로피 오차 구현하기 (0) | 2022.01.11 |
신경망 학습 (0) | 2022.01.09 |
밑바닥부터 시작하는 딥러닝 : MNIST 데이터 Google Colab 에서 로드하기 (0) | 2022.01.09 |