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.
예측 확률 (): 모델이 예측한 이메일이 스팸일 확률 (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_pred와 y_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. 모든 권리 보유. 무단 복제 금지.