- Perceptron
- MLP
- input, hidden, output layer
- 신경망 학습 : 순전파-손실 계산-역전파 과정
- Gradient Descent
- Optimizer
- Learning Rate - decay, scheduling
- Weight Initialization - Xavier, He
- Overfitting
- weight decay (regularizer)
- Dropout
- Early Stopping
- Cross Validation
- GridSearch, RandomSearch
learning rate : 얼마나 이동할지(보폭)을 조정하는 hyperparameter
🌀 Learning rate Decay/Scheduling
학습률 감소/계획법
학습률이 너무 낮으면 최적점에 이르기까지 너무 오래 걸리거나, 주어진 iteration 내에서 최적점에 도달하는 데 실패하기도 한다, local minimum에 빠질 수 있다.
반대로, 학습률이 너무 높으면 경사 하강 과정에서 발산하면서 모델이 최적값을 찾을 수 없게 된다.
그렇기 때문에, 최적의 학습률을 찾는 것은 학습에서 중요한 요소이다.
위와 같은 문제를 해결하기 위해 사용되는 방법이 학습률 감소/계획법이다.
1. Learning rate Decay (학습률 감소)
주요 optimizer에 이미 구현되어 쉽게 적용가능
lr
: 학습률 설정
beta_1
: 학습률 감소율 설정
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001, beta_1=0.89),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
2. Learning rate Scheduling (학습률 계획법)
학습률을 커스터마이징하여 증감을 반복했을 때 효과
experimental
내부의 함수 사용해 설계할 수 있다.
first_decay_steps = 1000 # step=iteration
initial_learning_rate = 0.01 # 초기 학습률
# 코사인 값을 이용해 학습률의 증감을 나타내는 메서드
lr_decayed_fn = (tf.keras.experimental.CosineDecayRestarts(initial_learning_rate, first_decay_steps))
# 앞서 설정한 학습률 계획을 optimizer 내 lr 인자로 사용
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_decayed_fn),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
🌀 Weight Initialization
기본적으로, 가중치 값은 너무 크면 안됨.
또한 동일한 값들이 중복되서 들어가는 것이 좋지 않다.
노드들마다 weigth값들이 다 똑같은 값을 가지고 있다면, 다양한 정보를 보유할 수 없게 된다.
가중치 초기는 작은 값들로, 고르게 되는 것이 좋음. (보통 표준편차가 0.01수준 정도가 되는것이 좋다고 함)
depth가 깊어진다면, 다른 방법이 필요하겠지.
표준편차를 1인 정규분포로 가중치를 초기화할 때 각 층의 활성화 값 분포
활성화 함수로 sigmoid
평균이 0, std=1로 설정
활성값이 0 또는 1이면 미분값이 0이라서 학습 x
대부분의 활성화 값이 0, 1에 위치하게 되어, 많은 양의 layer를 사용하는 의미가 없어져 학습이 잘 이루어지 않아, 잘 사용되지 않는다.
Xavier Initialization (glorot initialization)
활성화 함수 : tanh
이전항, 다음항의 계수를 고려해서 만들었다.
층이 깊어져도 활성값이 고루 형성됨.
relu같은 경우, 시간이 지날수록(층이 깊어질수록), 값이 0으로 몰려서 문제 발생
Xavier 초기화 : 가중치를 표준편차가 고정값인 정규분포로 초기화했을 때의 문제점을 해결하기 위해 등장한 방법
Xavier초기화는 이전 층의 노드가 n개일 때, 현재 층의 가중치를 표준편차가 1/root(n)인 정규분포로 초기화된다.
Xavier 초기화는 활성화 함수가 Sigmoid 인 신경망에서 잘 동작한다. 하지만, 활성화 함수가 ReLU 인 경우 층이 지날수록 활성값이 고르지 못하게 된다.
He Initialization
활성화함수를 ReLU로 설정 시 xavier 초기화 시 활성값의 대부분이 0으로 형성되기 때문에 이러한 문제 해결하기 위해 등장
ReLU에 맞는 초기화 방법이라 할 수 있겠지.
이전 층의 노드가 n개일 때, 현재 층의 가중치 표준편차가 2/root(n)인 정규분포로 초기화한다.
He 초기화 적용 시, 층이 지나도 활성값이 고르게 유지될 수 있다.
ex) 이전 층의 노드가 16개일 때, 현재 층의 가중치 표준편차가 0.5인 정규분포로 초기화한다.
가중치 초기화 방법은 여러 가지가 있다.
['uniform', 'lecun_uniform', 'normal', 'zero', 'glorot_normal', 'glorot_uniform', 'he_normal', 'he_uniform']
케라스 dense layer에서는 default로 ‘glorot_uniform’(=xavier uniform)이 설정되어있다.
적용 방법
: 모델 내 추가하는 dense layer에 kernel_initilaizer
사용
# HE Initialization 사용
Dense(32, activation='relu', kernel_initializer='he_uniform')
[SUMMARY]
Activation function에 따른 초기값 추천
- Sigmoid → Xavier 초기화를 사용하는 것이 유리
- ReLU → He 초기화를 사용하는 것이 유리
딥러닝은 머신러닝의 한 분야로, ML에서 발생하는 동일한 문제가 발생한다.
ML과 마찬가지로 DL도 모델이 복잡해질수록 overfitting 발생할 가능성이 높아진다. 인공 신경망은 매우 복잡한 모델이기 때문에 overfitting 자주 발생한다.
강아지집이 강아지에 과적합된 이미지 ㅎㅎ
🌀 Overfitting 방지를 위한 기법들
1. Weight Decay (가중치 감소)
loss function에 가중치의 크기와 관련된 penalty 항 추가 - L1(lasso), L2(Ridge) Reguralization 사용
cf) l1은 가중치를 0으로 만들 수도 있다는 점 주의해야함. 중요하지 않은 feature들은 사라지게 되는 feature selection의 효과를 줄 수 있다. 하지만 골고루 중요한 경우엔 이 방법이 적절하지 않을 수 있다. 모든 feature이 더 중요한 경우에는 l1보다 l2가 더 적절하겠지!
좀 더 성능이 더 대체적으로 잘 나오는 것이 elasticnet으로 l1,l2개념 둘 다 쓰는 것이다. 특정 feature에 대해 죽여버리는 것에 대해 살짝 보완되는 느낌이겠지.ㅎㅎ
keras에서는 가중치 감소를 적용하고 싶은 층에 regularizer
파라미터를 추가하면 된다.
- 가중치 감소:
kernel_regularizer
- 편향 감소 :
bias_regularizer
- 가중치+편향 감소 :
activity_regularizer
Dense(64, kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.1l(0.01))
# 숫자는 람다값을 의미함.
2. Dropout
복잡함 좀 제거해주기 위해, iteration마다 레이어 내 일부 노드를 확률적으로 삭제
무작위로 제거되기 때문에 매 학습마다 다른 모델을 만드는 효과 (ensemble)
cf. (기본적으로 알고리즘 돌릴 때 ,svm, knn,decison tree, randomforest는 해보는데,
다른 것에 비해, randomforest만 성능이 월등하다 → feature selection에 관심을 가져야함. (random forest에서의 각각의 결정 트리는 데이터의 일부 feature를 랜덤하게 선택해 사용하므로, feature selection의 효과를 자연스럽게 내기 때문이다.)
(딥러닝에서도, 좋은 성능을 내기 위해서 feature 중요도 고려해서, feature selection을 하는 것도 하나의 방법)
알고리즘에 대한 이해도 중요하지만 가장 중요한 것은 데이터의 통찰!! 데이터를 보고 어떻게 전처릴를 햇을때 어떤 알고리즘을 결정하면 좋은 성능이 나오겠다는 통찰할 수 있는 것이 매우 필요!!
Dropout(0.5)
3. Early Stopping (조기 종료)
train data에 대한 손실은 계속 줄어들지만, val data에 대한 손실은 증가한다면 학습을 종료하도록 설정하는 방법
일정 기간동안 성능 개선되지 않으면(과적합 발생 시작 지점이면) 학습 종료!!
- EarlyStopping 콜백은 모델이 학습을 진행하면서 지정된 성능 지표 monitor를 모니터링하다가, 성능이 개선되지 않는 상황이 일정 기간 patience 동안 지속될 경우 학습을 조기 종료하는 방법
- ModelCheckpoint 콜백 : 학습 중 가장 좋은 성능을 보인 모델만 저장
-> EarlyStopping, ModelCheckpoint를 함께 사용해, 학습이 진행되면서 모델의 파라미터는 checkpoint_filepath경로에 저장됨. 이후에 학습을 재개할 때는 저장된 모델을 불러와서 학습 진행 가능.
# 파라미터 저장 경로 설정 : 조기 종료 적용할 때 학습이 끝낸 시점에 모델 사용하는 것이아니라,
# 그 이전에 모델 사용할 수 있기 때문에 파라미터를 저장하는 용도로 사용됨.
checkpoint_filepath = 'FMbest.hdf5'
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', # 성능 측정 방법 (default='val_loss')
min_delta=0, # 개선이 있다고 판단할 최소의 변화량 (default=0)
patience=10, # 성능이 개선되지 않더라도 얼마나 기다릴 것인지. (default=0)
mode='auto' # 모니터링할 지표의 개선 방향 지정 (default='auto')
# min_delta보다 변경 사항이 작다면 개선이 없다고 판단(default=0)
# patience=10 : 10번의 epoch동안 개선되지 않을 경우 학습 중단
# mode : 모델이 최소화해야하는 loss값일 경우 mode='min', 최대화해야하는 accuracy의 경우 mode='max'
# ModelCheckpoint를 통해 모델 저장
save_best = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_filepath,
monitor='val_loss',
save_best_only=True, # 최고 성능 보이는 경우만 저장 (false로 해놓고하면 계속 테스트할 시 바뀌는데,
# true로 해놓고 계속 테스트하면 최고 성능안바뀌더라고)
save_weights_only=True, # 모델의 가중치만 저장 (false일 경우, 레이어까지 모두 저장)
mode='auto',
save_freq='epoch', # 매 epoch마다 저장 시도
options=None)
model.fit(x_train, y_train, batch_size=32, epochs=30,
validation_data=(x_test, y_test),
callbacks=[early_stop, save_best])
# 앞서 선언한 early stopping과 model checkpoint를 callbacks를 통해 설정
callback 개념
.fit 함수가 실행되는 동안 얘네를 물고있는것
callback : 함수가 실행해지는 동안에, 호출했다가 다시 돌아오는 것
dropout, regularization을 반드시 적용할 필요는 없다. 때론 없을 때 성능이 더 좋을수도~(상황에 맞게끔 잘 선택해보자!)
More Study
모델 최적화하는데 여러 번 학습하는데 드는 시간 절약하는 방법은?
- 병렬화 : 병렬 처리를 통해 여러 개의 작업 동시에 처리 (GPU나 분산 처리 시스템)
- 데이터 크기 줄이기
- 층이 깊어지는게 꼭 필요한가?에 대해 고민
- feature 수를 줄이기
- undersampling : 데이터 불균형 문제를 해결하기 위해 다수 클래스 데이터를 일부만 사용하여 학습하는 것으로, 데이터의 크기를 줄여 시간 단축 가능
- smote : 소수 데이터 샘플을 oversampling해서 재구성하여, 데이터 불균형 문제를 해결하는 방법 중 하나이다.
'Machine Learning' 카테고리의 다른 글
[CV] CNN, Tranfer Learning (0) | 2023.05.07 |
---|---|
[Neural Networks 4] Hyperparameter Tuning (0) | 2023.04.24 |
[Neural Networks 2] Training Neural Networks (0) | 2023.04.24 |
[Neural Networks 1] Artificial Neural Network (0) | 2023.04.23 |
[Applied Predictive Modeling 4] Special Classification Problem (0) | 2023.04.17 |