심심해서 하는 블로그 :: '텐서플로우' 태그의 글 목록

'텐서플로우'에 해당되는 글 1건

Andrew Ng 교수님의 Machine Learning 강좌(http://www.coursera.org)

모두를 위한 머신러닝 강좌(http://hunkim.github.io/ml/)를 참고하여 포스팅하였습니다.


1. 선형 회귀

대표하는 직선!!  

왼쪽 그림과 같이 데이터가 분포하여 있을 때 X=9일 때 Y 값을 예측을 하고자 한다. 

단순히 왼쪽 그림만으로 Y 값을 예측하기에는 근거가 부족하다. 

우리가 4지 선다형 문제를 찍는 데에도 근거가 있으면 (예를 들면 답이 유독 4가 없다는 등)

묘하게 설득력이 생긴다. 통계학자들은 이런 근거를 만들고자 오른쪽과 같이 직선을 그어보았다.

이 직선 주변으로 데이터를 나타나는 점들이 분포하여 마치 데이터를 대표하는 모델로 역할을 수행한다.

따라서 이제 X=9에서 Y 값을 예측하는 것은 이 직선에서 X=9를 대입하면 끝!! 근거도 있어서 맘도 편하다.

이와 같은 방법으로 데이터를 예측하는 모델을 선형 회귀라고 하고, 이 직선의 방정식을 가설 함수라 한다.



직선 그리는 것도 각양각색

위의 그림에서 직선의 모양, 즉 가설 함수에 따라서 X=9일 때 예측값 Y의 값이 달라짐을 알 수 있다.

따라서 대표하는 직선을 어떤 기준으로 그릴 거냐는 문제가 발생한다.  



위의 그림에서 d는 원래 데이터의 값 y1과 예측값 H(x1)의 거리를 의미한다.

H(X)의 함수식 Θ1, Θ0에 따라서 d값이 달라질 것이며 어떤 점에 대해서는 너무 멀고 

어떤 점에서는 너무 가깝지 않는, 즉 분산이 최소가 되는 값을 구하여야 한다.

이 때 d값의 분산을 Cost Function이라 하고 Cost Function 최소가 되는 Θ1, Θ0를 구하는 것이 목표이다.



산을 타고 내려갑니다.

위의 그래프는 Θ에 따른 cost(Θ)의 변화이다. 앞서 말했듯이 우리가 원하는 것은 

cost(Θ)을 최솟값으로 만드는 Θ값을 구하는 것이다.

이때 사용하는 알고리즘이 Gradient descent이다. 쉽게 말해서 산타고 내려가는 것!! 

Θ를 일정한 양만큼 계속 줄여가면서 바닥으로 내려가는 것인데 만약 바닥이라면 기울기가 0이 되므로

위의 박스친 편미분 부분이 0이 되어 더 이상 감소하지 않는다. 

그리고 위의 식에서 α을 Learning rate라고 한다. α의 값은 개발자가 직접 설정해야 한다.

만약 α값이 너무 크면 바닥까지 내려오지 않을 수도 있고, α값이 너무 작으면 반복하는 횟수가 증가한다.

따라서 α값을 변형하면서 적절한 값을 찾는 것이 중요하다.


2. Tensorflow 구현

소스 코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import tensorflow as tf
import matplotlib.pyplot as plt
 
# 학습 데이터
X_data = [3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.1677.042,10.791,5.313,7.997,5.654,9.27,3.1]
Y_data = [1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.2212.827,3.465,1.65,2.904,2.42,2.94,1.3]
 
numOfData = len(X_data)     # 데이터의 갯수
alpha = 0.001               # Learning Rate alpha
itr = 3000                  # 반복 횟수 1000회
 
theta1 = tf.Variable(tf.random_uniform([1], 0.03.0))      # theta1
theta0 = tf.Variable(tf.random_uniform([1], 0.03.0))      # theta0
 
# H(x) = theta1 * x + theta0
hypothesis = tf.add(tf.mul(theta1, X_data), theta0)
 
# cost() = 1/2m * sum(pow(H(x) - y))
cost_function = tf.reduce_sum(tf.pow(hypothesis - Y_data, 2)) / (2 * numOfData)
 
# Gradient Descent 알고리즘
optimizer = tf.train.GradientDescentOptimizer(alpha).minimize(cost_function)
 
# 변수 초기화
init = tf.global_variables_initializer()
 
# Tensorflow session 시작
with tf.Session() as sess:
    sess.run(init)
 
    # 3000회 반복 수행
    for i in range(itr):
        sess.run(optimizer)
        if i % 20 == 0:
            print(i, sess.run(cost_function), sess.run(theta1), sess.run(theta0))
 
    # 데이터 시각화
    plt.plot(X_data, Y_data, 'ro', label='Training Data')
    plt.plot(X_data, sess.run(theta1) * X_data + sess.run(theta0), label='Linear Regression Result')
    plt.legend()
    plt.show()
 
 
cs

결 과


 

,