はじめに
こんにちは、swim-loverです。 Pythonで機械学習の一つである手書き数字認識を実装しています。Pythonを始めたばかりですが、「使いながら覚える」をコンセプトに勉強しています。 第14回は、勾配(gradient)のプロットについても使ってみました。今回も、参考図書にしたがって進めます。
参考図書
機械学習の参考書籍として、”斎藤康毅著 ゼロから作るDeep Learning オライリージャパン 2016年9月”を使用しました。
勾配法 gradient method
機械学習のパラメータは、重みとバイアスですが、これらの最適な値とは、損失関数が最小になるときです。Part(14)の最後で触れましたが、関数の値を最も減らす方向を示すのが勾配でした。
勾配法は、勾配方向に関数の値を少しずつ変化せて、関数の値を小さくする方法になります。
勾配法を数式で確認します。関数は、f(x0,x1)で2変数であるときに、以下のようになります。
ギリシャ文字η(イータ)は学習率と呼ばれます。この式は1回の更新の式なので、この学習では、ステップを何度も繰り返します。η=0.01や0.001から始めるとして、一通りの学習が終わったら、η=0.02や0.002などに更新して、また同じ学習を行い、結果を確認します。
勾配降下法 gradient descent method Python実装
7-12行目が、勾配降下法の実装です。以前実装した勾配関数 numerical_grad()をstep_num回数分繰り返しています。
35行目がメイン処理になります。学習率lr=0.1を指定しています。
import numpy as np
#f(x)=x0^2+x1^2
def func_2(x):
return x[0]**2+x[1]**2
def grad_descent(f,init_x,lr=0.01,step_num=100):
x=init_x
for i in range(step_num):
grad =numerical_grad(f,x)
x -=lr*grad
return x
def numerical_grad(f,x):
#h = 10e-50 # bad example, too small value
h = 1e-4 # good example
grad=np.zeros_like(x) #make zero data
for idx in range(x.size):
tmp = x[idx]
#calc f(x+h)
x[idx]=tmp + h #add h only x[idx]
fxh1 = f(x)
#calc f(x-h)
x[idx]=tmp - h #subs h only x[idx]
fxh2 = f(x)
#calc grad about ixd
grad[idx]=(fxh1-fxh2)/(2*h)
x[idx]=tmp #restore tmp
return grad
init_x = np.array([-3.0,4.0])
ans = grad_descent(func_2,init_x,lr=0.1,step_num=100)
print(ans)
python モジュール化
これまでColab環境でいくつかの関数を作ってきましたが、後々、関数の使いまわしができるようモジュール化しておきます。
common_func.ipynb というファイル名で次のような関数をまとめてみます。
#soft max
def softmax(x):
c=np.max(x)
exp_a=np.exp(x-c)
sum_exp_a=np.sum(exp_a)
y=exp_a/sum_exp_a
return y
#sigmoid
def sigmoid(x):
return 1/(1+np.exp(-x))
#meas squre err
def mean_squre_err(y,t):
return 0.5* np.sum((y-t)**2)
#cross entropy
def corss_entropy_err(y,t):
delta=1e-7
return -np.sum(t*np.log(y+delta))
次に、ipynb形式のファイルをpy形式のファイルに変換します。
Colabのメニューから、ファイル -> ダウンロード -> .pyをダウンロードを選択すると、自分のPCにcommon_func.py というPythonコードが出力されます。
出力されたcommon_func.pyをColab環境で呼び出すために、Goodle Driveへ配置します。
例では、MyDriver\machne以下に配置しています。
次にGoogle drivreをColab上にマウントします。
from google.colab import drive
drive.mount('/content/drive')
cd drivre/MyDrive/machine/
モジュールのインポートを行います。
試しに、corss_entropy_err()を読んで実行してみました。
import numpy as np
from common_func import softmax,corss_entropy_err
from common_func import numerial_grad
#sample data 1
t=[0,0,1,0,0,0,0,0,0,0] # number 2 is correct
y=[0.1,0.01,0.99,0.0,0.0,0.1,0.02,0.1,0.1,0.04]
ans = corss_entropy_err(np.array(y),np.array(t)) #0.010050234843405595
print(ans)
まとめ
今回、勾配降下法 gradient descent methodの実装と自前関数のモジュール化し、Colab環境へのインポートを行ってみました。
引き続き、ニューラルネットワークの学習について学んでいきたいと思います。
組み込み系ソフトエンジニアをしています。これまでフロントエンド技術は避けてきましたが、食わず嫌いをやめて、勉強を始めました。
趣味は、水泳、ロードバイク、ランニング、登山です。
組み込み系技術ネタ、勉強したフロントエンド技術、たまに趣味の運動について発信していきます。
どうぞよろしくお願いします。
コメント