실습 환경은 Python 3.6과 tensorflow 1.5이다.
드롭아웃(Dropout)
과적합(모델의 학습 결과와 학습 데이터가 너무 일치하여 이외의 데이터(테스트 데이터)에 대한 인식률이 떨어지는 현상) 문제를 해결하기 위해 등장한 기법.
학습 시 전체 신경망 중 일부만을 사용하도록 하여 가중치의 균형을 잡게 한다.
일반 학습 방법보다 학습 시간이 더 오래 걸린다는 단점이 있다.
모델은 이전 포스팅에서 사용한 MNIST 모델을 사용하였다.
2020/07/19 - [개발 일지/ML] - MNIST 학습 모델 만들기
드롭아웃 적용법
학습 시에는 뉴런의 일부만을, 결과 예측 시에는 뉴런의 전체를 사용해야 한다. 즉 서로 다른 값이 사용되어야 하므로 사용될 뉴런의 비율 keep_prob는 플레이스홀더로 선언한다.
keep_prob = tf.placeholder(tf.float32)
신경망 구성 시 dropout 함수를 이용해 사용할 뉴런의 비율을 지정해 줄 수 있다.
# 은닉층 1
W1 = tf.Variable(tf.random_normal([784, 256], stddev=0.01))
L1 = tf.nn.relu(tf.matmul(X, W1))
# 드롭아웃: 사용할 뉴런 비율 0.8
L1 = tf.nn.dropout(L1, keep_prob)
# 은닉층 2
W2 = tf.Variable(tf.random_normal([256, 256], stddev=0.01))
L2 = tf.nn.relu(tf.matmul(L1, W2))
L2 = tf.nn.dropout(L2, keep_prob)
# 출력층
W3 = tf.Variable(tf.random_normal([256, 10], stddev=0.01))
model = tf.matmul(L2, W3)
다음과 같이 최적화의 실행(학습) 시에는 뉴런의 비율을 0.8로 구성하고,
# 학습 시에는 뉴런의 0.8만 사용
_, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs,
Y: batch_ys,
keep_prob: 0.8})
결과 예측 시에는 뉴런의 비율을 1(전부 사용)으로 구성한다.
print("정확도:", sess.run(accuracy, feed_dict={X: mnist.test.images,
Y: mnist.test.labels,
keep_prob: 1}))
드롭아웃을 사용하면, 학습 횟수를 늘릴수록 정확도가 개선되어감을 확인할 수 있다.
그러나 과적합을 해결하지 않고 학습 횟수만을 늘리면, 과적합 문제가 심화되어 테스트 데이터에 대한 정확도가 오히려 낮아짐을 확인할 수 있다.
과적합을 해결하는 방안은 매년 새롭게 등장하고 있다. 따라서 이 해결법(드롭아웃)에 집중하기보다는, 과적합이 발생하는 이유와 어떻게 하면 과적합을 해결할 수 있는가에 집중하는 것이 더 옳은 학습 방법으로 보인다.