ecsimsw

Linear Regression / Gradient descent algorithm 본문

Linear Regression / Gradient descent algorithm

JinHwan Kim 2019. 3. 16. 11:02

Linear Regression / Cost

- 지도 학습에서 많이 사용되고 있는 알고리즘, 선형 회귀 방식을 공부하였다.
  홍콩 과기대의 김성훈 교수님의 유튜브 강의로 공부하였다. [Sung kim] Lec 00 - Machine/Deep learning 수업의 개요와 일정
  • Linear Regression
    - Linear Regression(선형 회귀) 방식은 지도 학습에서 기본이 되는 알고리즘으로 주어진 인풋 데이터를 표현할 수 있는 가장 합리적인 직선을 찾는 것이 그 알고리즘의 원리가 된다.

      위 그림에서 입력된 데이터를 표현할 수 있는 가장 합리적인 그래프는 어떤 것일까. 당연히 빨간색이고 그걸 비교할 수 있도록 손실도를 계산하도록 하는 방법이 Cost function이다.
  • Cost function
    - 가장 합릭적인 그래프를 찾는 것은, 다른말로 그래프에서 데이터들이 떨어진 정도가 가장 작는 것을 의미한다.
      따라서 손실도는 그래프에서 데이터의 거리의 평균으로 구할 수 있다.

  • Gradient descent algorithm
    - cost minimize가 최적의 그래프를 찾기위해 얼마나 중요한지 알 수 있었다. Gradient descent algorithm는 cost는 최소화하기 위한 가장 대표적인 알고리즘이다.
      Cost function을 함수로 표현하면 다음과 같고 최소가 되는 부분은 꼭지점, 즉 미분에서 그 값이 0인 점에 가까운점이 더 작은 cost를 갖는 것이다.
      아래 그림처럼 Cost function을 그래프로 표현했을 때 임의의 한점에서 접선을 긋고, 그 기울기의 경사 반대로 정의한 step size를 가지고 조금씩 움직여 기울기가 0인 점에 점점 더 가까워 지는 것이다.

    직접 텐서플로우에 몇개의 점 좌표를 넣고 가장 합리적인 직선을 찾으면 그 기울기가 학습이 덜된 초반에는 매우 빠르게 변화하다가 점점 그 폭이 작아지면서 수학적 기울기에 근접한 값을 점점 도출하는 것을 확인하였다.
      이것을 직접 구할 필요없이 텐서플로우의 메소드를 사용하면 다음의 식처럼 간단하게 cost minimize를 할 처리할 수 있다.
    cost = tf.reduce_mean(tf.square(hypothesis-y)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train = optimizer.minimize(cost)
  • example
    - 아래 코드는 3개 데이터의 x,y 좌표를 대입했을 때, 가장 합리적 직선을 찾고, 해당 그래프에서 x가 새로운 값일 때, y를 추정하는 코드이다.
    "Find line" #set data x =tf.placeholder(tf.float32) y =tf.placeholder(tf.float32) W = tf.Variable(tf.random_normal([1])) ### 1. Variable / random_normal([1]) b = tf.Variable(tf.random_normal([1])) hypothesis = W*x+b #cost cost = tf.reduce_mean(tf.square(hypothesis-y)) #Gradient Desent optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train = optimizer.minimize(cost) #sess sess = tf.Session() sess.run(tf.global_variables_initializer()) ### 2. tf.global_variables_initializer() #step for step in range(2001): sess.run(train, feed_dict = {x:[1,2,3], y:[2,4,6]}) if step%20 ==0: print(step, sess.run(W, feed_dict = {x:[1,2,3], y:[2,4,6]})) print(sess.run(hypothesis,feed_dict = {x:[4]})) ### 3. input new data
      공부해야할 포인트 3가지를 표시했다.
    - 1) W,b에 variable을 사용하였다. tensorflow에서 variable은 다른 언어의 변수와는 조금 다르게 이해해야한다.
      텐서플로우의 변수는 "변하는 수"로 H(x) = Wx+b에서 W,b를 변수로 하여 학습에 따라 계속 변화할 수 있도록 한다. 이 때문에 텐서플로우에서 변수는 trainable이라고도 한다. 이렇게 W,b를 전혀 모르는 상황에서 tf.random_normal([1])으로 1차원 난수를 대입하여 선언한 것이다.
      variable을 사용한다면 2)처럼 session.run 하기전에 반드시 tf.global_variables_initializer() 으로 변수를 초기화해야한다.
      variable을 사용한다면 2)처럼 session.run 하기전에 반드시 tf.global_variables_initializer() 으로 변수를 초기화해야한다.
    - 3) cost를 줄이는 2000번 학습으로 그래프를 추정한 이후, "feed_dict = {x:[4]"으로 x=4로 고정하고 hypothesis(결과 그래프)를 출력하는 것으로, 그래프를 가정했을때 x=4일때의 y값을 출력할 수 있었다.

'Machine Learning > Tensorflow' 카테고리의 다른 글

Placeholder / Variable  (0) 2019.03.17
Multi-variable / Matrix  (0) 2019.03.16
Data flow graph  (0) 2019.03.16
Supervised / Unsupervised  (0) 2019.03.15
Installation tensorflow  (0) 2019.03.14
Comments