| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- gas
- c#
- google apps script
- Python
- Tkinter
- hive
- dataframe
- Github
- Kotlin
- Excel
- math
- Google Spreadsheet
- matplotlib
- django
- GIT
- PostgreSQL
- array
- SQL
- Mac
- PANDAS
- list
- string
- Java
- Apache
- PySpark
- numpy
- Google Excel
- 파이썬
- Redshift
- Today
- Total
달나라 노트
경사 하강법(Gradient Descent) 본문
1. 경사 하강법(Gradient Descent)이란?
경사 하강법(Gradient Descent)은 말 그대로 점잔적으로 하강하여 함수의 최소값을 찾는 방법입니다.
여기서 얘기할 경사 하강법은 딥러닝에서 자주 나오는 얘기이기에 모델의 학습 차원에서 경사 하강법을 다시 좀 더 자세하게 정의해보겠습니다.
함수의 계수(w, b 등)를 조금씩 조절하여 모델의 손실 함수(Cost Function, 모델의 에러율이라고 생각하시면 됩니다.)의 값이 최소가 되는 계수를 찾는 방법입니다.
우리가 딥러닝을 하는 것은 결국 y = wx + b같은 식에서 가지고 있는 데이터를 높은 정확도로 설명할 수 있는 w, b값을 찾아내는 것이죠.
만약 우리가 최적의 w, b를 찾아낸다면, 이 함수식의 정확도는 매우 높아질 것입니다. 즉, 에러율은 낮아지겠죠.
따라서 최소 에러율을 갖는 그 값을 찾아내는 방법입니다.
2. 좀 더 구체적으로 알아봅시다.
구체적인 예시를 통해 모델의 학습 과정이 어떻게 흘러가는지, 그리고 경사 하강법이 학습 과정에서 어떻게 적용되는지를 알아보겠습니다.
x값 = [1, 2, 3, 4, 5]
y값 = [3, 5, 7, 9, 11]
지금 우리는 위 데이터를 가지고 있다고 가정해봅시다.
이 값들을 가지고 모델을 학습시켜볼겁니다.
이미 눈치채신 분도 있겠지만 위 x, y값의 관계는 y = 2x + 1이라는 식에 대응하는 값들입니다.
근데 우리는 y = 2x + 1이라는 식이 위 x, y값의 관계를 설명하는 함수식이라는 것을 모른다고 가정하고 생각해봅시다.
우리의 목적은 딥러닝을 통해서 모델이 y = 2x + 1이라는 함수식을 가지게 하는 것이죠.
한번 시작해봅시다.
위같은 값이 주어지고 우리는 딥러닝 과정을 다음과 같은 방식으로 수행합니다.
1. y = wx + b라는 함수식의 틀을 구성한다.
2. w, b의 초기값을 지정한다.
3. 위 값들을 기준으로 학습을 진행하여 w, b값을 살짝씩 조절한다.
4. 손실 함수(에러율)를 계산한다.
5. 손실 함수(에러율) 값이 우리가 생각한 것 이상이라면 3번으로 다시 돌아가 학습을 한 번 더 진행하여 w, b값을 또 조절한다.
위 1~5번 중 2번부터 봅시다.
초기 w, b값을 지정해야하는데 몇으로 지정해야할까요?
이것도 방법이 여러 가지가 있지만 여기서는 간단하게 w = 5, b = 3이라고 지정한다고 합시다.
그러면 초기 식은 y = 5x + 3이 됩니다. (모델에게 초기 함수식 y = 5x + 3를 주어주는 것이죠.)
근데 y = 5x + 3은 정답이 아니죠. (정답은 y = 2x +1 이라고 했습니다.)
따라서 우리는 3~5번 과정을 거치면서 5와 3이라는 값을 점진적으로 변화시켜 최적값을 찾아야합니다.
y = 5x + 3에 x = 1을 넣어봅시다.
그러면 y = 8이 나오겠죠.
근데 x = 1일 때 y값은 3이어야 정답입니다.
모델이 예측한 값이 8, 정답은 3. 예측값과 정답간에 오차가 있죠.
이렇게 모델의 예측값과 정답간의 차이를 나타내는 수치가 에러율이 손실 함수(에러율)입니다.
정확한 계산 방식은 여기서는 패스하고 어쨌든 모델의 예측값과 정답간에 차이가 있으니 w, b값을 조절해야합니다.
모델이 예측한 값이 정답보다 크기 때문에 w, b값을 낮춰야 합니다.
w값은 5에서 4.5정도로 낮춰보죠.
b값은 3에서 2정도로 낮춰보겠습니다.
(원래는 이렇게 대충 아무렇게나 낮추지 않습니다. 자세한 방식들이 있지만 여기서는 경사 하강법의 컨셉에 대해 대략적으로 이해하는 것을 중점으로 하기에 자세한 내용은 모두 생략합니다.)
그러면 지금 모델이 가진 함수식은 y = 4.5x + 2가 됩니다.
이 상태에서 다시 한번 x = 1을 넣어볼까요?
그러면 y = 6.5가 됩니다.
모델이 예측한 값이 6.5, 정답은 3. 둘 간에 오차가 있죠.
모델의 예측값이 6.5로서 정답인 3보다는 여전히 크지만, 아까는 모델이 예측한 값이 8이어서 정답과의 차이가 더 컸는데 그 차이가 줄어들었죠.
따라서 이 상태에서 손실 함수(에러율)를 계산해보면, 아까보다 손실 함수 값의 크기가 줄어들었을 것입니다.
하지만 손실 함수(에러율)의 값이 여전히 존재하고, 아직 모델은 정답보다 큰 값을 예측하기 때문에 w, b값을 더 조절해야합니다.
이런 과정을 계속 반복합니다.
내가 가진 값들을 넣어보고,
정답과 비교해서 에러율을 계산해보고,
에러율이 여전히 높으면 w, b 값을 조절해보고...
이런 과정을 반복하다보면 어느샌가 이런 시점에 도달할겁니다.
w = 2.0001
b = 1.0002
가 되었다고 가정해봅시다.
그러면 모델은 y = 2.0001x + 1.0002라는 함수식을 가지게 됩니다.
그러면 위 모델이 가진 식에 x = 1을 넣어볼까요?
y는 3.0003이라는 값이 return될겁니다.
x값 = [1, 2, 3, 4, 5]
y값 = [3, 5, 7, 9, 11]
처음에 언급했던 x값, y값을 보면 x = 1일 때 y = 3이어야 합니다.
모델의 예측값 = 3.0003
정답 = 3
오! 이제 모델의 예측값이 정확하게 3은 아니지만 3에 매우매우 가까운 3.0003을 예측했습니다.
이 경우 손실 함수(에러율)을 계산해보면 에러율이 0은 아니지만 에러율이 매우매우 작을겁니다.
자 이 과정을 보면 결국 우리가 한건 매우 간단합니다.
함수식의 계수(w, b)값을 계속 조절해보면서 손실 함수(에러율)이 최소가 되는 지점을 찾은 것이죠.
경사 하강법은 이렇게 모델이 가진 여러 계수들을 조절하여 에러율을 점진적으로 낮춰 에러율이 최소가 되는 그 지점을 찾는 과정입니다.
3. 왜 하필 경사 하강법인가?
딥러닝에는 왜 경사 하강법을 사용할까요?
경사 하강법을 사용하는 이유는 여러 가지가 있지만 대표적인 내용만 언급해 보겠습니다.
(1) 자체적인 검증 가능
위에서 본 모델 학습 과정을 떠올려보면 우리는 계수(w, b)를 조절하는 단계를 여러 번 거치고, 계수(w, b)를 한 번 조절할 때 마다 손실 함수(에러율)를 계산했습니다.
즉, 자연스럽게 모델의 학습 뿐 아니라 손실 함수(에러율)에 대한 계산이 이뤄지고, 현재 모델의 에러율이 어느정도인지를 파악할 수 있다는 것입니다.
이 말은 에러율이 일정 수준 미만으로 내려가면 자연스레 현재 모델에 대한 정확도가 어느정도 이상이 된다는 증명이 됩니다.
(2) 현실의 복잡성
손실 함수(에러율)가 최소값이 되는 지점을 찾는게 목표라면 손실 함수를 미분해서 최소값 또는 극소값을 찾으면 되지 않나?라고 생각할 수도 있습니다.
위에서 봤던 y = 2x + 1같은 간단한 함수의 예측을 하는 경우라면 손실 함수의 최소값을 찾음으로서 모델을 학습시킬 수 있습니다.
그러나 현실 세계에서 나타나는 다양한 현상들은 저런 간단한 패턴을 가지고 있지 않습니다.
패턴이 매우 복잡하며, 패턴이 없는 경우도 많죠.
이러한 현상을 근사하기 위한 어떠한 하나의 함수식을 단순히 에러율의 미분 등으로 근사하여 찾는 것은 거의 불가능에 가깝습니다.
따라서 경사 하강법을 통해 계수(w, b)를 서서히 조절해가며 계수가 어떤 값을 가질 때 에러율은 몇인지를 매번 조사하여 에러율이 최소가 될 때 까지 계수(w, b)를 변화시키는 경사 하강법을 사용하는 것이죠.
4. 그러면 경사 하강법은 무적인가?
경사 하강법에도 당연히 단점은 있습니다.
(1) 연산 비용 문제
경사 하강법을 하는 과정에서는 필연적으로 동일한 과정을 여러 번 반복하는 작업이 필요합니다.
모델이 가진 함수식의 최적 계수값을 한 번에 찾아낼 수 없기에 함수식의 계수(w, b)를 서서히 조절해가는 똑같은 과정을 반복해가며 에러율을 낮춰야 합니다.
따라서 정말 많은 수의 반복 계산이 필요합니다.
여기서 패턴이 복잡해질수록, 패턴을 설명하기 위한 인자가 많아질수록 필요한 계산량은 기하급수적으로 늘어납니다.
y = wx + b라는 식의 w, b를 찾아가는 과정과
y = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + w6x6 + b라는 식의 w1, w2, w3, w4, w5, w6, b를 찾아가는 과정을 비교해본다면
후자가 비교도 안될 정도로 연산이 많이 필요할 것입니다.
(2) 학습률(learning rate) 최적화 문제
위에서 봤던 예시에서 w와 b값의 변화를 살펴봅시다.
w = 5 -> 4.5 -> 2.0001
b = 3 -> 2 -> 1.0002
w, b의 초기값은 각각 5와 3이었고,
한번 학습한 후 w는 6에서 4.5로, b는 3에서 2로 바뀌었습니다.
두 번 학습한 후 w는 4.5에서 2.0001로 바뀌었고, b는 2에서 1.0002로 바뀌었습니다.
(다시 언급합니다만 실제로는 위처럼 대충 아무렇게나 계수를 바꾸지 않습니다! 이해를 돕기 위해 자세한건 다 생략한 것이니 실제로 위처럼 작동하지는 않다는 것을 다시 언급합니다!)
학습률은 한번의 학습을 거칠 때 계수들을 얼마나 많이 변화시킬 것인가를 결정하는 인자입니다.
학습률이 크면 학습을 한 번 진행할 때 마다 발생하는 계수의 변화 폭이 커집니다.
학습률이 작으면 학습을 한 번 진행할 때 마다 발생하는 계수의 변화 폭이 작아집니다.
예를들어 위 예시에서 학습률을 매우 높였다고 가정하면
w = 5 -> 2.0001
위처럼 바로 한번만에 5에서 2.0001로 줄어들 수도 있구요
w = 5 -> -10
학습률을 지나치게 높이면 위처럼 w의 목표값인 2를 넘어서서 -10으로 바뀔 수도 있습니다.
w의 초기값이 5이고, (우리는 모르지만) 정답이 2인데
학습 한번 할 때 마다 w를 100씩 변화시킨다고 생각해보세요.
2에 도달하기가 어려울겁니다.
반대로 w의 초기값이 5이고, 정답은 2인데
학습 한번 할 때 마다 w를 0.000000001씩 변화시킨다고 생각해보세요.
언젠가는 w가 2에 도달할 수 있겠지만 그 시간이 엄청나게 오래 걸릴 것이고, 비용 또한 증가할겁니다.
이처럼 계수를 학습 1회마다 얼마나 공격적으로 변화시킬지를 결정하는 요소인 학습률을 정해야합니다.
그리고 이 학습률은 너무 커도, 너무 작아도 문제가 생기죠.
이것이 경사 하강법의 단점이 될 수 있습니다.
(3) Local minima 문제
경사 하강법은 에러율이 최소가 되는 지점을 찾는 과정이라고 했습니다.
y = 2x + 1이라는 함수에 도달하기 위해 y = 5x + 3부터 시작하여 w, b값을 서서히 낮춰갔고 결국 y = 2.0001x + 1.0002라는 정답과 매우 유사한 함수식을 모델이 학습하도록 했죠.
x값 = [1, 2, 3, 4, 5]
y값 = [3, 5, 7, 9, 11]
위에서 봤던 예시는 제가 가진 학습을 위한 dataset이 위와 같았고, y = 2x + 1이 정답이라고 먼저 언급했기에
모델이 학습한 y = 2.0001x + 1.0002라는 식은 정답과 매우 가까운 (정답이라고 해도 무방한) 매우 잘 학습된 모델이라고 할 수 있을겁니다.
근데 y = 2x + 1이 정답이라는 걸 모른다고 해볼게요.
x값 = [1, 2, 3, 4, 5]
y값 = [3, 5, 7, 9, 11]
제가 가진 dataset인 위 값만 가지고 다시 모델을 학습한다고 해봅시다.
만약에 정답이 y = 2x + 1이 아니라,
사실은 (1, 3), (2, 5), (3, 7), (4, 9), (5, 11)이라는 5개의 점을 지나는 sin(), cos() 함수의 조합이라면요?
또는 (1, 3), (2, 5), (3, 7), (4, 9), (5, 11)이라는 5개의 점을 지나는 (직선 함수가 아닌) 다른 더 복잡한 함수라면요?
그러면 y = 2.0001x + 1.0002라는 모델이 예측한 식은 제가 가진 dataset 내에서 학습했을 때에는 에러율이 어느 수준 이하로 낮아져있을 수는 있어도 어딘가에 에러율이 더 낮은 (더 정확한) 상태에서의 계수값이 존재할 수도 있습니다.
이것을 Local minima 문제라고 합니다.
Local minima는 손실 함수(에러율)에서 특정 구간을 봤을 때 그 구간 내에서 최소의 에러율을 나타내는 지점을 의미합니다.
따라서 손실 함수의 어떤 구간을 보는지에 따라 최소값은 여러 개가 존재할 수 있으므로 Local minima는 여러 지점이 존재할 수 있으며 따라서 복수형태의 단어인 minima를 사용한 것입니다. (단수는 minimum입니다. data가 복수 단어이고, 단수는 datum인 것 처럼요.)
Global minimum은 손실 함수(에러율)의 전 구간을 통틀어 봤을 때 최소의 에러율을 나타내는 지점입니다.
손실 함수의 전 구간에서의 최소값이기 때문에 1개만 존재할 수 있으며 따라서 단수 형태의 단어인 minimum을 사용하였습니다.

Local Minima 문제를 그래프로 나타내면 위와 같습니다.
위 그래프는 손실 함수의 그래프인데요.
초기 w, b값을 지정하고 모델 학습을 진행했을 때 모델의 초기 에러율이 A section의 어딘가에서 시작했다고 가정해봅시다.
그러면 학습이 진행됨에 따라 모델은 A section에 있는 골짜기를 통해서 점점 내려가게 되고, 그러면서 Local Mimina point를 찾습니다.
모델은 A section에서 에러율이 최소가 되는 지점을 찾았으며 따라서 우리는 이걸 보고 현재 모델이 최적이라고 판단할 수도 있습니다.
다만 이건 A section만 봤을 때의 얘기이고, 다른 구간도 보면 오른쪽에 더 낮은 값을 가지는 Global Minimum point도 존재합니다.
위 경우 모델이 정말 정확하게 잘 학습했다면 Global Minimum을 찾는게 더 올바른 것이죠.
Local Minima 문제는 초기 계수(w, b)값을 어떻게 정하냐에 따라 발생할수도 있고, 발생하지 않을 수도 있습니다.
위 그래프에서 만약 A section이 Global Minimum이 포함된 곳에 걸쳐있었다면 모델은 Global Minimum point를 향해 학습을 진행했을테니까요.
따라서 경사 하강법을 사용할 때에는 초기 계수값을 어떻게 정하느냐도 중요한 요소 중 하나입니다.
FYI.
위에서 Local Minima 문제를 언급했지만 이는 원론적인 이야기이며 경사 하강법에 대한 감을 익히기 위해 언급한 내용입니다.
무슨 말이냐면 만약 현실에서 다뤄지는 초고차원 딥러닝이라는 상황을 가정하면 사실 Local Minima가 엄청나게 크리티컬한 문제를 일으키지는 않기 때문이예요.
Local Minima가 딥러닝을 저해하는 요인 중 하나가 될 수 있다는 것은 맞지만 현실에서 이뤄지는 초고차원 딥러닝에서는 다양한 이유(e.g. Local Minima가 없거나, Local Minima를 쉽게 탈출할 방법이 있다거나, Local Minima에 걸려도 꽤 괜찮은 성능을 낸다거나)에 의해 Local Minima가 정말 딥러닝에 큰 영향을 줄 만큼 그리고 딥러닝이란 것을 하지 못하게 할 만큼 심각한 문제는 아니라는거죠.
'AI > Deep Learning' 카테고리의 다른 글
| Local Minima는 딥러닝에서 진짜 큰 문제를 일으킬까? (feat. Saddle Point) (0) | 2025.11.16 |
|---|---|
| 가중치(W, Weight)와 편향(B, Bias) (0) | 2025.11.12 |
| Sampling과 Resampling (feat. 복원 추출/비복원 추출) (0) | 2025.11.11 |
| Cost Function 손실 함수 (1) | 2025.11.11 |
| 정규화(Normalization), 표준화(Standardization)란? (0) | 2025.11.08 |