728x90
반응형



참고자료 1 : 밑바닥부터 시작하는 딥러닝 (한빛미디어)




1. 경사법(경사하강법, Gradient Method)


기계학습 문제 대부분은 학습단게에서 최적의 매개변수를 찾아낸다. 신경망 역시 최적의 매개변수(가중치와 편향)를 학습 시에 찾아야 한다. 여기에서 최적이란 손실 함수가 최솟값이 될 때의 매개변수 값이다. 매개변수 공간이 광대하여 어디가 최솟값이 되는 곳인지를 알아내기가 쉽지 않다. 이런 상황에서 기울기를 잘 이용해 함수의 최솟값을 찾으려는 것이 경사법이다. 


여기서 주의할점은 각 지점에서 함수의 값을 낮추는 방안을 제시하는 지표가 기울기라는 것이다. 그러나 기울기가 가리키는 곳에 정말 함수의 최솟값이 있는지, 즉 그쪽이 정말로 나아갈 방향인지는 보장할 수 없다. 


함수가 극솟값, 최솟값, 또 안장점이 되는 장소에서는 기울기가 0이다. 극솟값은 국소적인 최솟값, 즉 한정된 범위에서의 최솟값인 점이다. 안장점은 어느 방향에서 보면 극댓값이고, 다른 방향에서 보면 극솟값이 되는 점이다. 경사법은 기울기가 0인 장소를 찾지만 그것이 반드시 최솟값이라고 할 수 없고, 복잡하고 찌그러진 모양의 함수라면 평평한 곳으로 파고들면서 고원이라고 하는 학습이 진행되지 않는 정체기에 빠질 수 있다.


그래서 기울어진 방향이 꼭 최솟값을 가리키는 것이 아니나, 그 방향으로 가야 함수의 값을 줄일 수 있다.  최솟값이 되는 장소를 찾는 문제에서는 기울기 정보를 단서로 나아갈 방향을 정해야한다.


경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한다. 그런 다음 이동한 곳에서도 마찬가지로 기울기를 구하고, 또 그 기울어진 방향으로 나아가기를 반복한다. 이렇게 해서 함수의 값을 점차 줄이는 것이 경사법이다. 경사법은 기계학습을 최적화 하는데 흔히 쓰이는 방법이다. 특히 신경망 학습에는 경사법을 많이 사용한다. 


경사법은 최솟값을 찾느냐, 최댓값을 찾느냐에 따라 이름이 다르다. 전자를 경사하강법(Gradient descent method) 후자를 경사상승법(Gradient ascent method)이라고 한다. 다만 손실 함수의 부호를 반전시키면 최솟값을 찾는 문제와 최댓값을 찾는 문제는 같은 것이니 하강이냐 상승이냐는 본질적으로 중요하지 않다. 


경사법을 수식으로 나타내면 다음과 같다.


(수식 1) 학습률

 

기호 에타는 갱신하는 양을 나타내며 이를 신경망 학습에서는 학습률(learning rate)이라고 한다. 한번의 학습으로 얼마만큼 학습해야 할지, 즉 매개변수 값을 얼마나 갱신하느냐를 정하는 것이 학습률이다.

 

수식 1은 1회에 해당하는 갱신이고, 이 단계를 반복하게 된다. 변수의 값을 갱신하는 단계를 여러 번 반복하면서 서서히 함수의 값을 줄이는 것이다. 또, 여기에는 변수가 2개인 경우를 보여주었지만, 변수의 수가 늘어도 같은 식(각 변수의 편미분 값)으로 갱신하게 된다.

 

또한 학습률 값은 0.01이나 0.001 등 미리 특정 값으로 정해두어야 하는데, 일반적으로 이 값이 너무 크거나 작으면 좋은 장소를 찾아 갈 수 없다.

 

신경망 학습에서는 보통 이 학습률 값을 변경하면서 올바르게 학습하고 있는 지를 확인하면서 진행한다.

 

경사 하강법은 다음과 같이 간단하게 구현이 가능하다.

 

def gradient_descent(f, init_x, lr=0.01, step_num=100):

x = init_x

 

for i in range(step_num):

grad = numerical_gradient(f, x)

x -= lr * grad

return x

 

인수 f : 최적화 하려는 함수

init_x : 초기값

lr : learning rate

step_num : 경사법에 따른 반복 횟수

 

함수의 기울기는 numerical_gradient(f, x)로 구하고, 그 기울기에 학습률을 곱한 값으로 갱신하는 처리를 step_num 번 반복합니다.

 

 

학습률이 너무 클 경우에 (lr  = 10)는 큰 값으로 발산할 수 있고,

학습률이 너무 작을 경우에 (lr = 1e-10)는 갱신되지 않은 채 끝나버릴 수 있다.

 

그러므로 학습률을 설정하는 일은 매우 중요하다.

 

학습률 같은 매개변수를 하이퍼파라미터(hyper parameter, 초매개변수)라고 한다. 이는 가중치와 편향같은 신경망의 매개변수와는 성질이 다른 매개변수이다. 신경망의 가중치 매개변수는 훈련 데이터와 학습 알고리즘에 의해서 자동으로 획득되는 매개변수인 반면, 학습률 같은 하이퍼파라미터는 사람이 직접 설정해야 하는 매개변수이다. 일반적으로 이들 하이퍼파라미터는 여러 후보 값 중에서 시험을 통해 가장 잘 학습하는 값을 찾는 과정을 거쳐야한다.

 

 

 

 

2. 신경망에서의 기울기

신경망 학습에서도 기울기를 구해야한다. 여기서 말하는 기울기는 가중치 매개변수에 대한 손실 함수의 기울기이다. 예를 들어 형상이 2x3, 가중치가 W, 손실함수가 L인 신경망을 생각해보면 이 경우 경사 A는 다음과 같이 나타낼 수 있다.

 

 

(수식 2) 형상이 2x3, 가중치가 W, 손실함수가 L인 신경망

 

 

의 각 원소는 각각의 원소에 관한 편미분이다. 예를 들어 1행 1번째 원소는 w11을 조금 변경했을 때 손실함수 L이 얼마나 변화하느냐를 나타낸다. 여기서 중요한 점은 이 형상이 W와 같다는 것이다.

 

 

 

간단한 신경망을 예로 들어 실제로 기울기를 구하는 코드를 구현해보면 다음과 같다.

 

 

 

먼저 간단한 신경망을 위한 함수들을 선언해주고,

 

 

 

 

형상이 2x3인 가중치 매개변수 하나를 인스턴스 변수로 갖는다. 메소드는 예측을 수행하는 predict(x)와 손실함수의 값을 구하는 loss(x, t)이다. 여기에서 인수 x는 입력 데이터, t는 정답 레이블이다.

 

기울기를 구해볼 때 numerical_gradient(f, x)를 써서 구하면 된다.

t는 정답레이블이다.

 

numerical_gradient(f, x)의 인수 f는 함수, x는 함수 f의 인수이다. 그래서 여기에는 net.W를 인수로 받아 손실함수를 계산하는 새로운 함수 f를 정의 할 수 있다.

 

그리고 이 새로 정의한 함수를 numerical_gradient(f, x)에 넘긴다.

 

 

 

 

 

dW는 numerical_gradient(f, net.W)의 결과로 그 형상은 2x3의 2차원 배열이다. dW의 내용을 보면 예를 들어 W의 w11은 대략 0.15 이다. 이는 w11을 h 만큼 늘리면 손실함수의 값은 0.15h 만큼 증가한다는 의미이다.

 

마찬가지로 w23은 대략 -0.5 이니 w23을 h 만큼 늘리면 손실 함수의 값은 0.5h 만큼 감소한다는 것이다. 그래서 손실 함수를 줄인다는 관점에서는 w23은 양의 방향으로 갱신하고, w11은 음의 방향으로 갱신해야 함을 알 수 있다. 또, 한번에 갱신되는 양에는 w23이 211보다 크게 기여한다는 사실도 알 수 있다.

 

참고로 이 구현에서는 새로운 함수를 정의하는데 def f(x) :  ... 문법을 썼는데, 파이썬에서는 간단한 함수라면 람다 기법을 쓰면 더 편리하다.

 

신경망의 기울기를 구한 다음에는 경사법에 따라 가중치 매개변수를 갱신하기만 하면 된다. 다음 절에서는 2층 신경망을 대상으로 학습 과정 전체를 구현 할 수 있게 된다.

728x90
반응형