TensorFlow에 대해서 알려달라는 메일이 와서 한 번 끄적여본다.



TensorFlow는 기본적으로 그래프를 그려 문제를 방법이다.

여기서 그래프란 우리가 알고 있는 Y = X + 1 같은 것이 아니라 노드(데이터)와 엣지(링크)로 연결된 형태를 말한다.

위키 백과에 그래프에 대해서 잘 설명을 해놨으니 읽어보는 것이 좋겠다.
https://ko.wikipedia.org/wiki/%EA%B7%B8%EB%9E%98%ED%94%84

이는 딥러닝 또한 마찬가지인데, 쉽게 말해서 행렬문제를 많이 풀도록 컴퓨터한테 시키는 것이다.

이를 사용하기 잘 위해서 선형대수학, 함수, 미적분, 미분방정식에 대해서 알아야 한다.



그럼 텐서플로우를 사용하기 위한 기본 개념을 알아보자.

텐서플로우에는 기본적으로 placeholder, Variable, constant가 있다. 이는 모두 노드를 뜻한다.

placeholder는 우리가 집어 넣을 데이터의 공간이고 constant는 말 그대로 상수의 공간이다. 그리고 Variable이 보통 '딥러닝(머신러닝)으로 이 문제를 풀어봐!' 라고 말하는 사람들이 원하는 답이 들어있는 공간이다.

placeholder: 우리가 가진 데이터를 넣는 공간
Variable: 최적화를 시킬 필요가 있는 공간
constant: 상수


그럼 노드의 계산이 어떻게 일어나는지 생각을 해보자.

A = B + C 라는 식이 있다고 해보자.

이를 그래프로 표현하면 어떻게 될까?




위의 그래프는 공학이나 수학, 물리학을 전공한 사람들에게는 익숙하겠지만 보통의 사람들에게는 익숙하지 않은 모양일 것이다.

쉽게 설명해보자면 B, C라는 데이터가 +연산을 하여 A라는 데이터로 바뀌는 과정을 도식화 한 것이다.

placeholder, Variable, constant는 A, B, C에 들어가는 공간이다.

각 객체를 어떻게 사용하는지는 TensorFlow Document에서 찾아서 읽어보도록 하자.
https://www.tensorflow.org/api_docs/



그럼 가장 쉬운 예제인 선형회귀에 대해서 생각을 해보도록 하자.

선형회귀에 대한 설명을 알아서 찾아보기로 하고 선형회귀를 텐서플로우로 바꾸면 어떻게 되는지 살펴보자.



======================= Python =======================

# 텐서플로우 가져오기

import tensorflow as tf




# 사용할 데이터 정의

x_data = [1, 2, 3]

y_data = [1, 2, 3]




# W, X, Y 정의

# W = tf.Variable(tf.random_normal([1]), name='weight')

W = tf.Variable(5.0)

X = tf.placeholder(tf.float32, shape=[None], name='x')

Y = tf.placeholder(tf.float32, shape=[None], name='y')




# 사용할 식 정의. linear regression

hypothesis = W * X




# cost func 정의

# cost(W, b) = (1/m) * sigma(i = 1 ~ m)((W * X) - Y)^2

cost = tf.reduce_mean(tf.square(hypothesis - Y))




### minimize하기

# GradientDescentOptimizer의 식

# W := W - a * (1/m) * sigma(i = 1 ~ m)((W*xi - yi) * xi)

# 어느 정도로 시도할 것인지 결정

learning_rate = 0.1  # a

# 기울기 값

gradient_W = tf.reduce_mean((W * X - Y) * X)  # (1/m) * sigma(i = 1 ~ m)((W*xi - yi) * xi)

descent_W = W - learning_rate * gradient_W  # W - a * (1/m) * sigma(i = 1 ~ m)((W*xi - yi) * xi)

# W에 descent값을 재할당 한다.

update_W = W.assign(descent_W)  # W := W - a * (1/m) * sigma(i = 1 ~ m)((W*xi - yi) * xi)




# 세션 열기

sess = tf.Session()

# Variable 초기화하기

sess.run(tf.global_variables_initializer())

for step in range(101):

    sess.run(update_W, feed_dict={X:x_data, Y:y_data})

    print(step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))


======================= Python =======================



위는 가장 기본적인 형태의 선형회귀를 텐서플로우로 표현한 것이다.

원래는 Y = W * X + b 로 표현해야겠지만 직접 최적화를 하는 것을 보여주기 위해서 b를 뺐다.

Y = W * X 를 그래프로 표현해보면 아래와 같다.




이건 위에서도 봤던 간단한 형태의 그래프이다.

이제 각각의 요소를 텐서플로우로 봐보자.

먼저 X, Y는 placeholder이다. 이것들은 우리가 가지고 있는 데이터 값이기 때문이다. W의 경우 Variable로 정의되는데 이것은 우리가 최적화해야 하는 값이기 때문이다.

위에서 최적화(Optimization)의 경우 cost function(loss function)을 최소화하는 방법을 이용했는데 이는 경사하강법(Gradient Descent)을 이용한 것이다. 

위의 코드를 돌려보면 아래와 비슷하게 나올 것이다.


============================== Results ==============================

0 21.238516 3.1333332

1 6.041179 2.1377778

2 1.71838 1.6068149

3 0.48878372 1.3236346

4 0.1390319 1.1726052

5 0.0395468 1.092056

6 0.011248882 1.0490966

7 0.0031996702 1.0261848

8 0.0009101348 1.0139652

9 0.0002588762 1.0074481

10 7.363582e-05 1.0039723

11 2.0945927e-05 1.0021186

12 5.95745e-06 1.0011299

13 1.6944645e-06 1.0006026

14 4.820219e-07 1.0003214

15 1.3713388e-07 1.0001714

16 3.8991956e-08 1.0000914

17 1.1105257e-08 1.0000488

18 3.1516645e-09 1.000026

19 8.923659e-10 1.0000138

20 2.5492378e-10 1.0000074

21 7.316222e-11 1.0000039

22 2.1486812e-11 1.0000021

23 6.631732e-12 1.0000012

24 1.8047785e-12 1.0000006

25 5.163277e-13 1.0000004

26 2.6526928e-13 1.0000002

27 9.947598e-14 1.0000001

28 0.0 1.0

29 0.0 1.0

...

100 0.0 1.0

============================== Results ==============================



횟수가 거듭될수록 점점 cost가 줄고 W가 1.0이 되는 것을 확인 할 수 있다.

이는 사용한 데이터의 모양을 보면 왜 저렇게 되는지 알 수 있다.

위에서 사용한 데이터는 아래와 같다.
x_data = [1, 2, 3] 
y_data = [1, 2, 3]



텐서플로우의 사용법에 대해서 설명을 할 생각을 해보지 않았기에 잘 이해가 안 가는 부분이 있을수도 있다. 혹시 잘 모르겠으면 메일로 물어보기를 바란다.

p.s. tf.Session()등의 내용은 텐서플로우 홈페이지의 맨처음 예제를 해보면 알 수 있기에 설명에서 제외했다.







+ Recent posts