Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

AI study/톡계 & ML & DL

[λ”₯λŸ¬λ‹] μ†μ‹€ν•¨μˆ˜ (loss function) μ’…λ₯˜ 및 간단 정리 (feat. keras & pytorch)

감자 πŸ₯” 2021. 3. 4. 02:22
λ°˜μ‘ν˜•

μ‹œμž‘ν•˜λ©°

λ”₯λŸ¬λ‹λͺ¨λΈ ꡬ좕 도쀑 μ†μ‹€ν•¨μˆ˜ λ•Œλ¬Έμ— 였λ₯˜κ°€ 났닀. μ•„λ§ˆ μ†μ‹€ν•¨μˆ˜μ™€ ν™œμ„±ν™” ν•¨μˆ˜μ˜ 쑰합이 λ§žμ§€ μ•Šμ•˜λ˜ 것 κ°™λ‹€. 일단 κ·Έλž˜μ„œ μ΄λŒ€λ‘œλŠ” μ•ˆλ˜κ² λ‹€ μ‹Άμ–΄μ„œ μžμ„Έν•œ μˆ˜μ‹κΉŒμ§€λŠ” μ•„λ‹ˆλ”λΌλ„ μ–Έμ œ, μ–΄λ–»κ²Œ, 무슨 μ’…λ₯˜μ˜ μ†μ‹€ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄κΈ°λ‘œ ν•œλ‹€!!! μ•„μžμ•„μž ν™”μ΄νŒ…  β‹ŒΰΌΌ •Μ€ βŒ‚ •Μ ΰΌ½β‹‹ 

 

손싀 ν•¨μˆ˜(loss function) λž€?

  • λ¨Έμ‹ λŸ¬λ‹ ν˜Ήμ€ λ”₯λŸ¬λ‹ λͺ¨λΈμ˜ 좜λ ₯κ°’κ³Ό μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 좜λ ₯κ°’μ˜ 였차λ₯Ό 의미
    • μ†μ‹€ν•¨μˆ˜λŠ” μ •λ‹΅(y)와 예츑(^y)λ₯Ό μž…λ ₯으둜 λ°›μ•„ μ‹€μˆ«κ°’ 점수λ₯Ό λ§Œλ“œλŠ”λ°, 이 μ μˆ˜κ°€ λ†’μ„μˆ˜λ‘ λͺ¨λΈμ΄ μ•ˆμ’‹μ€ 것
  • μ†μ‹€ν•¨μˆ˜μ˜ ν•¨μˆ˜κ°’μ΄ μ΅œμ†Œν™” λ˜λ„λ‘ ν•˜λŠ” κ°€μ€‘μΉ˜(weight)와 편ν–₯(bias)λ₯Ό μ°ΎλŠ” 것이 λͺ©ν‘œ

νŒŒμ΄μ¬μ—μ„œ μ§€μ›ν•˜λŠ” λ‹€μ–‘ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” λ§Žμ€ μ†μ‹€ν•¨μˆ˜λ₯Ό μ§€μ›ν•œλ‹€. ν•΄λ‹Ή ν¬μŠ€νŒ…μ—μ„œλŠ” kerasμ—μ„œ μ‘΄μž¬ν•˜λŠ” μ†μ‹€ν•¨μˆ˜μ™€, pytorchλ₯Ό ν™œμš©ν•΄μ„œ μ†μ‹€ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³Ό 것인데, μ•„λž˜ κ³΅μ‹λ¬Έμ„œμ—μ„œ λ‹€μ–‘ν•œ μ†μ‹€ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³Ό 수 μžˆλ‹€.

www.tensorflow.org/api_docs/python/tf/keras/losses

 

Module: tf.keras.losses  |  TensorFlow Core v2.4.1

Built-in loss functions.

www.tensorflow.org

 

 

1. binary_crossentropy (이항 ꡐ차 μ—”νŠΈλ‘œν”Ό)

  • y값이 (ex. 0,1) 인 이진 λΆ„λ₯˜κΈ°λ₯Ό ν›ˆλ ¨ν•  λ•Œ 자주 μ‚¬μš©λ˜λŠ” 손싀 ν•¨μˆ˜ (multi-label classification)
  • ν™œμ„±ν™” ν•¨μˆ˜ : sigmoid μ‚¬μš© (좜λ ₯값이 0κ³Ό 1μ‚¬μ΄μ˜ κ°’)
  • μˆ˜μ‹
    • μ•„λž˜ ν•¨μˆ˜μ— μ˜ˆμΈ‘κ°’(Yi) κ³Ό μ‹€μ œκ°’(ti) 에 1을 λŒ€μž…ν•˜λ©΄, μˆ˜μ‹μ€ 0에 μˆ˜λ ΄ν•˜κ²Œ 됨
    • μ•„λž˜ ν•¨μˆ˜μ— μ˜ˆμΈ‘κ°’(Yi =0)κ³Ό μ‹€μ œκ°’(ti = 1)을 λŒ€μž…ν•œλ‹€λ©΄, μˆ˜μ‹μ€ μ–‘μ˜ λ¬΄ν•œλŒ€κ°€ 됨
    • λ”°λΌμ„œ 이진 λΆ„λ₯˜μ— μ ν•©ν•˜λ‹€κ³  ν•©λ‹ˆλ‹€ :) 

β–· kerasμ—μ„œ μ§€μ›ν•˜λŠ” 이항 ꡐ차 μ—”νŠΈλ‘œν”Ό

tf.keras.losses.BinaryCrossentropy( from_logits=False, label_smoothing=0, reduction="auto", name="binary_crossentropy" )

β–· pytorchμ—μ„œ μ§€μ›ν•˜λŠ” λ²”μ£Όν˜• ꡐ차 μ—”νŠΈλ‘œν”Ό

μ‹ κ²½λ§μ˜ 좜λ ₯을 κ°€μž₯ν•œ 랜덀 벑터에 μ‹œκ·Έλͺ¨μ΄λ“œ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ μš©ν•΄ 이진 벑터인 probabilitiesλ₯Ό λ§Œλ“ λ‹€. κ·Έ λ‹€μŒ target을 0κ³Ό 1둜 이루어진 λ²‘ν„°λ‘œ λ§Œλ“€μ–΄μ„œ 손싀을 κ³„μ‚°ν•œλ‹€.

import torch
import torch.nn as nn

bce_loss = nn.BCELoss()
sigmoid = nn.Sigmoid()
probabilities = sigmoid(torch.randn(4, 1, requires_grad=True))
targets = torch.tensor([1, 0, 1, 0], dtype=torch.float32).view(4,1)
loss = bce_loss(probabilities, targets)
print(probabilities)
print(loss)

 

2. categorical_crossentropy (λ²”μ£Όν˜• ꡐ차 μ—”νŠΈλ‘œν”Ό)

  • 좜λ ₯을 클래슀 μ†Œμ† ν™•λ₯ μ— λŒ€ν•œ 예츑으둜 이해할 수 μžˆλŠ” λ¬Έμ œμ—μ„œ μ‚¬μš© (즉, λ ˆμ΄λΈ” (y) ν΄λž˜μŠ€κ°€ 2개 이상일 경우 μ‚¬μš© 즉, λ©€ν‹°ν΄λž˜μŠ€ λΆ„λ₯˜μ— μ‚¬μš©λ¨)
  • ν™œμ„±ν™” ν•¨μˆ˜ : softmax (λͺ¨λ“  벑터 μš”μ†Œμ˜ 값은 0κ³Ό 1μ‚¬μ΄μ˜ 값이 λ‚˜μ˜€κ³ , λͺ¨λ“  합이 1이 됨)
  • 라벨이 (0,0,1,0,0) , (0,1,0,0,0) κ³Ό 같이 one-hot encoding 된 ν˜•νƒœλ‘œ 제곡될 λ•Œ μ‚¬μš© κ°€λŠ₯
  • μˆ˜μ‹
    • μ•„λž˜ μˆ˜μ‹μ—μ„œ C λŠ” 클래슀의 개수
    • μ‹€μ œκ°’κ³Ό μ˜ˆμΈ‘κ°’μ΄ λͺ¨λ‘ λ™μΌν•˜κ²Œ 될 경우 μ†μ‹€ν•¨μˆ˜μ˜ 값은 0이 λ‚˜μ˜΄
    • μ‹€μ œκ°’κ³Ό μ˜ˆμΈ‘κ°’μ΄ λ‹€λ₯Ό 경우 μˆ˜μ‹μ— λŒ€μž…ν•˜λ©΄ μ–‘μ˜ λ¬΄ν•œλŒ€λ‘œ λ°œμ‚°

β–· kerasμ—μ„œ μ§€μ›ν•˜λŠ” λ²”μ£Όν˜• ꡐ차 μ—”νŠΈλ‘œν”Ό

tf.keras.losses.CategoricalCrossentropy( from_logits=False, label_smoothing=0, reduction="auto", name="categorical_crossentropy", )

β–· pytorchμ—μ„œ μ§€μ›ν•˜λŠ” λ²”μ£Όν˜• ꡐ차 μ—”νŠΈλ‘œν”Ό

λ°˜μ‘ν˜•
import torch
import torch.nn as nn

ce_loss = nn.CrossEntropyLoss()
outputs = torch.randn(3, 5, requires_grad = True)
targets = torch.tensor([1, 0, 3], dtype = torch.int64)
loss = ce_loss(outputs, targets)
print(loss)

λžœλ€ν•œ 벑터λ₯Ό 좜λ ₯으둜 κ°€μ •ν•˜κ³ , κ·Έ target 벑터λ₯Ό μ •μˆ˜ λ²‘ν„°λ‘œ λ§Œλ“ λ‹€. νŒŒμ΄ν† μΉ˜μ˜ CrossEntropyLoss() ν΄λž˜μŠ€λŠ” 각 μž…λ ₯이 클래슀 ν•˜λ‚˜μ— μ†ν•˜κ³  각 ν΄λž˜μŠ€μ—λŠ” κ³ μœ ν•œ μΈλ±μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

3. sparse_categorical_crossentropy

tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)
  • λ²”μ£Όν˜• ꡐ차 μ—”νŠΈλ‘œν”Όμ™€ λ™μΌν•˜κ²Œ λ©€ν‹° 클래슀 λΆ„λ₯˜μ— μ‚¬μš©
  • one-hot encoding 된 μƒνƒœμΌ ν•„μš” 없이 μ •μˆ˜ 인코딩 된 μƒνƒœμ—μ„œ μˆ˜ν–‰ κ°€λŠ₯
  • 라벨이 (1,2,3,4) μ΄λŸ°μ‹μœΌλ‘œ μ •μˆ˜ν˜•νƒœμΌλ•Œ μ‚¬μš©! 

 

4. 평균 제곱 였차 손싀 (means squared error, MSE)

  • μ‹ κ²½λ§μ˜ 좜λ ₯(^y)κ³Ό νƒ€κ²Ÿ(y)이 연속값인 νšŒκ·€ λ¬Έμ œμ—μ„œ 널리 μ‚¬μš©ν•˜λŠ” μ†μ‹€ν•¨μˆ˜
    • νšŒκ·€λ¬Έμ œμ— μ‚¬μš©λ  수 μžˆλŠ” λ‹€λ₯Έ 손싀 ν•¨μˆ˜
      • 평균 μ ˆλŒ“κ°’ 였차 (Mean absolute error, MAE)
      • 평균 제곱근 였차 (Root mean squared error, RMSE)
  • 예츑과 νƒ€κ²Ÿκ°’μ˜ 차이λ₯Ό μ œκ³±ν•˜μ—¬ ν‰κ· ν•œ κ°’ (λͺ¨λ‘ μ‹€μˆ«κ°’μœΌλ‘œ 계산)
  • MSEκ°€ ν¬λ‹€λŠ” 것은 평균 사이에 차이가 ν¬λ‹€λŠ” 뜻 / MSEκ°€ μž‘λ‹€λŠ” 것은 데이터와 ν‰κ· μ‚¬μ΄μ˜ 차이가 μž‘λ‹€λŠ” 뜻
    • 즉, MSEλŠ” 데이터가 ν‰κ· μœΌλ‘œλΆ€ν„° μ–Όλ§ˆλ‚˜ λ–¨μ–΄μ Έμžˆλ‚˜λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ†μ‹€ν•¨μˆ˜
  • μ—°μ†ν˜• 데이터λ₯Ό μ‚¬μš©ν•  λ•Œ 주둜 μ‚¬μš© (주식 가격 예츑 λ“±)

β–· pytorchμ—μ„œ μ§€μ›ν•˜λŠ” MSE

import torch
import torch.nn as nn

mse_loss = nn.MSELoss()
outputs = torch.randn(3, 5, requires_grad = True)
targets = torch.randn(3, 5)
loss = mse_loss(outputs, targets)
print(loss)

β–· keras μ—μ„œ μ§€μ›ν•˜λŠ” MSE

keras.losses.mean_squared_error(y_true, y_pred)

https://www.tensorflow.org/api_docs/python/tf/keras/metrics/mean_squared_error?hl=ko 

 

tf.keras.metrics.mean_squared_error  |  TensorFlow Core v2.5.0

Computes the mean squared error between labels and predictions.

www.tensorflow.org

 

 

 

 

μ°Έκ³ λ¬Έν—Œ (λ„μ™€μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κΈ€ μž˜μ½μ—ˆμ–΄μš”!)

wordbe.tistory.com/entry/ML-Cross-entropyCategorical-Binary%EC%9D%98-%EC%9D%B4%ED%95%B4

bskyvision.com/822

needjarvis.tistory.com/567

 

마치며

방금 κ³΅λΆ€ν•˜λ‹€κ°€ μ•Œκ²Œ 된 건데, μ•„κΉŒ λ”₯λŸ¬λ‹ λͺ¨λΈμ„ λŒλ¦¬λ‹€κ°€ 였λ₯˜κ°€ λ‚œ μ΄μœ λŠ” ν™œμ„±ν™” ν•¨μˆ˜ λ•Œλ¬Έμ΄ μ•„λ‹ˆλΌ μ•„λ§ˆ 였λ₯˜κ°€ λ‚œ μ΄μœ κ°€, μ •μˆ˜ ν˜•νƒœμ˜ λΌλ²¨μ΄μ—ˆλŠ”λ° binary cross entrophyλ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ΄μ—ˆλ˜ 것 κ°™λ‹€. ν‹°μŠ€ν† λ¦¬μ— μ—…λ‘œλ“œν•˜λŠ” 게 μ‹œκ°„μ΄ μ’€ 더 걸리긴 ν•˜μ§€λ§Œ 머릿속에 ν™•μ‹€ν•˜κ²Œ 정리가 λ˜λŠ” 것 κ°™λ‹€!!  αƒ¦(· α΄₯ ·)ο½― 

κ·Έλ™μ•ˆ λ§Žμ€ ν”„λ‘œμ νŠΈλ„ μ§„ν–‰ν•˜κ³  상도 타고 ν–ˆμ—ˆλŠ”λ°, μ΄λ ‡κ²Œ μ„Έμ„Έν•˜κ²Œ κ³ λ―Όν•˜κ³  κ³΅λΆ€ν•΄λ³΄λ‹ˆ 정말 뢀쑱함을 많이 λŠλ‚€λ‹€. μ–Όλ₯Έ TF 자격증 λ”°μž !! 화이탱탱탱  ΰΈ„^•ο»Œ•^ΰΈ„ 

 

λ°˜μ‘ν˜•