5-3 TensorFlow solution of x - 1.12345 = 0

in #kr5 years ago (edited)

noname01.png

머신 러닝 연구가 아무리 첨단을 간다 해도 머신 러닝이 그렇게 대단한 툴이라면 이 정도 간단한 문제는 당연히 풀 수 있어야 하겠지. 항상 어려운 어렵고 난해한 문제만 쫓아 다니다 보니 x – 1.12345 = 0 과 같이 우스울 정도로 쉬운 문제를 어떻게 코딩해야 할지 해보기 전에는 막막하다는 생각이 들기도 한다.

물론 머신 러닝이 컴퓨터에 인스톨되기 때문에 기본적인 덧셈, 뺄셈, 곱셈, 나눗셈의 4칙 연산이 가능하므로 양변에 1.12345를 한번 더해주면 끝나는 간단한 문제이지만 이 방법에 의해서 푼다면 그것은 머신 러닝이라 할 수는 없다.

머신 러닝의 특징이 과연 무엇인가? 데이터 학습, random number 생성에 의한 웨이트와 바이아스 설정, hypothesis 설정, 경사하강법 적용 및 웨이트와 바이아스의 업데이트 과정이 일 것이다.

TensorFlow를 사용하여 일차 방정식 x – 1.12345 = 0을 처리해 보자. 방정식이 간단하므로 별도의 학습 과정조차 필요 없으며 직접 hypothesis를 설정하고 제곱하여 cost 함수를 구성 하도록 한다. 한편 학습을 통해서 처리하는 경우는 별도로 다룰 예정이다.

noname02.png

이 cost 함수에 경사 하강법 적용을 위해서 random_uniform()을 사용하여 충분히 넓은 범위 구간에서 weight w의 초기 값을 부여한다. 항상 동일한 계산 결과를 보려면 난수의 seed 값을 일정하게 부여하도록 한다.

noname03.png

learning rate = 0.9 로 설정하여 경사하강법에 의해 step 0 에서 90 회까지 총 91회에 걸쳐 weight 값을 업데이트 하면서 cost 함수의 최소값을 아래와 같이 계산하여 찾게 된다.

noname04.png

물론 TensorFlow 라이브러리를 사용하여 머신 러닝에 의해 해를 구할 수도 있지만 이 방정식은 너무 간단하여 수계산을 통해서도 해를 계산하여 확인할 수도 있다.
즉 cost 함수는 다음과 같이 제곱의 형태로 주어진다.

noname05.png

물론 TensorFlow 라이브러리를 사용하여 머신 러닝에 의해 해를 구할 수도 있지만 이 방정식은 너무 간단하여 수계산을 통해서도 해를 계산하여 확인할 수도 있다.
즉 cost 함수는 다음과 같이 제곱의 형태로 주어진다.

noname12.png

웨이트 의 초기 값은 코드 시작 부분에서 tf.set_random_seed(777) 가 실행된다면 항상 random_uniform() 명령에 의해noname06.png 으로 설정되며 이때 cost 함수의 값을 계산해 보면 61.32757 이 된다.

cost 함수를 w에 관해 한번 미분하도록 하자.

noname07.png

noname13.png

noname09.png

noname10.png

noname11.png

여하튼 learning rate 값을 얼마로 설정하느냐에 따라 수렴성이 많이 변하지만 0.5 근방의 값을 사용하면 대단히 빨리 수렴함을 수치 실험을 통해 알 수 있다.

첨부된 코드를 다운받아 indentation을 확인한 후 실행해 보자.

#simple_eqn.py
import tensorflow as tf
tf.set_random_seed(777) # reproducibility

w = tf.Variable(tf.random_uniform([1], -10., +10), name='weight')

hypothesis = w - 1.12345
cost = tf.reduce_mean(tf.square(hypothesis))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.9)
train = optimizer.minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for step in range(91):
sess.run(train)
if step % 1 == 0:
print(step, sess.run(cost), sess.run(w))

Sort:  

jjm.jpeg
짱짱맨 호출에 응답하여 보팅하였습니다.

짱짱맨은 저자응원 프로그램입니다. 더 많은 저자 분들에게 더 큰 혜택을 드리고자 스파임대 스폰서를 받고 있습니다. 스폰서 참여방법과 짱짱맨 프로그램에 관해서는 이 글을 읽어 주세요. 기업형 예비증인 북이오(@bukio)가 짱짱맨 프로그램을 운영하고 있습니다. 여러분의 증인 보팅은 큰 힘이 됩니다. Vote for @bukio

빵을 사기위해서는 이중적분을 알아야한다던 미친 친구가 생각납니다. ㅎㅎㅎ

재미난 친구분이시군요. ㅎ ㅎ

유머감각이 최고였져 ㅎㅎ

빵을 사기 위해 이중적분을 할 필요는 없겠지만, 빵가게(=방정식의 풀이법)가 없다면 밀, 팥과 사탕수수를 재배하고 오븐을 만드 등의 과정(=머신러닝)이 필요한거 아닐까요? ㅎ

기승전 머신러닝 인가여 ㅎㅎ

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.034
BTC 63688.35
ETH 3125.30
USDT 1.00
SBD 3.97