勾配降下 - []機械学習機械ポータル05を学びます

1.はじめに勾配降下

1.1勾配

多機能差動結石では、我々は持っていると接触グラデーション(グラデーション)の概念を。

振り返ってみると、勾配は何ですか?

ある勾配意図ベクトル(ベクトル)点で関数を表す指向誘導体、この方向に沿って最大値を取得する関数、すなわちその時点で、方向(この勾配の方向)が最も速い変化の変化を(勾配モード)最大レート。

これは、Baiduの百科事典によって与えられた説明です。

実際には、勾配の定義は、ポリオール組成物ベクトルの偏導関数の関数です。バイナリ関数で  F(x、y)の 一例として。fはX F、表し  fは  、X、Y数の部分的誘導体。次いで、  F勾配グラで(x、y)は、F =(  F X、F(X、Y)、Y(X、Y)

だから、勾配、および機械の概念は、それは問題ではない何を学びますか?

これは、損失関数、最も急成長している方向の、その勾配方向を向いエラー、エラーのポイントサイズの増加率のために、理解されるであろう。したがって、最小の損失、すなわちA勾配0の検索(または0に近い)点のポイントを見つけることができます。これは、機械学習のための勾配の概念の意味です。今説明したアイデアは、勾配降下法のプロトタイプです。

勾配降下1.2

勾配降下法は、実際には反復アルゴリズムです。すなわち、任意の点から出発して、各移動は、傾斜まで傾斜方向に微小距離、最大は0に等しいです。

線形システムを解く同様の反復法は、任意のベクターから出発し、反復式を使用しては、2個の十分に近いの反復が得られるまで繰り返します。

単変量の例では、反復勾配降下法であるが、実際には、θから、図1に示す二次関数、0は、プロセスの最下点付近に始まりました。

 

 

 以下の線形回帰は、例えば、勾配降下法を説明します。

           

 

 

            

 

 

 (上記をとるhttps://blog.csdn.net/neuf_soleil/article/details/82285497

また、以下のいくつかのボーエンも考慮に値します。

https://www.jianshu.com/p/424b7b70df7b

https://blog.csdn.net/walilk/article/details/50978864

https://blog.csdn.net/pengchengliu/article/details/80932232

これはよく知られているほとんどQ

https://www.zhihu.com/question/305638940

2.達成勾配降下

私たちの共通語、コードの実装の勾配降下法で直接、または見て、複雑な数学的導出を持ちます。

2.1 Pythonの誘導体操作

2つの一般的なPythonの導出方法は、Sympyデフライブラリに別の方法を派生する方法scipyのダウンロードライブラリを使用することであります。

1. scipyのダウンロード

scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)[source]

n番目の点aの関数の導関数を検索します。即ち、所与の機能、DXはX0で使用ピッチのn番目の導関数を計算する差分式を中心。

パラメータ:

FUNC:要求機能ガイド、書き込み専用パラメータ名が、書き込みではない括弧は、それ以外の場合はエラーになります

X0:要件そのポイントガイド、float型

DX(オプション):間隔が少ない、float型であるべきです

n個(オプション):nは次微分。デフォルト値は1、int型であります

引数(オプション):パラメータタプル

順序(オプション):ポイントの奇数は、int型を使用しなければなりません

  def f(x):          return x**3 + x**2  derivative(f, 1.0, dx=1e-6)

2. Sympy発現導出

sympy是符号化运算库,能够实现表达式的求导。所谓符号化,是将数学公式以直观符号的形式输出。下面看几个例子就明白了。

from sympy import *
# 符号化变量x = sy.Symbol('x')
func = 1/(1+x**2)
print("x:", type(x))print(func)print(diff(func, x))print(diff(func, x).subs(x, 3))print(diff(func, x).subs(x, 3).evalf())
具体可参考:https://www.cnblogs.com/zyg123/

2.2 梯度下降法的实现

首先我们需要定义一个点  作为初始值,正常应该是随机的点,但是这里先直接定为0。然后需要定义学习率 ,也就是每次下降的步长。这样的话,点  每次沿着梯度的反方向移动 距离,即 ,然后循环这一下降过程。

那么还有一个问题:如何结束循环呢?梯度下降的目的是找到一个点,使得损失函数值最小,因为梯度是不断下降的,所以新的点对应的损失函数值在不断减小,但是差值会越来越小,因此我们可以设定一个非常小的数作为阈值,如果说损失函数的差值减小到比阈值还小,我们就认为已经找到了。

 

 

 

 1 def gradient_descent(initial_theta, eta, epsilon=1e-6):
 2     theta = initial_theta
 3     theta_history.append(theta)
 4     while True:
 5         # 每一轮循环后,要求当前这个点的梯度是多少
 6         gradient = dLF(theta)
 7         last_theta = theta
 8         # 移动点,沿梯度的反方向移动步长eta
 9         theta = theta - eta * gradient
10         theta_history.append(theta)
11         # 判断theta是否达到损失函数最小值的位置
12         if(abs(lossFunction(theta) - lossFunction(last_theta)) < epsilon):
13             break
14 
15 def plot_theta_history():
16     plt.plot(plot_x,plot_y)
17     plt.plot(np.array(theta_history), lossFunction(np.array(theta_history)), color='red', marker='o')
18     plt.show()

 

以上就是梯度下降法的Python实现

 

首先,给出线性回归的模型
h_\theta(x) = \theta_0 + \theta_1xθ (x)=θ 0 +θ 1 x
假设我们用来拟合的数据共有 mm 组,根据最小二乘法,我们实际要找出令
\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2i=1m (h θ (x (i) )−y (i) ) 2 
最小的 \thetaθ 值,其中上标 (i)(i) 代表是第几组数据。设关于 \thetaθ 的损失函数
J(\theta) = \frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2J(θ)= 21  i=1m (h θ (x (i) )−y (i) ) 2 
\thetaθ 可以看做是一个参数向量,即 \{\theta_0, \theta_1\}^T{θ 0 ,θ 1 } T 。式子的前面乘上系数,是为了方便计算。
根据前面梯度的概念,我们得到
\nabla J(\theta) = (\frac{\partial J(\theta)}{\partial \theta_0},\frac{\partial J(\theta)}{\partial \theta_1})∇J(θ)=( ∂θ 0 ∂J(θ) , ∂θ 1 ∂J(θ) )
也就是说,为了使损失函数达到局部最小值,我们只需要沿着这个向量的反方向进行迭代即可。
那么参数的值到底该一次变化多少呢?我们通常用 \alphaα 来表示这个大小,称为**“步长”**,它的值是需要我们手动设定的,显然,步长太小,会拖慢迭代的执行速度,而步长太大,则有可能在下降时走弯路或者不小心跳过了最优解。所以,我们应该根据实际的情况,合理地设置 \alphaα 的值。
于是,在每次迭代,中,我们令
\theta_0 = \theta_0 - \alpha\frac{\partial J(\theta)}{\partial \theta_0},\theta_1 = \theta_1 - \alpha\frac{\partial J(\theta)}{\partial \theta_1}θ 0 =θ 0 −α ∂θ 0 ∂J(θ) ,θ 1 =θ 1 −α ∂θ 1 ∂J(θ) 
即可使损失函数最终收敛到局部最小值,我们也得到了我们想要的参数值。这个过程如下图
————————————————版权声明:本文为CSDN博主「Evan-Nightly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/neuf_soleil/article/details/82285497

おすすめ

転載: www.cnblogs.com/DrChuan/p/11976028.html