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

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

 

週末を利用してアテネに旅に行ってきました。この年齢で、このタイミングでアテネを訪れる事になるとは全く想像していませんでしたが、まつぼっくりちゃんのフットワークの良さ、そして、まつぼっくりちゃんのお友達の素敵なホスピタリティーに助けられ実現する事ができました。

到着初日に、

アテネのイケメン、アレクサンドロスのAirbnbに深夜の2時過ぎに到着した事も、

2日目に、

ハドリアヌス図書館遺跡の前で現地の物売りに「yo, man, what's up?」というノリで拳を突きつけられた事も、

古代アゴラに15時半ごろ到着したら、開門時間が15時までと知り、あははは、と笑った事も、

3日目に、

お昼ご飯を食べるためにタベルナを探していたら、2日目に声をかけてきたオジさんに全く同じ場所で、そして全く同じ文句で「タコ、イカ、オイシイよ〜」と勧誘された事も、

結局、古代アゴラには行けなかったんだけれども、「アゴラ」と名の付くカフェを見つけて「近代アゴラを見つけたぞー」とはしゃいだ事も、

最終日に、

まつぼっくりちゃんのお友達のお家にあるクマのぬいぐるみが、突然音を出して僕らをビックリさせた事も、

全て良き思い出となりました。

3泊4日と短い旅行ではありましたが、終始楽しく笑い、そして気持ち良く過ごす事が出来ました。感謝感激雨霰でございます。

f:id:KinnikuMegane:20181206052111j:plain

パルテノン神殿

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

本日は4章の続きでございます。

 

前回の記事では、f(x0, x1) = x0^2 + x1^2のグラフを描き、それを盆地と捉えて感覚的に勾配というものを理解しました。そして、盆地に投げ入れたボールが少しづつ速度を落とし、一番低い地点へ下がっていく事をニューラルネットワークが「学習」していく過程と捉え、最終的に盆地の一番低い地点へ到達したその瞬間を、ニューラルネットワークが「学習」フェーズを終えた瞬間だと理解しました。その時のボールの座標が、ニューラルネットワークが「学習」を終えた時点での最適な重みパラメーターである、と書きました。

 

本日は、勾配を求める、という事について書いていきます。ニューラルネットワークが学習をする対象の状態が、前回の記事でも示した以下のような簡単な盆地であるとは限りません。そして、そもそも学習する対象の全体像を最初から把握しておく事はできません。というのも、全体の状態を把握する事、より高度の低い位置を探す事が、ニューラルネットワークにおける「学習」でしたよね。

 

f:id:KinnikuMegane:20181124223347p:plain


それでは、勾配を求める、とはどういう事か、というと、ある地点におけるベクトルを求める事です。そして、ベクトルを求めると何が嬉しいか、と言うと、それはニューラルネットワークの「学習」フェーズを前に進めるためには、どちらの方向に重みパラメーターを動かせば良いかが分かるという事です。

本書では、勾配を求める方法として勾配法、特に「勾配降下法」について説明しています。

実際に「勾配降下法」を使ってみましょう。

先ずは、コードです。

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.gradient import numerical_gradient

def gradient_descent(f, init_x, lr=0.01, step_num=100):
      x = init_x

      for i in range(step_num):
           grad = numerical_gradient(f, x)
           x -= lr * grad
      return x

def function_2(x):
      return x[0]**2 + x[1]**2

init_x = np.array([-3.0, 4.0])
gradient_descent(function_2, init_x=init_x, lr=0.1, step_num=100)

出力結果は以下となります。

array([ -6.11110793e-10, 8.14814391e-10])

ポイントは、lr(learning rate)、という学習率を0.1と設定している事です。

今回は、学習率を0.1と設定した結果、最終的なoutputが、ほぼ、(0, 0)という想定していた座標となりましたが、この学習率が大きすぎても小さすぎてもニューラルネットワークは上手に学習できません。実際には、学習率を微調整しながら、ニューラルネットワークがうまく学習できるケースを探す、という事となります。

 

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