1. review train, linear model

저번 시간에는 선형 모델을 정의하고,

MSE가 최소가 되는 w가 우리가 원하는 이상적인 모델, true line이라는 것을 배웠고,

이를 찾기 위해 정해진 범위 내에서 일일이 w를 움직여 가면서 MSE를 계산하고 최소인 점을 찾았다.

하지만, 해당 방법은 계산해야 되는 w가 점점 더 많아질수록 계산량이 많아지고 복잡하다는 점이 있다.

처음에는 ramdom한 값으로 임의의 직선이 형성되지만 true line과의 loss 계산을 통해서, 점점 true line과 가까워지도록 w를 업데이트 한다.

 

정리하자, 저번 시간에 배운 train 또는 learning의 목표는 loss를 최소화하는 w를 찾는 것이다.

--

2. Gradient Descent (경사하강법)

임의의 기울기가 양인 이차함수를 생각해보자. 함수의 정의역은 w이고 치역은 loss이다.

우리는 loss가 최소인 w를 찾기 위해서, 해당 이차함수의 극점을 찾아야 한다.

이를 위해서 Gradient Descent algorithm, 경사하강법은 점 w'에서 기울기가 양이면 좌측으로 w를 업데이트, 음이면 우측으로 w를 업데이트하는 방식으로 극점, 즉 loss가 최소가 되는 w를 찾는다.

$$
\text{loss} = (\hat{y} - y)^2 = (x \cdot w - y)^2
$$

$$
w = w - \alpha \cdot \frac{\partial \text{loss}}{\partial w}
$$

--

3. (extra) 경사하강법의 한계

강의를 듣고 드는 의문점들이 많아서, 추가로 찾아본 내용들이다.

--

q1. 우리는 MSE가 최소가 되는 점을 찾아야 하기에, MSE를 w에 대해 미분한 기울기를 써야만 할 것 같은데, 왜 위의 수식에서는 각 datapoint의 loss를 미분하는가?

a1.

각 데이터 포인트의 loss만 미분하는 이유는 계산을 빠르게 하기 위해서입니다.
전체 MSE의 gradient는 개별 loss gradient의 평균이기 때문에,
결국 여러 번 반복하면 같은 방향으로 수렴합니다.

그렇다고 한다.. 내가 말한 전체 MSE에 대해 미분하는 건
1. Batch Gradient Descent (배치 경사하강법)

위에서 한 방법은
2. Stochastic Gradient Descent (확률적 경사하강법, SGD) 라고 한다.

막 납득이 엄청 되지는 않지만 ~ 일단 넘어가기로 한다.

--

q2. 단순 점의 기울기만 가지고 w를 업데이트하면 global한 최솟값을 찾지 못할 것 같아 보이는데?

a2.

단일 점만 보고는 최솟값을 못 찾는 것이 맞지만,
무작위 점들을 반복해서 보는 방식(SGD)은 전체 평균 방향을 점점 따라가게 되어
결국 global minimum에 수렴할 수 있습니다
(단, 손실함수가 convex거나, 좋은 조건에서).

“데이터가 충분하고, 반복을 무한히 하면 global minimum에 수렴한다”

하지만 아래와 같은 한계가 존재

  • 비볼록 함수 문제 딥러닝 등 복잡한 모델은 local minima, saddle point가 많아 global minimum 보장 안 됨
  • 학습률(learning rate) 민감성 너무 크면 발산, 너무 작으면 느림 또는 최솟값 근처에서 멈춤
  • 노이즈와 진동 문제 (SGD) 샘플 하나의 gradient만 쓰면 방향에 노이즈 → 진동 발생
  • 평탄한 영역(flat region) 기울기 거의 0인 구간에서는 학습 정체
  • 전역 정보 부족 현재 위치의 기울기만 보고 움직이기 때문에 전체 구조 고려 불가

그렇다고 한다. 일단 넘어가자.

--

4. 실습 코드

epoch, learning rate와 같은 용어가 새로 등장했다. 익숙해지자!

import numpy as np  
import matplotlib.pyplot as plt

#1. 주어진 dataset과 초기 랜덤값 가중치 구현

x\_data = \[1.0,2.0,3.0\]  
y\_data = \[2.0,3.0,6.0\]  
w = 1.0 # 랜덤값으로 시작

learning\_rate = 0.01 # gradient descent 의 alpha값, learning rate

#2. forward, gradient, loss 함수를 구현

def forward(x):  
return w\*x

def loss(x,y):  
y\_pred = forward(x)  
return (y\_pred-y)\*(y\_pred-y)

def gradient(x,y): # d\_loss/d\_w  
return 2 \* x \*( w \* x - y )

#train 진행 전, 예측값을 print  
print("before training input 4, predict is ",forward(4.0))

for epoch in range(100):  
for i,x\_val in enumerate(x\_data):  
y\_val = y\_data\[i\]  
grad = gradient(x\_val,y\_val)  
w = w - learning\_rate \* grad  
l = loss(x\_val,y\_val)  
print("\\t grad ", x\_val, y\_val, grad)  
print("epoch : ",epoch, "w = " , w , "loss : " ,l)

#train 후, 예측값을 print  
print( "after training input 4, predict is ",forward(4.0))

+ Recent posts