본문 바로가기
딥러닝/파이토치 딥러닝

6장 경사하강법

by sonysame 2024. 4. 22.

1. 미분, 편미분

편미분: 하나의 입력 변수에 대해서만 미분 

gradient : 기울기 벡터

 

선형계층 미분: m차원의 벡터를 출력으로 갖는 함수 f를 n차원의 벡터 x로 미분하는 경우

 

2. 경사하강법

 

경사하강법(gradient descent): 손실함수의 출력을 최소로 만드는 입력을 찾기 위한 방법

 

-> 손실 함수의 출력값을 낮추기 위해 가중치 파라미터로 미분하여 얻은 그래디언트를

학습률과 곱해서 현재 가중치 파라미터에서 빼줌

 

->그래디언트와 반대방향으로!

 

경사하강법은 지역 최소점(local minima)에 빠질 문제점이 존재하지만,

심층신경망은 가중치 파라미터의 크기가 매우 커지게 되는데,

높은 차원의 공간에서는 지역 최소점이 큰 문제가 되지는 않음.

 

학습률은 하이퍼파라미터로서, 잘 설정해주어야 한다!

 

(하이퍼파라미터: 데이터를 통해 학습이 진행되는 가중치 파라미터와 달리 모델의 성능에 영향을 줄 수 있지만 사용자에 의해 직접 설정되어야 하는 파라미터)

 

3. 실습(경사하강법 구현)

 

파이토치에서는 경사하강법을 위한 자동편미분(autograd)기능을 제공

import torch
import torch.nn.functional as F
target=torch.FloatTensor([[.1,.2,.3],
                          [.4,.5,.6],
                          [.7,.8,.9]])
x=torch.rand_like(target)
x.requires_grad=True

loss=F.mse_loss(x,target)

threshold=1e-5
learning_rate=1.
iter_cnt=0
while loss > threshold:
    iter_cnt+=1
    loss.backward()
    x=x-learning_rate*x.grad
    x.detach_()
    x.requires_grad_(True)
    loss=F.mse_loss(x,target)

    print('%d-th Loss: %.4e'%(iter_cnt, loss))
    print(x)

 

스칼라 값에 backward: 편미분 수행 -> grad에 그래디언트 값 저장

requires_grad 속성이  True인 텐서가 있을 때, 이 텐서가 들어간 연산의 결과가 담긴 텐서도 자동으로 requires_grad가 True

'딥러닝 > 파이토치 딥러닝' 카테고리의 다른 글

8장. 로지스틱 회귀  (1) 2024.05.01
7장 선형회귀(linear regression)  (0) 2024.04.22
5장. 손실함수  (0) 2024.04.10
4장. 선형계층  (0) 2024.04.10
3장 파이토치 튜토리얼  (0) 2024.04.04