경사하강법(Gradient Descent)은
반복적인 계산을 통해 미분 가능한 함수의 가장 작은 값, 즉 극소점(local
minimum)을 찾아내는 최적화 알고리즘이다. 반대로,
함수의 가장 큰 값(극대점: local maximum)을
찾아내는 알고리즘은 경사상승법(Gradient Ascent)이라고 부른다.
그래디언트(인용: www.syncfusion.com)
이제 앞에서 살펴본 것과 동일한 3차원
곡면을 그리는 함수를 다시 생각해 보자. 이 함수는 변수 x와 y에서 발생하는 오류(error)를 나타낸다고 가정하자. 그렇다면 3차원 곡면에서 어떤 지점이 가장 좋은 값일까? 바로 값이 가장 작은 지점, 즉 곡면 아래쪽으로 가장 낮은 부분일
것이다. 이 지점이 바로 우리가 찾고자 하는 최적의 값, 즉
목표지점이다.
우리의 목적이 이 목표지점에 해당하는 x와 y의 좌표를 찾아내는 것이라면, 경사하강법을 사용하면 된다. 그 방법은 다음과 같다.
먼저 함수 f(x, y)를 x와 y 각각에 대해 편미분해서 그래디언트 ∇f를 구한다. 이 그래디언트는 현재 위치에서 함수가 가장 빠르게
증가하는 방향을 알려준다. 하지만 우리는 값을 줄이고 싶기 때문에 이 그래디언트의 반대 방향으로 이동해야
한다.
그래서 ∇f에 음수 부호(-)를 붙이고, 동시에 값이 너무 많이 변하지 않도록 작은 상수인
스텝사이즈(step size), 즉 알파(∝)를 곱해준다. 때로는 수학적 편의를 위해 수식 앞에 1/2을 곱해주기도 한다. 이를 종합하면 다음과 같은 수식이 나온다:
(x, y) ← (x, y) - 1/2 ∝ ∇f
이 수식은 현재의 (x, y) 위치에서
그래디언트를 따라 아주 조금씩 값을 줄여가면서 반복적으로 이동하는 과정을 나타낸다. 이렇게 하면 점점
더 오류가 줄어들고, 결국 함수의 가장 낮은 값, 즉 최적의
해에 도달하게 된다.
이처럼 경사하강법은 함수의 기울기를 이용해 더 나은 해를 찾아가는 똑똑하고
단순한 알고리즘이며, 딥러닝과 강화학습의 핵심 원리로 널리 사용된다.
import matplotlib.pyplot as plt
# (1) 함수 정의
def func(x):
return (x - 3)**2
# (2) 미분(기울기) 함수
def grad(x):
return 2 * (x - 3)
# (3) 초기값 설정
x = 0 # 시작 위치
lr = 0.1 # 학습률 (learning rate)
steps = 30 # 반복 횟수
x_history = [x] # 학습 경로 저장용
# (4) 경사하강법
for i in range(steps):
x = x - lr * grad(x) # 경사하강법 공식
x_history.append(x)
print(f"최솟값에 수렴한 x 값: {x:.4f}")
# (5) 시각화
x_vals = [i * 0.1 for i in range(-10, 60)]
y_vals = [func(val) for val in x_vals]
plt.plot(x_vals, y_vals, label='y = (x-3)^2')
plt.scatter(x_history, [func(x) for x in x_history], color='red', label='Gradient Descent Path')
plt.title('Gradient Descent Example')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid()
plt.show()
경사하강법
이 코드는 경사하강법(Gradient
Descent)을 이해하기 쉽게 다섯 단계로 구성되어 있다. 각 번호에 해당하는 코드 블록은
경사하강법의 핵심 개념을 하나씩 구현하며, 수학적인 이론이 실제 동작으로 이어지는 과정을 잘 보여준다.
(1) 함수 정의
첫 번째 단계에서는 경사하강법의 최소값 탐색 대상이 되는 함수 y=(x−3)2를 정의한다. 이 함수는 x가 3일
때 가장 작은 값을 가지는 2차 함수이며, 이를 통해 경사하강법이
점차 최솟값을 어떻게 향해 나아가는지를 확인할 수 있다.
(2) 미분(기울기)
함수 정의
두 번째 단계에서는 위에서 정의한 함수의 도함수를 수식으로 표현한다. 함수 y=(x−3)2의 도함수는 y′=2(x−3) 이며, 이는 현재 위치에서의 기울기를 나타낸다. 경사하강법에서는 이 기울기의
방향을 따라 반대로 이동하며, 이 과정을 반복해 최솟값을 찾아간다.
(3) 초기값 설정
세 번째 단계에서는 경사하강법을 실행하기 위한 초기값을 설정한다. 시작 위치 x는 0으로
두었고, 학습률(learning rate)은 0.1로 설정하여 한 번에 이동하는 양을 조절한다. 반복 횟수는 30회로 설정하여 충분한 학습을 진행할 수 있도록 하였다. 또한 학습이
진행되는 동안 변화된 x 값을 기록하기 위해 x_history 리스트를
만들어두었다.
(4) 경사하강법 반복 수행
네 번째 단계는 경사하강법의 실제 실행 부분이다. 총 30번의 반복을 통해 현재 위치에서 기울기를 계산하고, 그 기울기의
반대 방향으로 x 값을 갱신한다. 이 과정에서 매 단계마다
갱신된 x 값을 저장하여 학습 경로를 추적할 수 있도록 한다. 반복이
거듭될수록 x는 점점 최솟값인 3에 가까워지게 된다.
(5) 시각화
마지막 다섯 번째 단계에서는 함수의 전체 모양과 경사하강법이 이동한 경로를 시각적으로 보여준다. 함수 곡선은 연속적인 선으로 나타내고, 경사하강법의 경로는 빨간
점으로 표시하여 시각적으로도 x가 어떻게 최소값으로 수렴하는지 확인할 수 있게 한다. 축 이름과 제목, 범례를 추가하여 그래프의 가독성을 높였다.
이처럼 다섯 개의 단계는 각각 함수 정의,
미분, 초기 설정, 반복 실행, 시각화로 나뉘어 있으며, 경사하강법의 작동 원리를 차근차근 따라가며
체계적으로 학습할 수 있게 해준다. 수학적 원리와 프로그래밍적 구현이 조화롭게 어우러진 구조라 할 수
있다.