인공지능 응용 공학

TensorFlow solution of x - 1.12345 = 0

coding art 2022. 11. 5. 16:58
728x90

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

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

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

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

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

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

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

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

웨이트 의 초기 값은 코드 시작 부분에서 tf.set_random_seed(777) 가 실행된다면 항상 random_uniform() 명령에 의해

 으로 설정되며 이때  Cost 함수의 값을 계산해 보면 61.32757 이 된다.

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

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

 

첨부된 코드를 다운받아 tensorflow 1.15 이하 버전에서 실행해 보자.

#simpleeqn.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))