(JY) Keras 사용해보기

1. What is keras? 케라스(Keras)는 텐서플로우 라이버러리 중 하나로, 딥러닝 모델 설계와 훈련을 위한 고수준 API이다. 사용자 친화적이고 모델의 구성이 쉽기 때문에 기본 이미지 분류 및 텍스트 분��

dsbook.tistory.com

위 함수의 모델을 구성할 때 이전 글에서 완전 연결 계층의 방식으로 모델을 구성했다. 하지만 이 모델이 항상 정확한 결과를 보여준다고 할 수 없다. 만약 정확한 결과 출력이 가능하다면, softmax함수로 클래스를 분류할 때 이미지가 속하는 클래스의 확률값은 1, 그렇지 않은 클래스의 확률값은 0으로 저장될 것이다. (실제로는 0~1사이의 소숫점으로 구성된 10개의 요소를 가진 1차원 넘파이 배열이 형성된다.) 즉 오차값이 발생할 수 있으며, 모든 신경망 학습의 목적은 이 오차값을 최대한 낮추는 방향으로 나아가는 것이다. 그렇다면 이 오차값을 어떻게 줄여나가면서 학습을 하는지 다음 코드를 통해 알아보자.

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

 

 

1. 손실함수, Loss function

손실함수(Loss function), 비용함수(Cost function)는 말 그대로 실제값과 예측값이 차이가 났을 때, 그 오차가 얼마인지 계산해주는 함수이다. 예를 들어서 11번째 이미지의 실제값을 y11', 예측값을 y11이라고 해보자.

# y11' : 실제값
# y11' = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

# y11 : 예측값
# y11 = [0, 0.78, 0, 0, 0.2, 0, 0.01, 0.01, 0, 0]​

실제 이미지의 분류 값은 2번째 class를 가리키고 있지만 예측한 결과, 2일 확률은 78%, 5일 확률은 20% 그리고 7, 8일 확률이 1%로 예측한다. 이렇게 실제값과 예측값은 차이가 날 수 있으며, 그 오차를 줄이도록 신경망을 계속해서 학습시켜나가는 것이 목적이다. 이 오차를 계산하도록 도와주는 함수가 바로 손실함수이다. 손실함수를 계산하는 방법에는 평균제곱오차(Mean Squared error, MSE)방법과 교차 엔트로피 오차 (Cross Entropy Error, CEE)방법 등이 있다.

 

1) Cross-entropy error, CEE 방법

크로스 엔트로피가 무엇인지 알기위해서, 우선 엔트로피가 뭔지, 정보량이 뭔지 알아야 한다. 

  • 정보량 : 어떤 사건에 가치를 매겨놓은 것이다. 예를들어 아침에 해가 높이 떠있는데 기상청에서 오늘 맑을 것이라는 정보를 주면, 그 정보는 희소성을 잃은 정보이므로 가치가 높지 않다. 즉, 정보량이 적다. 반면, 오늘 아침에 구름이 잔뜩 껴있어 하늘이 어두운데 오늘 맑을 것이라는 정보를 주면, 그 정보는 희소성이 높은 정보이므로 가치가 높다. 즉 정보량이 많다고 할 수 있다. 어떤 사건 A에 대한 정보량은 다음과 같다.

$$-logP(A_i)$$

  • 엔트로피(entropy) : 엔트로피는 정보량의 기댓값을 뜻한다. 어떤 랜덤변수 A에 i = 1, 2, ... ,n개의 요소가 들어있다고 가정하면, 랜덤변수 A의 엔트로피는 다음과 같다.

$$-\sum_{i=1}^nA_ilogP(A_i)$$

 

  • 크로스 엔트로피(cross-entropy)는 다른 사건의 확률을 곱해서 엔트로피를 계산한 것이다. 베르누이처럼 0, 1만을 가지는 특별한 확률변수 X가 있고, X에 대한 또다른 확률함수를 Q라고 했을 때, 엔트로피와 크로스 엔트로피의 차이점은 다음과 같다.

$$entropy = -P(X=0)log(P(X=0)) -P(X=1)log(P(X=1))$$

$$cross-entropy = -Q(X=0)log(P(X=0)) -Q(X=1)log(P(X=1))$$

 

2) cross-entropy for multi class

크로스 엔트로피 손실함수에 대해 수식으로 나타내면 다음과 같다.

$$-\sum_{i=1}^n{t_i}'P(s_i)$$

여기서 t와 s는 각각 실제값과 예측값을 뜻하고 i는 각 클래스를 의미한다. 실제로 이 손실함수를 사용하기 전에는 sigmoid나 softmax와 같은 활성화 함수를 통해 예측값을 계산하고, 그렇게 계산한 값을 손실함수에 대입한다. binary 분류를 위한 sigmoid 활성화 함수와 결합하여 쓰이는 크로스 엔트로피 손실함수에는 binary cross-entropy가 있고, 다중 클래스 분류 문제를 해결하기 위해 softmax 활성화 함수와 결합하여 자주 사용되는 categorical cross-entropy가 있다. (사실 binary 크로스 엔트로피 함수와 categorical 크로스 엔트로피 함수의 식에는 크게 차이가 없다. 다만, binary의 경우 class의 갯수는 2개이고, categorical의 경우 class의 갯수는 3개 이상이라는 점에 차이가 있을 뿐이다.)

softmax + categorical cross-entropy

 

categorical cross-entropy는 우리가 다룬 fashion 이미지 데이터처럼 다중클래스 분류 문제를 해결할 때 자주 사용된다. 이 때, 실제값과 예측값을 각 클래스 별로 오차를 계산하고 그 오차값을 모두 더한다. 우리가 실습한 fashion 이미지 분류 문제를 예로 들어보자. fashion 이미지의 class는 총 10개이고, train 데이터 셋에서 예측값과 실제값의 결과는 각각 10개의 클래스에 대한 확률값을 가진 60,000개의 넘파이 배열로 이루어져 있다. 앞에서 이야기했던 것처럼 실제값을 y', 예측값을 y라고 하면 다음과 같이 나타낼 수 있다.

$$-\sum_{i=1}^n{y_i}'P(y_i)=-\sum_{i=1}^{10}{y_i}'P(y_i)$$

 

 

2. Summary

크로스 엔트로피 방법을 이용하여 딥러닝 과정에서 발생하는 오차를 계산한다. 이 때, 크게 2진 분류 문제와 다중 분류 문제로 구분할 수 있는데, 2진 분류 문제에는(class가 2개인 경우) sigmoid 활성화 함수와 함께 binary cross-entropy를 사용하고, 다중 분류 문제에는 softmax 활성화 함수와 함께 categorical cross-entropy를 사용한다.

 

Keras documentation: Probabilistic losses

Probabilistic losses BinaryCrossentropy class tf.keras.losses.BinaryCrossentropy( from_logits=False, label_smoothing=0, reduction="auto", name="binary_crossentropy" ) Computes the cross-entropy loss between true labels and predicted labels. Use this cross-

keras.io

 

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

See Stable See Nightly Built-in loss functions. View aliases Main aliases tf.losses Classes class BinaryCrossentropy: Computes the cross-entropy loss between true labels and predicted labels. class CategoricalCrossentropy: Computes the crossentropy loss be

www.tensorflow.org

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기