(4주차) 3월23일
import tensorflow as tf
import tensorflow.experimental.numpy as tnp
import matplotlib.pyplot as plt
tnp.experimental_enable_numpy_behavior()
- 예제9: 카페예제로 돌아오자.
x=tnp.array([20.1, 22.2, 22.7, 23.3, 24.4, 25.1, 26.2, 27.3, 28.4, 30.4])
x
tnp.random.seed(43052)
y= 10.2+ x*2.2 + tnp.random.randn(10)
y
beta0= tf.Variable(9.0)
beta1= tf.Variable(2.0)
with tf.GradientTape(persistent=True) as tape:
loss=sum((y-beta0-beta1*x)**2)
tape.gradient(loss,beta0),tape.gradient(loss,beta1)
- 예제10: 카페예제의 매트릭스 버전
X= tnp.array([1]*10+ [20.1, 22.2, 22.7, 23.3, 24.4, 25.1, 26.2, 27.3, 28.4, 30.4]).reshape(2,10).T
X
beta_true = tnp.array([[10.2],[2.2]])
beta_true
tnp.random.seed(43052)
y= X@beta_true + tnp.random.randn(10).reshape(10,1)
y
beta = tnp.array([[9.0],[2.0]])
beta
with tf.GradientTape(persistent=True) as tape:
tape.watch(beta)
yhat = X@beta
loss=(y-yhat).T @ (y-yhat)
tape.gradient(loss,beta) # 텐서플로우가 계산한 미분값
- 해석적풀이
$$loss'(\beta)= -2X'y + 2X'X\beta$$
-2 * X.T @ y + 2* X.T @ X @ beta # 이론적인 값
- 예제11: 위의 예제에서 이론적인 $\boldsymbol{\beta}$의 최적값을 찾아보고 (즉 $\boldsymbol{\hat\beta}$을 찾고) 그 지점에서 loss의 미분값(=접선의 기울기)를 구하라. 결과가 $\bf{0}$인지 확인하라. (단 ${\bf 0}$은 길이가 2이고 각 원소가 0인 벡터)
betahat = tf.linalg.inv(X.T @ X) @ X.T @ y
betahat
with tf.GradientTape() as tape:
tape.watch(betahat)
yhat = X@betahat
loss=(y-yhat).T @ (y-yhat)
tape.gradient(loss,betahat)
- $loss=(\frac{1}{2}\beta-1)^2$를 최소하는 $\beta$를 컴퓨터를 활용하여 구하는 문제를 생각해보자. (답은 이미 알고 있어요, $\beta=2$입니다.)
(1) beta = [-10, -9.99, -9.98, ... , 9.99, 10] 와 같은 수열을 만든다.
(2) 각 지점에서 (beta/2 -1)^2 을 계산한다.
(3) (2)의 결과를 가장 작게 만드는 값을 고른다.
beta = tnp.linspace(-10,10,100)
loss = (beta/2 -1)**2
loss
(예비학습)
tnp.argmin([1,2,3,-1,5])
tnp.argmin([1,2,-1,3,5])
예비학습 끝
tnp.argmin(loss)
beta[59]
beta[60]
loss[59],loss[60]
- 비판1: [-10,10]이외에 해가 존재하면?
- 이 예제의 경우는 운좋게 [-10,10]에서 해가 존재했음
- 하지만 임의의 고정된 $x,y$에 대하여 $loss(\beta)=(x\beta-y)^2$ 의 형태의 해가 항상 [-10,10]에서 존재한다는 보장은 없음
- 해결책: 더 넓게 많은 범위를 탐색하자?
- 비판2: 효율적이지 않음
- 알고리즘을 요약하면 결국 -10부터 10까지 작은 간격으로 조금씩 이동하며 loss를 조사하는 것이 grid search의 아이디어
- $\to$ 생각해보니까 $\beta=2$인 순간 $loss=(\frac{1}{2}\beta-1)^2=0$이 되어서 이것보다 작은 최소값은 존재하지 않는다(제곱은 항상 양수이어야 하므로)
- $\to$ 따라서 $\beta=2$ 이후로는 탐색할 필요가 없다