#誤差の最適化と勾配法
機械学習や深層学習では、一般に予測の誤差を最小化・最適化することを学習と言います。
前回までのステップで、データフローグラフの基本を学んだところで、このチュートリアルでは「最適化」という概念について勉強して行きたいと思います。
最適化とは、与えられた関数の出力を「最小化」するパラメータを見つけることです。
Tensorflowでは、「勾配法」という手法により、誤差関数を最小化する便利な機能があります。
1.勾配法(最急降下法)
別名、最急降下法と呼ばれる関数の2次元空間を、降下していくメソッドです。
その基本的な段階は、
1.パラメータを適当な値で初期化する
2.与えられたパラメータでの関数の傾き(勾配)を計算する
3.最も傾きの大きい(急な)方向に、パラメータを少しずつずらしていく
4.2〜3を繰り返す
<最急降下法による2次関数の最小化>
import tensorflow as tf
# パラメータは変数として定義
x = tf.Variable(0., name='x')
# パラメータを使って最小化したい関数を定義
func = (x - 1)**2
# learning_rate は一度にずらす大きさを決める
optimizer = tf.train.GradientDescentOptimizer(
learning_rate=0.1
)
# train_step が x を少しずらす操作を表す
train_step = optimizer.minimize(func)
# train_step を繰り返し実行する
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(20):
sess.run(train_step)
print('x = ', sess.run(x))
x = 0.98847073
x = 1の時に、この関数は、0になり最小の値になりますが、20回程度の反復で、
x = 0.98847073
を示していますね。
#2.勾配法の機械学習への適用
さてこの勾配法を機械学習にはどのように適用するのでしょうか?
簡単な例で、みて行きましょう。ここでは、Boston house-prices というデータセットを使って、
住宅価格を判定する機械学習モデルを作ってみましょう。
##2.1 データセットの準備
Tensorflowの上位言語のKerasには、このデータセットを割と簡単に取り込むことができる機能があるので、Kerasを導入してみましょう。
pip install keras
これを例のAnacondaのaistudio仮想環境のターミナルから実行しましょう。
。。 ターミナルではなくて、jupyter notebookからでも出来ます。が、
!pip install keras
頭に!(ダッシュ)を付けます。
x_trainだけ、出力してみましょう。なにがしかのデータがロードされたようです。
でもこれでは分からないので、ヒストグラムにして表示しましょう。
# matplotlibのグラフをインラインで表示する
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['IPAexGothic']
plt.rcParams['font.size'] = 10*3
plt.rcParams['figure.figsize'] = [18, 12]
plt.hist(y_train, bins=20)
plt.xlabel('住宅価格($1,000単位)')
plt.ylabel('データ数')
plt.show()
plt.plot(x_train[:, 5], y_train, 'o')
plt.xlabel('部屋数')
plt.ylabel('住宅価格($1,000単位)')
こんな分布をしているみたいですね。