[AI Bootcamp] N413: NN Training Options

[AI Bootcamp] N413: NN Training Options

✔️ 모델 아키텍쳐를 선택하는 방법

✔️ 가중치의 규제(Regularization)전략

✔️ 다양한 활성함수를 사용하는 과정에서 발생하는 trade-off

학습 규제 전략 (Regularization Strategies)

Overfitting 극복을 위한 노력

Neural Networks는 매개변수가 아주 많은 모델이어서 데이터에 쉽게 과적합될 수 있다. 이 문제를 해결하기 위해 가중치 규제 전략을 택한다.

일반적인 규제방법

1. 항상 Early Stopping을 사용한다. 이 전략은 가중치가 최고 유용한 시점을 지나 업데이트 되는 것을 막는다.

2. 가중치 감소(Weight Decay)

가중치 자체, 즉 parameter 크기 자체에 error를 씌움. parameter가 커지면 error도 커지니 파라미터가 커지지 않게끔 잡아주는 역할.

- 가중치를 제거하거나 값을 규제하여 매개변수를 과도하게 적합시키는 것을 방지한다.

- Dropout 사용

3. Weight Constraint

신경망의 각 레이어 노드에서 일부 노드를 사용하지 않고 학습을 진행하는 방법이다. 노드 간의 연결(가중치) 자체를 사용하지 않도록 만들면서 하나의 모델을 여러가지 방법으로 학습하게 하여 overfitting을 방지하는 방법이다.

# 모델 학습을 위한 코드 # 변수 설정을 따로 하는 방법을 적용하기 위한 코드입니다. batch_size = 30 epochs_max = 1 # 학습시킨 데이터를 저장시키기 위한 코드입니다. checkpoint_filepath = "FMbest.hdf5" # overfitting을 방지하기 위해서 학습 중 early stop을 수행하기 위한 코드입니다. early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1) # Validation Set을 기준으로 가장 최적의 모델을 찾기 위한 코드입니다. 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])

Keras에서 규제방법을 구현하기

Weight Decay

L1 L2

Loss^2 + weight들의 집합(절댓값)

Loss^ + weight들의 집합(제곱)

# Weight Decay를 전체적으로 반영한 예시 코드 from tensorflow.keras.constraints import MaxNorm 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))

Constraints

물리적으로 Weight의 크기를 제한하는 방법. Weight에 Max값을 설정해서 특정 값보다 더 큰 경우 설정된 임의의 max값으로 변경해버린다.

# 모델 구성을 확인합니다. 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))

Dropout

Dropout은 모델 자체에 Layer를 추가하는 방식으로 진행된다. 이는 확률적으로 몇 개의 노드 연결을 임시적으로 끊어서 그 노드들의 연결이 없이 결과를 예측하도록 하는 역할을 한다. 일부 뉴런이 없이 학습을 진행하기 때문에 과적합을 어느 정도 차단할 수 있다.

from tensorflow.keras.layers import Dropout from tensorflow.keras.constraints import MaxNorm from tensorflow.keras import regularizers # 모델 구성을 확인합니다. 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))

Learning rate Decay

학습량을 점점 줄어들게 하면서 학습

Learning rate Scheduler

lr_schedule = keras.optimizers.schedules.ExponentialDecay( initial_learning_rate=1e-2, decay_steps=10000, decay_rate=0.9) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_schedule) , 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))

def decayed_learning_rate(step): step = min(step, decay_steps) cosine_decay = 0.5 * (1 + cos(pi * step / decay_steps)) decayed = (1 - alpha) * cosine_decay + alpha return initial_learning_rate * decayed first_decay_steps = 1000 initial_learning_rate = 0.01 lr_decayed_fn = ( tf.keras.experimental.CosineDecayRestarts( initial_learning_rate, first_decay_steps)) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_schedule) , 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))

코사인러닝레이트: 0~1사이 왔다갔다

+ Activation Functions

Tanh Functions

만약 sigmoid 함수가 0에서 멀어질 때 바로 그렇게 평평해지지 않고 중간에 조금 더 뾰족해진다면? 그것은 기본적으로 Tanh 기능이다. Tanh 함수는 실제로 y 치수에서 sigmoid 함수를 2로 스케일링하고 모든 값에서 1을 빼면 생성될 수 있다. 기본적으로 sigmoid와 동일한 성질을 가지며, 여전히 우리가 0에서 멀어질수록 평평한 구배 감소에 어려움을 겪고 있지만, 그 파생상품은 0 주위에 더 높아져 가중치가 극단으로 조금 더 빠르게 이동한다.

Leaky ReLU

Softmax Function

from http://bhymi.tistory.com/34 by ccl(A) rewrite - 2021-08-11 14:59:54