티스토리 뷰

딥러닝

적절한 하이퍼파라미터 찾기

4567은 소수 2021. 1. 17. 04:41

하이퍼파라미터는 뉴런 수 (노드 수), 배치 크기, 학습률, 가중치 감소 등을 말합니다. 하이퍼파라미터의 값 또한 적절한 값을 사용해야 학습이 잘 됩니다. 

하이퍼파라미터를 효율적으로 찾아봅시다.

 

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함