본문 바로가기
Deep Learning

Softmax, One-hot encoding, Regularization, Dropout의 이해

by 자라자 2020. 8. 15.

미래연구소 홈페이지: https://futurelab.creatorlink.net/

 

Softmax

Softmax는 activation함수의 일종이다. Binary classification에서는 Sigmoid라는 함수를 썼다면 multiclass classification에서는 Softmax를 쓴다. Softmax의 공식은 아래와 같다.

\[\sigma {({\mathbf{z}})_i} = \frac{{{e^{{z_i}}}}}{{\sum\limits_{j = 1}^K {{e^{{z_j}}}} }}{\text{ for }}i{\text{  =  1, }}...{\text{ ,}}K{\text{ and }}{\mathbf{z}} = ({z_1},...,{z_K}) \in {\mathbb{R}^K}\]

 

 

즉 가중치가 반영된 벡터 z에 exponential을 한 것의 비중이다. 자세히 보면 binary classification에서 쓰이는 sigmoid와 유사한 것을 알 수 있다. Sigmoid도 결국 아래와 같은 꼴이기 때문이다.

\[\frac{1}{{1 + {e^{ - WX}}}} = \frac{{{e^{WX}}}}{{{e^{WX}} + 1}} = \frac{{{e^{{w_1}X - {w_2}X}}}}{{{e^{{w_1}X - {w_2}X}} + 1}} = \frac{{{e^{{w_1}X}}}}{{{e^{{w_1}X}} + {e^{{w_2}X}}}}\]

 

결국 softmax를 거치게 되면 각 class에대한 확률로 결과가 출력되고 가장 높은 확률을 갖는 클래스가 선택된다. 이를테면 동물 사진이 있고 강아지인지, 고양이인지, 병아리인지, 그 외의 것인지 판별하는 모델에서 (0.9, 0.05, 0.03, 0.02) 로 출력될 수 있고 그 결과 강아지로 판명이 될 것이다. 

 

One-hot encoding

one-hot encoding은 클래스 분류시 분류 항목을 1,0으로 이러우진 벡터로 구성하는 기법이다. 예를 들면 동물 사진을 ('강아지', '고양이', '병아리', '그 외')로 한다고 할때 강아지는 (1 0 0 0) 고양이는 (0 1 0 0) 이런 식으로 만들어 주는 것을 의미한다. 구현 방법은 keras의 to_categorical로 가능하다.

 

 

Dropout

 

dropout은 모델의 overfitting을 방지하기 위한 전략 중 하나로, layer의 노드를 확률적으로 빼놓고 연산을 진행한다. 레이어마다 선별적으로 dropout rate를 설정할 수 있으며 이는 Tensorflow의 keras에서 쉽게 구현이 가능하다. Sequential 모델에서 적용하고자 하는 레이어 아래에 추가하면 된다. 예를들면 

 

1
2
3
4
5
6
7
from tensorflow.keras.layers import Dropout
 
def dropout_model():
    model = Sequential()
    model.add(Flatten(input_shape=(28,28)))
    model.add(Dense(units=64, activation='relu'))
    model.add(Dropout(0.3))
 

 

등으로 구현이 가능하다. 

 

 

Regularization

 

Regularization은 overfitting을 방지하기 위한 기법 중 하나로, cost function에 다른 term을 추가해 줘서 실행된다. 어떠한 norm을 추가하느냐에 따라서 L2 regularization과 L1 regularization이 있고, 식으로 보자면 아래와 같다.

\[J(w,b) = \frac{1}{m}\sum\limits_{i = 1}^m {L({{\hat y}^{(i)}},{y^{(i)}}) + \frac{\lambda }{{2m}}\parallel W} \parallel \]

 

맨 마지막 항이 추가된 항이다. 이 항이 Gradient descent로 들어가면 아래와 같이 식이 진행된다.

\[\begin{gathered}
  d{W^{[L]}} = {\text{(from backprop) }} + \frac{\lambda }{m}{W^{[L]}} \hfill \\
  {W^{[L]}} = {W^{[L]}} - \alpha \left[ {{\text{(from backprop) }} + \frac{\lambda }{m}{W^{[L]}}} \right] \hfill \\
   = \left( {1 - \frac{{\alpha \lambda }}{m}} \right){W^{[L]}} - \alpha {\text{(from backprop)}} \hfill \\ 
\end{gathered} \]

 

즉 weight이 줄어들게 되며, 이는 model이 과도하게 복잡해지는 것을 방지해준다.