본문 바로가기
AI & Data Analysis/인공지능 스터디

[모두의 딥러닝] #4장: 오차 수정하기 : 경사하강법

by 로토마 2022. 1. 13.

두 번째 딥러닝 스터디 시간이 찾아왔따!

이번에도 주피터 노트북을 사용해 실습까지 이쁘게 무엇보다 꼼꼼히 진행해 보았다.

 

전 시간에는 최소 제곱법을 이용해 기울기 값과 y절편의 값을 구해 방정식을 세우고,

예측을 진행하는 단일 선형 회귀를 진행했다.

이번 시간에는 앞써 진행했었을 때의 오차를 떠올리며! 

어떻게 오차를 최소화 시킬 수 있는가? 에 대한 solution 경사하강법에 다루고, 다중 선형 회귀 실습을 진행해 보았다.

 

"경사하강법" 이란?

실습 과정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
# 공부 시간 x와 y의 성적 리스트 만들기
data = [[2,81],[4,93],[6,91],[8,97]]
 
# x와 y 리스트 선언
= [i[0for i in data]
= [i[1for i in data]
 
# 그래프로 나타내기
plt.figure(figsize=(8,5))
plt.scatter(x,y)
plt.show()
 
# 리스트로 되어 있는 x와 y 값을 넘파이 배열로 바꾸기 
# => 인덱스를 주어 하나씩 불러와 계산하기 위해
x_data = np.array(x)
y_data = np.array(y)
 
# 기울기 a와 절편 b 초기화
= 0
= 0
 
# 학습률 정하기
lr = 0.03
 
# 몇 번 반복될지 설정
epochs = 2001
 
# 경사하강법 시작
for i in range(epochs):       # 에포크 수만큼 반복
    y_pred = a * x_data + b   # y를 구하는 식 세우기
    error = y_data - y_pred   # 실제값 - 예측값, 오차를 구하는 식
    
    # 평균 제곱 오차를 a로 미분한 결과
    a_diff = -(2/len(x_data)) * sum(x_data *(error))
    
    # 편균 제곱 오차를 b로 미분한 결과
    b_diff = -(2/len(x_data)) * sum(error)
    
    a = a - lr * a_diff # 미분 결과에 학습률 곱한 후 기존의 a 값 업데이트
    b = b - lr * b_diff # 미분 결과에 학습률 곱한 후 기존의 b 값 업데이트
    
    # 100번 반복될 때마다 현재의 a 값, b 값 출력
    if i%100 == 0
        print("epoch=%.f, 기울기=%.04f, 절편=%.04f" %(i,a,b))
 
 
# 앞써 구한 기울기와 절편을 이용해 그래프를 다시 그리기
y_pred = a * x_data + b
plt.scatter(x,y)
plt.plot([min(x_data),max(x_data)],[min(y_pred),max(y_pred)])
plt.show()
 
cs

경사하강법의 원리, 미분 유도 과정
다중 선형회귀 개요

실습 과정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d # 3D 그래프 그리는 라이브러리
 
# 공부 시간 x와 y의 성적 리스트 만들기
data = [[2,0,81],[4,4,93],[6,2,91],[8,3,97]]
 
# x와 y 리스트 선언
x1 = [i[0for i in data]
x2 = [i[1for i in data]
= [i[2for i in data]
 
ax = plt.axes(projection='3d'# 그래프 유형 정하기
ax.set_xlabel('study_hours')
ax.set_ylabel('private_class')
ax.set_zlabel('Score')
ax.scatter(x1,x2,y)
plt.show()
 
x1_data = np.array(x1)
x2_data = np.array(x2)
y_data = np.array(y)
 
# 기울기 a와 절편 b 값 초기화
a1=0
a2=0
b=0
 
# 학습률
lr = 0.02
 
# 반복 횟수 + 1
epochs = 2001
 
# 경사하강법 시작
for i in range(epochs):
    y_pred = a1 * x1_data + a2*x2_data +# y 구하는 식 세우기
    error = y_data - y_pred  #오차 구하는 식
 
    # 평균 제곱 오차를 a로 미분한 결과
    a1_diff = -(2/len(x1_data)) * sum(x1_data *(error))
    a2_diff = -(2/len(x2_data)) * sum(x2_data *(error))
 
    # 편균 제곱 오차를 b로 미분한 결과
    b_diff = -(2/len(x1_data)) * sum(y_data - y_pred)
    
    a1 = a1 - lr * a1_diff # 미분 결과에 학습률 곱한 후 기존의 a1 값 업데이트
    a2 = a2 - lr * a2_diff # 미분 결과에 학습률 곱한 후 기존의 a2 값 업데이트
    b = b - lr * b_diff # 미분 결과에 학습률 곱한 후 기존의 b 값 업데이트
    
    if i%100 == 0:
         print("epoch=%.f, 기울기1=%.04f, 기울기2=%.04f, 절편=%.04f, a1편미분=%.04f,a2편미분=%.04f, b편미분=%.04f" %(i, a1 ,a2, b,a1_diff,a2_diff,b_diff))
 
 
#참고 자료, 다중 선형회귀 '예측 평면' 3D로 보기
 
import statsmodels.api as statm
import statsmodels.formula.api as statfa
#from matplotlib.pyplot import figure
 
= [i[0:2for i in data]
= [i[2for i in data]
 
X_1=statm.add_constant(X)
results=statm.OLS(y,X_1).fit()
 
hour_class=pd.DataFrame(X,columns=['study_hours','private_class'])
hour_class['Score']=pd.Series(y)
 
model = statfa.ols(formula='Score ~ study_hours + private_class', data=hour_class)
 
results_formula = model.fit()
 
a, b = np.meshgrid(np.linspace(hour_class.study_hours.min(),hour_class.study_hours.max(),100),
                   np.linspace(hour_class.private_class.min(),hour_class.private_class.max(),100))
 
X_ax = pd.DataFrame({'study_hours': a.ravel(), 'private_class': b.ravel()})
fittedY=results_formula.predict(exog=X_ax)
 
fig = plt.figure()
graph = fig.add_subplot(111, projection='3d')
 
graph.scatter(hour_class['study_hours'],hour_class['private_class'],hour_class['Score'],
              c='blue',marker='o', alpha=1)
graph.plot_surface(a,b,fittedY.values.reshape(a.shape),
                   rstride=1, cstride=1, color='none', alpha=0.4)
graph.set_xlabel('study hours')
graph.set_ylabel('private class')
graph.set_zlabel('Score')
graph.dist = 11
 
plt.show()
 
# 3차원 '예측 평면'
 
 
cs

이렇게 모두의 딥러닝 4장의 모든 과정 스터디를 마쳤다~ ㅎ 

epochs도 나오고 이제 뭔가 진쨔 본격적으로 딥러닝으로 들어가는 것 같달까? 

마직막으로 실습 예제 문제를 풀고 4장 공부를 마치겠다!! 

 

p.s 이번 예제는 난도가 꽤 있으니!! 유의해서 공부하면서 풀어볼 것 !!!

 

실습 예제 문제)

실습 예제 문제

전체 코드)

https://github.com/emilyjiminroh/2022_ai_winter_study/blob/main/chapter_4/4%EC%9E%A5_%EC%8B%A4%EC%8A%B5_%ED%80%B4%EC%A6%88.ipynb

 

GitHub - emilyjiminroh/2022_ai_winter_study: 모두의 딥러닝 교재를 바탕으로 AI Study

모두의 딥러닝 교재를 바탕으로 AI Study. Contribute to emilyjiminroh/2022_ai_winter_study development by creating an account on GitHub.

github.com