-
[딥러닝] 비용함수 알아보기Python/딥러닝 2024. 9. 13. 12:59반응형
평균 절대 오차¶
MAE라고 표기하는 평균 절대 오차(Mean Absolute Error)는 예측한 값과 실제 값 사이의 차이에 절대값을 취한 뒤, 이를 평균낸 값을 이릅니다. 특별한 값 보정 없이 절대값만 취했기 때문에 직관적으로 오차를 확인할 수 있다는 장점이 있지요. 이 때문에 해석이 쉬워서 종종 이용되지만, 대부분의 기계학습 모델에서는 큰 오차가 더 치명적인 문제를 일으키기 때문에 오차의 크기에 따른 가중치가 없는 MAE는 자주 사용되지 않는 평가 지표입니다.
$n$개의 데이터가 있을 때, 예측한 값 $\hat{y}_i$와 실제 값 $y_i$가 있다면, MAE는 아래와 같은 수식으로 표현할 수 있습니다.
평균 제곱 오차¶
위에 살펴본 MAE의 문제를 해결하기 위해서는 큰 오차일수록 더욱 큰 값이 반환되는 수식을 이용해야 합니다. 흔히 MSE라고 표기하는 평균 제곱 오차(Mean Squared Error)는 해당 요소가 반영되어 있어서 예측한 값과 실제 값 사이의 차이를 나타내는 대표적인 비용 함수로 이용되고 있지요. 이 함수는 회귀 분석에서 주로 이용한다고 하는데요, MSE의 수식은 아래와 같이 나타낼 수 있습니다.
MSE는 아래와 같은 수식을 보여줍니다.
$ \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $그리고, RMSE(평균 제곱근 편차, Root Mean Squared Error)는 MSE의 제곱근으로 정의할 수 있으며, 아래와 같은 수식으로 표현할 수 있습니다.
$\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}$MSE는 수식의 특성상, 항상 양의 값으로만 나타납니다. 그리고 오차가 적을수록 0에 가까워지기 때문에, 낮으면 낮을수록 모델의 성능이 좋다고 판단할 수 있기 때문에 직관적으로 모델을 평가할 수 있습니다. 다만, 오차가 클수록 값이 많이 늘어나는 경향이 있기 때문에 MSE 값에 제곱근을 취한 RMSE 지표를 사용하는 경우도 있습니다.
교차 엔트로피 손실¶
교차 엔트로피 손실(Cross Entropy Loss)은 분류기를 만들 때 주로 이용하는 비용 함수입니다. 이는 분류기가 예측한 확률 분포와, 실제 확률 분포 사이의 차이를 측정하는 방식으로 계산합니다. 교차 엔트로피 손실 함수의 경우, 분류기에서 이용한다는 특성상 이진 분류와 다중 분류 모델에서 서로 다른 함수를 이용하게 됩니다. 이진 분류의 경우 이진 교차 엔트로피(Binary Crossentropy) 함수를, 다중 분류의 경우 범주형 교차 엔트로피(Categorical Crossentropy) 함수를 이용하는 편이지요.
이진 교차 엔트로피를 수식으로 나타내자면, 아래와 같이 표현할 수 있습니다.
비용 함수의 이용¶
이번에는 파이썬(Python)에서 흔히 사용하는 딥러닝 라이브러리인 텐서플로우(TensorFlow)를 이용해서 비용 함수를 이용해 보겠습니다. 먼저, $y=Wx+b$ 방정식에 해당하는 문제를 풀 수 있는 선형 회귀(Linear Regression) 모델에서 MSE를 이용하는 사례입니다.
MSE의 이용¶
In [1]:import tensorflow as tf import numpy as np # 데이터 생성 (y = 2x + 1) X = np.array([1, 2, 3, 4], dtype=np.float32) y = np.array([3, 5, 7, 9], dtype=np.float32) # 가중치, 바이어스 초기화 W = tf.Variable(0.0) b = tf.Variable(0.0) def linear_model(X): return W * X + b def mean_squared_error(y_true, y_pred): return tf.reduce_mean(tf.square(y_true - y_pred)) optimizer = tf.optimizers.SGD(learning_rate=0.01) # 학습 과정 정의 def train_step(X, y): with tf.GradientTape() as tape: y_pred = linear_model(X) loss = mean_squared_error(y, y_pred) gradients = tape.gradient(loss, [W, b]) optimizer.apply_gradients(zip(gradients, [W, b])) return loss # 학습 반복 epochs = 1000 for epoch in range(epochs): loss = train_step(X, y) if epoch % 100 == 0: print(f"Epoch {epoch}: Loss: {loss.numpy()}") # 학습된 파라미터 출력 print(f"학습된 W: {W.numpy()}") print(f"학습된 b: {b.numpy()}") # 예측 결과 출력 X_test = np.array([5, 6], dtype=np.float32) y_test_pred = linear_model(X_test) print(f"예측 결과: {y_test_pred.numpy()}")
Epoch 0: Loss: 41.0 Epoch 100: Loss: 0.007531234994530678 Epoch 200: Loss: 0.0041345576755702496 Epoch 300: Loss: 0.002269820310175419 Epoch 400: Loss: 0.0012461235746741295 Epoch 500: Loss: 0.0006841050344519317 Epoch 600: Loss: 0.0003755530924536288 Epoch 700: Loss: 0.0002061743725789711 Epoch 800: Loss: 0.00011318828910589218 Epoch 900: Loss: 6.213804590515792e-05 학습된 W: 2.0048611164093018 학습된 b: 0.9857079386711121 예측 결과: [11.010014 13.014875]
반응형'Python > 딥러닝' 카테고리의 다른 글
[TensorFlow] 파이썬을 이용한 MNIST 분류 모델 만들기 (2) 2024.07.29 [TensorFlow] 단층 퍼셉트론과 MLP 구현해보기 (0) 2024.07.15 [TensorFlow] 파이썬 사진 분류 딥러닝 모델 만들기 (0) 2023.11.16