본문 바로가기
Data Science/Deep Learning

경사하강법 Python 파이썬 코드로 구현하기

by Queen2 2023. 1. 13.
728x90
반응형

딥러닝을 배우면 정말 지긋지긋하게 나오는 경사하강법입니다.

좀 제대로 머리에 경사하강법 원리를 익히기 위해 여러 소스를 참고해서 파이썬 코드를 작성했습니다.

 

import numpy as np
import matplotlib as plt

def function(x1, x2):  #손실함수 임의로 정의
    return 0.5*x1**2 + (5/2)*x2**2 - x1*x2 - 2*(x1 + x2)

def gradient(x1, x2):   #각 값에 대한 미분식 제시
    return np.array([-2 + x1 - x2, -2 - x1 + 5*x2])
    
x1 = 2   #x1, x2를 임의 값으로 설정
x2= 1
lr = 0.1 # step size (learning rate, 실험을 위해 크게 설정함)
precision = pow(10,-6) #epsilon 이 값 이하로 오차가 줄어들시에 계산을 멈춤
original = function(x1,x2) # 훈련을 시작하는 첫 식

record = [[x1,x2]]

grad = gradient(x1,x2)

while abs(x2-x1) > precision:
    x1 = x1 - lr*grad[0]
    x2 = x2 - lr*grad[1]
    diff = function(x1,x2) - original
    record = np.vstack((record,[x1,x2])) #업데이트 과정에 따라 값을 보관함
    original = function(x1,x2)
    grad = gradient(x1,x2)
    
record_x1 = record[:,0] #쌓아놓았던 값에서 x1값들, x2값들을 분리함
record_x2 = record[:,0]

# ------------------------그래프 그리는 과정--------------------------
x1 = np.linspace(2, 3.5, 150)
x2 = np.linspace(0.25, 1.75, 150)
X1, X2 = np.meshgrid(x1, x2)
Z = function(X1, X2)


fig = plt.figure(figsize = (10,7))
contours = plt.contour(X1, X2, Z, 20)
plt.clabel(contours, inline = True, fontsize = 10)
plt.title("Evolution of the cost function during gradient descent with level circles", fontsize=15)

plt.plot(record_x1, record_x2)
plt.plot(record_x1, record_x2, '*', label = "Cost function")

plt.xlabel('x1', fontsize=11)
plt.ylabel('x2', fontsize=11)
plt.colorbar()
plt.legend(loc = "upper right")
plt.show()

GPU 없이 CPU로 돌렸더니 생각보다 너무 오래 걸려서 참조한 깃허브에 기재되어 있는 그래프를 대신 첨부합니다.

Source: github

 

 

**이번에 알게된 사실인데 Visual Studio Code에서 jupyter notebook처럼 코드를 돌리고 결과를 보고싶다면

가장 상단에 #%%를 입력하면 위에 Run Cell | Run Below | Debug Cell 이 뜨면서 코드를 돌릴 수 있습니다

확실히 좀 오래 걸리기는 하지만 매우 유용한 것 같습니다 ㅎㅎㅎ

 

 

참고자료:

https://github.com/joctet/Visualization_Cost_Function_Gradient_Descent/blob/main/Gradient%20Descent%20-%20Evolution%20of%20the%20Cost%20Function.ipynb

728x90
반응형

댓글