본문 바로가기

AI Theory/key concept of AI

모델 크기 조절과 규제

모델 크기 조절과 규제

모델의 크기 조절

과대적합이 발생할 경우, 해결 방법 중 하나로 모델의 크기를 줄이는 것이 제시된다.

모델의 크기를 조절하는 것은, 레이어의 유닛 수와 레이어의 수를 조절하는 것이다.

1. 레이어 유닛수를 감소시켜 모델 전체 파라미터 수 감소시키기

2. 레이어 수를 줄여서 더 앝은 신경망으로 만들기

데이터의 규모가 클 때, 더 크고 깊은 모델이 더 좋은 성능을 보여주지만, 데이터에 비해 모델이 너무 크면 과대적합이 발생할 수 있다. 따라서 데이터의 크기에 따라 모델 크기를 적절하게 설정해야 한다.

 

같이보면 좋을 글

 

[모델 튜닝] 하는 방법 - 과대적합과 과소적합

이번 포스팅에서는 머신러닝/딥러닝 모델의 성능평가 이슈 2가지 과대적합(overfittiong)과 과소적합(underfitting)에 대해서 다룬다. | Overfitting VS Underfitting 과대적합(Overfitting)이란 모델이 훈련세트에

hyjykelly.tistory.com

모델 규제

규제

모델의 손실함수에서 큰 가중치에 비용을 추가하는 형태

L1 규제, L2 규제가 있다.

모델에 따라 어떤 규제가 좋은지 실험해봐야한다.

# l1
l1_model =  models.Sequential()
l1_model.add(layers.Dense(16, 
                          kernel_regularizer='l1',
                          activation='relu', 
                          input_shape=(10000, )))
l1_model.add(layers.Dense(16, 
                          kernel_regularizer='l1',
                          activation='relu'))
l1_model.add(layers.Dense(1, activation='sigmoid'))
l1_model.compile(optimizer='rmsprop',
                 loss='binary_crossentropy',
                 metrics=['accuracy'])
l1_model.summary()

# l2
l2_model =  models.Sequential()
l2_model.add(layers.Dense(16, 
                          kernel_regularizer='l2',
                          activation='relu', 
                          input_shape=(10000, )))
l2_model.add(layers.Dense(16, 
                          kernel_regularizer='l2',
                          activation='relu'))
l2_model.add(layers.Dense(1, activation='sigmoid'))
l2_model.compile(optimizer='rmsprop',
                 loss='binary_crossentropy',
                 metrics=['accuracy'])
l2_model.summary()

#l1 & l2: l1과 큰 차이 없음
l1_l2_model =  models.Sequential()
l1_l2_model.add(layers.Dense(16, 
                             kernel_regularizer='l1_l2',
                             activation='relu', input_shape=(10000, )))
l1_l2_model.add(layers.Dense(16, 
                             kernel_regularizer='l1_l2',
                             activation='relu'))
l1_l2_model.add(layers.Dense(1, activation='sigmoid'))
l1_l2_model.compile(optimizer='rmsprop',
                    loss='binary_crossentropy',
                    metrics=['accuracy'])
l1_l2_model.summary()

# L2 규제 기본값 0.01에서 커스터마이징 가능

your_model =  models.Sequential()
your_model.add(layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.01, activation='relu', input_shape=(10000, )))
your_model.add(layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.01, activation='relu'))
your_model.add(layers.Dense(1, activation='sigmoid'))
your_model.compile(optimizer='rmsprop',
                    loss='binary_crossentropy',
                    metrics=['accuracy'])
your_model.summary()

# 저장
l1_l2_model_hist = l1_l2_model.fit(x_train, y_train,
                                  epochs=30,
                                  batch_size=512,
                                  validation_data=(x_test, y_test))

# 그래프 시각화
your_val_loss = your_model_hist.history['val_loss']

epochs = range(1, 31)
plt.plot(epochs, val_loss, 'k--', label='Model')
plt.plot(epochs, l1_val_loss, 'b--', label='L1-regularized')
plt.plot(epochs, l2_val_loss, 'r--', label='L2-regularized')
plt.plot(epochs, l1_l2_val_loss, 'g--', label='L1_L2-regularized')
plt.plot(epochs, your_val_loss, 'y--', label='Your L2-regularized')
plt.xlabel('Epochs')
plt.ylabel('Validation Loss')
plt.legend()
plt.grid()
plt.show()

dropout

모델이 학습을 진행할 때 일부 노드들만 사용하는 방법이다.

일반적으로 20~50% dropout한다.

테스트 단계에서는 그 어떤 노드도 드롭아웃 되지 않고, 대신 해당 레이어의 출력 노드를 드롭아웃 비율에 맞게 줄인다.

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000, )))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.summary()

drop_20_history = model.fit(x_train, y_train,
                            epochs=30,
                            batch_size=512,
                            validation_data=(x_test, y_test))

'AI Theory > key concept of AI' 카테고리의 다른 글

categorical cross entropy vs sparse cross entropy  (0) 2023.07.31
가중치 초기화와 배치 정규화  (0) 2023.07.25
딥러닝 구조와 모델  (0) 2023.07.24
텐서 표현과 연산  (0) 2023.07.24
[CV] GAN 과 cGAN  (0) 2023.07.18