ゼロから作るDeep Learning(13日目)

こんにちは、筋肉めがねです。

本日2本目の記事でございます。

 

前回の記事ではBrexitについて、来週12月11日に大事な投票が実施されると書きました。この記事では、具体的に誰が何に対して投票するのか書いていきます。

Theresa May英国首相は、11月26日に欧州議会において、27ヵ国のEU首脳から、UKのEU離脱における協定案に対する承認を取り付けました。具体的に付議された協定案は以下の二つで、一つはUKのEU離脱における全体的な合意内容、そしてもう一つは離脱後のUKとEU間の関係を示すものです。

f:id:KinnikuMegane:20181210052550j:plain

 

1. 離脱における全体的な合意内容

https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/759019/25_November_Agreement_on_the_withdrawal_of_the_United_Kingdom_of_Great_Britain_and_Northern_Ireland_from_the_European_Union_and_the_European_Atomic_Energy_Community.pdf

例えば、UKがEUにどれだけ借金をしていて、どういう予定で返済していかなければならないか、とか、現在UKに住んでいるEUの人々はどうなるのか、とか、現在EUのUK外に住んでいるUKの人々はどうなるのか、という内容が書かれております。一つ例を挙げると、現在ドイツに住んでいるUKの人々の、ドイツにおける住民権、およびドイツにおけるSocial Security権利(医療など)は保証されておりますが、ドイツ外のEUにおける住民権、Social Securityについては、具体的に言及されておりません。またスペインの南に位置するUK領ジブラルタルについても、同案は言及しており、UKがEUを離脱する際には、ジブラルタルについても同様の条件が適用される、と書かれております。

 

2. 離脱後のUKとEU間の関係に関する宣言書

https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/759021/25_November_Political_Declaration_setting_out_the_framework_for_the_future_relationship_between_the_European_Union_and_the_United_Kingdom__.pdf

そこまで具体的な内容は書かれておりませんが、例えば関税については、これまで通り0としましょう、という内容が書かれております。

 

これら二つの案をTheresa Mayはイギリス下院に付議し、そして議員の過半数の賛成を得る事ができれば、晴れてwith dealでのBrexitへと一直線な訳でございますが、もしも否決された場合、その後21日以内に次のアクションを決める必要があるようです。それについては、次の記事で書きましょう。

 

それでは、「ゼロから作るDeep Learning」を進めていきましょう。

4章最後の記事ですね。

前回の記事では、2層のニューラルネットワークを一つのクラスとして実装し、そして、MNISTのデータセットを使用してニューラルネットワークに学習させました。

この記事では、前回学習をさせてニューラルネットワークが過学習を起こしていないか、検証して行きます。

 

過学習とは何なのか。お絵描きして理解してみましょう。

例えば、xy座標に幾つかのデータがあり、それらのデータを表す二次曲線を求めるという最適化問題があった場合、 外れ値の無いデータ群であれば、特に問題なくニューラルネットワークに学習させ、それらのデータを表す最適なモデルを作ってくれそうです。

f:id:KinnikuMegane:20181210053813p:plain

では、さらにデータの数が増え、そして外れ値が含まれるデータ群となり、そしてニューラルネットワークがその外れ値に対しても適合するモデルを作ってしまった場合、そのモデルは汎化なものではなくなってしまいますね。つまり、ニューラルネットワークが学習し過ぎた事により、不適切なモデルが出来上がってしまった、という訳です。

これが過学習ですね。

f:id:KinnikuMegane:20181210054003p:plain

では、前回の記事で学習させたニューラルネットワークが過学習を起こしていないか検証していきます。

 

2層ニューラルネットワークについては、前の記事で一つのクラスとして実装した通りです。という事で、ニューラルネットワークが過学習をしたのか、検証するためのコードを以下に書きます。

import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

(x_train, t_train), (x_test, t_test) = \
      load_mnist(normalize=True, one_hot_label=True)

train_loss_list = []
train_acc_list = []
test_acc_list = []
train_size = x_train.shape[0]
batch_size = 100

iter_per_epoch = max(train_size / batch_size, 1)

iters_num = 10000
learning_rate = 0.1

network = TwoLayerNet (input_size=784, hidden_size=50, output_size=10)

for i in range(iters_num):
     batch_mask = np.random.choice(train_size, batch_size)
     x_batch = x_train[batch_mask]
     t_batch = t_train[batch_mask]

     grad = network.numerical_gradient(x_batch, t_batch)

     for key in ('W1', 'b1', 'W2', 'b2'):
          network.params[key] -= learning_rate * grad[key]

     loss = network.loss(x_batch, t_batch)
     train_loss_list.append(loss)

     if i % iter_per_epoch == 0:
        train_acc = network.accuracy(x_train, t_train)
        test_acc = network.accuracy(x_test, t_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)
        print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))

結果、以下が出力されました。

train acc, test acc | 0.10868333333333334, 0.1153

今回は100個の訓練データ(本書では100個ごとに1epochと読んでいる)を検証し、つまり100個の画像データの認識を行い、それを各々のデータラベルと比較し、その検証結果をtrain_accとして出力しました。その結果、accuracyは0.10868であると。そして、訓練データではなくて、テストデータを用いて同様に検証してみると、検証結果は0.1153であると。検証結果がほぼほぼイコールである事が確認できました。

本来であれば、1epoch(100個のデータ)だけでなく、本書で示されている通り100epoch程度の検証結果を比較し、それらの検証結果をx軸epoch数、y軸、検証結果の認識精度でグラフ化すべきではありますが、いかんせん、僕のmacでは、計算に多大な時間を要するようです。

 

という事で4章まで終えました。全8章ある本書のようやく半分でございます。

次回は5章ですね。

 

それでは、本日は以上でございます。