경사하강법(Gradient descent)
✨ 참고
https://twojun-space.tistory.com/124
[머신 러닝] - 경사 하강법(Gradient descent)
금일(2023-03-13) 학부에서 머신러닝 수업 중, 기계 학습의 핵심이라고 언급해 주셨던 "경사 하강법(Gradient descent)"에 대해 추가적인 스터디가 필요했고, 이 부분에 대해 간략하게 정리한 글입니다. 1
twojun-space.tistory.com
경사하강법(Gradient descent)은 기계 학습과 최적화에서 매우 중요한 알고리즘 중 하나입니다, 이 알고리즘은 함수의 갑이 낮아지는 방향으로 각 독립변수들의 값을 변형시키면서 함수가 최솟값을 갖도록 하는 탐색 방법을 의미합니다.
특히 기계학습에서 모델의 가중치(Weight)를 조정하여 손실 함수를 최소화 하는데 많이 활용됩니다.
경사 하강법을 통해 근삿값을 구하는 과정

3-1. 경사(Gradient)의 방향 성분, 크기 이용하기

경사 하강법의 종류
1️⃣ 배치 경사 하강법(Batch Gradient Descent, BGD)
배치 경사 하강법은 가장 기본적인 경사 하강법이며 데이터셋 전체를 고려하여 손실함수를 계산한다.
단 한번의 Epoch에 모든 파라미터를 단 한번만 업데이트한다.. 파라미터를 업데이트할 때 한 번에 전체 데이터셋을 고려하기 때문에 모델 학습 시 많은 시간과 메모리가 필요하다는 단점이 있다.
2️⃣ 확률적 경사 하강법(Stochastic Gradient Descent, SGD)
확률적 경사 하강법은 배치 경사 하강법이 모델 학습시 많은 시간과 메모리가 필요하다는 단점을 개선하기 위해 제안된 기법입니다. Batch Size를 1로 설정하여 파라미터를 업데이트 하기 때문에 배치 경사 하강법보다 훨씬 빠르고 적은 메모리로 학습이 진행됩니다. 하지만 파라미터 값의 업데이트 폭이 불안정하기 때문에 정확도가 낮은 경우가 생길 수 있습니다.
3️⃣ 미니 배치 경사 하강법(Mini-Batch Gradient Descent, MGD)
미니 배치 경사 하강법은 Batch Size를 설정한 size로 사용한다. 배치 경사 하강법보다 모델 학습 속도가 빠르고 확률적 경사 하강법보다 안정적인 장점이 있다. 미니 배치 경사 하강법은 딥러닝 분야에서 가장 많이 활용되는 경사 하강법이며 일반적으로 Batch Size를 16, 32, 64, 128과 같이 2의 n제곱에 해당하는 값으로 사용하는게 보편적이다.
경사 하강법의 여러가지 알고리즘
1️⃣ SGD(확률적 경사 하강법)
매개변수 값을 조정 시 전체 데이터가 아니라 랜덤으로 선택한 하나의 데이터에 대해서만 계산하는 방법입니다.
💻 코드
optimizer = optim.SGD(model.parameters(), lr=0.1)
2️⃣ 모멘텀(Momentum)
모멘텀은 경사하강법의 알고리즘 중 하나로 기울기가 작을 때 발생하는 움직임의 불안정성을 해결하고 수렴 속도를 높이기 위해 도입된 기법입니다. 관성이라는 물리학의 법칙을 응용한 방법이며 경사 하강법에 관성을 더해줍니다.
기본적인 경사하강법은 현재 위치에서의 기울기만을 고려하여 가중치를 업데이트 하는데, 모멘텀은 이전에 이동한 방향을 고려하여 업데이트를 수행합니다. 이를 통해 기울기의 크기와 방향에 대한 정보를 유지하며 이동하게 되므로, 이전에 이동한 방향에 관성을 부여하여 빠르게 수렴할 수 있습니다.
모멘텀의 업데이트 규칙

모멘텀을 사용하면 이전에 이동한 방향에 대한 정보를 유지하면서 새로운 방향으로 업데이트되기 때문에, 지그재그로 인한 불안정한 움직임을 줄이고 수렴 속도를 높일 수 있습니다. 특히 고원(Plateau) 지역에서 효과적으로 동작하는 경향이 있습니다.
고원(Plateau) 지역
최적화 문제에서 손실 함수가 더 이상 감소하지 않는 지점을 의미합니다. 즉, 손실 함수의 기울기가 거의 0에 가까워져서 파라미터를 더 이상 업데이트하지 않는 상태를 나타냅니다.
💻 코드
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # momentum을 설정하여 모멘텀 적용
3️⃣ 아다그라드(Adagrad)
아다그라드는 기계 학습과 최적화에서 사용되는 알고리즘 중 하나입니다. 아다그라드는각 매개변수에 대한 갱신 스케일을 조정하여 학습률을 자동으로 조절합니다.
아다그라드의 핵심 아이디어는 각 매개변수에 대한 학습률을 조절하여 경사가 급격한 방향으로 업데이트되는 경우에는 학습률을 감소시키고, 경사가 완만한 방향으로 업데이트되는 경우에는 학습률을 증가시키는 것입니다.
아다그라드의 과정
- 각 매개변수의 제곱 그래디언트 누적:
- 각 매개변수의 그래디언트를 제곱하여 누적합니다.
- 매개변수 갱신:
- 각 매개변수에 대해 학습률을 현재의 그래디언트의 제곱 누적값의 제곱근으로 나눈 값을 곱하여 업데이트합니다

아다그라드는 각 매개변수에 대해 독립적으로 학습률을 조절하기 때문에 자주 나타나는 기울기가 큰 매개변수에 대해서는 작은 학습률을, 기울기가 작은 매개변수에 대해서는 큰 학습률을 적용할 수 있습니다.
💻 코드
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
4️⃣ 아담(Adam)
아담(Adam)은 기계 학습 및 딥 러닝에서 사용되는 최적화 알고리즘 중 하나로, 많은 작업에서 효과적으로 사용되고 있는 알고리즘 중 하나입니다. 아담은 모멘텀과 RMS프롭(RMSprop)의 아이디어를 결합하여 제안되었습니다. 아담은 자동으로 학습률을 조절하면서도 효과적으로 수렴할 수 있습니다.
아담의 핵심 아이디어
- 모멘텀 (Momentum): 현재의 그래디언트 뿐만 아니라 이전 타임 스텝에서의 그래디언트에 대한 지수 이동 평균을 사용하여 모멘텀을 도입합니다. 이전 기울기의 정보를 사용하여 빠른 수렴을 돕습니다.
- RMS프롭 (RMSprop): 기울기의 제곱값에 대한 지수 이동 평균을 사용하여 각 매개변수에 대한 학습률을 조절합니다. 이는 기울기가 급격하게 변할 때 학습률을 감소시키고, 완만할 때는 학습률을 증가시켜 안정적으로 학습할 수 있도록 도와줍니다.
- 편향 보정 (Bias Correction): 초기 학습 단계에서 모멘텀과 RMS프롭이 편향될 수 있기 때문에, 이에 대한 보정을 적용하여 더 정확한 학습을 수행합니다.

아담은 매우 일반적으로 사용되며, 딥 러닝에서의 기본 최적화 알고리즘 중 하나로 간주됩니다.
💻 코드
optimizer = optim.Adam(model.parameters(), lr=0.001)
'머신러닝&딥러닝 > 이론' 카테고리의 다른 글
| [머신러닝&딥러닝] 비선형 활성화 함수(Activation Funtions) (0) | 2024.01.19 |
|---|---|
| [머신러닝&딥러닝] 딥러닝(Deep Learning) (0) | 2024.01.17 |
| [머신러닝&딥러닝] 논리회귀(Logistic Regression) (0) | 2024.01.12 |
| [머신러닝&딥러닝] 파이토치 선형회귀-다중 선형 회귀 (0) | 2024.01.11 |
| [머신러닝&딥러닝] 파이토치 선형회귀-단항 선형 회귀 (0) | 2024.01.10 |