반응형
Regression
- Regression to the mean : 전체의 데이터는 평균으로 회기하려는 성질이 있다
Linear Regression
- 데이터를 가장 잘 대변하는 직선 방정식을 찾는 방법을 말함
Hypothesis
- 가설, 데이터를 대변하는 방정식
Cost
- Hypothesis에 의해 나온 결과값(예측값)과 실제 값의 차이
- Cost, Loss, Error 등으로 부름
- Cost를 최소화하는 식을 찾는게 목표임
- 실제 값과의 차이를 계산하면 음수가 나올 수도 있고, 양수가 나올 수도 있기 때문에 이 값의 크기를 누적할 수 있도록 제곱해서 평균을 구하는 식으로 많이 사용함
Gradient Descent
- Cost를 최소화하는 값을 찾는 알고리즘을 말함
- cost 함수를 미분한 값(기울기)와 learning rate(alpha)값을 W에서 빼는 작업을 반복하여 최적의 W값을 찾는걸 목표로함
예제 코드
- 코드
import tensorflow as tf
# y = x 방정식을 학습하기위한 데이터
# H(x) = W * x + b
# W = 1, b = 0에 가까워져야 학습 성공
x_data = [1, 2, 3, 4, 5]
y_data = [1, 2, 3, 4, 5]
# 초기값, 임의의 값으로 지정
W = tf.Variable(2.9)
b = tf.Variable(0.5)
learning_rate = 0.01
for i in range(100 + 1):
with tf.GradientTape() as tape:
# 가설 함수
hypothesis = W * x_data + b
# 비용 함수
cost = tf.reduce_mean(tf.square(hypothesis - y_data))
# W와 b의 기울기를 각각 반환(Gradient)
W_grad, b_grad = tape.gradient(cost, [W, b])
# W와 b의 값을 업데이트(Descent)
W.assign_sub(learning_rate * W_grad)
b.assign_sub(learning_rate * b_grad)
if i % 10 == 0:
print("{:5}|{:10.4f}|{:10.4}|{:10.6f}".format(i, W.numpy(), b.numpy(), cost))
# W = 1, b = 0에 가까워졌으므로 각각 5, 2.5에 가까운 값을 출력해야함
print((W * 5 + b).numpy()) # 5.00667
print((W * 2.5 + b).numpy()) # 2.4946702
- 결과
0| 2.4520| 0.376| 45.660004
10| 1.1036| 0.003398| 0.206336
20| 1.0128| -0.02091| 0.001026
30| 1.0065| -0.02184| 0.000093
40| 1.0059| -0.02123| 0.000083
50| 1.0057| -0.02053| 0.000077
60| 1.0055| -0.01984| 0.000072
70| 1.0053| -0.01918| 0.000067
80| 1.0051| -0.01854| 0.000063
90| 1.0050| -0.01793| 0.000059
100| 1.0048| -0.01733| 0.000055
5.00667
2.4946702
간소화한 예제 코드
- 코드
import tensorflow as tf
x_data = [1, 2, 3, 4, 5]
y_data = [1, 2, 3, 4, 5]
# 초기값, 임의의 값으로 지정
W = tf.Variable(2.9)
learning_rate = 0.01
for i in range(100 + 1):
hypothesis = W * x_data # hypothesis = tf.multiply(W, x_data)
gradient = tf.reduce_mean((hypothesis - y_data) * x_data)
descent = W - learning_rate * gradient
W.assign(descent)
if i % 10 == 0:
print("{:5}|{:10.4f}".format(i, W.numpy()))
# W = 1, b = 0에 가까워졌으므로 각각 5, 2.5에 가까운 값을 출력해야함
print((W * 5).numpy()) # 5.000074
print((W * 2.5).numpy()) # 2.500037
- 결과
0| 2.6910
10| 1.5273
20| 1.1644
30| 1.0513
40| 1.0160
50| 1.0050
60| 1.0016
70| 1.0005
80| 1.0002
90| 1.0000
100| 1.0000
5.000074
2.500037
참고
반응형
'Development > Deep Learning' 카테고리의 다른 글
[Deep Learning] LSTM (0) | 2020.12.28 |
---|---|
[Deep Learning] Keras 기초 (0) | 2020.12.28 |
[Deep Learning] Multi Variable Linear Regression (0) | 2020.12.28 |
[Deep Learning] 기본 (0) | 2020.12.28 |