본문 바로가기

Hello MLop/DL

MLop_DL_사인함수 예측하기

20221117

30일 차

 


이번에 할 내용은 사인함수 그래프 예측하기 이다.

 

사인함수 그래프를 결과로 놓고

3차 함수를 사인 함수의 모양으로 만들어 보는 실습을 해봤다.

 


 

모델 설계과정은 위와 같다.

 


 

import math는 파이썬에서 수학함수를 쓸 수 있게 해준다.

import torch는 pytorch의 torch를 쓸 수 있게 해준다.

 

💡 torch?

 

facebook에서 제공하는 딥러닝 도구로서, numpy와 효율적인 연동을 지원하는 편리한 도구

 구글에서 만든 tensorflow나 pytorch나 기본적인 data structure은 tensor이다.

 tensor란 2차원 이상의 array(배열)이며, matrix, vector의 일반화된 객체이다.

 

출처 : https://www.datacamp.com/tutorial/investigating-tensors-pytorch

 


x = torch.linspace(-math.pi, math.pi, 1000)

위의 코드를 해석하자면

x라는 변수에 torch  # tensor형태로 를 저장할거야

.linspace 배열 형태로

시작은 -math.pi # pi = π = 원주율 이고 끝은 math.pi

전체 개수는 1000개로 할게.

 

그래서 위의 출력값이 -3.14xxxx로 시작하는 것이다.

 

 


그리고 우리의 목표가 될 종속변수 ysin함수를 위와 똑같은 데이터 타입(tensor)으로

저장해 준다.

 


 

위의 두 tensor 배열 x, y로 시각화를 해보면

위와 같은 형태의 그래프가 나온다.

 


우리가 학습 시킬 그래프는 3차함수 그래프 이므로

각각 3차 방정식의 계수(= a, b, c)와 상수(= d)를

torch.randn(())으로 설정해준다.

 

💡 torch.randn(())

평균0 이고 분산이 1정규분포(aka.표준 정규 분포)에서 난수로 채워진 tensor를 반환한다 .

 

위와 같이 a, b, c, d가 출력되는것을 볼 수 있다.

 

그리고 y_random이라는 변수에 삼차 방정식( a * x**3 + b * x**2 + c * x + d )

 


자 그럼 중간 점검을 하면

 

우리는 현재 3차함수의 그래프의 모양을 결정계수상수를 각각 독립변수로 설정

그리고 종속 변수를 sin함수로 설정한것이다.

 

그럼 머리속에서 이런 생각이 들어야한다.

 

3차함수의 계수와 상수를 sin함수의 모양에 맞게끔 학습시키고 오차를 줄이면

난수로 지정된 3차 함수의 계수와 상수

결국에는 사인함수의 계수와 상수에 가까워 지겠구나.

 

이걸 딥러닝 차원에서 보면

 

들어갈 데이터 입력값을 a,b,c,d로 만들어 준것이다.

머신러닝에서는 전처리 단계에 해당한다.

 


<위의 코드 해석>

 

plt.subplot(2,1,1)

시각화를 출력할 건데 2행, 1열의, 1번째 인덱스는

 

plt.title('y true')

타이틀은 ' y true'로 한다.

 

plt.plot(xy)

plot로 그릴건데 데이터는 xx데이터, yy데이터로 한다.

 

결과 = 출력의 첫 번째 그래프

 


learning_rate란 학습률을 정의한다.

 

그리고 for문을 통해 학습을 진행하는데 range(2000)이므로 2000번 학습하겠다는 의미이다.

 

그럼 학습할 내용은 무었이냐 보니y_pred 라는 3차함수 식인데 # a,b,c,d는 난수 텐서  배열로 위에서 저장해주었다.

손실(오차)을 의미하는 loss라는 변수에 제곱오차의합을  저장할것이다.

 

다시말해서 오차의 제곱의 합을 더해줄것이다.

y (sin 함수)값 - y_pred(3차 함수값) ▶ 오차.pow(2) ▶ 제곱.sum()  .item()  tensor 에서 실수값으로 

 

# loss = sum((예측값 - 실제값) ** 2)


▲ 위의 for문과 이어집니다.

 

오차를 줄이는 방식중 하나인 경사하강법으로

계수 a,b,c 상수 d의 값을 학습시킨다.

 

❗ 결국 3차 함수그래프 모양sin함수와 같게끔 유도하는건

4개의 값 a,b,c,d이다.

 

grad_y_pred = 2.0 * (y_pred - y) # 손실함수의 편미분한 값 = 경사하강법에서의 학습 진행방향 (=기울기 방향)
    
grad_a = (grad_y_pred * x ** 3).sum()
3차항에 grad_y_pred를 적용하겠다.
 
grad_b = (grad_y_pred * x ** 2).sum()
2차항에 grad_y_pred를 적용하겠다.
 
grad_c = (grad_y_pred * x).sum()
1차항에 grad_y_pred를 적용하겠다.
 
grad_d = grad_y_pred.sum()
상수항에 grad_y_pred를 적용하겠다.

그럼 각항에서의 경사하강법은 어떻게 진행될지 결정 되었다.

그럼 이제  그래프의 모양을 결정지을 계수상수

적용시켜보자.

 

a -= learning_rate * grad_a       # 가중치를 업데이트 (기울기의 반대방향 * -1)
b -= learning_rate * grad_b
c -= learning_rate * grad_c
d -= learning_rate * grad_d

이제 실제 값을 출력해보자

 

 

경사하강법으로 오차의 최솟값에 근접하게 학습시킨

각각의 계수와 상수가 들어간 y_pred의 결과물을 볼 수 있다.

 

 

 

 

 

 

 

'Hello MLop > DL' 카테고리의 다른 글

MLop_DL_ResNet 실습  (0) 2022.12.04
MLop_DL_CNN 실습  (0) 2022.11.30
MLop_DL_손글씨 판단 예측  (0) 2022.11.24
MLop_DL_보스톤 집값 예측  (0) 2022.11.23
MLop_DL_Deep Learnig  (1) 2022.11.21