ํค์๋
- ํ์ต๋ฅ
- ๊ฐ์ค์น ์ด๊ธฐํ
- ๊ณผ์ ํฉ ๋ฐฉ์ง(๊ฐ์ค์น ๊ฐ์, ๋๋กญ์์, ์ผ๋ฆฌ์คํํ)
ํ์ต๋ฅ ๊ฐ์/๊ณํ๋ฒ(Learning rate Decay/Scheduling)
ํ์ต๋ฅ (Learning rate) : ๋งค ๊ฐ์ค์น์ ๋ํด ๊ตฌํด์ง ๊ธฐ์ธ๊ธฐ ๊ฐ์ ์ผ๋ง๋ ์ ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ํ์ดํผํ๋ผ๋ฏธํฐ
์์์ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ด ํ์ต๋ฅ ์ ๊ฐ์ค์น๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ (๊ฒฝ์ฌํ๊ฐ๋ฒ)์์ ํด๋น ์ง์ ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ผ๋ง๋ ๋ฐ์ํ ์ง๋ฅผ ์ ํด์ฃผ๋ ํ๋ผ๋ฏธํฐ์ ๋๋ค.
- ํ์ต๋ฅ ์ด ๋๋ฌด ๋ฎ์ ๊ฒฝ์ฐ : ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ๋๋ด ์ต์ ์ ์ ๋๋ฌํ์ง ๋ชปํ๊ฒ ๋จ
- ํ์ต๋ฅ ์ด ๋๋ฌด ๋์ ๊ฒฝ์ฐ : ์ต์ ์ ์ ์ง๋์ณ ๋ฐ์ฐํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ ์กด์ฌ
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌ
ํ์ต๋ฅ ๊ฐ์(Learning rate Decay)
์ฌ๋ฌ ์ตํฐ๋ง์ด์ (Adagrad, RMSprop, Adam ๋ฑ)์ ์ด๋ฏธ ๊ตฌํ๋์ด ์์ด ์ฝ๊ฒ ์ ์ฉ ๊ฐ๋ฅ
ํด๋น ์ตํฐ๋ง์ด์ ์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํจ์ผ๋ก์จ ๊ฐ์ ์ ๋๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅ
์์
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001, beta_1 = 0.89) , loss='sparse_categorical_crossentropy' , metrics=['accuracy'])
- ํ์ต๋ฅ ๊ณํ๋ฒ(Learning rate Scheduling)
- ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ๋ฒ์ ํฐ learning rate์ ์ฃผ๊ณ (warm-up step) ์ฒ์ฒํ ๋ฎ์ถฐ๋๊ฐ๋ ๋ฐฉ๋ฒ
- ์์
first_decay_steps = 500
initial_learning_rate = 0.05
lr_decayed_fn = (
tf.keras.experimental.CosineDecayRestarts(
initial_learning_rate,
first_decay_steps))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_decayed_fn)
, loss='sparse_categorical_crossentropy'
, metrics=['accuracy'])
๊ฐ์ค์น ์ด๊ธฐํ(Weight Initialization)
- ์ด๊ธฐ ๊ฐ์ค์น๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
- ํ์คํธ์ฐจ๊ฐ 1์ธ ์ ๊ท๋ถํฌ๋ก ๊ฐ์ค์น๋ฅผ ์ด๊ธฐํํ ๊ฒฝ์ฐ
- ๋๋ถ๋ถ์ ํ์ฑํ ๊ฐ์ด 0 ๊ณผ 1์ ์น์ฐ์ณ์ ธ ์์
- ํ์คํธ์ฐจ๊ฐ 0.01์ธ ์ ๊ท๋ถํฌ๋ก ๊ฐ์ค์น๋ฅผ ์ด๊ธฐํํ ๊ฒฝ์ฐ
- ๋๋ถ๋ถ 0.5๋ก ํ์ฑํ ๊ฐ์ด ์น์ฐ์ณ์ง
- Xavier ์ด๊ธฐํ๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ(Glorot Xavier๊ฐ ๊ณ ์ํ ๋ฐฉ๋ฒ์ผ๋ก, glorot ์ด๊ธฐํ ๋ผ๊ณ ๋ ๋ถ๋ฆ)
- ํ์คํธ์ฐจ๊ฐ ๊ณ ์ ๊ฐ(ํน์ ์์)์ธ ์ ๊ท๋ถํฌ๋ก ์ด๊ธฐํ ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ์
- ์ด์ ์ธต์ ๋ ธ๋ ์๊ฐ n ๊ฐ์ผ ๋, ํ์ฌ ์ธต์ ๊ฐ์ค์น๋ฅผ ํ์คํธ์ฐจ๊ฐ 1 / root(n) ์ธ ์ ๊ท๋ถํฌ๋ก ์ด๊ธฐํ
- ๋จ, Keras์์๋ ์ด์ ์ธต์ ๋ ธ๋ ์๊ฐ n๊ฐ, ํ์ฌ ์ธต์ ๋ ธ๋ ์๊ฐ m๊ฐ์ผ ๋, ํ์ฌ ์ธต์ ๊ฐ์ค์น๋ฅผ ํ์คํธ์ฐจ๊ฐ 2 / root(n+m)์ธ ์ ๊ท๋ถํฌ๋ก ์ด๊ธฐํ
- ํ์ฑํ ํจ์๊ฐ Sigmoid์ธ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
tf.keras.initializers.GlorotNormal()
- He ์ด๊ธฐํ๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ(Kainig He๊ฐ ๊ณ ์ํ ๋ฐฉ๋ฒ์ผ๋ก, Kaiming ์ด๊ธฐํ ๋ผ๊ณ ๋ ๋ถ๋ฆ)
- ์ด์ ์ธต์ ๋ ธ๋ ์๊ฐ n ๊ฐ ์ผ ๋, ํ์ฌ ์ธต์ ๊ฐ์ค์น๋ฅผ ํ์คํธ์ฐจ๊ฐ root(2 / n)์ธ ์ ๊ท๋ถํฌ๋ก ์ด๊ธฐํ
- ReLUํจ์๋ฅผ ํ์ฑํ ํจ์๋ก ํ ๋, Xavier ์ด๊ธฐํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ์
- ReLU์ Xavier ์ด๊ธฐํ ์ฌ์ฉํ ๊ฒฝ์ฐ(์๋ ๊ทธ๋ฆผ) -> ์ ์ฐจ ๋ถํฌ๊ฐ ์น์ฐ์น๋ ๊ฒ์ ๋ณผ ์ ์๊ณ ์ด๋ ๊ณง ๊ธฐ์ธ๊ธฐ ์์ค๋ก ์ด์ด์ง๋๋ค.
- ReLU์ He ์ด๊ธฐํ ์ฌ์ฉํ ๊ฒฝ์ฐ
tf.keras.initializers.HeNormal()
- ํ์ฑํ ํจ์ = ์๊ทธ๋ชจ์ด๋, Xavier ์ด๊ธฐํ
- ํ์ฑํ ํจ์ = ๋ ๋ฃจ, He ์ด๊ธฐํ
๊ณผ์ ํฉ ๋ฐฉ์ง
- ์ธ๊ณต์ง๋ฅ ์์ ๋จธ์ ๋ฌ๋ ์์ ๋ฅ๋ฌ๋
- ์ฆ, ๋จธ์ ๋ฌ๋์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ฅ๋ฌ๋์๋ ๋์ผํ๊ฒ ์ ์ฉ ๊ฐ๋ฅ
- ๋ฅ๋ฌ๋์ ๋ ธ๋ ์๊ฐ ์กฐ๊ธ๋ง ์ฆ๊ฐํด๋ ํ๋ผ๋ฏธํฐ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ๋ชจ๋ธ์ด ๋ณต์กํด์ง
- ์ฆ, ๊ณผ์ ํฉ๋ ๊ฐ๋ฅ์ฑ์ด ๊ต์ฅํ ๋์
1. ๊ฐ์ค์น ๊ฐ์(Weight Decay)
- ๊ณผ์ ํฉ์ ์ฃผ๋ก ๊ฐ์ค์น ๊ฐ์ด ํด ๋ ๋ฐ์
- ๋ฐ๋ผ์ ๊ฐ์ค์น๊ฐ ๋๋ฌด ์ปค์ง์ง ์๋๋ก ์กฐ๊ฑด์ ๋ถ์ฌ(๋จธ์ ๋ฌ๋์์์ Ridge Regression์์ ํจ๋ํฐ ๋ถ์ฌํ๋ฏ)
- L1 Regularization(Lasso) : ์ ๋๊ฐ ํฉ
- L2 Regularization(Ridge) : ์ ๊ณฑ๊ฐ ํฉ
์ ์ฉ ์์)
Dense(64, kernel_regularizer=regularizers.l2(0.01), activity_regularizer=regularizers.l1(0.01))
- kernel_regularizer => ๊ฐ์ค์น์ ํจ๋ํฐ # ์ฃผ๋ก L2 ์ ์ฝ ์ฌ์ฉ
- activity_regularizer => ํ์ฑํ ํจ์์ ํจ๋ํฐ # ์ฃผ๋ก L1 ์ ์ฝ ์ฌ์ฉ
- bias_regularizer => ํธํฅ์ ํจ๋ํฐ
2. ๋๋กญ ์์(Drop Out)
- Iteration๋ง๋ค ๋ ์ด์ด ๋ ธ๋ ์ค ์ผ๋ถ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด์ ํ์ต์ ์งํํ๋ ๋ฐฉ๋ฒ
- ๋งค Iteration๋ง๋ค ๋ค๋ฅธ ๋ ธ๋๊ฐ ํ์ต๋๋ฉด์ ์ ์ฒด ๊ฐ์ค์น๊ฐ ๊ณผ์ ํฉ๋๋ ๊ฒ์ ๋ฐฉ์ง
์ ์ฉ ์์)
Dense(128,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01))
Dropout(0.5) # 128๊ฐ ์ค์ 64๊ฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋ค. dropout์ ํ ๋ ์ด์ด์ ์๋์ค์ ์์น, ๋ ์ด์ด ๊ดํธ๋ฅผ ๋ซ๊ณ ์ด๋ค๋ ์ ์ ์ ์
3. ์ผ๋ฆฌ ์คํํ(Early Stopping)
- Train set(ํ์ต ๋ฐ์ดํฐ)์ ๋ํ ์์ค์ ๊ณ์ ์ค์ด๋ค์ง๋ง, Validation set(๊ฒ์ฆ ๋ฐ์ดํฐ)์ ๋ํ ์์ค์ ์ฆ๊ฐํ ๋, ๋ฏธ๋ฆฌ ํ์ต์ ์ข ๋ฃํ๋ ๋ฐฉ๋ฒ
์ ์ฉ ์์)
# ํ๋ผ๋ฏธํฐ ์ ์ฅ ๊ฒฝ๋ก ๋ฐ ํ์ผ๋ช
์ ์ค์ ํ๋ ์ฝ๋์
๋๋ค.
checkpoint_filepath = "best.hdf5"
# ์ต์ ์ ๋ชจ๋ธ๋ก ๊ฐฑ์ ๋ ๋๋ง๋ค ์ ์ฅํ ์์น
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)
# val_loss๊ฐ ์ต์๊ฐ์ ๊ฐ๊ณ ์ด ํ 10๋ฒ๊น์ง ๋ ์ต์๊ฐ์ด ๊ฐฑ์ ๋์ง ์์ผ๋ฉด ๋ฉ์ถ๋ค.
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)
model.fit(X_train, y_train, batch_size=32, epochs=30, verbose=1,
validation_data=(X_test,y_test),
callbacks=[early_stop, save_best])
!ls # ์ง์ ๋ ๊ฒฝ๋ก์ ์กฐ๊ธฐ์ข
๋ฃ๋ ๋ชจ๋ธ์ด ์๋์ง ํ์ธ
model.load_weights(checkpoint_filepath) # ์กฐ๊ธฐ์ข
๋ฃํ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ๋ถ๋ฌ์ค๊ธฐ
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]75. ์ ๊ฒฝ๋ง ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.03.01 |
---|---|
[TIL]74. ์ ๊ฒฝ๋ง - Hyper parameter (0) | 2022.02.25 |
[TIL]72. ์ ๊ฒฝ๋ง ํ์ต (0) | 2022.02.23 |
[TIL]71. ์ธ๊ณต ์ ๊ฒฝ๋ง (0) | 2022.02.22 |
[TIL]70.ํผ์ ํธ๋ก (0) | 2022.02.22 |