수식이 나오지 않는다면 새로고침(F5)을 해주세요
모바일은 수식이 나오지 않습니다.
텐서플로우를 통한 선형회귀 예제입니다. 사실 처음 해볼때 이럴꺼면 사이킷런을 쓰는게..? 라는 생각을 했는데, 좀더 복잡하고 큰 데이터를 다루거나 복잡한 모형을 다룰 때 굉장히 효율적일거라는 생각이 들더군요. 좋은 경험이었습니다.
먼저 데이터를 생성해주고 단순선형회귀 식의 Weight와 bias를 설정해줍니다.
# data
x_train = [1,2,3]
y_train = [1,2,3]
# random_normal은 우리가 아직 W, b를 모르기 때문에 rank가 1인 값을 랜덤하게 넣어주는 것.
W = tf.Variable(tf.random.normal([1]), name = 'weight')
b = tf.Variable(tf.random.normal([1]), name = 'bias')
여기서 Variable는 constant와 다르게 변경가능한 텐서를 정의할 때 사용하는 클래스입니다. 또한 안에 있는 random.normal은 초기 값을 설정해주기 위해 1차원의 아무 값이나 넣어준 것이라고 볼 수 있습니다.
다음은 경사하강법을 위한 optimizer와 최적화 function을 정의합니다.
# 경사하강... Minimize
optimizer = tf.optimizers.SGD(learning_rate = 0.01)
# 최적화 function 정의
def train_step(x,y):
with tf.GradientTape() as tape:
hypothesis = x_train * W + b
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - y_train))
# gradient 계산
gradients = tape.gradient(cost, [W, b])
# 변수 업데이트
optimizer.apply_gradients(zip(gradients, [W, b]))
return cost
먼저 optimizer.SGD는 텐서플로우에서 확률적 경사하강법(Stochastic Gradient Descent)를 사용하여 모델을 최적화하는데 사용하는 옵티마이저입니다. 학습률은 0.01로 설정해주었습니다.
그 다음 train_step이라는 함수를 최적화 함수를 정의합니다. 선형회귀식 그리고 cost(loss)를 정의해 줍니다. 위에서 사용한 cost의 경우 선형회귀에서 주로 사용하는 MSE를 사용하였습니다.
.reduce_mean의 경우 텐서플로우에서 주어진 텐서의 요소들에 대한 평균을 계산하는 함수입니다.
.gradient의 경우 텐서플로우에서 자동 미분(automatic differentiation)을 수행하여 주어진 텐서의 그래디언트를 계산하는데 사용되는 메서드입니다. 다음에 볼 GradientTape와 함께 사용되고 모델 학습 중 손실 함수에 대한 모델 매개변수의 변하율을 계산하는 데 중요한 역할을 합니다.
위와 같이 tape.gradient(cost, [W, b])를 사용하면 cost 함수에 대한 W와 b의 그레디언트 값을 계산하는 것입니다.
마지막으로 .apply_gradient를 사용하여 계산된 그레디언트를 기반으로 W, b를 업데이트 합니다.
for step in range(1000):
train_step(x_train, y_train)
if step % 100 == 0:
print(f"Step: {step}, Cost: {cost.numpy()}, W: {W.numpy()}, b: {b.numpy()}")
Step: 0, Cost: 1.4960676431655884, W: [0.99992746], b: [0.00016458]
Step: 100, Cost: 1.4960676431655884, W: [0.99994296], b: [0.00012938]
Step: 200, Cost: 1.4960676431655884, W: [0.9999551], b: [0.00010221]
Step: 300, Cost: 1.4960676431655884, W: [0.9999647], b: [8.013696e-05]
Step: 400, Cost: 1.4960676431655884, W: [0.9999719], b: [6.340873e-05]
Step: 500, Cost: 1.4960676431655884, W: [0.99997795], b: [5.0263905e-05]
Step: 600, Cost: 1.4960676431655884, W: [0.9999829], b: [3.90185e-05]
Step: 700, Cost: 1.4960676431655884, W: [0.99998665], b: [3.0469606e-05]
Step: 800, Cost: 1.4960676431655884, W: [0.9999894], b: [2.399653e-05]
Step: 900, Cost: 1.4960676431655884, W: [0.9999915], b: [1.9093864e-05]
Step: 1000, Cost: 1.4960676431655884, W: [0.9999931], b: [1.53936e-05]
위 코드는 총 1000번 iteration하는데 100번 마다 상황을 확인하는 코드입니다.
결과를 보면 W가 1에 가깝고 b는 0에 가깝습니다. 우리가 사용했던 데이터를 생각하면 올바르게 적용한 것을 볼 수 있습니다.
'🌞 Statistics for AI > Deep learning' 카테고리의 다른 글
Tensorflow? 텐서플로우? (0) | 2024.08.01 |
---|---|
활성화 함수들의 정의와 활용 : 시그모이드, 소프트맥스, ReLU, Leakly ReLU (0) | 2024.03.26 |
경사 하강법 최적화 알고리즘 : Momentum method, AdaGrab, RMSProp, Adam (0) | 2023.12.14 |
드롭 아웃(Drop out)과 정규화(Regularization) (0) | 2023.12.13 |
경사 하강법 : 배치, 확률적, 미니 배치 경사하강법(Batch, Stochastic, Mini Batch) (0) | 2023.12.13 |