티스토리 뷰
하이퍼파라미터는 뉴런 수 (노드 수), 배치 크기, 학습률, 가중치 감소 등을 말합니다. 하이퍼파라미터의 값 또한 적절한 값을 사용해야 학습이 잘 됩니다.
하이퍼파라미터를 효율적으로 찾아봅시다.
1. 검증 데이터
검증 데이터를 이용해 하이퍼파라미터를 조정합니다. 검증 데이터는 훈련 데이터의 20% 정도를 이용하여 하이퍼파라미터를 조정합니다.
- 훈련 데이터 : 매개변수 학습
- 검증 데이터 : 하이퍼파라미터 성능 평가
- 시험 데이터 : 신경망 범용 능력 평가
2. 하이퍼파라미터 최적화
하이퍼파라미터를 대략적인 값으로 지정합니다. 그 다음 최적의 값을 찾고, 그 값의 범위 내에서 또 다시 최적의 값을 찾는 것을 반복하는 것입니다.
순서는 다음과 같습니다.
- 하이퍼파라미터 값의 범위를 설정한다.
- 설정된 범위 내에서 무작위로 고른다.
- 샘플링한 하이퍼파라미터를 이용해 학습하고, 검증 데이터로 정확도를 평가한다. (에폭은 작게 설정)
- 위 단계를 반복한다. (100회 가량) 그 뒤 하이퍼파라미터의 범위를 좁힌다.
- 축소된 범위를 이용해 위 과정을 반복한다.
책의 예시 코드
import sys, os
sys.path.append(os.pardir)
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net import MultiLayerNet
from common.util import shuffle_dataset
from common.trainer import Trainer
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)
x_train = x_train[:500]
t_train = t_train[:500]
validation_rate = 0.2
validation_num = int(x_train.shape[0] * validation_rate)
x_val = x_train[:validation_num]
t_val = t_train[:validation_num]
x_train = x_train[validation_num:]
t_train = t_train[validation_num:]
def __train(lr, weight_decay, epocs=50):
network = MultiLayerNet(input_size=784, hidden_size_list=[100,100,100,100,100,100],
output_size=10, weight_decay_lambda=weight_decay)
trainer = Trainer(network, x_train, t_train, x_val, t_val,
epochs=epocs, mini_batch_size=100, optimizer='sgd',
optimizer_param={'lr':lr}, verbose=False)
trainer.train()
return trainer.test_acc_list, trainer.train_acc_list
optimization_trial = 100
results_val = {}
results_train = {}
for _ in range(optimization_trial):
weight_decay = 10 ** np.random.uniform(-8,-4)
lr = 10 ** np.random.uniform(-6,-2)
val_acc_list, train_acc_list = __train(lr, weight_decay)
key = "lr:"+str(lr)+", weight_decay:"+str(weight_decay)
results_val[key] = val_acc_list
results_train[key] = train_acc_list
graph_draw_num = 20
col_num = 5
row_num = int(np.ceil(graph_draw_num / col_num))
idx = 0
for key, val_acc_list in sorted(results_val.items(), key=lambda x:x[1][-1], reverse=True):
plt.subplot(row_num, col_num, idx+1)
plt.title("Best-"+str(idx+1))
if idx % 5:
plt.yticks([])
plt.xticks([])
x = np.arange(len(val_acc_list))
plt.plot(x, val_acc_list)
plt.plot(x, results_train[key],"--")
idx += 1
if idx >= graph_draw_num:
break
plt.show()
'딥러닝' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 1권 후기 (0) | 2021.01.20 |
---|---|
합성곱 계층, 폴링 계층 (0) | 2021.01.18 |
오버피팅 방지 (0) | 2021.01.17 |
배치 정규화 (0) | 2021.01.17 |
가중치 설정 (0) | 2021.01.17 |
댓글