ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

重みの初期値

重みの初期値についてアウトプット。

学習の精度がいまいち上がらない時がある。

よく言われるのは、レイヤーの追加や学習データの増量、
パラメータの変更など方法はさまざま。

結構見落とされがちであるものの、
重みの初期値も結構大切かもしんない。

直結で行くと、過学習のところで出てくる。
重みの初期値をちゃんと適正に設定していなければ、過学習(オーバーフィッティング)になっちゃう。
その重みを適正な値に初期設定する方法として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()

f:id:kawam0t0:20191221152559p:plain

確かに、重みの初期値によって学習の進みも早くなっていることを確認…

全然違うな…

一回既に構築しているモデルのコードを書き直してみますwww