Loss Function (손실 함수)

3단 분석법

순서
분석
단어
내용
1
정의
손실 함수
인공신경망이나 기타 머신러닝 모델에서 예측값과 실제 값 간의 차이를 정량적으로 측정하는 함수
2
알아야하는 이유
손실 함수
모델의 성능을 평가하고, 예측 오차를 최소화하기 위해 학습 과정에서 가중치를 조정하는 지표로 사용되기 때문 즉, 컴퓨터가 학습할 때 오차를 스스로 알게 하기 위해서
3
사용 방법
손실 함수
1. 예측값 계산 2. 실제 값과 비교 3. 오차 계산 4. 가중치 업데이트 5. 반복
Loss function = Cost function

정의

손실 함수
인공신경망이나 기타 머신러닝 모델에서 예측값과 실제 값 간의 차이를 정량적으로 측정하는 함수
손실 함수(Loss Function)는 인공신경망이나 기타 머신러닝 모델에서 예측값과 실제 값 간의 차이를 정량적으로 측정하는 함수입니다.
이는 모델이 얼마나 정확한 예측을 하고 있는지를 평가하는 데 사용되며, 예측 오차를 최소화하는 방향으로 모델을 학습시키기 위해 중요한 역할을 합니다.
손실 함수는 예측값과 실제값 간의 차이를 실수값으로 표현하며, 이 값이 클수록 모델의 예측 성능이 낮음을 의미합니다.
단층 퍼셉트론으로 이루어진 모델의 선형 그래프입니다.
현재 weight들이 그래프에서 많이 벗어나있는 것을 확인할 수 있습니다.
이렇게 유지된다면 이 모델의 성능은 좋지 않을 것 입니다.
이때 손실 함수를 사용해 정답값의 범위와 출력값(예측된 값)의 범위가 얼마나 벗어나있는지를 계산합니다.
손실 함수를 사용해 계산된 범위을 토대로 weight를 조절합니다.
위 과정을 반복 하면 Loss 값은 낮아지고, accuracy(정확도) 값은 상승함으로서 모델의 성능이 좋아지게 됩니다.
이처럼, 활성화 함수가 머신 러닝에서 가장 중요한 구성 요소 중 하나였다면, 딥 러닝에서 가장 중요한 구성 요소 중 하나는 손실 함수 입니다.

알아야하는 이유

손실 함수
모델의 성능을 평가하고, 예측 오차를 최소화하기 위해 학습 과정에서 가중치를 조정하는 지표로 사용되기 때문
이유
설명
모델 성능 평가
손실 함수는 모델의 예측 성능을 평가하는 주요 지표입니다. 손실 값이 낮을수록 모델의 예측이 실제 값에 가깝다는 것을 의미합니다. 이를 통해 모델의 성능을 객관적으로 평가할 수 있습니다.
가중치 조정 지표
손실 함수는 학습 과정에서 모델의 가중치를 조정하는 데 사용됩니다. 예측 오차를 최소화하기 위해 경사 하강법(Gradient Descent)과 같은 최적화 알고리즘을 사용하여 손실 값을 기반으로 가중치를 업데이트합니다.
모델 개선
손실 함수를 통해 모델의 예측 오류를 분석하고, 이를 바탕으로 모델을 개선할 수 있습니다. 손실 값이 감소할수록 모델의 예측 정확도가 향상되며, 이는 더 나은 예측 결과를 제공합니다.
다양한 문제 해결
손실 함수는 회귀, 분류, 군집화 등 다양한 머신러닝 문제에서 사용됩니다. 각 문제 유형에 따라 적절한 손실 함수를 선택하여 사용함으로써 최적의 성능을 달성할 수 있습니다.
회귀가 무엇을 말하나요?
회귀는 주어진 데이터를 바탕으로 미래의 값을 예측하거나, 두 변수 간의 관계를 이해하기 위한 방법입니다. 예를 들어, 과거의 매출 데이터를 바탕으로 미래의 매출을 예측하거나, 집의 크기와 가격 간의 관계를 분석하는 데 사용될 수 있습니다.
데이터들이 이항 분포나 정규 분포와 같은 분포를 따를 수 있습니다. 이러한 경우, 손실을 줄이기 위해 적절한 손실 함수를 사용하는 것이 중요합니다.
베르누이 분포(Bernoulli Distribution) (이항 분포)
가우시안분포 (Gaussian distribution) (정규 분포)

사용 방법

손실 함수
1. 예측값 계산 2. 실제 값과 비교 3. 오차 계산 4. 가중치 업데이트 5. 반복

1. 예측값 계산

신경망 모델을 통해 입력 데이터의 예측값을 계산합니다.
입력 데이터가 주어지면, 모델은 이를 기반으로 출력값을 생성합니다.
이 과정에서 모델의 현재 가중치와 편향 값이 사용됩니다.
import numpy as np # 입력 데이터 (x) x = np.array([1, 2, 3, 4, 5]) # 초기 가중치와 편향 w = 0.5 b = 0.5 # 예측 값 계산 y_pred = w * x + b print("예측 값:", y_pred)
Python
복사

2. 실제 값과 비교

예측값과 실제 값을 비교합니다. 실제 값은 데이터셋에서 제공되며, 모델의 예측 성능을 평가하는 기준이 됩니다.
예를 들어, 이미지 분류 문제에서는 실제 레이블과 예측 레이블을 비교합니다.
# 실제 값 (y) y_actual = np.array([2.5, 4.5, 6.5, 8.5, 10.5]) # 예측 값과 실제 값 비교 print("실제 값:", y_actual)
Python
복사

3. 오차 계산

손실 함수를 사용하여 예측값과 실제 값 간의 오차를 계산합니다.
오차는 예측값과 실제 값 사이의 차이로 정의되며, 다양한 손실 함수가 이 오차를 계산하는 방법을 제공합니다.
예를 들어, 평균 제곱 오차(MSE), 크로스 엔트로피 손실 등이 있습니다.
# 평균 제곱 오차 (MSE) 계산 # difference = [-1.5, -3.0, -4.5, -6.0, -7.5] # squared_difference = [2.25, 9.0, 20.25, 36.0, 56.25] # mse = (2.25 + 9.0 + 20.25 + 36.0 + 56.25) / 5 # mse = 123.75 / 5 # mse = 24.75 mse = np.mean((y_pred - y_actual) ** 2) print("평균 제곱 오차 (MSE):", mse)
Python
복사
평균 제곱 오차란?
예측 값과 실제 값의 차이를 제곱한 값들의 평균을 나타내는 지표로, 모델의 예측 성능을 평가하는 데 사용됩니다.
오차를 제곱하는 이유는 음수인 오차 값을 양수로 변환하여 전체 오차의 크기를 비교하고 평가할 수 있게 하기 위함입니다.
크로스 엔트로피 손실이란?
분류 문제에서 모델의 예측 확률 분포와 실제 클래스 분포 간의 차이를 측정하는 지표입니다.” 이항 분포 예시
웹 개발자가 이메일 스팸 필터링 시스템을 만들고 있다고 가정해봅시다. 이 시스템은 각 이메일이 스팸인지 아닌지를 예측해야 합니다. 이 예측 문제는 두 가지 결과(스팸 또는 스팸 아님)를 가지므로 베르누이 분포로 모델링할 수 있습니다.
1.
실제 레이블 (y): 이메일이 스팸일 때 1, 스팸이 아닐 때 0.
2.
예측 확률 (y^\hat{y} ): 모델이 예측한 이메일이 스팸일 확률 (0에서 1 사이의 값).
* 손실 값이 4가 되는 상황은 매우 높은 손실 값을 의미합니다. 이는 일반적으로 예측 확률 값이 극단적으로 잘못된 경우 발생합니다
코드
정규 분포 예시
한 연구자가 사람들의 키를 분석하고 있다고 가정해봅시다. 연구자는 특정 그룹의 사람들 키의 분포를 예측하고자 합니다. 키 데이터는 연속적인 값들을 가지므로, 이를 정규 분포로 모델링할 수 있습니다.
a.
실제 분포 (y_true): 특정 그룹의 사람들 키의 실제 분포. 평균 180cm, 표준편차 5cm.
b.
예측 분포 (y_pred): 연구자가 예측한 사람들 키의 분포. 평균 185cm, 표준편차 5cm.
코드

4. 가중치 업데이트

계산된 오차를 바탕으로 경사 하강법 등의 최적화 알고리즘을 사용하여 모델의 가중치를 조정합니다.
이 과정은 모델이 더 정확한 예측을 할 수 있도록 지속적으로 가중치를 조정하는 데 도움을 줍니다.
learning_rate = 0.01 # 가중치 업데이트 for epoch in range(100): # 예측 값 계산 y_pred = w * x + b # 오차 계산 # difference = [-1.5, -3.0, -4.5, -6.0, -7.5] # squared_difference = [2.25, 9.0, 20.25, 36.0, 56.25] # mse = (2.25 + 9.0 + 20.25 + 36.0 + 56.25) / 5 # mse = 123.75 / 5 # mse = 24.75 mse = np.mean((y_pred - y_actual) ** 2) # 0 에포크 = 24.75 # 가중치 기울기 계산 # grad_w = 2 * np.mean([-1.5*1, -3.0*2, -4.5*3, -6.0*4, -7.5*5]) # grad_w = 2 * np.mean([-1.5, -6.0, -13.5, -24.0, -37.5]) # grad_w = 2 * (-16.5) # grad_w = -33.0 grad_w = 2 * np.mean((y_pred - y_actual) * x) # 편향 기울기 계산 # grad_b = 2 * np.mean([-1.5, -3.0, -4.5, -6.0, -7.5]) # grad_b = 2 * (-4.5) # grad_b = -9.0 grad_b = 2 * np.mean(y_pred - y_actual) # 가중치 업데이트 w -= learning_rate * grad_w # 첫 에포크 : 0.5 - 0.01 * (-33.0) = 0.83 b -= learning_rate * grad_b # 첫 에포크 : 0.5 - 0.01 * (-9.0) = 0.59 if epoch % 10 == 0: print(f"Epoch {epoch}: Loss = {mse}") print("최종 가중치:", w) print("최종 편향:", b)
Python
복사

5. 반복

이 과정을 여러 번 반복하여 손실을 최소화하고 모델의 성능을 향상시킵니다. 학습 과정은 여러 에포크(epoch) 동안 반복되며, 각 에포크마다 전체 데이터셋이 모델에 입력됩니다.
반복을 통해 모델은 점진적으로 예측 오차를 줄이고, 더 나은 성능을 발휘하게 됩니다.

Google Colab

미니퀘스트

1번 미니퀘스트 - 손실 함수 계산하기

예측값과 실제 값 간의 평균 제곱 오차(MSE)를 계산하는 방법을 실습합니다.
이를 통해 손실 함수가 예측과 실제 값의 차이를 어떻게 정량화하는지 이해할 수 있습니다.

문제 설명

1.
예측값과 실제 값 설정
y_predy_true 배열에 각각 예측값과 실제 값을 설정합니다.
예제데이터
# 예측 값과 실제 값 y_pred = np.array([2.5, 0.0, 2.1, 1.5]) y_true = np.array([3.0, -0.5, 2.0, 1.0])
Python
복사
2.
손실 함수 정의
평균 제곱 오차(MSE)를 계산하는 mean_squared_error 함수를 정의합니다.
3.
손실 값 계산
mean_squared_error 함수를 사용하여 예측값과 실제 값 간의 손실 값을 계산합니다.
4.
결과 출력
계산된 손실 값을 출력합니다.

코드

import numpy as np # 예측값과 실제 값 y_pred = np.array([2.5, 0.0, 2.1, 1.5]) y_true = np.array([3.0, -0.5, 2.0, 1.0]) # 평균 제곱 오차(MSE) 계산 함수 def mean_squared_error(y_true, y_pred): return np.mean((y_true - y_pred) ** 2) # MSE 계산 mse = mean_squared_error(y_true, y_pred) print(f"Mean Squared Error: {mse}")
Python
복사

결과 설명

Mean Squared Error
예측값과 실제 값 간의 차이의 제곱을 평균한 값입니다.
값이 작을수록 모델의 예측이 실제 값에 더 가깝다는 것을 의미합니다.

코드 설명

2번 미니퀘스트 - 손실 함수 최적화

이 미니퀘스트에서는 주어진 데이터를 바탕으로 손실 함수를 최소화하기 위해 경사 하강법을 사용하여 모델의 가중치와 바이어스를 업데이트하는 과정을 구현합니다.

문제 설명

1.
데이터셋 설정
입력값 X와 실제 출력값 y를 설정합니다.
에제데이터
# 데이터셋 (입력 값과 실제 출력 값) X = np.array([1, 2, 3, 4, 5]) y = np.array([3, 5, 7, 9, 11]) # y = 2x + 1
Python
복사
2.
초기 가중치와 바이어스 설정
가중치 w와 바이어스 b를 무작위 값으로 초기화합니다.
3.
손실 함수 정의
예측값과 실제 값 간의 평균 제곱 오차(MSE)를 계산하는 compute_loss 함수를 정의합니다.
4.
가중치 업데이트 함수 정의
경사 하강법을 사용하여 가중치와 바이어스를 업데이트하는 update_weights 함수를 정의합니다.
5.
학습 과정
여러 에포크(epoch)에 걸쳐 가중치와 바이어스를 반복적으로 업데이트하여 손실 값을 최소화합니다.
6.
결과 출력
학습 후 최종 가중치와 바이어스를 출력합니다.

코드

import numpy as np # 데이터셋 (입력 값과 실제 출력 값) X = np.array([1, 2, 3, 4, 5]) y = np.array([3, 5, 7, 9, 11]) # y = 2x + 1 # 초기 가중치와 바이어스 w = np.random.randn() b = np.random.randn() # 학습률 learning_rate = 0.01 # 손실 함수 (MSE) def compute_loss(X, y, w, b): y_pred = w * X + b return np.mean((y - y_pred) ** 2) # 가중치 업데이트 함수 def update_weights(X, y, w, b, learning_rate): N = len(X) y_pred = w * X + b # MSE의 기울기 계산 dw = -2 * np.mean(X * (y - y_pred)) db = -2 * np.mean(y - y_pred) # 가중치 업데이트 w -= learning_rate * dw b -= learning_rate * db return w, b # 학습 과정 epochs = 1000 for epoch in range(epochs): w, b = update_weights(X, y, w, b, learning_rate) if epoch % 100 == 0: loss = compute_loss(X, y, w, b) print(f"Epoch {epoch}: Loss = {loss}") print(f"Trained weights: w = {w}, b = {b}")
Python
복사

결과 (예시)

출력 결과
Epoch 0: Loss = 22.153596026796926 Epoch 100: Loss = 0.0038611053619945304 Epoch 200: Loss = 0.0019613154803415187 Epoch 300: Loss = 0.000996284238003892 Epoch 400: Loss = 0.0005060798697831749 Epoch 500: Loss = 0.0002570720531651653 Epoch 600: Loss = 0.000130584211039386 Epoch 700: Loss = 6.633251636195389e-05 Epoch 800: Loss = 3.3694752925239116e-05 Epoch 900: Loss = 1.7115834540294246e-05 Trained weights: w = 2.0019208162579427, b = 0.9930652438371297

결과 설명

초기 가중치와 편향(bias): 학습이 시작되기 전에 설정된 임의의 값들입니다.
손실 값(Loss): 각 에포크마다 계산된 손실 값으로, 학습이 진행됨에 따라 점점 감소하는 것이 이상적입니다.
최종 가중치와 바이어스: 학습이 완료된 후의 가중치와 바이어스로, 이 값들이 모델의 최종 예측 성능을 결정합니다.

부가 설명

Epoch 0: Loss = 22.153596026796926
초기 손실 값이 매우 큽니다.
이는 초기 가중치와 바이어스가 무작위로 설정되어 있어 모델이 아직 적절한 예측을 하지 못하고 있음을 나타냅니다.
Epoch 100: Loss = 0.0038611053619945304
100 에포크가 진행된 후 손실 값이 크게 감소하였습니다.
이는 경사 하강법을 통해 가중치와 바이어스가 업데이트되면서 모델의 예측 성능이 개선되었음을 보여줍니다.
Epoch 200: Loss = 0.0019613154803415187
손실 값이 계속 감소하고 있으며, 모델의 예측이 점점 더 실제 값에 가까워지고 있음을 나타냅니다.
Epoch 300: Loss = 0.000996284238003892
손실 값이 더욱 감소하여 예측 오차가 매우 작아지고 있습니다.
Epoch 400: Loss = 0.0005060798697831749
모델이 예측을 매우 정확하게 하고 있음을 나타내는 낮은 손실 값입니다.
Epoch 500: Loss = 0.0002570720531651653
손실 값이 더욱 감소하여 예측 오차가 거의 없음을 보여줍니다.
Epoch 600: Loss = 0.000130584211039386
손실 값이 매우 작아졌으며, 모델의 예측이 실제 값과 거의 일치함을 나타냅니다.
Epoch 700: Loss = 6.633251636195389e-05
손실 값이 매우 작아 모델이 매우 정확한 예측을 하고 있음을 나타냅니다.
Epoch 800: Loss = 3.3694752925239116e-05
손실 값이 거의 0에 가까워지고 있으며, 모델의 예측이 매우 정확함을 나타냅니다.
Epoch 900: Loss = 1.7115834540294246e-05
최종적으로 손실 값이 매우 작아져 모델의 예측 성능이 거의 최적화되었음을 보여줍니다.
Trained weights: w = 2.0019208162579427, b = 0.9930652438371297
학습 후 모델의 최종 가중치와 바이어스 값입니다.
실제 값 y = 2x + 1에 매우 근접한 값입니다.

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.