njs03332 / ml_study

3 stars 0 forks source link

2023/01/25 ~ 2023/02/02 #56

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
스크린샷 2023-01-25 오후 10 35 03
givitallugot commented 1 year ago

11.3.5 Adam과 Nadam 최적화

Adam

optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)

AdaMax

Nadam

지금까지 논의한 모든 최적화 기법은 1차 편미분(Jacobian)에만 의존, 최적화 이론에는 2차 편미분(Hessian)을 기반으로 뛰어난 알고리즘도 존재하나 심층 신경망 적용이 어려움, 하나의 출력마다 n개의 1차 편미분이 아니라 n 제곱개의 2차 편미분을 계산해야 하기 때문

희소 모델 훈련

njs03332 commented 1 year ago

11.3.6 학습률 스케줄링

optimizer = keras.optimizers.SGD(lr=0.01, decay=1e-4)
def exponential_decay(lr0, s):
    def exponential_decay_fn(epoch):
        return lr0 * 0.1 ** (epoch / s)
    return exponential_decay_fn

exponential_decay_fn = exponential_decay(lr0=0.01, s=20)

# LearningRateScheduler는 에포크를 시작할 때마다 옵티마이저의 learning_rate 속성을 업데이트함
lr_scheduler keras.callbackes.LearningRateScheduler(exponential_decay_fn)
history = model.fit(X_train_scaled, y_train, [...], callbacks=[lr_scheduler])
def exponential_decay_fn(epoch, lr):
    return lr * 0.1**(1 / 20)
danbi5228 commented 1 year ago

11.4 규제를 사용해 과대적합 피하기

11.4.1 L1과 L2 규제

규제 강도 0.01을 사용하여 L2 규제를 적용하는 방법

layer = keras.layers.Dense(100, activation="elu", kernel_initializer="he_normal", kernel_regularizer=keras.regularizer.l2(0.01))

L1과 L2가 모두 필요하면 keras.regularizers.l1_l2() 사용. l1(), l2(), l1_l2() 모두 기본값은 0.01

일반적으로 네트워크의 모든 은닉층에 동일한 활성화 함수/초기화 전략/규제 를 적용하므로

높은 가독성을 위해 functools.partial() 함수를 이용할 수 있음

from functools import partial RegularizedDense = partial(keras.layers.Dense, activation="elu", kernel_initializer="he_normal", kernel_regularizer=keras.regularizer.l2(0.01))

model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), RegularizedDense(300), RegularizedDense(100), RegularizedDense(10, activation="softmax", kernel_intializer="glorot_uniform") ])



### 11.4.2 드롭아웃
- 매 훈련 스텝에서 각 뉴런(입력 뉴런 포함. 출력 뉴런은 제외)은 임시적으로 드롭아웃될 확률 p를 가짐
  - 이번 훈련 스텝에는 완전히 무시되지만 다음 스텝에서는 활성화될 수 있음

![image](https://user-images.githubusercontent.com/26505830/216330148-f63e1530-4e7f-4355-b436-4eb502cd8977.png)

- 하이퍼파라미터 p를 드롭아웃 비율이라고 하고 보통 10%-50% 사이 지정
  - 순환 신경망에서는 20%-30%에 가까움
  - 합성곱 신경망에서는 40%-50%에 가까움
  - 훈련이 끝난 후에는 뉴런에 더는 드롭아웃을 적용하지 않음
- 드롭아웃으로 훈련된 뉴런은 이웃한 뉴런에 맞추어 적응될 수 없으므로 가능한 한 자기 자신이 유용해져야 함
  - 그래서 입력값의 작은 변화에 덜 민감해지고, 더 안정적인 네트워크가 되어 일반화 성능이 좋아짐
- TIP) 일반적으로 출력층을 제외한 맨 위의 층부터 세 번째 층까지 있는 뉴런에만 드롭아웃을 적용함
- p=50%로 하면 테스트하는 동안에는 하나의 뉴런이 훈련 때보다 평균적으로 두 배 많은 입력 뉴런과 연결됨
  - 훈련이 끝난 후 각 입력의 연결 가중치에 보존 확률(1-p)를 곱하거나
  - 훈련하는 동안 각 뉴런의 출력을 보존 확률로 나눌 수도 있음 (위의 방법과 동일하진 않지만 잘 동작함)
- 케라스에서는 `keras.layers.Dropout` 층을 사용하여 드롭아웃을 구현
- 주의) 드롭아웃은 훈련하는 동안에만 활성화되므로 훈련 손실과 검증 손실을 비교하면 안됨
비슷한 손실이더라도 훈련 세트에 과대적합될 수 있으므로 훈련이 끝난 후 드롭아웃을 빼고 훈련 손실을 평가해야함
- 모델이 과대적합되었다면 드롭아웃 비율을 늘리고, 반대로 과소적합되면 드롭아웃 비율을 낮춰야 함
- 층이 클 때는 드롭아웃 비율을 늘리고 작으 ㄴ층에는 드롭아웃 비율을 낮추는 것이 도움이 됨
  - 많은 최신 신경망 구조는 마지막 은닉층 뒤에만 드롭아웃을 사용함
- 드롭아웃은 수렴을 상당히 느리게 만드는 경향이 있지만 적절히 튜닝하면 훨씬 좋은 모델을 만들 수 있음
- TIP) 자기 정규화하는 네트워크를 규제하고 싶다면 알파 드롭아웃을 사용해야 함. 일반 드롭아웃은 자기 정규화하는 기능을 망가뜨릴 수 있음