重みの初期値
重みの初期値についてアウトプット。
学習の精度がいまいち上がらない時がある。
よく言われるのは、レイヤーの追加や学習データの増量、
パラメータの変更など方法はさまざま。
結構見落とされがちであるものの、
重みの初期値も結構大切かもしんない。
直結で行くと、過学習のところで出てくる。
重みの初期値をちゃんと適正に設定していなければ、過学習(オーバーフィッティング)になっちゃう。
その重みを適正な値に初期設定する方法としてWeight decayという手法がある。
簡単に言えば、重みの値を小さくするってこと。
じゃぁ、小さくするなら0でいいんでないっすか?
→結論、NG。0が悪いわけではないが、同じ値で2層目以降を更新していくから、うまく学習が
行えなくなってしまう。
つまり、ランダムな値での重みづけが必要。
隠れ層のアクティベーション
隠れ層の活性感薄の後の出力データの分布をみることで結構勉強になるという。
# coding: utf-8 import os import sys sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from common.util import smooth_curve from common.multi_layer_net import MultiLayerNet from common.optimizer import SGD # 0:MNISTデータの読み込み========== (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True) train_size = x_train.shape[0] batch_size = 128 max_iterations = 2000 # 1:実験の設定========== weight_init_types = {'std=0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'} optimizer = SGD(lr=0.01) networks = {} train_loss = {} for key, weight_type in weight_init_types.items(): networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100], output_size=10, weight_init_std=weight_type) train_loss[key] = [] # 2:訓練の開始========== for i in range(max_iterations): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] for key in weight_init_types.keys(): grads = networks[key].gradient(x_batch, t_batch) optimizer.update(networks[key].params, grads) loss = networks[key].loss(x_batch, t_batch) train_loss[key].append(loss) if i % 100 == 0: print("===========" + "iteration:" + str(i) + "===========") for key in weight_init_types.keys(): loss = networks[key].loss(x_batch, t_batch) print(key + ":" + str(loss)) # 3.グラフの描画========== markers = {'std=0.01': 'o', 'Xavier': 's', 'He': 'D'} x = np.arange(max_iterations) for key in weight_init_types.keys(): plt.plot(x, smooth_curve(train_loss[key]), marker=markers[key], markevery=100, label=key) plt.xlabel("iterations") plt.ylabel("loss") plt.ylim(0, 2.5) plt.legend() plt.show()
確かに、重みの初期値によって学習の進みも早くなっていることを確認…
全然違うな…
一回既に構築しているモデルのコードを書き直してみますwww