KNOU STUDYREAD

한국방송통신대학교 통계데이터과학과 블로그

CS & Department of Statistics and Data Science

통계데이터과학과 및 컴퓨터과학 독서

04. 딥러닝 5장

Harryㅤ 2023. 11. 13.

1. 경사하강법 : 일정한 곡면을 가진 2차함수가 있을 때 경사의 가장 완만한 부분은 봉우리 지점(가장 볼록한 부분)에 도달했을때 기울기가 가장 작다. 이 그래프에서 가장 완만한 지점의 값을 기울기 a라고 할 때, m의 위치에 있다면 임의의 기울기 a1, a2, a3...인 식으로 각각의 m을 구한다. 이때의 미분 기울기를 이용하는 방법을 경사 하강법이라고 한다.
따라서, 기울기가 0인 지점, 미분값이 0인 지점을 찾으면서 임의의 수를 대입하는데 이때 적절한 학습률을 설정해서 구해야한다.

import numpy as np
import matplotlib.pyplot as plt

# 이전단원 학생별 공부시간별 점수

x = np.array([2, 4, 6, 8])     # 공부시간 x
y = np.array([81, 93, 91, 97]) # 성적 y
 
plt.scatter(x, y)   # 산점도 scatter 옵션 사용하여 그래프 시각화
plt.show()

# 기울기 a의 값과 절편 b의 값을 초기화
a = 0
b = 0

# 학습률(Learning Rate) 임의지정
lr = 0.03

# 반복할 횟수 설정
epochs = 2001 

# x의 총 값 n 설정
n = len(x)

# 정해진 범위 안에서 경사하강법 시행
for i in range(epochs):      
    y_pred = a * x + b       # 예측 값을 구하기
    error = y - y_pred       # 실제 값과 비교한 오차를 error로 설정

    a_diff = (2/n) * sum(-x * (error))   # 오차 함수를 a로 편미분
    b_diff = (2/n) * sum(-(error))       # 오차 함수를 b로 편미분

    a = a - lr * a_diff   # 학습률을 곱해 기존의 a 값을 업데이트
    b = b - lr * b_diff   # 학습률을 곱해 기존의 b 값을 업데이트

    if i % 100 == 0:      # 100번 반복될 때마다 현재의 a 값, b 값을 출력
        print("epoch=%.f, 기울기=%.04f, 절편=%.04f" % (i, a, b))
        
# 앞서 구한 최종 a 값을 기울기, b 값을 y 절편에 대입해 그래프를 시각화
y_pred = a * x + b      

# 그래프 시각화
plt.scatter(x, y)
plt.plot(x, y_pred,'r')
plt.show()

따라서, 경사하강법에 따라 기울기 a 값이 2.3에 수렴되면서 b값 절편은 대략 79라는 것을 알 수 있다.

만약 여러 변수가 포함되는 다중선형회귀의 경우 기울기 a1, a2, a3.. 이런 식으로 추가해서 구할 수 있다.

import numpy as np
import matplotlib.pyplot as plt

# 공부 시간 x1과 과외 시간 x2, 성적 y인 배열 설정
x1 = np.array([2, 4, 6, 8])
x2 = np.array([0, 4, 2, 3])
y = np.array([81, 93, 91, 97])

# 그래프 시각화
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(x1, x2, y);
plt.show()

# 기울기 a값 절편 b값 초기화
a1 = 0
a2 = 0
b = 0

# 학습룰 설정
lr = 0.01 

# 총 반복수 설정
epochs = 2001 

# x 값이 총 몇 개인지 셉니다. x1과 x2의 수가 같으므로 x1만 가산.
n = len(x1)

# 정해진 범위 안에서 경사하강법 시행
for i in range(epochs):             
    
    y_pred = a1 * x1 + a2 * x2 + b  # 예측 값 식
    error = y - y_pred              # 실제 값과 비교한 오차를 error로 설정
    
    a1_diff = (2/n) * sum(-x1 * (error))  # 오차 함수를 a1로 편미분
    a2_diff = (2/n) * sum(-x2 * (error))  # 오차 함수를 a2로 편미분
    b_diff = (2/n) * sum(-(error))        # 오차 함수를 b로 편미분
    
    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" % (i, a1, a2, b))

# 실제 및 예측 점수 결과 출력
print("실제 점수: ", y)
print("예측 점수: ", y_pred)

반복횟수가 대략 1800- 2000번에 도달했을때 예측점수와 실제 점수의 유사도가 높아지며 오차는 대략 1점 내외로 나오는 것을 볼 수 있다. 

'통계데이터과학과 및 컴퓨터과학 독서' 카테고리의 다른 글

06. 딥러닝 7-9장  (0) 2023.11.27
05. 딥러닝 6장  (0) 2023.11.20
03.딥러닝 3-4장  (0) 2023.11.06
02. 딥러닝 2장  (0) 2023.10.30
01. 딥러닝 1장  (0) 2023.10.23