손실함수에서 모델의 가중치와 바이어스의 최적의 값을 찾기 위해서 사용되는 방법이다.
머신러닝의 최적화 알고리즘 중 하나이다.
기울기(경사)구하기
예를 들어 b(절편,bias)가 0이라고 가정해보자(계산상 편의를 위해)
그 때 가중치 w값의 변화에 따른 손실 값을 살펴보고, 그 값에서의 기울기를 확인한다.
그래프로 표현해보면 bias를 0, MSE를 사용했기 때문에 포물선 형태가 되는 것을 볼 수 있다.
경사에 대한 기울기를 자동 미분하여 계산해주는 코드를 알아두자
loss.backward() (역전파 과정)

가중치 업데이트 하기
경사를 구했으니깐 우리가 어느 방향으로 가야 최솟값으로 갈 수 있는지를 알게 된 것이다. 업데이트는 아래와 같은 식으로 진행된다. (이때 a는 학습률을 의미한다.)
계산한 기울기로 w를 업데이트 하는 코드는 이러하다.
optimizer.step()

학습률이란?
머신러닝과 신경망 훈련에서 매우 중요한 하이퍼 파라미터
이러한 학습률은 모델이 학습할 때 가중치가 업데이트 되는 크기를 결정한다.
근데 이 학습률은 고정된 값이 아니라서 시행착오를 거쳐 최적의 학습률 값을 찾아야한다.
지금까지 한 경사하강법 작동과정을 한번에 정리해보자

이런 경사하강법에도 단점이 있다.
SGD(stochastic gradient descent)라고도 하는 확률적 경사하강법은 모든 데이터를 이용해서
오차를 계산하는 것이 아닌 각각의 데이터 포인트마다 오차를 계산하는 방식으로 접근한다.
또한 각각의 포인트에서 기울기를 계산함으로써 그 기울기에 노이즈가 포함되게 되는데 이 노이즈는 최적화 과정에서 global minimum에 도달시켜 주는 역할을 한다.
작동원리는 기존의 경사하강법과 유사하다.
import torch.optim as optim # optim은 최적화 모듈
optimizer=optim.SGD(model.parameters(),lr=0.01)
optimizer.zero_grad() # 이전 단계 계산된 기울기 초기화하는 코드
loss.backward() #현재 손실값에 대한 기울기를 자동미분하여 계산하는 코드
optimizer.step() #계산된 기울기로 업데이트를 진행하는 코드
확률적 경사 하강법이 계산이 빠르고 메모리 측면에서도 효율적이기는 하나 노이즈가 많고 학습과정이 불안정하는 문제점이 있다.
그래서 두 알고리즘의 장점만 합친것이 미니 배치 경사하강법이라는 것이다.
각 데이터를 배치 단위로 묶음으로써 기존의 확률적 경사하강법 보다 안정적으로 학습이 가능하며,
각 미니 배치마다 가중치를 업데이트 함으로써 전체 데이터 셋을 한번에 업데이트 하는 경사하강법 보다 학습속도가 빠르다.
