ハイパーパラメータの自動最適化

ハイパーパラメータ

ニューロンの数や学習係数などをハイパーパラメータと言います。これらは幾通りもあり、なおかつ値によって結果がかなり異なることがあります。ハイパーパラメータをランダムに選び、実験することで自動で良い値を見つけます。

MNISTコード

max_lr = 0.0
max_ans = 0.0
for i in range(10):
    network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
    lr = 10**np.random.uniform(-6,2)    #範囲の中から自動で選ぶ
    optimizer = SGD(lr)       #最適化手法を選択
    for step in range(7001):
        #~訓練処理~#

    ans = network.accuracy(x_val, t_val)*100    #検証データで正解率を判定
    print("[",i,"] ", "lr:", lr, "acc:", ans, "%")
    if ans > max_ans:
        max_lr = lr
        max_ans = ans


print("lr:", max_lr, "acc:", max_ans, "%") #一番良かった学習率と正解率

XORコード

max_ans = 0.0
max_lr = 0.0
for i in range(100):
    lr = 10**np.random.uniform(-6,2) #lr=0.04
    mom = 10**np.random.uniform(-1,0) #mom=0.374
    optimizer = Momentum(lr, mom)       #最適化手法を選択
    ans = 0

    #検証データがないので、30回の何回成功率を測定
    for j in range(30): 
        network = TwoLayerNet(2, 2, 2)
        for step in range(701):
            #~訓練処理~#
        y = np.argmax(network.predict(x_train), axis=1)
        a = (y == ans_label)
        if a.all():
            ans += 1
    print("lr:", lr, "mom:", mom, "ans:", ans, "/ 30")
    #良い正解率なら更新
    if ans > max_ans:   
        max_lr = lr
        max_ans = ans

print("lr:", max_lr, "acc:", max_ans, "%")  #一番良かった学習率と正解率

結論

処理は重いので、ある程度範囲を絞っていきながら実行すれば、いい結果を見つけられる。