[Python] 모두의 딥러닝 - 02. 딥러닝의 동작 원리[경사하강법]

Updated:

모두의 딥러닝 교재를 토대로 공부한 내용입니다.

실습과정에서 필요에 따라 코드나 이론에 대한 추가, 수정사항이 있습니다.


기본 세팅

import numpy as np
import pandas as pd

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

mpl.rc('font', family='NanumGothic') # 폰트 설정
mpl.rc('axes', unicode_minus=False) # 유니코드에서 음수 부호 설정

# 차트 스타일 설정
sns.set(font="NanumGothic", rc={"axes.unicode_minus":False}, style='darkgrid')
plt.rc("figure", figsize=(10,8))

warnings.filterwarnings("ignore")

4. 경사하강법

경사하강법에 대해선 머신러닝 완벽가이드에서 공부하였다.

경사하강법 포스팅에서 자세한 설명을 적어두었으니 참고하자.

여기선 새로운 교재니 복습겸 코드만 실습해보고 설명은 따로 적지 않으려고 한다.

4.1 단순 선형 회귀

# X: 공부시간, Y: 성적
x_data = np.array([2,4,6,8])
y_data = np.array([81,93,91,97])

# 기울기, 절편 초기화
beta_1 = 0
beta_0 = 0

# 학습률 설정
learning_rate = 0.03

# 반복 수 설정
epochs = 2001

# 단순 선형 회귀 경사하강법
for i in range(epochs):
    y_pred = beta_1 * x_data + beta_0
    error = y_data - y_pred
    
    # 베타1 미분 값
    beta_1_diff = -(2/len(x_data)) * sum(x_data * (error))
    
    # 베타0 미분 값
    beta_0_diff = -(2/len(x_data)) * sum(error)
    
    # 베타1,0 업데이트
    beta_1 = beta_1 - learning_rate * beta_1_diff
    beta_0 = beta_0 - learning_rate * beta_0_diff
    
    if i % 200 == 0:
        print(f"epoch={i}, 기울기={beta_1:.2f}, 절편={beta_0:.2f}")
epoch=0, 기울기=27.84, 절편=5.43
epoch=200, 기울기=4.10, 절편=68.28
epoch=400, 기울기=2.55, 절편=77.48
epoch=600, 기울기=2.34, 절편=78.79
epoch=800, 기울기=2.31, 절편=78.97
epoch=1000, 기울기=2.30, 절편=79.00
epoch=1200, 기울기=2.30, 절편=79.00
epoch=1400, 기울기=2.30, 절편=79.00
epoch=1600, 기울기=2.30, 절편=79.00
epoch=1800, 기울기=2.30, 절편=79.00
epoch=2000, 기울기=2.30, 절편=79.00

4.2 다중 선형 회귀

from mpl_toolkits import mplot3d

# X1: 공부시간, X2: 과외수업횟수, Y: 성적
x1 = np.array([2,4,6,8])
x2 = np.array([0,4,2,3])
y = np.array([81,93,91,97])

# 파라미터 초기화
a1 = 0
a2 = 0
b = 0 

# 학습률 설정
learning_rate = 0.02

# 반복 수 설정
epochs = 2001

# 다중 선형 회귀 경사하강법
for i in range(epochs):
    y_pred = a1*x1 + a2*x2 + b
    error = y_data - y_pred
    
    # a1 미분 값
    a1_diff = -(2/len(x1)) * sum(x1 * (error))
    
    # a2 미분 값
    a2_diff = -(2/len(x2)) * sum(x2 * (error))
    
    # b 미분 값
    b_diff = -(2/len(x2)) * sum(error)
    
    # 파라미터 업데이트
    a1 = a1 - learning_rate * a1_diff
    a2 = a2 - learning_rate * a2_diff
    b = b - learning_rate * b_diff
    
    if i % 200 == 0:
        print(f"epoch={i}, 기울기1={a1:.2f}, 기울기2={a2:.2f}, 절편={beta_0:.2f}")
epoch=0, 기울기1=18.56, 기울기2=8.45, 절편=79.00
epoch=200, 기울기1=4.57, 기울기2=3.35, 절편=79.00
epoch=400, 기울기1=2.36, 기울기2=2.58, 절편=79.00
epoch=600, 기울기1=1.74, 기울기2=2.37, 절편=79.00
epoch=800, 기울기1=1.57, 기울기2=2.31, 절편=79.00
epoch=1000, 기울기1=1.52, 기울기2=2.29, 절편=79.00
epoch=1200, 기울기1=1.51, 기울기2=2.29, 절편=79.00
epoch=1400, 기울기1=1.50, 기울기2=2.29, 절편=79.00
epoch=1600, 기울기1=1.50, 기울기2=2.29, 절편=79.00
epoch=1800, 기울기1=1.50, 기울기2=2.29, 절편=79.00
epoch=2000, 기울기1=1.50, 기울기2=2.29, 절편=79.00

Leave a comment