모두를 위한 딥러닝 시즌2 - PyTorch Lab 3

1️⃣ Lab Video
2️⃣ Lab slide
3️⃣ Lab code

경사 하강법 (Gradient Descent)

이제 앞서서 설명한 비용 함수(cost function)의 값을 최소로 하는 WWbb를 찾는 방법을 알아보겠습니다. 이때 사용하는 것을 옵티마이저(Optimizer) 알고리즘이라고 하며, 이러한 옵티마이저를 통해 최적화된 WWbb를 찾는 것을 학습이라고 부릅니다.

저는 경사하강법의 설명을 쉽게하기 위해 bb는 고려하지 않고, WW를 구하는 방식에 대해 설명하겠습니다.

가중치 WW는 직선의 방정식의 기울기이며, 위의 그림에서 주황색 선은 기울기 WW가 20일 때, 초록색 선은 기울기 WW가 1일 때를 나타냅니다.
주황색 선은 y=20xy=20x

위의 그래프는 bb는 고려하지 않은 단순히 가중치 WW만을 사용한 H(x)=WxH(x)=Wx

위의 그래프는 cost(W)cost(W)를 최소화하는 WW를 찾기위한 과정의 그림이며, WW값이 점차 수정되는 과정에 사용하는 것이 바로 경사 하강법(Gradient Descent)입니다.

이러한 과정을 위해서 미분을 사용하게 되며, 위의 그림의 초록색 선은 WW가 임의의 값을 가지게 되는 4가지 경우에 대해서 그래프 상으로 접선의 기울기를 보여줍니다.
접선의 기울기가 낮은 방향으로 갈수록 접선의 기울기가 점차 작아지며, 0에 가까워지는 것을 볼 수 있습니다.
이를 통해 cost(W)가 최소화가 되는 지점은 접선의 기울기0이 되는 지점이며,
또한 미분 값이 0이 되는 지점입니다.

접선의기울기=δcost(W)δW접선의 기울기 = \frac {\delta cost(W)}{\delta W}

접선의 기울기가 0이 되는 지점을 찾기 위해 반복되는 과정에 특정 숫자 α\alpha를 곱한 값을 빼서 새로운 WW로 사용하는 식이 사용되며, 기울기가 음수일 때와 양수일때 WW값의 변화를 알아보겠습니다.

기울기가 음수일 때 : 기울기의 값이 증가

W:=Wα(음수기울기)=W+α(양수기울기)W := W - \alpha * (음수기울기) = W+\alpha * (양수기울기)

기울기가 음수면 위의 식을 통해 결과적으로 WW의 값이 증가하게 되고,
이는 결과적으로 접선의 기울기가 0인 방향으로 WW의 값이 조정됩니다.

기울기가 양수일 때 : 기울기의 값이 감소

W:=Wα(양수기울기)W := W - \alpha *(양수기울기)

기울기가 양수면 WW의 값이 감소하게 되며, 이는 음수일때와 마찬가지로 접선의 기울기가 0인 방향으로 WW의 값이 조정됩니다.
아래의 수식은 접선의 기울기가 음수거나, 양수일 때 모두 접선의 기울기가 0인 방향으로 WW의 값을 조정합니다.

W:=WαδδWcost(W)W := W - \alpha \frac{\delta}{\delta W}cost(W)

여기서 사용된 α\alpha는 학습률을 의미하며, 학습률은 WW의 값을 변경할 때, 얼마나 크게 변경할지를 결정하는 값입니다. 이는 WW를 그래프의 한 점으로보고 접선의 기울기가 0일 때까지 경사를 따라 내려간다는 관점에서 얼마나 큰 폭으로 이동할지를 결정하는 변수입니다.


하지만, 학습률이 지나치게 높은 값을 가질 때, 접선의 기울기가 0이 되는 WW를 찾아가는 것이 아니라, 오히려 반대로 WW의 값이 발산하는 상황을 보여줍니다.

또 지나치게 너무 낮은 값을 가지면 학습속도가 느려지기 때문에 적당한 값의 학습률을 찾아내는 것도 중요합니다.

설명을 위해 bb는 제외하였지만, 실제 학습에서는 WW, bb의 최적을 동시에 수행하게 됩니다.

경사하강법의 PyTorch Code

optimizer = optim.SGD([W, b], lr=0.01)

경사 하강법의 PyTorch를 사용한 구현입니다.
아래의 SGD는 경사 하강법의 일종입니다. lr학습률(learning rate)를 의미합니다.
학습 대상인 Wb가 SGD의 입력이 됩니다.

# gradient를 0으로 초기화
optimizer.zero_grad() 
# 비용 함수를 미분하여 gradient 계산
cost.backward() 
# W와 b를 업데이트
optimizer.step() 

optimizer.zero_grad()를 실행하므로서 미분을 통해 얻은 기울기를 0으로 초기화합니다.
기울기를 초기화해야만 새로운 가중치 편향에 대해서 새로운 기울기를 구할 수 있습니다.
그 다음 cost.backward()함수를 호출하면 가중치 W편향 b에 대한 기울기가 계산됩니다.
그 다음 경사 하강법 최적화 함수 opimizer의 step()함수를 호출하여 인수로 들어갔던 W와 b에서 리턴되는 변수들의 기울기에 학습률(learining rate) = 0.01을 곱하여 빼줌으로서 업데이트합니다.

참조

PyTorch로 시작하는 딥러닝 입문 - https://wikidocs.net/52460
모두를 위한 딥러닝 시즌2 PyTorch - https://github.com/deeplearningzerotoall/PyTorch

좋은 웹페이지 즐겨찾기