[MLP] Multilayer perceptron (MLP) 완성(?)

드디어 Feedforward의 가장 기초적인 모델인 Multilayer perceptron (MLP)를 (다시) 완성한 것 같다.
작년에는 Numpy와 Tensorflow 두 가지 방법으로 짜다보니 약 두 달에 걸쳐서 만든 것 같은데 이번에는 그냥 간단하게 Tensorflow로만 설계했다.
(Numpy로 Batch normalization은 물론 Batch re-normalization 기능까지 곁들인 Neural network의 Back-propagation을 일일이 다 짰던 내 과거 코드를 보면서 정말 나 자신이 대단하다고 느꼈을 정도...)

이를 위해 Couresra의 Andrew Ng 교수의 Deep leraning 강의를 처음부터 다시 복습했고 또 작년 코드도 많은 부분 가져다 썼더니 과거보다 빠르게 만든 것 같다.
개인적으로 Deep learning의 첫 번째 course도 물론 중요하지만 두 번째 course인 "Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization"을 완전 추천한다.
Learning을 잘 되게끔 하는 여러가지 방법들을 이해하기 쉽게 설명해주기 때문!

특히 요번에는 내 올해 최종 목표가 Deep Q-Learning을 구현하는 것인데, 여기에서는 Feedforward 네트워크가 부수적인 하나의 function으로 동작하는 느낌이 있다.
즉 밖에서는 열심히 일반적인 Reinforcement learning Q-learning을 돌리되 안에서는 (state, action)과 Q-function의 mapping을 기존 간단한 tabular method나 value approximation에서 한 차원 더 나아가 Feedforward로 하고자 하는 것.

그렇기 때문에 이번에 다시 만든 Feedforward는 최대한 labeled 된 train set만 input으로 넣어주면 바로 바로 train이 될 수 있도록 바깥에서 볼 때 최대한 simple하게 만들려고 노력했다.

여튼 그럼 내가 이렇게 공들인 MLP가 잘 동작하는지 시험해봐야겠지?
Coursera에서 제공한 example data set인 "Football field", "Moons", "Cat vs. Non-cat" 그리고 "Signs"를 이용해서 내 MLP의 supervised learning 결과를 plot으로 남겨본다.
참고로 "Signs" dataset은 multiple class를 가지고있으며 아래 그림과 같다.


또한 밑에서 "Baseline"이라 함은 Regularization, Batch normalization을 쓰지 않고 ADAM optimization으로 training 한 모델을 일컫는다.

1) Regularization (Dropout, L2 normalization)

Data set:
- "Football field"

Model parameters:
- Minibatch = 1024
- Epochs = 10000
- Learning rate = 0.0001
- Optimizer = Adam
- 3-layer MLP with {256 ReLU, 168 ReLU, 1 Sigmoid}

< Baseline >

Train set: | cost_train=0.004593 | acc_train=100.000000 |
Test set: | cost_test=0.895019 | acc_test=91.500000 |

< L2 Regularization >


L2 regularization with Lambda = 0.7
Train set: | cost_train=0.272097 | acc_train=93.838863 |
Test set: | cost_test=0.305499 | acc_test=93.500000 |

< Dropout >


Dropout with Keep_prob = 0.5 for the intermediate layers
Train set: | cost_train=0.119971 | acc_train=95.260664 |
Test set: | cost_test=0.483484 | acc_test=94.000000 |

짧은 평:
L2 regularization 또는 Dropout을 통해 overfitting을 막을 수 있음을 보여주는 좋은 예시.
하지만 경험상 train set의 sample 갯수가 input dimension에 비해 충분히 많다면 굳이 Regularization을 사용하지 않아도 되었다. 당연한 말이지만;

2) Optimizers

Data set:
- "Moons"

Model parameters:
- Minibatch = 1024
- Epochs = 2000
- Learning rate = 0.0001
- 3-layer MLP with {256 ReLU, 168 ReLU, 1 Sigmoid}

< Gradient descent >

Train set: | cost_train=0.363473 | acc_train=84.666667 |
Test set: | cost_test=0.341516 | acc_test=84.666667 |

< Gradient descent with momentum >

Momentum with beta_1 = 0.9
Train set: | cost_train=0.267264 | acc_train=90.333333 |
Test set: | cost_test=0.237386 | acc_test=90.333333 |

< RMSProp >


RMSProp with beta_2 = 0.999
Train set: | cost_train=0.124104 | acc_train=94.666667 |
Test set: | cost_test=0.103055 | acc_test=96.333333 |

< ADAM >


ADAM with beta_1 = 0.9, beta_2 = 0.999
Train set: | cost_train=0.106113 | acc_train=94.333333 |
Test set: | cost_test=0.108386 | acc_test=95.333333 |

짧은 평:
일반적인 gradient descent 방법을 쓰면 learning이 겁나 안되는 것을 볼 수 있음.
Machine learning 분야의 고질적인 특징이 어느 한 domain에서 optimize 된 strategy가 다른 domain으로 가면 잘 먹히지 않는다는 점인데 RMSProp이나 ADAM의 경우 이미 다양한 data set에서 굉장히 높은 성능을 보임이 확인되었기 때문에 기존 machine learning의 technique과는 사뭇 다르게 범용성이 상당히 넓다고 할 수 있음. (Andrew Ng의 의견)

3) Batch normalization

Data set:
- "Cat vs. Non-cat"

Model parameters:
- Minibatch = 1024
- Epochs = 200
- Learning rate = 0.0001
- Optimizer = Adam
- 3-layer MLP with {256 ReLU, 168 ReLU, 1 Sigmoid}

< Baseline >
Train set: | cost_train=0.176524 | acc_train=99.043062 |
Test set: | cost_test=3.539656 | acc_test=66.000000 |

< Batch normalization >
Batch normalization with mu_test and var_test by moving average momentum 0.9
Train set: | cost_train=0.328580 | acc_train=100.000000 |
Test set: | cost_test=0.624473 | acc_test=66.000000 |

< Baseline + Dropout >
Train set: | cost_train=5.981646 | acc_train=67.464115 |
Test set: | cost_test=11.975652 | acc_test=34.000000 |

< Batch normalization + Dropout >
Batch normalization with mu_test and var_test by moving average momentum 0.9
Train set: | cost_train=0.353764 | acc_train=99.043062 |
Test set: | cost_test=0.561738 | acc_test=74.000000 |

짧은 평:
"Cat vs. Non-cat"의 경우 image이기 때문에 input dimension이 큼.
그렇기 때문에 input feature를 sample들에 대해 잘 normalization을 시켜줘야 어떤 data input이 들어와도 robust한 MLP를 만들 수 있음.
한편 dimension이 크기 때문에 아마 input layer 뿐만 아니라 intermediate layer 에서도 normalization을 시켜주면 robustness를 더 향상시킬 수 있는 것으로 보여짐.
사실 위 결과에서 accuracy는 향상이 전혀 없어지만 Batch normalization을 적용한 후에 cost를 보면 상당히 낮아진 것을 볼 수 있음.
또한 Batch normalization과 Dropout을 combine 함으로써 test accuracy를 더 끌어올릴 수 있었음.
신기하게도 Baseline에 Dropout을 입히면 오히려 learning에 큰 방해가..

4) Batch re-normalization

Data set:
- "Signs"

Model parameters:
- Minibatch = 1024
- Epochs = 200
- Learning rate = 0.0001
- Optimizer = Adam
- 3-layer MLP with {1024 ReLU, 1024 ReLU, 6 Softmax}

< Baseline >
Train set: | cost_train=15.350553 | acc_train=16.666667 |
Test set: | cost_test=15.350570 | acc_test=16.666667 |

< Batch normalization >
Batch normalization with mu_test and var_test by moving average momentum 0.9
Train set: | cost_train=0.275383 | acc_train=100.000000 |
Test set: | cost_test=0.618002 | acc_test=91.666667 |

< Batch re-normalization >
Batch normalization with mu_test and var_test by moving average momentum 0.9
Batch re-normalization with r_max = 3, d_max = 5, renorm_begin = 5000 iterations, renorm_end = 40000 iterations
Train set: | cost_train=0.254642 | acc_train=100.000000 |
Test set: | cost_test=0.600489 | acc_test=92.500000 |

짧은 평:
사실 솔직한 말로 "Cat vs Non-cat" 까지만 해도 Batch normalization의 대한 신뢰가 별로 없었음.
괜히 코딩만 복잡하고 (이게 가장 큰 불신의 요인) 성능 향상도 별로 없고 해서 시간만 낭비한게 아닌가.. 싶었음. Batch re-normalization은 말 할 필요도 없고..
그런데 웬일;;
6개의 gesture를 classificaiton 하는 "Signs" data에서 Batch normalization을 사용하니까 accuracy가 확 늘었다!
정말 image같이 input dimension이 큰 data들에 대해서는 input layer 뿐만 아니고 intermediate layers에도 normalization을 해줘야 하는게 맞는듯!?
마지막에 Batch re-normalization도 실험해봤는데 사실 미미하지만 normalization보다 조금 더 좋은 accuracy와 robustness를 보여줬다.
어쨋든 오늘 나만의 결론은 Batch normalization이 image classification에 상당히 유용하다는 것!

Comments