GDSC HUFS 3기/텐서플로우로 시작하는 딥러닝 기초(Part-1)

[5팀] 텐서플로우로 시작하는 딥러닝 기초 | LAB 02

나쵸 소스 2021. 10. 5. 11:15

이 글은 boostcourse 강의를 참고하여 작성했습니다. 

작성자 : 홍수정

 

 

 

Lab 02: Simple Linear Regression 를 TensorFlow 로 구현하기.

이 강의에서는 선형회귀 (Linear Regression)을 코드로 구현하는 내용을 배웠다.

 

 

1. Hypothesis 함수와 Cost

 

Hypothesis 함수 👉 Wx+b

(W: weight, b:bias) (Wx+b로 표현이 되는 1차식) 

 

이 가설함수를 모델이라고 부른다. (우리의 Hypothesis, 우리의 가설,우리의 예측, 모두 동일한 말임)

Hypothesis 기반으로 cost함수를 정의했다. (y는 실제 값이다)

 

Cost 함수 👉 1/m∑ (H(xi)-yi)^2


예측과 실제의 차이는 에러라고 할 수 있는데 여기서 Cost는 에러 제곱을 모두 다 더해서 데이터 개수 m으로 나눈 값으로 정의한다.
즉, 에러 제곱의 평균값으로 정의되었다는 뜻이다.


Cost가 최소화되는 W와 b값을 구하는 것이 머신러닝에서의 러닝, 학습이라고 요약할 수 있다.

 

 

 

 

2. Hypothesis 함수와 Cost function을 tensorflow 코드로 어떻게 옮겨내는가?


1. 데이터 준비

 

x_data=[1,2,3,4,5] #(x데이터는 input)
y_data=[1,2,3,4,5] #(y데이터는 output)

=> x값과 y값이 같기 때문에 W와 b 값을 예측해볼 수 있다. (y=x)
=> H(x)=Wx+b (W=1,b=0)

 

 

 

2. W와 b를 정의

 

*tensorflow의 Variable로 정의. 각각 2.9와 0.5 값을 초깃값으로 지정함 (이 초깃값은 임의의 값을 지정할 수 있다.)
-> 실제 진행할땐 초기에 랜덤값으로 부여함

hypothesis = W*x_data+b # 이 부분이 우리의 가설 함수
cost=tr.reduce_mean(tf_square(hypothesis-y_data))


tf.reduce_mean( ) 함수

( 차원, 즉 랭크가 하나 줄어들면서 mean을 구한다고 해서 앞에 reduce 라는 말이 붙어있음)

v=[1.,2.,3.,4.]
tr.reduce_mean(v) # 2.5


1차원을 reduce=> 랭크 0

 

tr.square( )  함수 => 제곱함수

tf.square(3) #9

 


Cost가 최소화되도록 하는 W와 b를 찾는 minimization 알고리즘

=> Gradient descent(경사 하강 알고리즘 혹은 경사하강법)가 제일 유명
=> 경사를 하강하면서, 경사를 내려가면서 Cost가 minimize되는 W와 b를 찾는 알고리즘

 


1. Gradient descent 알고리즘은 일반적으로 텐서플로우에서는 GradientTape를 가지고 구현하는데, GradientTape은 with 구문하고 같이 쓰인다.
(with 구문 안에 있는 블록 안의 변수들의 변화를 테이프에 기록한다는 의미)

 

2. tape.gradient 메서드를 호출해서 경사도 값, 즉 미분값을 구한다.

gradeint( )함수는 함수에 대해서 변수들에 대한 개별 미분값, 즉 기울기 값을 구해서 튜플로 반환한다 (순서대로 반환됨)
(W에 대한 기울기, b에 대한 기울기에 각각 할당된다.)

3.  assign_sub 메서드를 호출해서  W와 b를 업데이트 (뺀 값을 다시 그 값에 할당해주는 것이다. (ex)A=A-B, A-=B)
gradient 값을 얼마만큼 반영할것인지를 결정하는 learning_rate 값을 곱해서 assign 하고 있는데
(learning_rate는 보통 굉장히 작은 값을 사용한다. 보통 0.001 혹은 0.00001 같은 매우 작은 값 사용)


(1~3) 이것을 여러 차례 걸쳐서 W와 b를 업데이트하게 된다. => 여기선 for문을 이용

 

 

import tensorflow as tf
tf.enable_eager_execution()

x_data = [1,2,3,4,5]
y_data = [1,2,3,4,5]

w= tf.Variable(2.9) # W,b 를 초기화
b= tf.Variable(0.5) 

learning_rate=0.01

for i in range(100+1): 
	with tf.GradientTape() as tape:
    	hypothesis = W * w_data + b
        cost=tf.reduce_mean(tf.square(hypothesis - y_data))
    W_grad, b_grade = tape.gradient(cost, [W,b])
    W.assign_sub(learning_rate * W_grad)
    b.assign_sub(learning_rate * b_grad)
    if i % 10 == 0 :
    	print("{:5}|{:10.4f}|{:10.4}|{:10.6f}".format(i,W.numpy(),b.numpy(),cost))


위의 코드를 돌려보면, print문을 통해 cost가처음에 큰 값이다가 거의 0 에 가깝게 오차가 작아진 것을 볼 수 있다.

우리의 모델이 실제 데이터와 거의 유사하다, 동일하다고 볼 수 있으며 모델이 실제 값을 예측하는데 굉장히 잘 맞게 되었다는 것을 알 수 있음.