딥러닝 모델 세부 설정
모델 초기값 설정 : get_config()
- 레이어의 초기값을 개발자가 지정할 수 있다.
- (예제) mnist 데이터셋 활용
dense = tf.keras.layers.Dense(256, activation = 'relu')
dense.get_config()
- 'kernel_initializer' : 레이어 초기화 방법 지정(기본값, glorot_uniform)
- 'kernel_regularizer' : 과대 적합 규제 적용(기본값, None)
모델 규제
- 과대적합을 피하기 위해 모델을 구성하는 레이어마다 l1, l2 규제 설정이 가능
- kernel_regularizer 활용
# 규제 적용
dense = tf.keras.layers.Dense(256, kernel_regularizer = 'l1', activation = 'relu')
print(dense.get_config()['kernel_regularizer']
# config {'l1' : 0.00099999}
# 규제 강도 값을 정하고 싶다면
regularizer = tf.keras.regularizers.l1(l1 = 0.1)
dense = tf.keras.layers.Dense(256, kernel_regularizer = regularizer, activation = 'relu')
print(dense.get_config()['kernel_regularizer']
# config {'l1' : 0.100000}
드롭아웃(Drop Out) : 학습데이터에만 최적화된 신경망 개선
- 드롭아웃 혹은 희석화라고도 하는 이 방법은 오버피팅 문제를 해결하는 대안
- 이 방법의 핵심 아이디어는 그림과 같이 신경망의 학습 단계에서 임의의 노드를 탈락시켜 학습시키는 것(노드 중 일정량(임의로 정함)을 학습 중간마다 무작위로 사용하지 않는 방법
- 딥러닝 모델의 층이 깊고 넓어질 때(wide and deep) 모델의 과대 적합 경향이 나타남
- 노드의 일부 신호를 임의로 삭제하여 모델이 학습하는 가중치 파라미터 개수를 줄임으로써 딥러닝 모델의 큰 난제인 모델의 과대 적합 문제 해결 제시, 강건한(robust) 모델 구현
- 단, 드롭아웃은 모델 훈련시에만 적용되어 노드의 일부만 훈련되게 되고, 예측시점에는 모든 노드를 활용
배치 정규화(Batch Normalization)
내부 공선성(Internal Covariance Shift)를 해결하기 위해 고안됨
신경망의 출력은 다양한 입력 데이터에 의해 쉽게 변화될 수 있는데, 매우 큰 범위의 출력값의 신경망을 불안정하게 하여 성능 저하를 일으킴. 배치 정규화는 신경망 층의 출력값 분포의 범위를 줄여서 불확실성을 어느 정도 개선하는 효과를 가짐
각층에서 활성화 함수를 통과하기 전에 미니배치의 스케일을 정규화함
정규화를 시키면 높은 학습률을 사용해도 그래디언트 손실/폭발의 문제점을 개선시키고 빠른 학습이 가능
자체적 규제 효과로 과대 적합 개선
케라스에서 클래스 함수로 지원하기 때문에 별도로 코드로 구현할 필요 없음콜백(call back) - 모델 학습 시 사용
model_b = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape =(28,28)), tf.keras.layers.Dense(64), tf.keras.layers.BatchNormalization(), tf.keras.layers.Activation('relu')....
훈련할 때 보조적인 작업을 수행할 수 있도록 도와주는 객체임
model.fit() 메소드에 callback 매개 변수로 지정함
tensorflow.keras.callbacks 패키지 내 다양한 콜백이 정의 되어있음
모델 체크포인트(Model Checkpoint)
- 가장 많이 사용되는 콜백임
- 미리 정해놓은 규칙에 의하여 모델의 훈련 epoch별로 체크포인트를 생성하고 저장함
- filePath : 체크포인트의 저장 경로
- save_weights_only : 가중치만 저장할 지 여부 설정
- save_best_only : monitor 기준으로 가장 높은 epoch만 저장할지 아니면 매 epoch별 저장할지 여부 설정
- monitor : 저장 시 기준이 되는 지표 설정, 'val_loss'로 설정 시 검증 손실이 가장 낮은 epoch의 가중치 저장
- verbose : 1로 설정 시 매 epoch 별 저장 여부를 알려주는 log message 출력
- 체크포인트 설정
checkpoint = tf.keras.callbacks.ModelCheckpoint(filePath = **,....) model.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 10, callbacks = [checkpoint])
조기종료(Early Stopping)
tensorflow.keras.callbacks.EarlyStopping() 객체로 생성하며 모델 훈련 시 patience에 지정된 epoch 안에 손실이 줄어들지 않는다면 모델훈련을 조기 종료함.
[예제] 3 epoch동안 검증 손실(val_loss)이 줄어들지 않으면 모델 훈련이 종료되는 예제
# EarlyStopping 콜백 생성 earlystopping = tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience = 3) model.fit(X_train, y_train, validation_data = (X_test, y_test) epochs = 20, callbacks [earlystopping]
학습률 스케줄러(Learning Rate Scheduler)
- 훈련에 대한 학습률 조정, 학습률을 특정 로직에 의하여 조정하고 싶을 때
```
def scheduler(epoch, lr):
tf.print('f"learning_rate : {lr: 5f}")
# 챗 5 매포크 동안 유지
if epoch < 5:
return lr
else:
# 학습률 감소 적용
return lr * tf.math.exp(-0.1)
# 콜백 객체 생성 및 scheduler 함수 적용
lr_scheduler = tf.keras.callbacks.LearningRateScheduler(scheduler)
model.compile(tf.keras.optimizers.SGD(), loss = 'sparse_categorical_crossentropy", metrics = ['accuracy']
```
딥러닝과 과대적합
딥러닝 모델의 학습 반복횟수가 많으면 학습 데이터에 대한 정확도는 증가하나 학습시간이 늘어나고 테스트 데이터의 성능을 떨어뜨릴 가능성이 높다.
조기종료
- 학습을 진행할 때 최대 학습 반복횟수를 설정하데ㅚ, 모델이 과대적합 될 소지가 있을 경우 학습을 중단하고 지금까지 학습된 모델 중에서 최고의 모델을 선택해야함
- 딥러닝 학습에 조기 종료를 도입하기 위해 가장 먼저 해야할 일은 데이터를 학습 데이터, 검증데이터, 테스트 데이터로 분리하는 것
'머신러닝 및 딥러닝 > 딥러닝' 카테고리의 다른 글
객체탐지와 합성곱 신경망 (0) | 2023.02.27 |
---|---|
합성곱 신경망 데이터 증강(ImageDataGenerator 사용하기) (0) | 2023.02.23 |
전이학습 이론 (0) | 2023.02.23 |
합성곱 신경망 이론 (0) | 2023.02.22 |
인공신경망과 퍼셉트론 이론 (0) | 2023.02.21 |