ハイパーパラメータの自動最適化
ハイパーパラメータ
ニューロンの数や学習係数などをハイパーパラメータと言います。これらは幾通りもあり、なおかつ値によって結果がかなり異なることがあります。ハイパーパラメータをランダムに選び、実験することで自動で良い値を見つけます。
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, "%") #一番良かった学習率と正解率
結論
処理は重いので、ある程度範囲を絞っていきながら実行すれば、いい結果を見つけられる。