[DL] 왜 Softmax Function을 사용하는가

softmax function에 대해 가지게 된 궁금증에 대한 글입니다. 구글링하며 찾게 된 질문 및 답변을 필자가 이해하기 쉽게 정리하였습니다.

\[softmax(z)_i=\frac{exp(z_i)}{\sum_j exp(z_j)}\]
  • softmax는 differentiable하며 0과 1 사이의 값으로 normalize 해준다는 특성이 있습니다.

Why use softmax as opposed to standard normalization

  • 원글은 여기서 확인하실 수 있습니다.
  • 해당 글은 왜 Z-normalization 대신 softmax를 사용해서 output distribution을 뽑아내는가에 관한 질문입니다.
    1. output distribution의 차이를 더 크게 만들어준다.
      • image를 예를 들어 설명하자면, softmax function은 각 픽셀들이 거의 uniform distribution을 띄고 있는 low stimulation (blurry image)과, 0 또는 1에 가까운 값들을 가지는 high stimulation (crisp image)에 모두 잘 반응합니다.
      • 다음과 같은 예를 보면, z-normalization을 사용할 때보다 softmax를 사용할 경우, output distribution이 조금 더 명확하게, 구분되어 나올 수 있도록 만들어주는 역할을 합니다. (이는 다른 trick들, 예를 들어 pooling이나 optimizer를 사용하는 이유와 같습니다.)

          >>> std_norm([1,2])                      # blurry image of a ferret
          [0.3333333333333333, 0.6666666666666666] #     it is a cat perhaps !?
          >>> softmax([1,2])              # blurry image of a ferret
          [0.26894142,      0.73105858])  #     it is a cat perhaps !?
        
        
          >>> std_norm([10,20])                    # crisp image of a cat
          [0.3333333333333333, 0.6666666666666666] #     it is a cat perhaps !?
          >>> softmax([10,20])            # crisp image of a cat
          [0.0000453978687, 0.999954602]) #     it is definitely a CAT !
        
    2. cross-entropy loss의 log를 상쇄하여 더 쉽게 계산할 수 있다.
      • neural network를 학습하는 방법 중 가장 흔히 쓰이는 방법이 Maximum Likelihood Estimator (MLE)인데, 각 sample의 likelihood를 곱하는 것보다 아래와 같이 log를 씌워 더하는 것이 더 간편하다.
      • k번째 sample이라고 했을 때, \(argmax_{\theta} \sum_{k=1}^m log(P(y^{(k)}|x^{(k)}; \theta)) \cdots (1)\)
      • 이 때, softmax를 사용하면 위의 계산이 $z_i$의 형태로 나오게 되고, 이는 결국 모델이 잘못되더라도 쉽게 수정할 수 있다.
      • true class i에 대해 \(P(y^{(k)}|x^{(k)}; \theta)=P(y^{(k)}|z)=softmax(z)_i \cdots (2)\)
      • 식 (1)의 $log(softmax(z)_i)$을 구하기 위해 식 (2)에 log를 씌우면 \(log(softmax(z)_i) = (z_i-log \sum_j exp(z_j)) \cdots (3)\)
      • z의 class 간의 차이가 크다면, linear한 형태로 나타난다. \(log(softmax(z)_i) = (z_i-\max_jz_j)\)
        • 여기서, 차이가 크다는 것은
          Let $M = max(z_j)$, then $z_i - log∑exp(z_j) \ = z_i - log∑exp(M + z_j - M)$
          $ = z_i - log∑(exp(M) * exp(z_j - M)) \ = z_i - M + log∑exp(z_j - M)$.
          When there are large differences in z,
          we can approximate $exp(z_j - M) ≈ 0 $ for $z_j ≠ M \cdots (4)$.
          So $z_i - M + log∑exp(z_j - M) ≈ z_i - M + log(exp(M - M)) = z_i - M$
      • 모델이 정확하면 $max(z) = x_i$가 되어, 식 (3)의 log-likelihood가 0에 수렴한다.
      • 그러나 모델이 틀리면 $z_j$가 $z_i$보다 크므로 식 (4)가 성립하지 않게 되고, 따라서 log-likelihood는 $z_i-z_j$가 된다. 그렇다면 모델은 $z_i$를 증가시키고 $z_j$를 감소시키는 방향으로 학습을 하게 된다.

댓글남기기