Learning Rate: learning rate는 gradient descent에서 local minimum을 찾을 때 다음 미분 지점으로 가기 위한 step size이다. learning rate가 너무 크면 local minimum을 찾지 못하고 발산하게 된다. 너무 작으면 시간이 오래 걸린다. 적당한 값으로 정하는 게 중요하다.
Overfitting: train data에 모델이 너무 잘 맞아서 다른 data set의 prediction에는 적용하기 힘든 경우를 말한다. train data에서 validation data를 따로 두고 사전 테스트를 통해 overfitting이 발생했는지 확인할 수 있다. overfitting을 발견하면 learning rate나 epoch을 조정하여 해결할 수 있다. overfitting을 방지하기 위해 적절한 data preprocessing이 필요하다. 또한 더 많은 train data를 학습시키거나 feature 수를 줄이고 regularization을 해서 overfitting을 해결할 수 있다.
Regularization: ML에서 일반화는 weight 값을 줄이는 것이다. overfitting model은 구불구불하다. 즉, noise data나 일반적이지 않은 데이터까지 너무 정확하게 분류해내기 위해서 데이터에 맞추어 weight 값이 크게 변형된다. 이 문제를 해결하기 위해서는 cost function에 weight term을 추가하면 된다. 그 이유는 weight가 커지면 cost도 더 커지게 해서 update를 할 때 weight가 작아지도록 유도할 수 있기 때문이다. 이 weight term에서 weight 앞에 붙는 상수인 regularization strength의 크기를 조절하거나 weight에 제곱을 해서 일반화 정도를 조절할 수 있다.
Preprocessing: data set의 값들이 차이가 크다면, learning rate를 아무리 잘 정해도 local minimum을 찾기 힘들 수 있다. 여러 weights로 구성된 벡터 공간에서의 cost function에 대한 등고선 그래프를 생각해보면 그 이유를 알 수 있다. cost의 차이가 크다면 등고선 그래프는 한쪽으로 치우치거나 타원의 형태를 띠게 되면서 어떤 구간에서 폭이 매우 크거나 매우 작을 수 있다. 그럼 일정 크기의 learning rate로 내려오면서 gradient descent를 적용할 때, 폭이 넓은 구간에서는 완만하게 내려오다가 폭이 얇은 구간에서 갑자기 방향이 크게 바뀌면서 발산할 수 있다. 따라서 normalization이나 standardization 등의 방법으로 rescaling을 해서 데이터 크기의 차이가 너무 크지 않게 조절하는 것으로 overfitting을 방지할 수 있다.
Normalization: 방법은 데이터에 맞게 잘 정하면 된다. 데이터를 적절한 값으로 나누거나 빼서 차이가 너무 크지 않게 조절할 수도 있다. 여러 가지 방법이 있다.
Standardization: 편차와 평균을 사용하여 표준화 확률 변수를 구하는 것이다.
Drop Out: overfitting을 막는 일반화의 한 방법이다. 신경망에서 몇 개의 노드를 죽이는 것이다. 주의할 점은 학습 과정에서만 drop out 하고 싶은 노드의 비율을 줄이고, 평가 과정에서는 다시 원래 비율로 돌아오게 구성해야 된다. ML에서 앙상블(Ensemble)과 유사하다.
Tensor Board: 텐서 그래프를 그리거나 accuracy 등의 평가 지표를 시각화할 수 있다. deep NN에서 유용하다.
# 딥 러닝에서 가중치의 초기 값을 잘 정하면 좋다. Xavier 등으로 너무 크지도 않고 작지도 않은 input과 output 사이의 값으로 줄 수 있다.
# deep NN은 wide, deep 할수록 성능이 좋다. 너무 깊으면 overfitting될 가능성도 있다.
# 여러 층의 deep NN에서 activation function를 잘 정해야 한다. sigmoid는 vanishing gradient 문제 때문에 ReLU가 더 좋다.
# adam optimizer 성능이 좋다.
# ResNet의 fast forward를 사용하면 layer의 개수가 매우 많아도 학습이 잘 된다.
코드:
xavier
https://github.com/hunkim/DeepLearningZeroToAll/blob/master/tf2/tf2-10-3-mnist_nn_xavier.py
dropout
https://github.com/hunkim/DeepLearningZeroToAll/blob/master/tf2/tf2-10-5-mnist_nn_dropout.py
'데이터 사이언스 공부 > 딥러닝' 카테고리의 다른 글
Text generation with an RNN (0) | 2020.08.15 |
---|---|
CNN, RNN (0) | 2020.07.03 |
Multinominal Logistic Regression, Softmax (0) | 2020.06.24 |
Logistic Regression, Binary Classification, Sigmoid (0) | 2020.06.16 |
TensorFlow 2.0 basic practice 2 (0) | 2020.06.08 |