2019.06.13
출처 : https://wikidocs.net/book/2155
핵심키워드
- 순전파(Foward Propagation)
- 손실 함수(Loss function)
- 옵티마이저(Optimizer)
- 배치 경사 하강법(Batch Gradient Descent)
- 확률적 경사 하강법(Stochastic Gradient Descent, SGD)
- 미니 배치 경사 하강법(Mini-Batch Gradient Descent)
- 모멘텀(Momentum)
- 아다그라드(Adagrad)
- 알엠에스프롭(RMSprop)
- 아담(Adam)
- 에포크(Epoch)
- 배치 크기(Batch size)
- 이터레이션(Iteration)
딥 러닝의 학습 방법
이번 챕터에서는 머신 러닝 챕터에서 배운 손실 함수와 옵티마이저의 개념을 가지고, 딥 러닝에서 어떻게 학습을 하는지에 대해서 배운다,.
1. 순전파(Foward Propagation)
활성화 함수, 은닉층의 수, 각 은닉층의 뉴런 수 등 딥 러닝 모델을 설계하고 나면 입력값은 입력층, 은닉층을 지나면서 각 층에서의 가중치와 함께 연산되며 출력층으로 향한다. 그리고 출력층에서 모든 연산을 마친 예측값이 나오게 된다. 이와 같이 입력층에서 출력층 방향으로 예측값의 연산이 진행되는 과정을 순전파라고 한다.
2. 손실 함수(Loss function)
손실 함수는 실제값과 예측값의 차이를 수치화해주는 함수이다. 이 두 값의 차이. 즉, 오차가 클 수록 손실 함수의 값은 크고 오차가 작을 수록 손실 함수의 값은 작아진다. 회귀에서는 평균 제곱 오차, 분류 문제에서는 크로스 엔트로피를 주로 손실 함수로 사용한다. 손실 함수의 값을 최소화하는 두 개의 매개변수인 가중치 W와 편향 b를 찾아가는 것이 딥 러닝의 학습 과정이므로 손실 함수의 선정은 매우 중요하다.
1) MSE(Mean Squared Error, MSE)
오차 제곱 평균을 의미한다. 연속형 변수를 예측할 때 사용된다.
2) 크로스 엔트로피(Cross-Entropy)
y : 실제값 (0 or 1) / y-hat : 예측값 (확률)
낮은 확률로 예측해서 맞추거나, 높은 확률로 예측해서 틀리는 경우 loss가 더 크다. 이진 분류 (Binary Classfication)의 경우 binary_crossentropy를 사용하며 다중 클래스 분류(Multi-Class Classification)일 경우 categorical_crossentropy를 사용한다.
3. 옵티마이저(Optimizer)
손실 함수의 값을 줄여나가면서 학습하는 방법은 어떤 옵티마이저를 사용하느냐에 따라 달라진다. 여기서 배치(Batch)라는 개념에 대한 이해가 필요하다. 배치는 가중치 등의 매개 변수의 값을 조정하기 위해 사용하는 데이터의 양을 말한다. 전체 데이터를 가지고 매개 변수의 값을 조정할 수도 있고, 정해준 양의 데이터만 가지고도 매개 변수의 값을 조정할 수 있다.
1) 배치 경사 하강법(Batch Gradient Descent)
배치 경사 하강법(Batch Gradient Descent)은 가장 기본적인 경사 하강법이다. 배치 경사 하강법은 옵티마이저 중 하나로 오차(loss)를 구할 때 전체 데이터를 고려한다. 머신 러닝에서는 1번의 훈련 횟수를 1에포크라고 하는데, 배치 경사 하강법은 한 번의 에포크에 모든 매개변수 업데이트를 단 한 번 수행한다. 배치 경사 하강법은 전체 데이터를 고려해서 학습하므로 에포크당 시간이 오래 걸리며, 메모리를 크게 요구한다는 단점이 있으나 글로벌 미니멈을 찾을 수 있다는 장점이 있다. 케라스에서는 아래와 같이 사용한다.
model.fit(X_train, y_train, batch_size=len(trainX))
2) 확률적 경사 하강법(Stochastic Gradient Descent, SGD)
기존의 배치 경사 하강법은 전체 데이터에 대해서 계산을 하다보니 시간이 너무 오래걸린다는 단점이 있다. 확률적 경사 하강법은 매개변수 값을 조정 시 전체 데이터가 아니라 랜덤으로 선택한 하나의 데이터에 대해서만 계산하는 방법이다. 더 적은 데이터를 사용하므로 더 빠르게 계산할 수 있다.
매개변수의 변경폭이 불안정하고, 때로는 배치 경사 하강법보다 정확도가 낮을 수도 있지만 속도만큼은 배치 경사 하강법보다 빠르다는 장점이 있다. 케라스에서는 아래와 같이 사용한다.
model.fit(X_train, y_train, batch_size=1)
3) 미니 배치 경사 하강법(Mini-Batch Gradient Descent)
전체 데이터도 아니고, 1개의 데이터도 아니고 정해진 양에 대해서만 계산하여 매개 변수의 값을 조정하는 경사 하강법을 미니 배치 경사 하강법이라고 한다. 미니 배치 경사 하강법은 전체 데이터를 계산하는 것보다 빠르며, SGD보다 안정적이라는 장점이 있다. 실제로 가장 많이 사용하는 경사 하강법이다.
model.fit(X_train, y_train, batch_size=32) #32를 배치 크기로 하였을 경우
4) 모멘텀(Momentum)
모멘텀(Momentum)은 관성이라는 물리학의 법칙을 응용한 방법이다. 모멘텀 SGD는 경사 하강법에 관성을 더 해준다. 모멘텀은 SGD에서 계산된 접선의 기울에 한 시점(step) 전의 접선의 기울기값을 일정한 비율만큼 반영한다. 이렇게 하면 마치 언덕에서 공이 내려올 때, 중간에 작은 웅덩이에 빠지더라도 관성의 힘으로 넘어서는 효과를 줄 수 있다.
다시 말해 로컬 미니멈에 도달하였을 때, 기울기가 0이라서 기존의 경사 하강법이라면 이를 글로벌 미니멈으로 잘못 인식하여 계산이 끝났을 상황이라도 모멘텀. 즉, 관성의 힘을 빌리면 값이 조절되면서 로컬 미니멈에서 탈출하는 효과를 얻을 수도 있다. 케라스에서는 다음과 같이 사용한다.
keras.optimizers.SGD(lr = 0.01, momentum= 0.9)
5) 아다그라드(Adagrad)
매개변수들은 각자 의미하는 바가 다른데, 모든 매개변수에 동일한 학습률(learning rate)을 적용하는 것은 비효율적이다. 아다그라드는 각 매개변수에 서로 다른 학습률을 적용시킨다. 이 때, 변화가 많은 매개변수는 학습률이 작게 설정되고 변화가 적은 매개변수는 학습률을 높게 설정시킨다. 케라스에서는 다음과 같이 사용한다.
keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)
6) 알엠에스프롭(RMSprop)
아다그라드는 학습을 계속 진행한 경우에는, 나중에 가서는 학습률이 지나치게 떨어진다는 단점이 있는데 이를 다른 수식으로 대체하여 이러한 단점을 개선하였다. 케라스에서는 다음과 같이 사용한다.
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
7) 아담(Adam)
아담은 알엠에스프롭과 모멘텀 두 가지를 합친 듯한 방법으로, 방향과 학습률 두 가지를 모두 잡기 위한 방법이다. 케라스에서는 다음과 같이 사용한다.
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
4. 역전파(BackPropagation)
위키독스 내 별도 챕터에 작성되었음. 내일 공부하기로 함;
5. 에포크와 배치 크기와 이터레이션(Epochs and Batch size and Iteration)
기계는 실제값과 예측값의 오차로부터 옵티마이저를 통해서 가중치를 업데이트한다. 머신러닝에서는 이 과정을 학습이라고 한다. 이를 현실의 학습에 비유하면 사람은 문제지의 문제를 풀고, 정답지의 정답을 보면서 채점을 하며 부족했던 점을 깨닫는 과정을 거쳐 머릿속의 지식이 업데이트 된다.
그런데 사람마다 동일한 문제지와 정답지를 주더라도 공부 방법은 천차만별이다. 어떤 사람은 문제지 하나를 다 풀고 나서 정답을 채점하는데 어떤 사람은 문제지의 문제를 10개의 단위로 끊어서 공부한다. 문제 10개를 풀고 채점하고 다시 다음 문제 10개를 풀고 채점하고 반복하는 방식으로 학습한다는 것이다. 또한 게으른 사람은 문제지를 3번 공부하는데, 성실한 사람은 문제지의 문제지를 달달 외울만큼 문제지를 100번 공부한다.
기계도 똑같다. 같은 문제지와 정답을 주더라도 공부방법을 다르게 설정할 수 있다.
위의 그림은 에포크와 배치 크기와 이터레이션의 차이를 보여준다. 위의 그림의 예제를 통해 설명한다.
1) 에포크(Epoch)
에포크란 인공 신경망에서 전체 데이터에 대해 순전파와 역전파가 끝난 상태를 말한다. 전체 데이터를 하나의 문제지에 비유한다면 문제지의 모든 문제를 끝까지 다 풀고, 정답지로 채점을 하여 문제지에 대한 공부를 한 번 끝낸 상태를 말한다.
만약 에포크가 50이라고 하면, 전체 데이터 단위로는 총 50번 학습한다. 문제지에 비유하면 문제지를 50번 푼 셈이다. 이 에포크 횟수가 지나치거나 너무 적으면 앞서 배운 과적합과 과소적합이 발생할 수 있다.
2) 배치 크기(Batch size)
배치 크기는 몇 개의 데이터 단위로 매개변수를 업데이트 하는지를 말한다. 현실에 비유하면 문제지에서 몇 개씩 문제를 풀고 나서 정답지를 확인하느냐의 문제이다. 사람은 문제를 풀고 정답을 보는 순간 부족했던 점을 깨달으며 지식이 업데이트 된다고 했다. 기계 입장에서는 실제값과 예측값으로부터 오차를 계산하고 옵티마이저가 매개변수를 업데이트 한다. 여기서 중요한 포인트는 업데이트가 시작되는 시점이 정답지/실제값을 확인하는 시점이라는 것이다.
사람이 2,000 문제가 수록되어있는 문제지의 문제를 200개 단우로 풀고 채점한다고 하면 이때 배치 크기는 200이다. 기계는 배치 크기가 200이면 200개의 샘플 단위로 가중치를 업데이트한다.
여기서 주의할 점은 배치 크기와 배치의 수는 다른 개념이라는 점이다. 전체 데이터가 2,000일때 배치 크기를 200으로 준다면 배치의 수는 10이다. 이는 에포크에서 배치 크기를 나눠준 값(2,000/200 = 10)이기도 하다. 이때 배치의 수를 이터레이션이라고 한다.
3) 이터레이션(Iteration)
이터레이션이란 한 번의 에포크를 끝내기 위해서 필요한 배치의 수를 말한다. 또는 한 번의 에포크 내에서 이루어지는 매개변수의 업데이트 횟수이기도 하다. 전체 데이터가 2,000일 때 배치 크기를 200으로 한다면 이터레이션의 수는 총 10개이다. 이는 한 번의 에포크 당 매개변수 업데이트가 10번 이루어진다는 것을 의미한다. SGD를 이 개념을 가지고 다시 설명하면, SGD는 배치 크기가 1이므로 모든 이터레이션마다 하나의 데이터를 선택하여 경사 하강법을 수행한다.
참고자료
케라스의 옵티마이저 사용법 : https://keras.io/optimizers/