ねころこの備忘録

僕の開発の手順とか実験結果とか感想とかをつらつら書き込んでいくお墓.僕の魂を成仏させるためのお墓です.お経(いいね・ブクマ・コメント)待ってます

TensorFlow-勾配法でもはや機械学習(1)-

どうも皆さんこんにちは.今日はもはや機械学習です.大事なことなので二回言います機械学習です.

今回から,matplotlibというものを使っていきます.あとnumpyとkeras.もし,入っていない場合は,コマンドラインで

pip install matplotlib
pip install numpy
pip install keras

をすればインストールできるので,よろしくお願いします.

TensorFlow使ったことない人は,
www.nekorokomemordm.info

そもそも導入していない人は,
www.nekorokomemordm.info

以上,よろしくお願いします.

勾配法って?

ググれ.
冗談です.

そもそも機械学習って?

機械学習とは,予測するためのパラメータの調整をすることが目的なんですよね.
イメージとしては,スーパーの駐車場に自転車が100台あるよりも,車が100台あるほうが店内には人が多そうじゃないですか.
これは,自転車だとおひとり様が多くて,車だと,ひとり以上乗れますから,自然とバイアスがかかるんですよね.
f:id:ryuga13tk:20190121223228p:plain
この場合だと,自転車の台数≒人数と考えられますが,車だと,乗っている人数を実数kとすると,k×車の台数≒人数っていう風に推定できるからです.

今回の場合,自転車には原則ひとりで乗ってもらって,,,自動車に乗っている人は1~5人としましょう.そうすると,自転車の数をa,自動車の数をbとして,実際に店内にいる人をyとして,車に乗っている人を実数k人と表現とすると,その関係は,
a + bk = y
となります.
これはただの1次関数ですが,このkを予測するのに,機械学習を使います.実際はもっと複雑なモデルに使いますが,イメージのための簡略化です(あんまりにも分かりにくいと判断したらそのうちかえます).

んで勾配法って?

じゃあ勾配法っていうのは何かっていう説明をするのに,実は1次関数じゃ無理なので2次関数(x-1)^2で考えていきます.
勾配法とは,その関数において,最小もしくは最大となるxを探すためのアルゴリズムになっています.
(x-1)^2について,TensorFlowで書いていきます.

%matplotlib inline
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

x = tf.Variable(2., name = 'x')
func = ((x - 1) ** 2)

#以下4行グラフの描写のためのデータ.勾配法には無関係.
train_x = []
y = []
func_x = np.linspace(-0, 1.2, 200)
func_y = (func_x - 1) ** 2

# 勾配法のパラメータ更新担当.learning_rateの大きさで更新値が変わる.
optimizer = tf.train.GradientDescentOptimizer(
    learning_rate = 0.1
)

# パラメータを実際にずらしていく担当.sess.run(train_step)で実際にずらす
train_step = optimizer.minimize(func)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    
    for i in range(50):
        #更新.
        sess.run(train_step)
        #実行ごとに,更新された値を取得.
        train_x.append(sess.run(x))
        #更新したときのyの値を取得.
        y.append((train_x[i] - 1) ** 2)
    
    print(train_x)
    #更新の様子を描画.
    plt.scatter(train_x, y)
    #最小値を推定するグラフの描画.
    plt.plot(func_x, func_y)
    plt.show() 

ちなみにこれの実行結果は,
f:id:ryuga13tk:20190121225601p:plain
という感じ.
見事最小値を見つけ出しています.
ちなみに勾配法は実装しません,TensorFlowが用意してくれてるので.素晴らしい.

x = tf.Variable(2., name = 'x')

これに関しては,「2.」となっているのは,勾配法は初期値を決めてそこから最小値を推定するアルゴリズムなので,初期値が必要.
今回の場合はパッと見ただけで,最小値がわかるのでありがたみを感じないが,これが例えば,x^5 + 4x^2 + 1とかだと勾配法が強い.ただし,初期値を間違えると無限大に大きく(小さく)なる可能性がある...

勾配法のアルゴリズム

ここで,勾配法のアルゴリズムをちょろっと紹介.
勾配法(今回使用したのは最急降下法)は,最適化手法です.ニュートン法と似てる.

プログラム中の登場したlearning_rateをαと定義.初期値を推定する関数をf(x),初期値をx_0,更新後の値をxと置くと,更新後のxは,
x = x_0 - α*f'(x_0) (ちなみにニュートン法だとx = x_0 - f'(x_0))
と,なる.
なので,f'(x) = 0となる地点に近づくほど,更新値(α*f'(x))が小さくなって行くのがわかる.
つまり,傾きが大きい時ほど大きく更新して,小さくなると,少しずつ更新する.しかもこれを学習計数αである程度いじれるという.

部屋の価格が機械学習で予測される.

Kerasのデータセットに,犯罪率とか部屋の数とかもろもろのデータと住宅価格があるけれど,これ以上は長くなるので,今回はここまでにします.
機械学習は次回からです.
機械学習で住宅価格を推定するモデルの学習ですが,更新したら下にリンク貼ります.