34. 딥러닝으로 MNIST 98%이상 해보기 (lab 10)


여기까지만 잘 해도 전문가 소리를 듣는다고 교수님께서 말씀하셨다. 그래서, 나는 전문가가 아니다. 따라하긴 하는데, 내껀 하나도 없는 것처럼 느껴진다.


19. 학습 rate, training-test 셋으로 성능평가 (lab 07)에서 설명했던 코드가 다시 나왔다. 이번 동영상에서 설명하는 모든 코드는 이 코드를 기반으로 한다. 이 코드를 이해하면 이번 동영상도 이해할 수 있다. 이전 글에서 충분히 설명했으니까, 생략한다.


새로운 기술을 적용하고 성능 측정한 결과를 보여주신다. 첫 번째로 볼 것은 neural network의 본질에 충실하게 hidden layer를 두었다. layer가 늘어났으니까, 그에 맞게 W와 b도 바뀌었다.

참.. sigmoid 대신 ReLU activation을 사용했고, 코드 마지막 줄에서 GradientDescentOptimizer 대신에 AdamOptimizer 함수로 바꿨다. 이게 현존하는 알고리듬 중에서 가장 좋다고 말씀하셨다.


지난 번 코드에서는 91%를 기록했는데, 이번에는 94%를 가볍게 넘겼다. 더욱이 반복 횟수도 15회로 훨씬 적게 반복했다. cost가 급격하게 떨어지는 것이 충격적이다. GradientDescentOptimizer로도 해봐야겠다.


hinton 교수님이 말씀하신 좋은 초기화를 하면 어떻게 달라질까? xavier 초기화를 했다. he 초기화가 아니다. 여기서는 bias를 사용하지 않았다.


놀랍다. 초기화 하나 했을 뿐인데, 97%를 넘겼다. 초기화를 잘 했기 때문에 첫 번째 cost부터 인상적인 값이 출력되었다. 그림 왼쪽의 마지막 cost보다 작은 값이다.


layer의 갯수를 늘렸다. 이럴 경우 overfitting 문제가 발생할 수 있으므로 dropout을 적용했다. 중간에 layer가 있을 때마다 하나씩 추가되었다. for문에서 0.7을 전달했으니까, 30%는 쉬라고 얘기한 셈이다. 마지막 줄에서는 dropout_rate로 1을 전달했다. 즉, 100% 참가해야 한다고 말했다. dropout에서 주의할 점의 하나가 마지막에는 100% 참가해야 한다는 점이다.


드디어 동영상 처음에 말씀하신 것처럼 98%를 넘었다. 이건 참, 놀라운 것이다. 어찌 보면 코드상에서는 변화가 많이 없는데, 결과에서는 변화가 많다.


여러 개의 optimizer 성능을 비교하는 사이트를 소개해 주셨다. 이 중에서 가장 좋은 것은 파란색, adagrad라는 방식이다. 아래 링크를 꼭 확인해 보자. 여러 가지 optimizer에 대한 링크도 함께 있다.

  Alec Radford's animations for optimization algorithms


앞의 그림처럼 여러 가지 optimizer를 비교하는 그림이다. "ADAM: a method for stochastic optimization"는 2015년에 발표된 논문인데, 엄청 유명하다. 구글링해서 보니까, 논문 인용도 많이 됐고, 이 그림 말고도 다양하게 비교하는 그림이 많이 실려 있다. 아래 링크는 해당 논문의 pdf 파일과 연결되어 있다.

  ADAM: a method for stochastic optimization


AdamOptimizer를 사용하는 것이 GradientDescentOptimizer 사용과 다르지 않다고 설명하셨다. 단지 함수 이름만 바꾸면 된다. 성능 비교를 보면, 너무 차이가 많이 나서 AdamOptimizer 사용하지 않기는 어려워 보인다.


극적인 결과를 이루어낸 성능 측정을 요약했다. 다시 한번 물어보자. 나는 전문가가 되었는가?