[Deep Learning] Dropout
CS/Deep Learning

[Deep Learning] Dropout

[Deep Learning] Dropout

 

앞에서 overfitting을 완화시키는 방법 중 하나인 Regularization을 알아보았다.

이번엔 또 다른 방법인 Drop-Out을 보자.

 

regularization이 cost function에 penalty 함수를 추가하고 그 penalty 부분에 대한 조작을 통해 결과를 얻는 방식이라면, dropout은 망 자체를 변화시키는 방식이기 때문에 둘은 근본적으로 다르다.

 

 

Dropout

  • 일반적으로 신경망에서 hidden layer의 개수가 많아지면(=DNN이 되면) 학습 능력이 좋아지지만 망의 크기가 커지면 커질수록 overfitting에 빠질 가능성이 높아지고 시간도 길어진다.
  • 이렇게 망의 크기가 커질 경우 사용할 수 있는 방법이 dropout이다.
  • dropout은 random하게 일부 뉴런을 0으로 만들어서 layer에 포함된 weight 중에서 일부만 참여시키는 방법이다. 
  • 일정한 mini-batch 구간 동안 dropout된 망에 대한 학습을 끝내면, 다시 무작위로 다른 뉴런들을 dropout하면서 반복적으로 학습한다.

 

기대효과

  • Voting 효과 : mini batch 구간 동안 dropout된 각자의 망에 fitting이 되면서 평균 효과를 얻을 수 있다. 따라서 결과적으로 regularization과 비슷한 효과를 얻을 수 있다.
  • Co-adaptation 방지 : 특정 뉴런의 바이어스나 가중치가 큰 값을 갖게 되면 그것의 영향이 커지면서 다른 뉴런들의 학습 속도가 느려지거나 학습이 제대로 진행 되지 못하는데 dropout을 하면 결과적으로 이러한 뉴런의 가중치나 바이어스에 영향을 받지 않기 때문에 뉴런들이 서로 동조화 되는 것을 피할 수 있다.
  • 결과적으로 선명한 특징(salient feature)를 끌어낼 수 있다.

 

#dropout을 얼마나 시킬 것이지에 대한 placeholder 설정. 몇 %의 뉴런 남길지
keep_prob = tf.placeholder(tf.float32)
(생략)
#layer에 dropout 설정
layer = tf.sigmoid(tf.matmul(X, W1) + b1)
layer = tf.nn.dropout(layer, keep_prob)
(생략)
#학습 할 때 dropout 얼마나 시킬 것인지 설정 ex) 0.75 = 75% node를 활성화
_, cost_val = sess.run([optimizer, cost], feed_dict = {X:batch_x, Y: batch_y, keep_prob:0.75})
(생략)
#테스트 할 때 dropout을 적용 안 할 것이다. -> keep_prob: 1 (100% node를 활성화)
sess.run(accuracy, feed_dict={X:mnist.test.images, Y:mnist.test.label, keep_prob:1})

 

 

 

 

참고

https://m.blog.naver.com/laonple/220542170499

 

 

 

 

728x90
반응형

'CS > Deep Learning' 카테고리의 다른 글

[Deep Learning] Auto-Encoder  (1) 2020.04.24
[Deep Learning] Optimizer  (1) 2020.04.19
[Deep Learning] Regularization  (0) 2020.04.19
[Deep Learning] 손실 함수(Cost function)  (0) 2020.04.05
[Deep Learning] Cross-entropy  (0) 2020.04.05