본문 바로가기
DeepLearning Framework & Coding/Tensorflow 1.X

[코드로 이해하는 딥러닝 6] - 회귀(Linear Regression)에 대한 다른 접근

by 노마드공학자 2020. 12. 19.

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27

[코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 

[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 https://limitsinx.tistory.com/29

[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 https://limitsinx.tistory.com/30

[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31

[코드로 이해하는 딥러닝 5] - 다중선형회귀(Multiple Linear Regression) https://limitsinx.tistory.com/32

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

 

 

 

[Code Paraphrasing]

 

이번 글은, 이전에 작성했던 코드를 다른방식으로 작성해보는 '번외'편에 가깝습니다.

 

빠르고 정확한 이해를 위해선 선형대수학/행렬 연산에 대한 사전지식이 어느정도 요구되는 글입니다.

 

[코드로 이해하는 딥러닝 5] - 다중선형회귀(Multiple Linear Regression) https://limitsinx.tistory.com/32

에서 설명했던것을, 코드를 다른 방식으로 정리해보고자 합니다.

 

이번 글은, Skill적인 부분이긴 하지만, 앞으로는 이런식으로 코드를 짜는것이 상당히 편리하므로 숙지해두시면 좋습니다.

 

기존에는 상기와 같이 x1_data, x2_data, x3_data라고 해서 각각의 특징에 대해 모두 다른 변수로 선언해주었습니다.

 

즉, 이말은 5명(민호/동수/진호/경진/미희)의 점수를 국어/수학/영어 각각의 항목에 대해 모두 적어준것을 의미합니다.

 

하지만, 수많은 데이터를 학습시켜야 한다면 언제 이렇게 하나하나 치고있을지..

 

그럼 이런식으로 변경해보면 어떨까요?? 사람한명씩을 기준으로 배열을 만들어 정리를 해버리는 것입니다.

 

[변경 전]

x_data1=[73, 93, 89, 96, 73]

x_data2=[80, 88, 91, 98, 66]

x_data3=[75, 93, 90, 100, 70]

y_data = [152, 185, 180, 196, 142]

 

[변경 후]

x_data = [ [73,80,75], [83,88,93], [89,91,90], [96,98,100], [73,66,70] ]

y_data = [152, 185, 180, 196, 142]

 

이렇게되면 코드가 훨씬 직관적이며, 한명 한명이 국어/영어/수학점수를 어떻게 가지는지 확인할 수 있습니다.

 

예제 코드를 한번 분석해보겠습니다.

 

[코드 전문]

신규 코드

 

[코드 분석-1]

신규 코드

 

① x_data = [[1,1], [2,3], [4,5], [6,7], [8,8]]

    y_data = [[6], [7], [8], [9], [10]]

로써, x_data는 기본적으로 1행2열(1x2)의 데이터를 담고 있습니다.

기존에는 상수(1x1) 1개씩 표현했었는데, 이것들을 Array로 묶어 Matrix(행렬)형식으로 재배열 해주었다는 것이 중요합니다.

 

※ 이것을 각자 따로 학습시키자면, 이렇게 표현됩니다.

x_data1 = [1,2,4,6,8]

x_data2 = [1,3,5,7,8]

 

그다음, 엄청나게 중요한 부분이 나옵니다.

 

② ★ x=tf.placeholder(tf.float32, shape=[None,2])

: 기존에는 shape부분을 적어주지 않았습니다. 하지만, 새로 정리를 할때는 여러개의 데이터를 Array형식으로 묶어서 만들어 주었기 때문에 x_data가 어떤 Matrix형태인지 지정해주는것이 필요합니다.

 

"shape=[None,2]란 행(Rank)는 관계없고, 열(Column)이 2개다. 즉, x데이터 2개를 [ A, B ] 이런식으로 표현하겠다"

 

는 의미입니다.

 

※ Matrix에 대한 이해가 필요하신분은 해당 키워드 참고해주시면 됩니다.

▶ Keyword : Linear Algebra, 선형대수학, 행렬연산, Matrix Rank column

 

③ ★ w=tf.Variable(tf.random_normal([2,1])

: w는 Weighting 값입니다.

 

[기존 코드]

기존에는 Weigting도 x_data의 갯수에 대응되게 한개씩 따로 선언해주었죠 (w1, w2, w3)

하지만, 새로운 방식을 통해 x_data를 모두 하나로 묶어서 표현하게 되었으므로

Weighting값도 하나로 묶어 표현해야 합니다.

 

행렬 연산 원리로는 x_data가 (1,2)Matrix가 되었으니

※(1,2) : Rank 1 Column 2

y=x*W+b를 만족하기 위해선, W는(2,1)Matrix가 되어야하고, b는 (1,1)이 되면 되는거죠

 

따라서 W는 2행1열의 Matrix, b는 1행 1열의 Matrix로 선언해주는 것입니다.

 

[코드 분석-2]

① ★ Hypothesis = tf.matmul(x,w) + b

: Y=x*W + b를 해주는것으로, 기존에는

 Hypothesis = x1*w1 + x2*w2 + x3*w3 + b로 정리해두었었는데 Matrix연산을 통해 훨씬 깔끔하게 정리가 된 모습입니다.

tf.matmul 이라는 함수를 써주면 행렬곱(Matrix multiply)을 바로 진행해줍니다.

 

이하 코드는 기존과 동일합니다.

 

[결과값(10000번 학습)]

10000번 정도 학습시켜보면

real_Y값으로 [6,7,8,9,10]이 나와야하고, 학습한 결과로는

[5.886, 6.916, 8.05, 9.1869, 9.86] 정도를 예측하는것을 확인하실 수 있습니다.

 

꽤나 잘따라가는 모습을 보여주는데요, Learning_rate를 올리거나 학습횟수를 좀더 올리면 점점 실제Y값으로 수렴하는 모습을 확인하실 수 있습니다.

 

 

Summary

 

이번 글은, 선형대수학에 대한 어느정도의 사전지식이 필요했는데요

어려운 내용은 아니라서, 조금만 공부하셔도 금방이해하실 수 있으실겁니다.

 

하지만 도저히 이해가안되신다면 해당 코드를 그냥 외워주셔도 상관없습니다.

해당 글을 연재하는 목적은, 머신러닝을 완벽하게 이해하진 못해도 내가 필요한 결과값만 얻을 수 있도록 하는거니까요

 

 

댓글