본문 바로가기
AI Naver boost camp/[Week 02] ML LifeCycle

경사하강법 - Gradient Desent

by AI-BT 2024. 8. 13.
728x90
반응형

1. 손실함수 

정의

손실 함수는 모델의 예측값과 실제 값의 차이를 측정하는 함수이다.

모델의 성능을 평가하는 기준으로, 손실 값이 클수록 모델의 예측이 실제 값과 많이 다르다는 것을 의미하고,

손실 값이 작을수록 모델의 예측이 실제 값에 가깝다는 것을 의미합니다.

 

주요 역할

  • 모델 평가: 학습 과정에서 모델의 성능을 평가합니다.
  • 학습 지표: 손실 값을 최소화하는 방향으로 모델의 가중치를 조정합니다.

예시

  • 회귀 문제: 평균 제곱 오차(Mean Squared Error, MSE)
  • 분류 문제: 교차 엔트로피 손실(Cross-Entropy Loss)

2. 경사하강법 (Gradient Descent)

 

정의

경사하강법은 손실 함수를 최소화하기 위해 모델의 가중치를 조정하는 최적화 알고리즘이다.

이 방법은 손실 함수의 기울기를 계산하고, 기울기가 감소하는 방향으로 가중치를 업데이트하여 손실을 줄여 나간다

 

주요 개념:

  • 기울기: 손실 함수의 기울기(또는 도함수)는 손실 함수가 증가하거나 감소하는 방향을 나타낸다.
  • 학습률: 기울기에 따라 가중치를 얼마나 많이 조정할지를 결정하는 하이퍼파라미터입니다. 학습률이 너무 크면 최적의 해를 놓칠 수 있고, 너무 작으면 수렴 속도가 느려질 수 있다.

주요 절차:

  1. 기울기 계산: 현재 가중치에서 손실 함수의 기울기를 계산합니다.
  2. 가중치 업데이트: 계산된 기울기에 학습률을 곱하여 가중치를 업데이트합니다.
  3. 반복: 이 과정을 여러 번 반복하여 손실 함수가 최소화되도록 합니다.

3. 경사하강법 예제 코드

import numpy as np

# 손실함수는 실제값(target)과 예측값(y) 간의 차이를 수치적으로 측정하는 함수
# 경사 하강법(optimizer) 모델의 손실함수 값을 최소화하기 위해 사용하는 최적화 알고리즘
# optimzier 종류가 GD, SGD, ADAM, Momentum 등이 있다


# 손실 함수 정의 (예: 간단한 2차 함수)
def loss_function(theta, data):
    # 데이터가 없으므로, 그냥 theta^2를 반환
    return np.sum(theta**2)


# 손실 함수의 그래디언트 정의
def evaluate_gradient(loss_function, data, theta):
    # 손실 함수가 theta^2 이므로, 그래디언트는 2 * theta
    # 기울기를 알아야 하기 떄문에 미분
    return 2 * theta


# Gradient Descent 알고리즘
def gradient_descent(initial_theta, alpha, beta, max_iterations):
    theta = np.array(initial_theta)
    for iteration in range(max_iterations):
        theta_grad = evaluate_gradient(loss_function, None, theta)
        theta = theta - alpha * theta_grad

        # 그래디언트의 노름을 계산하여 기준값과 비교
        # 노름은 벡터가 원점에서 얼마나 떨어져 있는지를 나타낸다.
        # 노름이 작다는 것은 알고리즘이 최적점에 가까워졌다는 신호
        norm_grad = np.linalg.norm(theta_grad)
        if norm_grad <= beta:
            print(
                f"수렴: 반복 {iteration+1}, Theta = {theta}, Loss = {loss_function(theta, None)}")
            break

        print(f"반복 {iteration+1}: Theta = {theta}, Loss = {loss_function(theta, None)}, Norm of Gradient = {norm_grad}")

    return theta


# 초기 파라미터, 학습률, 기준값, 최대 반복 횟수 설정
initial_theta = [10.0, -5.0]  # 초기 파라미터 벡터
alpha = 0.1  # 학습률
beta = 0.01  # 기준값 - gradient 가 노름 값 이하로 줄어들면 알고리즘이 수렴했다고 판단하는 것
max_iterations = 100  # 최대 반복 횟수

# Gradient Descent 실행
final_theta = gradient_descent(initial_theta, alpha, beta, max_iterations)
print(f"최종 파라미터 값: {final_theta}")

 

결과

반복 1: Theta = [ 8. -4.], Loss = 80.0, Norm of Gradient = 22.360679774997898
반복 2: Theta = [ 6.4 -3.2], Loss = 51.20000000000001, Norm of Gradient = 17.88854381999832
반복 3: Theta = [ 5.12 -2.56], Loss = 32.768, Norm of Gradient = 14.310835055998655
반복 4: Theta = [ 4.096 -2.048], Loss = 20.971519999999998, Norm of Gradient = 11.448668044798923
반복 5: Theta = [ 3.2768 -1.6384], Loss = 13.4217728, Norm of Gradient = 9.158934435839138
반복 6: Theta = [ 2.62144 -1.31072], Loss = 8.589934592000002, Norm of Gradient = 7.327147548671311
반복 7: Theta = [ 2.097152 -1.048576], Loss = 5.497558138880002, Norm of Gradient = 5.86171803893705
반복 8: Theta = [ 1.6777216 -0.8388608], Loss = 3.518437208883202, Norm of Gradient = 4.68937443114964
반복 9: Theta = [ 1.34217728 -0.67108864], Loss = 2.2517998136852486, Norm of Gradient = 3.7514995449197124
반복 10: Theta = [ 1.07374182 -0.53687091], Loss = 1.4411518807585595, Norm of Gradient = 3.0011996359357695
반복 11: Theta = [ 0.85899346 -0.42949673], Loss = 0.9223372036854781, Norm of Gradient = 2.4009597087486156
반복 12: Theta = [ 0.68719477 -0.34359738], Loss = 0.5902958103587059, Norm of Gradient = 1.9207677669988927
반복 13: Theta = [ 0.54975581 -0.27487791], Loss = 0.3777893186295717, Norm of Gradient = 1.536614213599114
반복 14: Theta = [ 0.43980465 -0.21990233], Loss = 0.24178516392292593, Norm of Gradient = 1.2292913708792912
반복 15: Theta = [ 0.35184372 -0.17592186], Loss = 0.1547425049106726, Norm of Gradient = 0.9834330967034329
반복 16: Theta = [ 0.28147498 -0.14073749], Loss = 0.09903520314283043, Norm of Gradient = 0.7867464773627464
반복 17: Theta = [ 0.22517998 -0.11258999], Loss = 0.06338253001141148, Norm of Gradient = 0.629397181890197
반복 18: Theta = [ 0.18014399 -0.09007199], Loss = 0.04056481920730334, Norm of Gradient = 0.5035177455121576
반복 19: Theta = [ 0.14411519 -0.07205759], Loss = 0.025961484292674142, Norm of Gradient = 0.40281419640972604
반복 20: Theta = [ 0.11529215 -0.05764608], Loss = 0.016615349947311453, Norm of Gradient = 0.32225135712778086
반복 21: Theta = [ 0.09223372 -0.04611686], Loss = 0.010633823966279328, Norm of Gradient = 0.2578010857022247
반복 22: Theta = [ 0.07378698 -0.03689349], Loss = 0.00680564733841877, Norm of Gradient = 0.20624086856177976
반복 23: Theta = [ 0.05902958 -0.02951479], Loss = 0.004355614296588013, Norm of Gradient = 0.1649926948494238
반복 24: Theta = [ 0.04722366 -0.02361183], Loss = 0.0027875931498163283, Norm of Gradient = 0.13199415587953903
반복 25: Theta = [ 0.03777893 -0.01888947], Loss = 0.0017840596158824502, Norm of Gradient = 0.10559532470363124
...
반복 34: Theta = [ 0.0050706 -0.0025353], Loss = 3.213876088517983e-05, Norm of Gradient = 0.014172764569143662
반복 35: Theta = [ 0.00405648 -0.00202824], Loss = 2.056880696651509e-05, Norm of Gradient = 0.01133821165531493
수렴: 반복 36, Theta = [ 0.00324519 -0.00162259], Loss = 1.3164036458569658e-05
최종 파라미터 값: [ 0.00324519 -0.00162259]
728x90
반응형

댓글