과대적합과 과소적합을 해결하는 딥러닝학습기술

 

 

 

1. 모델의 크기조절

- 가장 단순한 방법

- 모델의 크기를 줄인다는 것은 학습 파라미터의 수를 줄이는 것

- 당연히 학습속도도 같이 커지거나 작아짐

- 파라미터의 수가 클 수록 과적합에 더욱민감하잼

val_loss

 

model 의 경우 총 160,305개의 파라미터

model(small)의 경우 70,007개의 파라미터

model(big)의 경우 총 1,296,769개의 파라미터

 

2. 옵티마이저

 

- 확률적 경사하강법(SGD)

  전체를 한번에 계산하지않고 확률적으로 일부 샘플을 뽑아 조금씩 나누어 학습

  데이터의 수가 적어지기대문에 한 번 처리하는 속도는 빠름

  손실함수의 최솟값에 이르기 까지 다소 위아래로 요동

  단순하지만 문제에 따라 시간이 매우 오래걸림

 

- Momentum

  운동량을 의미, 관성을 의미

  이전의 속도를 유지하려는 성향

  SGD보다 방향이 적게 변함

from tensorflow.keras.optimizers import SGD

optimizer = SGD(learning_rate=0.001, momentum=0.9)
# 모멘텀안주면 일반적인거 씀

 

 

- Nesterov

  모멘텀의 방향으로 조금 앞선곳에서 그래디언트르르 구함

  시간이 지날수록 좀 더 빠르게 최솟값도달

optimizer = SGD(lr=0.001, momentum=0.9, nesterov=True)

 

 

- AdaGrad

  가장 가파른 경사를 따라 하강하는 방법

  학습률을 자동으로 변화시킴

  학습률이 너무 감소되어 전역최솟값에 도달하기 전에 학습이 빨리 종료되기도 하기댸문에 딥러닝에서 자제

from tensorflow.keras.optimizers import Adagrad
optimizer = Adagrad(learning_rate=0.01, epsilon=None, decay=0.0)

 

- RMSProp

  adagrad를 보완하기위해 등장

  합 대신 지수의 평균값을 활용

  학습이 잘안되면 학습률을 키우고 너무 크면 다시줄임

 

from tensorflow.keras.optimizers import RMSprop

optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)

 

- Adam

  모멘텀의 최적화와 RMSProp의 아이디어를 더한것

  지난 그래디언트의 지수 감소 평균을 따르고(Momentum), 지난 그레디언트 제곱의 지수 감소된 평균(RMSProp)을 따    름

  가장많이 사용되는 방법

 

from tensorflow.keras.optimizers import Adam

optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

 

 

- 최적화 optimizer 비교

3. 가중치 초기화

 

- 가중치 소실

  활성화함수가 선형일 때, 은닉층의 갯수가 늘어 날수록 가중치가 역전파되며 가중치 소실문제 발생

  * 0~1사이로 출력되면서 0또는 1에 가중치값이 편중됨 이는 미분값이 0에 가까워짐을 의미

  * relu 등장

- 가중치 초기화문제

  가중치의 값이 치우쳐지면 표현 가능한 신경망의 수가 적어짐

  따라서 활성화 값이 골고루 분포되는것이 중요

 

- Xavier (Glorot)

  은닉층의 노드 수가 n이면 표준편차가 1/sqrt(n) 인분포

  활성화함수가 선형인 경우 매우적합

 

- He

  표준편차가 sqrt(2/n) 인분포

  활성화함수가 비선형일떄 매우적합

 

Dense(1, kernel_initializer='he_normal')

Dense(1, kernel_initializer='glorot_normal')

 

 

4. 배치 정규화

 

- 모델에 들어가는 샘플들을 균일하게 만드는 방법

 

- 가중치의 활성화값이 적당히 퍼지게끔함

 

- 학습을 빠르게 진행시킴

 

- 일반화성능ㅇ을 늘림

 

- 과대적합방지

 

- 주로  Dense또는 Conv2D 이후, 활성화함수 이전에 놓임

 

from tensorflow.keras.layers import BatchNormalization, Dense, Activation
from tensorflow.keras.utils import plot_model

model = Sequential()

model.add(Dense(32, input_shape=(28*28,), kernel_initializer='he_normal'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.summary()

plot_model(model)

5. 규제 regularzation 

 

- 과대적합(Overfitting, 오버피팅)을 방지하는 방법 중 하나


- 과대적합은 가중치의 매개변수 값이 커서 발생하는 경우가 많음


- 이를 방지하기 위해 큰 가중치 값에 큰 규제를 가하는 것


- 규제란 가중치의 절댓값을 가능한 작게 만드는 것으로, 가중치의 모든 원소를 0에 가깝게 하여 모든 특성이 출력에 주    는 영향을 최소한으로 만드는 것(기울기를 작게 만드는 것)을 의미


- 복잡한 네트워크 일수록 네트워크의 복잡도에 제한을 두어 가중치가 작은 값을 가지도록 함


- 적절한 규제값을 찾는 것이 중요

 

- L2 규제: 가중치의 제곱에 비례하는 비용이 추가(흔히 가중치 감쇠라고도 불림)
  가중치의 제곱합 

  손실함수값에 일정값을 더함으로써 과적합을 방지 

  lambda값이 크면 규제가 커지고 반대는 작아진다

  더 로버스트한 모델을 생성하므로 l1보다 더 많이 사용

 

from tensorflow.keras.regularizers import l1, l2, l1_l2

l2_model = Sequential([Dense(16, kernel_regularizer=l2(0.001), activation='relu', input_shape=(10000,)),
                       Dense(16, kernel_regularizer=l2(0.001), activation='relu'),
                       Dense(1, activation='sigmoid')])


- L1 규제: 가중치의 절댓값에 비례하는 비용이 추가
  가중치의 절대값합

  l2규제와 달리 어떤 가중치는 0이되는데 이는 모델이 가벼워짐을 의미

l1_model = Sequential([Dense(16, kernel_regularizer=l1(0.00001), activation='relu', input_shape=(10000,)),
                       Dense(16, kernel_regularizer=l1(0.00001), activation='relu'),
                       Dense(1, activation='sigmoid')])

 

- l1 l2 동시사용

Dense(16, kernel_regularizer=l1_l2(l1=0.00001, l2=0.001), activation='relu', input_shape=(10000,))

 

 

6. Dropout 

 

- 신경망을 위해 사용되는 규제 기법 중 가장 효과적이고 널리 사용되는 방법

 

- 학습할 때 사용하는 노드의 수를 전체 노드 중에서 일부만을 사용

- 신경망의 레이어에 드롭아웃을 적용하면 훈련하는 동안 무작위로 층의 일부 특성(노드)를 제외

 

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

 

dropout_model = Sequential([Dense(16, activation='relu', input_shape=(10000,)),
                       Dropout(0.5),
                       Dense(16, activation='relu'),
                       Dropout(0.5),
                       Dense(1, activation='sigmoid')])

'TF' 카테고리의 다른 글

[TF] CNN 컨볼루션 신경망  (0) 2022.04.13
[TF] 모델의 저장, callbacks  (0) 2022.04.11
[TF] 모델 컴파일 및 학습 mnist  (0) 2022.04.11
[TF] Layer, Model, 모델구성  (0) 2022.04.11

+ Recent posts