Simplified hypothesis
이전의 가설에서 b 부분을 생략한 간략화한 가설을 세워 Cost를 구하고 Minimize 하는 것까지 수행해보겠다.

위와 같이 간략화한 가설의 Cost 값을 임의로 구해보면 아래와 같은 결과를 가질 것이다.


위와 같은 그래프를 좀 더 조밀한 간격의 그래프로 나타내면 Cost function은 아래와 같은 형태를 띠게 된다.
우리가 원하는 Cost가 minimize 되는 부분은 W=0인 부분이 될 것이다.

Gradient descent algorithm
Cost Function에서 Cost 값을 최적화(최소화)하는 알고리즘
위와 같은 어느 시점에 최소 값을 가진 그래프의 한 시점에서 시작하여 Cost가 줄어드는 방향으로 움직여서 Cost 값이 최저가 되었다고 판단되었을 때까지 W와 b 값을 지속적으로 바꾼다.

여기서, Cost가 줄어드는 방향으로 움직이는 방법은 해당 시점에서의 기울기를 이용한다. 기존의 W 값에서 기울기를 빼줌으로써 만약 그래프의 오른쪽 부분에서 시작하였다면 기울기가 양수가 되고 이것을 W 값에서 빼주면 W 값이 줄어들어 그래프상에서 왼쪽으로 이동하는 형태가 될 것이고 만약 그래프의 왼쪽 부분에서 시작하였다면 기울기가 음수가 되고 W 값이 늘어나며 그래프상에서는 오른쪽으로 이동하는 형태가 되어 기울기가 0인 부분에 도달하면 W 값에 변화가 없어질 것이고 그 부분을 minimum이라고 결정 지을 것이다.
또한, 그래프의 기울기가 크다면 (경사지다면) 더 많은 이동을 할 것이고 그래프의 기울기가 작다면 (완만하다면) 적은 이동을 할 것이다.

위와 같은 미분 방식을 통해 W를 지속적으로 업데이트하여 Cost 값이 최소일 때를 구해 줄 수 있다.
W 값에 기울기를 빼줌으로써 기울기가 양수일 때는 W는 - 방향으로, 기울기가 음수일 때는 + 방향으로 바뀌어야 됨을 알 수 있다.
여기서 알파 값은 Learning rate이라고 하는 상수이며 이 값을 지정하여 우리가 구한 기울기 값을 통해 얼마만큼을 이동할 것인지 결정할 수 있다. ( Learning rate이 크면 한 번에 많이 이동, 작으면 적게 이동하며 보통 0.001이나 0.0001과 같은 작은 값을 이용한다. )
Convex function
우리가 Cost function을 설계할 때, 어느 지점에서 시작하든 같은 결과가 나와야 하며 Local minimum에 도달하는 일이 없도록 하여야 한다.
그런 문제점들이 생기지 않도록 하기 위해 우리는 Cost function을 설계할 때 Convex function의 형태를 띠는지 확인하여야 한다. Convex function이란, Local minimum과 Global minimum이 일치하는 아래와 같은 모양을 띠는 함수이다.

그렇다면, Cost minimize을 Tensorflow로 구현하면서 이해해보자.
우선 Numpy를 이용하여 Cost function의 식을 직접 구현하는 방법은 아래와 같다.
import numpy as np
# 데이터 셋
X = np.array([1, 2, 3])
Y = np.array([1, 2, 3])
# cost function 구현
def cost_func(W, X, Y):
c = 0
# 데이터 갯수만큼 for문
for i in range(len(X)):
# W * X[i]는 우리가 세운 가설 (모델)
# cost 함수를 직접 구현하고 각각을 더해준 뒤 데이터 개수를 나누어 평균(cost)을 반환
c += (W * X[i] - Y[i]) ** 2
return c / len(X)
# cost function 실행
# np.linspace 함수를 이용하여 -3 ~ 5의 값을 15개의 구간으로 나누어서 for문 구현
for feed_W in np.linspace(-3, 5, num=15):
# -3에서 5까지의 W 값을 가지고 cost function을 이용해 cost 값을 구해준다.
curr_cost = cost_func(feed_W, X, Y)
print("{:6.3f} | {:10.5f}".format(feed_W, curr_cost))
결과

위와 같은 W와 cost 값의 변화를 보고도 알 수 있겠지만 그래프를 통하여 좀 더 직관적으로 확인해 보자.

앞서 이론을 공부하면서도 봤겠지만 결론적으로 위와 같은 그래프 형태를 띠게 될 것이며 역시나 W=1 일 때 cost 값이 최소가 됨을 확인할 수 있다.
이제, Numpy를 이용하여 코드를 구현하는 대신 Tensorflow의 함수를 이용하여 구현하여 보자.
import tensorflow as tf
import numpy as np
# 데이터 셋
X = np.array([1, 2, 3])
Y = np.array([1, 2, 3])
# cos function 구현
def cost_func(W, X, Y):
# 가설(모델) 설정
hypothesis = X * W
# tf.reduce_mean을 이용한 평균, tf.sqaure을 이용한 제곱
return tf.reduce_mean(tf.square(hypothesis - Y))
# W 값을 -3 ~ 5로 임의로 주어줌
W_values = np.linspace(-3, 5, num=15)
cost_values = []
# 실행
for feed_W in W_values:
# 임의로 지정해준 W 값(feed_W)을 통해 cost function의 cost 값을 반환
curr_cost = cost_func(feed_W, X, Y)
# cost 값을 리스트에 추가
cost_values.append(curr_cost)
# 출력
print("{:6.3f} | {:10.5f}".format(feed_W, curr_cost))
결과는 앞선 코드와 동일하며 동일한 그래프 형태를 가진다.
위의 결과까지 도출하였다면 우리는 Cost function을 만드는 것까지 완료한 것이다. 그렇다면 이제 무엇을 해야겠는가?
바로 이 Cost function을 활용하여 cost가 최저인 점을 구하고 그 부분의 W 값을 도출해 내면 되는 것이다. ( Cost minimize 수행 )
그렇다면 minimize 하는 부분을 Gradient descent 알고리즘을 이용하여 구현
import tensorflow as tf
# 코드를 재실행 했을 때도 같은 결과를 얻기 위해 사용
tf.compat.v1.set_random_seed(0)
# 데이터 셋
X = [1., 2., 3., 4.]
Y = [1., 3., 5., 7.]
# 1개의 데이터를 가진 형태의 랜덤값을 W에 할당하여 정의
W = tf.Variable(tf.random.normal([1], -100., 100.))
# 300 스탭 구현
for step in range(300):
hypothesis = W * X
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Learning rate 값을 0.01로 지정
alpha = 0.01
# cost function을 구현
gradient = tf.reduce_mean(tf.multiply(tf.multiply(W, X) - Y, X))
# cost function을 이용하여 Gradient descent 구현
descent = W - tf.multiply(alpha, gradient)
W.assign(descent)
# 스탭 10번당 한번 출력
if step % 10 == 0:
print('{:5} | {:10.4f} | {:10.6f}'.format(step, cost.numpy(), W.numpy()[0]))
결과

결과 값을 보면 cost 값과 W 값은 큰 값으로 시작하여 점점 일정한 값으로 수렴하는 것을 확인할 수 있다.
또한, W의 초기값을 임의로 지정하여도 결과적으로 같은 값으로 수렴하는 것을 확인할 수 있다.
위의 과정까지 마쳤다면 우리는 cost 함수를 만들고 minimize 함을 통해 우리가 세운 가설(모델)을 구현한 것이다.
'Machine Learning & Deep Learning' 카테고리의 다른 글
| 6. Loading Data from File (0) | 2020.04.18 |
|---|---|
| 5. Multi-variable linear regression (0) | 2020.04.17 |
| 3. Linear Regression (0) | 2020.04.15 |
| 2. Tensorflow 사용 환경 구축 (0) | 2020.04.15 |
| 1. Machine Learning (0) | 2020.04.14 |