のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

最急降下法(機械学習のパラメータを求めるのに使います)

Sponsored Links

皆さんこんにちは
お元気ですか?私は元気です。

さて、本日は最急降下法について

最急降下法

関数(ポテンシャル面)の傾き(一階微分)のみから、関数の最小値を
探索する勾配法のアルゴリズムの一つ。勾配法としては最も単純であり、
直接・間接にこのアルゴリズムを使用している場合は多い。(by Wikipedia)

ふむ。端的にいうと、一階微分から関数の最小値を求める手法です。
どんな時に使うのかというと、その関数の値を最小化したい時に使います。

因みによく重みやバイアスを求める時のような機械学習の学習に利用されていますね。

最急降下法の例

以下の式の値yを最小化する時のxを求めなさい
{ \displaystyle
y = (x - 3)^2
}

このような問題を解くのに最急降下法は使われます。
いきなりですが求め方

{ \displaystyle
x(t+1) = x(t) - u * \frac{\partial y}{\partial x}
}
{ \displaystyle
x(t+1) = x(t) - u * (2x - 6)
}

x(t+1):次のxの値
u:学習率(反映度合い・学習係数)

yをxで微分し、変化分を学習率で掛けた値を引きます。
なぜ、ひくのかって?直感的な説明をすると下のようになります。
引くと、最小値に近づいていくわけですね。

f:id:tereka:20140624012631p:plain

さて、実際にやるとこんな感じになります。

#coding:utf-8
import numpy as np
import pylab as plt

"""微分"""
def grad(x):
	return 2 * x  - 6

""" (x-3)^2 の最急降下法"""
def minimumX():
	x = 5
	learning_rate = 0.01
	graph_plot(x)
	while(True):
		print x
		x_ = x - learning_rate * grad(x)
		if abs(x_ - x) < 0.00001:
			x = x_
			graph_plot(x)
			break
		x = x_
	return 

def graph_plot(point_x):
	x = np.arange(-1,7,0.01)
	y = (x - 3) ** 2
	plt.plot(x,y)
	plt.plot([point_x], [(point_x - 3) ** 2], 'ro')
	plt.show()

if __name__ == '__main__':
	minimumX()

はじめ
f:id:tereka:20140624013244p:plain

終わり
f:id:tereka:20140624013251p:plain

弱点

微分できない時には求められません。
局所解に陥ることがある。(最も低い値にならないことがある)