AI 공부 저장소
Linear Regression (선형 회귀) - Gradient Descent (경사 하강법) 개념, 원리와 코드 구현 본문
Linear Regression (선형 회귀) - Gradient Descent (경사 하강법) 개념, 원리와 코드 구현
aiclaudev 2022. 2. 5. 15:24
본 글은 Sung Kim 교수님의 PyTorchZeroToAll 강의를 토대로 저의 지식을 아주 조금 덧붙여 작성하였습니다.
글 작성에 대한 허락을 받아, 개인 공부용으로 작성합니다.
문제가 발생할 시 비공개로 전환함을 알립니다.
https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw
① Gradient Descent의 목적 - Find w that minimizes the loss
최적의 Linear Regression의 모델을 찾기 위해 Loss 라는 개념이 사용되었었습니다.
Loss는 간단히 설명하자면, 최적의 Linear Regression 모델과의 error라고 말할 수 있습니다. 따라서, error가 최소화 되는 = Loss가 최소화 되는) w값을 찾는다면 그것이 바로 최적의 모델이라고 말할 수 있습니다.
② Gradient Descent Algorithm
Gradient란 수학에서 '경사'를 의미합니다. 즉, '직선의 기울기'라고 생각하시면 편할 것입니다.
컴퓨터는 임의의 w값으로부터 시작하여 최적의 w (Loss가 최소인 w)를 찾아나가게 되는데요, 이 때 초기의 시작점 w를 Initial weight라고 표현합니다. 이제 Gradient Descent를 통해 어떻게 최적의 w를 찾아나가는지 알아봅시다.
임의의 값 w를 가지는 초기 점에서 먼저 기울기 (Gradient)를 측정합니다. 만약 기울기가 양수(+)라면, w가 작아지는 방향 (왼쪽 방향)으로 점은 이동합니다. 이후 다시 기울기를 측정한 후, 기울기가 또 양수라면 w가 작아지는 왼쪽 방향으로 점은 다시 이동합니다. 이처럼 한점에서의 기울기를 측정한 후, 기울기의 부호(또는 기울기의 크기)에 따라 점은 Loss가 최소가 되는 w로 점점 이동하는데요, 이처럼 '이동'에 대한 수식은 아래와 같습니다.
위 수식은 『w의 변화에 따른 Loss의 변화』(즉, Gradient)에 따라 w값이 갱신되어가는 과정을 나타냅니다. (이 때, α는 굉장히 작은 값이라고 생각하시면 됩니다. )
또한, '점은 어느 방향으로 이동할 것인가?'를 결정하는 것이 바로 우변의 - 입니다. 만약 Gradient가 음수라면, Gradient의 음수와 -가 결합하여 +가 되겠죠. 따라서 w는 더 커질 것입니다. 반대로, Gradient가 양수라면, 우변의 -는 그대로 살아있겠죠? 따라서, w는 더 작아지는 것입니다. 이와 같은 방법으로 컴퓨터는 Loss가 최소가 되는 w를 찾아나가게 됩니다.
경사 하강법을 통해 Loss가 최소가 되는 w를 찾아가는 과정을 간단히 요약하자면 아래와 같습니다.
① : 현재 점에서의 Gradient를 측정한다.
②-1 : Gradient가 양수라면, 점은 왼쪽으로 이동한다.
②-2 : Gradient가 음수라면, 점은 오른쪽으로 이동한다.
③ : 위 과정을 반복한다.
③ 코드 구현
코드 구현에 앞서, 위 사진에서 두 번째 식에 있는 Gradient는 코드 상에서 어떻게 나타내어야 할까요?
고민할 것 없이, loss를 w로 직접 미분해주면 됩니다.
이제 이 식을 'w의 이동'에 대한 식에 대입해보고 정리해봅시다.
문제가 되는 부분은 해결하였군요. 이제 코드로 구현해봅시다.
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0 # a random guess: random value
# our model forward pass
def forward(x) :
return x*w
# Loss function
def loss(x, y) :
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
# compute gradient
def gradient(x, y) : # d_loss / d_w
return 2 * x * (x * w - y)
# Updating weight
# Before Training
print("predict (befofe training)", 4, forward(4))
# Training Loop
for epoch in range(10) :
for x_val, y_val in zip(x_data, y_data) :
grad = gradient(x_val, y_val)
w = w - 0.01 * grad
print("\tgrad : ", x_val, y_val, grad)
l = loss(x_val, y_val)
print("porgress : ", epoch, "w = ", w, "loss = ", l)
# After training
print("predict (after training)", "4 hours", forward(4))
predict (befofe training) 4 4.0
grad : 1.0 2.0 -2.0
grad : 2.0 4.0 -7.84
grad : 3.0 6.0 -16.2288
porgress : 0 w = 1.260688 loss = 4.919240100095999
grad : 1.0 2.0 -1.478624
grad : 2.0 4.0 -5.796206079999999
grad : 3.0 6.0 -11.998146585599997
porgress : 1 w = 1.453417766656 loss = 2.688769240265834
grad : 1.0 2.0 -1.093164466688
grad : 2.0 4.0 -4.285204709416961
grad : 3.0 6.0 -8.87037374849311
porgress : 2 w = 1.5959051959019805 loss = 1.4696334962911515
grad : 1.0 2.0 -0.8081896081960389
grad : 2.0 4.0 -3.1681032641284723
grad : 3.0 6.0 -6.557973756745939
porgress : 3 w = 1.701247862192685 loss = 0.8032755585999681
grad : 1.0 2.0 -0.59750427561463
grad : 2.0 4.0 -2.3422167604093502
grad : 3.0 6.0 -4.848388694047353
porgress : 4 w = 1.7791289594933983 loss = 0.43905614881022015
grad : 1.0 2.0 -0.44174208101320334
grad : 2.0 4.0 -1.7316289575717576
grad : 3.0 6.0 -3.584471942173538
porgress : 5 w = 1.836707389300983 loss = 0.2399802903801062
grad : 1.0 2.0 -0.3265852213980338
grad : 2.0 4.0 -1.2802140678802925
grad : 3.0 6.0 -2.650043120512205
porgress : 6 w = 1.8792758133988885 loss = 0.1311689630744999
grad : 1.0 2.0 -0.241448373202223
grad : 2.0 4.0 -0.946477622952715
grad : 3.0 6.0 -1.9592086795121197
porgress : 7 w = 1.910747160155559 loss = 0.07169462478267678
grad : 1.0 2.0 -0.17850567968888198
grad : 2.0 4.0 -0.6997422643804168
grad : 3.0 6.0 -1.4484664872674653
porgress : 8 w = 1.9340143044689266 loss = 0.03918700813247573
grad : 1.0 2.0 -0.13197139106214673
grad : 2.0 4.0 -0.5173278529636143
grad : 3.0 6.0 -1.0708686556346834
porgress : 9 w = 1.9512159834655312 loss = 0.021418922423117836
predict (after training) 4 hours 7.804863933862125
④ Exercise - Compute Gradient and Implement
Answer)
본 글은 Sung Kim 교수님의 PyTorchZeroToAll 강의를 토대로 저의 지식을 아주 조금 덧붙여 작성하였습니다.
글 작성에 대한 허락을 받아, 개인 공부용으로 작성합니다.
문제가 발생할 시 비공개로 전환함을 알립니다.
https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw
'Artificial Intelligence > ML&DL' 카테고리의 다른 글
로지스틱 회귀 (Logistic Regression) Wide & Deep (0) | 2022.02.09 |
---|---|
로지스틱 회귀 (Logistic Regression)의 개념과 코드 구현 (0) | 2022.02.09 |
파이토치를 사용한 선형 회귀 (Linear Regression) 모델링 (0) | 2022.02.08 |
선형 회귀 (Linear Regression)에서의 역전파 (Back propagation) & 자동 미분(Autograd) 개념, 원리와 코드 구현 (0) | 2022.02.05 |
Linear Regression (선형 회귀)의 기본 개념(Loss, MSE)과 코드구현 (0) | 2022.02.03 |