-
Python 으로 경사하강법(Gradient Descent) 구현AI/Python 2020. 12. 23. 16:12728x90
경사하강법(GD)은 여러 종류의 문제에서 최적의 해법을 찾을 수 있는 매우 일반적인 최적화 알고리즘이다. 경사하강법의 기본 아이디어는 비용함수를 최소화하기 위해 반복해서 파라미터를 조정해 나가는 것이다.
간단한 예를 들면, 산 위에서 길을 잃었을 때 가장 빨리 골짜기로 내려가는 방법은 경사가 가파른 곳으로 내려가는 것이 가장 베스트 아이디어다. 이것이 바로 경사하강법의 원리이다.
이제 경사하강법에 대해서 다 배운 것이다. 말 그대로 기울기가 가파른 방향으로 내려가면서 기울기가 0이 되는 지점까지 가는 방법이다. 기울기가 0이 된다면 골짜기의 최솟값에 도달한 것이다.
우리가 앞에서 그렸던 공부시간과 시험 점수 그래프에서
Cost function을 Cost와 W에 대해서 그래프로 그린다면, 아래와 같이 그려진다.(W에 0, 10, 20, 30 대입해서 직접 그려본다.)
아래의 Cost는 W에 대하여 2차 함수식이다.
골짜기처럼 생겼다. 그래서 경사하강법을 쓸 수 있는 것이다.
실제로 구해보면 W=20 일 때, Cost=1/3*((20*1-20)^2+(20*2-40)^2+(20*3-60)^2)=0 이 나오게 된다.
따라서 Cost 값이 0이 되는 최적의 W, b 값은 W=20, b=0 이 되는 것이다.
가설 H(x)=Wx+b에 W=20, b=0를 대입해서 확인해보면, H(x)=20x로 최적의 해가 되게 된다.
이제 경사하강법이 무엇이고 cost 값이 최소가 될 때, W, b가 최적의 값을 갖는다는 것을 알았다.
그럼 경사하강법은 어떻게 구할까?
Cost function에서 기울기를 구하려면 미분을 해야 하므로 편의상 분모에 2를 곱해주었다. 1/m에서 최소화하나 1/2m에서 최소화하나 어차피 같은 결과가 나오므로 계산상 편하게 하기 위해 분모에 2를 곱해주었다.
경사하강법은 원래 값에서 기울기를 빼가면서(내려가면서) cost 값이 최소가 되는 지점을 찾는 것이다.
이를 수식으로 나타내면 아래와 같다.
원래 W 값에서 cost의 기울기만큼 빼가면서 다시 W에 값을 업데이트해준다. 이렇게 반복해서 조정시켜주면 언젠가는 최솟값을 찾게 돼있다. '언젠가'는 α=학습률에 달려있다. 학습률은 얼마나 빠르게 내려갈 것인지 스텝 크기를 결정한다.
만약 스텝의 크기가 너무 작다면 알고리즘이 수렴하기 위해 반복을 많이 진행해야 하므로 시간이 오래 걸린다.
반대로 학습률이 너무 크다면 골짜기를 튀어나가 값이 발산하게 된다.
좀 더 들어가서 위의 경사하강법 수식을 풀어서 써본다면,
위와 같이 나온다. 아까 말했듯이 미분을 쉽게 하기 위해 분모에 2를 곱해 주었다. 이렇게 최종 경사하강법 수식까지 풀어보았다.
위에서 풀어보았듯이, 경사하강법 알고리즘의 수식은 아래와 같이 나온다.
이 수식을 적용시키면 이제 cost 값을 최소화시키는 W와 b를 구해 낼 수 있고, 이러한 선형회귀의 학습과정을 통해 선형함수 모델을 만들 수 있다.
[출처] 경사하강법(Gradient Descent)|작성자 AvengineersAvengineers
기초부터 딥러닝 : 네이버 블로그
참고자료 : Hands-On Machine Learning With Scikit-Learn & Tensorflow (책) 모두의 딥러닝 (유튜브) 선형대수와 군 (책)
blog.naver.com
친절하게 자세히 설명되어 있었다.
이제 이걸 1-100사이의 수를 랜덤으로 X값을 지정해서 그래프를 그려주고
경사하강법을 이용해서 편차를 줄여나가는 그래프를 그려주는 파이썬(Python) 코드를 작성해 보았다.
#파이썬을 경사하강법 구현 #업데이트할 W : Learning Rate*((Y예측-Y실체)*X)평균 #업데이트할 b: Learning Rate*((Y예측-Y실체)*1)평균 import numpy as np import matplotlib.pyplot as plt X = np.random.rand(100) Y = 0.2 * X * 0.5 plt.figure(figsize=(8, 6)) plt.scatter(X, Y) plt.show() def plot_prediction(pred, y): plt.figure(figsize=(8, 6)) plt.scatter(X, y) plt.scatter(X, pred) plt.show() ## Gradient Descent 구현 W = np.random.uniform(-1, 1) b = np.random.uniform(-1, 1) learning_rate = 0.7 for epoch in range(100): Y_Pred = W * X + b error = np.abs(Y_Pred - Y).mean() if error < 0.001: break #gradient descent w_grad = learning_rate * ((Y_Pred - Y)*X).mean() b_grad = learning_rate * (Y_Pred - Y).mean() #W, b 값 갱신 W = W - w_grad b = b - b_grad if epoch % 5 == 0: Y_Pred = W * X + b plot_prediction(Y_Pred, Y)
실행 시켜보면 처음에 주황색으로 실제값이 그려지고
그다음 그래프부터 파란색 예측값이 그려지는데
경사하강법 수식을 이용해서 100 / 5로 20번 그려준다.
점점 파란색선이 주황색선에 가까워지게 되는걸 볼 수 있다.
728x90반응형'AI > Python' 카테고리의 다른 글
Python 예외처리 (0) 2020.12.22 Python File 읽기 쓰기 기초 (0) 2020.12.18 Python 모듈 기초 random, time (0) 2020.12.18 Python Class 기초 (0) 2020.12.18 Python 함수 Function (0) 2020.12.18