본문 바로가기
AI/밑딥

딥러닝) 기울기 , 경사하강법 , gradient descent , learning rate

by 채채씨 2021. 2. 27.
728x90
반응형
1. 기울기

함수 f를 x0과 x1에 대해 동시에 편미분을 계산하면 아래와 같다. 이처럼 모든 변수의 편미분을 벡터로 정리한 것을 기울기(gradient)라고 한다.

 

 

 

 

 

기울기(=모든 변수의 편미분의 벡터) 구현

 

 

참고로  위의 구현에서 np.zeros_like(x)는 x와 형상이 같고 그 원소가 모두 0인 배열을 만드는 함수이다.

 

 

위에서 구현한 기울기 함수를 이용해서 아래의 손실 함수에 대한 기울기를 실제로 구해보도록 하자. 

 

 

손실 함수 에시
넘파이 배열로 여러 변수의 편미분(=기울기) 동시에 구하기

 

 

 

기울기는 각 지점에서 함수의 값이 낮아지는 방향을 가리키킨다.

★기울기가 가리키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향임을 기억해야 한다.

 

 

 

 

2. 경사 하강법

신경망은 학습을 통해 최적의 매개변수(가중치와 편향)를 찾는다. 최적의 매개변수란 손실 함수가 최솟값이 될 때의 매개변수 값을 의미한다. 매개변수의 기울기를 이용하여 함숫값이 작아지는 방향으로 이동하며 극값에 도달할 때까지 반복한다.

 

 

경사법을 이용한 최적의 매개변수 찾기

 

 

함수의 값을 낮추는 방향을 나타내는 지표가 기울기지만 최솟값을 위한 방향을 실제로 제시하는 지는 보장할 수 없다.

함수의 극솟값, 최솟값, 안장점에서는 기울기가 0이다. 따라서 기울기가 0인 곳을 찾는 경사법은 최솟값이 아닌 극솟값 또는 안장점일 수도 있고, 만약 손실 함수가 복잡하고 찌그러진 모양이면 고원이라하는 학습이 진행되지 않는 평평한 곳으로 가서 정체기에 빠질 수도 있다.

 

그렇지만, 기울기가 가리키는 방향이 함수의 값을 줄일 수 있는 단서이므로 기울기를 이용해야 한다.

 

경사법이란, 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한 후 이동한 위치에서 다시 기울기를 구하고 그 기울어진 방향으로 나아가는 것을 반복하여 함수의 값을 줄이는 것을 말한다.

 

 

 

기호 에타(eta)는 갱신하는 양을 나타내고 이를 학습률(learning rate)이라 한다. 즉 매개변수 값을 얼마나 갱신할지(함수 값이 낮아지는 곳으로 얼만큼 이동할 것인지=보폭)를 정하는 것이다. 학습률은 미리 값을 정해두어야 하는데, 너무 크거나 작으면 손실 함수 값이 커지므로 적절하게 설정해야 한다.

 

경사 하강법을 구현하면 다음과 같다.

 

 

경사 하강법 구현

 

 

 

f는 최적화하려는 손실 함수, init_x는 초깃값, lr은 learning rate, step_num은 경사법에 따른 반복 횟수를 의미한다.

기울기에 learning rate을 곱한 값으로 갱신하는 처리를 step_num번 반복한다.

 

 

아래 함수의 최솟값을 구하는 문제는 다음과 같이 구현할 수 있다.

 

 

손실 함수
경사법으로 최솟값을 구하는 문제 구현

 

 

 

학습 후 결과

 

 

 

learning rate같은 매개변수를 하이퍼파라미터(hyper parameter, 초매개변수)라 한다. 하이퍼파라미터란, training data와 학습 알고리즘에 의해 자동으로 구해지는 가중치와 편향과 달리, 사람이 직접 설정하는 매개변수를 말한다. 하이퍼파라미터 역시 test를 통해 가장 잘 학습하는 값을 찾는 과정을 거쳐야 한다.

 

 

 

 

3. 신경망에서의 기울기

신경망 학습에서는 가중치 매개변수에 대한 손실 함수의 기울기를 구해야 한다. 예를 들어 형상이 2x3, 가중치가 W, 손실 함수가 L인 신경망의 경우, 경사는 다음과 같다.

 

 

가중치 행렬
각 가중치에 대한 편미분 행렬 (경사)

 

 

각 가중치에 대한 편미분 행렬에서 첫 번째 원소는 w11을 조금 변경했을 때 손실 함수 L이 얼만큼 변하는지를 나타낸다.

 

 

 

신경망 구현

 

 

참고로 위의 코드에서는 미리 만들어 놓은 functions.py에서 정의한 softmax, cross_entropy_error메서드와 gradient.py에서 정의한 numerical_gradient메서드를 이용한다. 그럼 신경망을 만들었으니, 기울기를 구하면 다음과 같다.

 

 

 

손실 함수를 가중치 매개변수 W에 대해 미분
미분 결과

 

 

결과를 보면 손실 함수를 w11에 대해 미분한 결과는 대략 0.14이다. 이것은 w11를 h만큼 증가시키면 손실 함수의 값은 0.14h만큼 증가한다는 것을 의미한다. 마찬가지로 w13에 대해 미분한 결과는 대략 -0.18이니, w13을 h만큼 증가시키면 손실 함수의 값은 0.18h만큼 감소한다는 것을 의미한다. 

 

따라서 손실 함수의 값을 줄여야 하므로, w11은 음의 방향으로 갱신하고 w13은 양의 방향으로 갱신해야 한다. 절댓값을 보면, w11보다 w13이 한 번에 갱신되는 양이 크다는 것도 알 수 있다.

 

 

 


 

<배운 것>

· 신경망 학습은 손실 함수를 지표로, 손실 함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신한다.

· 가중치 매개변수를 갱신할 때는 가중치 매개변수의 기울기를 이용하고, 기울어진 방향으로 가중치의 값을 갱신하는 작업을 반복한다.

 


출처: 사이토 고키『밑바닥부터 시작하는 딥러닝』, 한빛미디어(2017), p127-136.

728x90
반응형

댓글