on
딥러닝 기초 (3) Regularization
딥러닝 기초 (3) Regularization
과적합을 방지하는 학습 규제 전략 4가지
1. learning rate scheduling
학습을 너무 많이 하면 모델이 복잡해지면서 과적합이 일어난다. 그전에 적절한 곳에서 중단시키는 방법이 learning rate scheduling이다.
이 전략은 가중치의 최고 유용성 시점을 훨씬 지나서 더 업데이트되는 것을 막는다.
2. Weight decay (가중치 규제 - L1 & L2)
가중치 규제를 통해서 Weight의 학습 반경을 변경한다
오차 함수에 추가하기 때문에 간접적 으로 제한해준다고 이해할 수 있다.
L1 규제 (Ridge)
Loss function(손실 함수) + (lambda*가중치의 절댓값인 L1 norm
ex) 벡터 p =(3, 1, -3), q = (5, 0, 7)이라면 p, q의 L1 Norm 은 |3-5| + |1-0| + |-3 -7| = 2 + 1 + 10 = 13 이 됩니다.
L1 loss는 실제값과 예측값 사이의 오차의 절댓값 합
Sum of absolute deviation
기울기 소실(기울기가 0)이 발생하여 가중치가 비활성화되는 경우도 있다.
0인 지점에서 미분이 불가능하다는 단점이 있다.
L2 규제 (Lasso)
Loss function(손실 함수)
: 서로 다른 두 벡터 사이의 직선거리인 L2 Norm)
L2 loss는 실제값과 예측값 사이의 오차 제곱 합
>>L2 loss는 오차의 제곱 합을 더해나가기 때문에 Outlier(이상치)에 더욱 민감하게 반응하기 때문에......
보통은 L2규제를 많이 쓴다.
3. Weight Constraint (가중치 제한 = 바리케이드)
직접적 & 물리적으로 Weight의 크기를 제한하는 방법
Weight자체를 함수를 이용하여 더 큰 경우는 임의의 값으로 변경해버리는 기술을 사용하게 된다
그 이상으로 커지거나 작아지지 마라고 직접적 숫자를 제시함으로써 제한해 줄 수 있다.
4. Dropout
은닉층의 노드를 일부분 임의로 꺼놓고 학습 및 조정하는 것이다.
>> 과적합을 막는 거다. 어떻게 그렇게 되나요?
- 층의 개수는 유지하면서 노드의 개수를 바꿔주면서 새로운 모델을 만들어서 결과를 종합하기 때문에 과적합을 방지할 수 있다.
- 개념적으로 앙상블과 비슷하다 -- 100개 중에 80개만 쓰겠다고 했을 때, iteration마다 80개를 랜덤으로 고르게 되기 때문에 앙상블과 비슷하다.
Test 할 때 빼놓았던 노드를 다시 넣어야 한다.
Keras에서 규제 방법 구현 예제
예제에 사용할 데이터셋은 keras에서 제공하는 fashion_mnist이다.
데이터를 데이터 프레임으로 불러오고 정규화를 진행해준다.
# Tensorflow에서 데이터를 가져와 규제 하는 코드 from tensorflow.keras.datasets import fashion_mnist # 데이터 불러오기 (X_train, y_train), (X_test, y_test) = fashion_mnist.load_data() print(X_train.shape, X_test.shape) # 데이터를 정규화 합니다 print(X_train.max(), X_test.max()) # 가장 큰 수인 255로 나누어주면 1 이하의 값으로 정규화를 할 수 있다. X_train = X_train / 255. X_test = X_test /255. # 클래스를 확인합니다. np.unique(y_train) # (60000, 28, 28) (10000, 28, 28) # 255 255 # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)
아래에 기본적인 신경망을 만들어 보겠다.
# 기본적인 신경망을 만드는 코드 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten import keras, os # 모델 구성을 확인 model = Sequential([ Flatten(input_shape=(28, 28)), Dense(10, activation='softmax') ]) # 업데이트 방식을 설정 model.compile(optimizer='adam' , loss='sparse_categorical_crossentropy' , metrics=['accuracy']) # model.summary() ## 총 7850 parameters (10 bias) # 숫자를 포함한 변수를 초매개변수로 직접 입력하기 위해 변수 생성 batch_size = 30 epochs_max = 1 # 학습시킨 데이터를 저장시키기 위한 코드 checkpoint_filepath = "FMbest.hdf5" # overfitting을 방지하기 위해서 학습 중 early stop을 수행하기 위한 코드 # patience = 10 이라는 뜻은 Loss가 Best 값보다 5번 높아질 때 Stop 하도록 설정하는 것 early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1) # Validation Set을 기준으로 가장 최적의 모델을 찾기 위한 코드 # moniter: Best model을 만들 때, 멈추는 기준을 val_loss(검증 데이터셋의 loss 값)으로 설정했다. save_best = tf.keras.callbacks.ModelCheckpoint( filepath=checkpoint_filepath, monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=True, mode='auto', save_freq='epoch', options=None) # 모델 학습 코드 + early stop + Best model model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs_max, verbose=1, validation_data=(X_test,y_test), callbacks=[early_stop, save_best]) # 학습된 모델을 이용하여 테스트하는 코드 model.predict(X_test[0:1]) test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2) # 313/313 - 0s - loss: 0.5107 - accuracy: 0.8221
학습된 결과를 확인한다.
!ls # ds-lecture-data.s3.ap-northeast-2.amazonaws.com FMbest.hdf5 sample_data # 체크포인트에 저장된 가중치들을 불러들이는 코드 model.load_weights(checkpoint_filepath) # best model을 이용한 테스트 데이터 예측 정확도 재확인 코드 model.predict(X_test[0:1]) test_loss, test_acc = model.evaluate(X_test, y_test, verbose=1) #313/313 [==============================] - 0s 1ms/step - loss: 0.5107 - accuracy: 0.8221
새롭게 Weight Decay를 적용해서 모델을 만들어본다.
from tensorflow.keras import regularizers # 모델 구성을 확인합니다. model = Sequential([ Flatten(input_shape=(28, 28)), Dense(64, kernel_regularizer=regularizers.l2(0.01), # L2 norm regularization activity_regularizer=regularizers.l1(0.01)), # L1 norm regularization Dense(10, activation='softmax') ]) # 업데이트 방식을 설정합니다. model.compile(optimizer='adam' , loss='sparse_categorical_crossentropy' , metrics=['accuracy']) model.summary() model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1, validation_data=(X_test,y_test)) model.predict(X_test[0:1]) test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
방금 진행했던 Weight Decay에 추가로 Weight Constraint를 적용한다.
from tensorflow.keras.constraints import MaxNorm # 모델 구성을 확인 model = Sequential([ Flatten(input_shape=(28, 28)), Dense(64, kernel_regularizer=regularizers.l2(0.01), activity_regularizer=regularizers.l1(0.01), kernel_constraint=MaxNorm(2.)), ## add constraints Dense(10, activation='softmax') ]) # 업데이트 방식을 설정 model.compile(optimizer='adam' , loss='sparse_categorical_crossentropy' , metrics=['accuracy']) model.summary() model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1, validation_data=(X_test,y_test)) model.predict(X_test[0:1]) test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
Dropout도 추가해본다.
from tensorflow.keras.layers import Dropout # 모델 구성을 확인합니다. model = Sequential([ Flatten(input_shape=(28, 28)), Dense(64, kernel_regularizer=regularizers.l2(0.01), activity_regularizer=regularizers.l1(0.01), kernel_constraint=MaxNorm(2.)), Dropout(0.5) , ## add dropout Dense(10, activation='softmax') ]) # 업데이트 방식을 설정합니다. model.compile(optimizer='adam' , loss='sparse_categorical_crossentropy' , metrics=['accuracy']) model.summary() model.fit(X_train, y_train, batch_size=30, epochs=1, verbose=1, validation_data=(X_test,y_test)) model.predict(X_test[0:1]) test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
이런 식으로 층마다 규제를 추가해 가면서 과적합을 해결하고, 가장 좋은 결과를 내는 모델을 만들면 된다.
from http://chal.tistory.com/21 by ccl(A) rewrite - 2021-08-16 22:26:26