Advanced techniques for training neural networks
- Weight Initialization
- Nonlinearity (Activation function)
- Optimizers
- Batch Normalization
- Dropout (Regularization)
- Model Ensemble
Optimizers
좋은 학습 방법이란?
- global minimum 찾게 도와주는 방법 - 은 어렵다.
- local minimum을 빨리 찾는 방법 - 대부분의 알고리즘은 이 방법을 사용한다.
알파값(learning rate)을 크게 할지 작게 할지-
보편적으로 optimizer를 adam 알고리즘으로 사용한다.
def mlp_model():
model = Sequential()
model.add(Dense(50, input_shape = (784, )))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('softmax'))
adam = optimizers.Adam(lr = 0.001) # use Adam optimizer
model.compile(optimizer = adam, loss = 'categorical_crossentropy', metrics = ['accuracy'])
return model
model = mlp_model()
history = model.fit(X_train, y_train, validation_split = 0.3, epochs = 100, verbose = 0)
sigmoid, 초기값 안 좋아도(상황이 나빠도) optimizer를 adam으로 설정하는 것만으로도 성능이 대폭 향상된다.
결론>
- activation function은 ReLU 사용
- optimizer를 sgd 말고 adam 사용
모멘텀을 이용한 수렴 속도 개선
진행중인 방향으로 관성을 더해 local minimum에 빠지지 않도록 함
$$ v_t=(\alpha \frac{\delta Cost}{\delta W})t + r(\alpha \frac{\delta Cost}{\delta W}){t-1}+...+ r^n(\alpha \frac{\delta Cost}{\delta W})_{t-n} $$
(주의) 모멘텀이 있기 때문에 알파값은 작게 잡아야 한다.
Batch Normalization
(주의) 배치 정규화는 비선형함수 적용 전에 해야한다. (activation function 적용 전)
mean만큼 이동, scaling
Dropout (Regularization)
보통 activation 전에 batch normalization 하고,
activation 후에 dropout을 적용한다.
효과 보기 어려워
Dropout이란 weight를 0으로 만드는 것이다. 이는 overfitting을 방지하기 위함이다.
model.add(dropout(0.2))
학습 parameter가 10개였으면 randomly 2개의 weight를 0으로 만든다.
= 네트웍을 끊어버리는 것과 동일한 효과
network이 깊어질 수록 ~ overfitting 일어날 확률 높다
dropout 효과
- Co-adaptation
[72.2 0.01 -0.02] -> [0 0.01 -0.02]
dropout은 확률적으로 강한 co-efficiency를 제거하는 효과가 있다.
- Voting
weak classifier 들만 골라 모아서 strong classifier 되게 하는 것.
덜 학습시켜서 모아도 stronger
Model Ensemble
weak classifier: 선형 classifier
weak classifier들을 모아 strong classifier 만들 수 있다.
대표적 예제가 얼굴 검출기.
단순 분류기를 수 만 개 조합해 -> 얼굴 패턴 검출 가능
신경망 앙상블 학습
training data -> 각 신경망이 다르게 학습 -> voting
Voting: 다수결 방식.
- hard : 다수결로 0 or 1
- soft : validation accuracy를 신뢰도로 가중치 부여해서 결정
신경망 미니 배치 앙상블
training data -> mini-batch -> 각 신경망이 각 데이터로 학습 -> voting
각각 다른 데이터로 학습하니 서로 다른 의견을 낼 확률이 높아짐. better.
=> 신경망 분리 효과: dropout을 50% 이상은 해야 이런 효과가 나오는 것.. 보통 큰 값 쓴다 0.5
학습 단계에서만 0으로 놓는 것임.
다양성 역설 (Paradox of Diversity)
diversity 와 accuracy는 동시에 거의 불가
Low accuracy & High diversity
High accuracy & Low diversity
관심 있는 영역: 중간 accuracy & High diversity
성능을 높이려~diversity 높이려
argument max
- one-hot encoding의 index 찾을 때
- 몇 번째 클래스인지 판단할 때
y_train = np.argmax(y_train, axis = 1) #argmax: max값의 index 반환
y_test = np.argmax(y_test, axis = 1)
#model
def mlp_model():
model = Sequential()
model.add(Dense(50, input_shape = (784, )))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('softmax'))
sgd = optimizers.SGD(lr = 0.001)
model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = ['accuracy'])
return model
model1 = KerasClassifier(build_fn = mlp_model, epochs = 100, verbose = 1)
model2 = KerasClassifier(build_fn = mlp_model, epochs = 100, verbose = 1)
model3 = KerasClassifier(build_fn = mlp_model, epochs = 100, verbose = 1)
#서로 다른 모델 3개. 특별히 미니배치 사이즈 지정 안 했으므로 전체 배치로.
ensemble_clf = VotingClassifier(estimators = [
('model1', model1),
('model2', model2),
('model3', model3)], voting = 'soft')
#voting: 다수결 방식. hard/soft.
#soft: validation accuracy 반영해서 가중치 부여해서 결정
ensemble_clf.fit(X_train, y_train)
Epoch 100/100
19800/19800 [==============================] - 1s 36us/step - loss: 2.2426 - acc: 0.2104
Test accuracy: 0.315
ensemble로 합쳤더니 정확도 31%로 많이 늘어났다. (랜덤수준인 10%에 비해서는)
10개 쓰면 더 늘어나겠지
#위의 똑같은 모델에서 함수만 relu로 바꾸면
def mlp_model():
model = Sequential()
model.add(Dense(50, input_shape = (784, )))
model.add(Activation('relu'))
model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
sgd = optimizers.SGD(lr = 0.001)
model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = ['accuracy'])
return model
Epoch 100/100
19800/19800 [==============================] - 1s 37us/step - loss: 0.0054 - acc: 0.9998
ensemble 사용하면 흔들림 정도가 적다. smooth함
ensemble error - scikit-learn 0.21.3 version downgrade하면 됨..
'Python > Deep learning' 카테고리의 다른 글
CNN (0) | 2020.01.21 |
---|---|
다층 퍼셉트론을 향상시키는 방법 - 1 (0) | 2020.01.21 |
케라스 회귀 (0) | 2020.01.20 |
DNN (Deep Neural Network) (0) | 2020.01.20 |
경사하강법(SGD) (0) | 2020.01.20 |