最近非常热门的“深度学习”领域,用到了一种名为“梯度下降法”的算法。梯度下降法是机器学习中常用的一种方法,它主要用于快速找到“最小误差”(the minimum error)。要掌握“梯度下降法”,就需要先搞清楚什么是“梯度”,本文将从这些基本概念:方向导数(directional derivative)与偏导数、梯度(gradient)、梯度向量(gradient vector)等出发,带您领略“深度学习”中的“最小二乘法”、“梯度下降法”和“线性回归”。

  • 偏导数(Partial derivate)
  • 方向导数(Directional derivate)
  • 梯度(Gradient)
  • 线性回归(linear regression)
  • 梯度下降(Gradient descent)

一、方向导数

1,偏导数
  先回顾一下一元导数和偏导数,一元导数表征的是:一元函数 f(x)f(x)f(x) 与自变量 xxx 在某点附近变化的比率(变化率),如下:

f′(x0)=df(x)dx∣x=x0=limΔx→0f(x0+Δx)−f(x0)Δx" role="presentation">f′(x0)=df(x)dx∣x=x0=limΔx→0f(x0+Δx)−f(x0)Δxf′(x0)=df(x)dx∣x=x0=limΔx→0f(x0+Δx)−f(x0)Δx

f'(x_0) = \frac{\mathrm{d}f(x)}{\mathrm{d}x} \mid_{x=x_0} = \lim_{\Delta x \to 0}\frac{f(x_0 + \Delta x) - f(x_0)}{\Delta x}
  而二元函数的偏导数表征的是:函数 F(x,y)F(x,y)F(x,y) 与自变量 xxx (或 y" role="presentation" style="position: relative;">yyy) 在某点附近变化的比率(变化率),如下:

Fx(x0,y0)=∂F∂x∣x=x0,y=y0=limΔx→0F(x0+Δx,y0)−F(x0,y0)ΔxFx(x0,y0)=∂F∂x∣x=x0,y=y0=limΔx→0F(x0+Δx,y0)−F(x0,y0)Δx

F_x(x_0, y_0) = \frac{\partial F}{\partial x} \mid_{x=x_0,y=y_0} = \lim_{\Delta x \to 0}\frac{F(x_0 + \Delta x, y_0) - F(x_0, y_0)}{\Delta x}
  以长方形的面积 z=F(x,y)z=F(x,y) z = F(x,y) 为例,如下图:

如果说 z=F(x,y)=x⋅yz=F(x,y)=x⋅y z = F(x,y) = x \cdot y 表示以 P(x,y) 点和原点为对角点的矩形的面积,那么 z=F(x,y)z=F(x,y)z = F(x,y) 在 P0P0P_0 点对x 的偏导数表示 P0P0P_0 点沿平行于 x 轴正向移动,矩形的面积变化量与 P0P0P_0 点在 x方向的移动距离的比值

Fx(x0,y0)=∂F∂x=limΔx→0ΔSΔxFx(x0,y0)=∂F∂x=limΔx→0ΔSΔx

F_x(x_0, y_0) = \frac{\partial F}{\partial x} = \lim_{\Delta x \to 0}\frac{\Delta S}{\Delta x}
同样地,可得

Fy(x0,y0)=∂F∂y=limΔy→0ΔSΔyFy(x0,y0)=∂F∂y=limΔy→0ΔSΔy

F_y(x_0, y_0) = \frac{\partial F}{\partial y} = \lim_{\Delta y \to 0}\frac{\Delta S}{\Delta y}
需要注意的是:
  矩形面积的这个例子有时候也很容易让人混淆,上图中无论 x 还是 y ,都是输入变量,输出变量 S 并没有用坐标轴的形式画出来。也就是说,这个例子实际上是一个三维空间的函数关系,而不是二维平面的函数关系。
  
向量角度看偏导数:
  偏导数向量 [FxFy][FxFy]\begin{bmatrix}F_x\\ F_y\end{bmatrix}是坐标向量(原向量) [xy][xy]\begin{bmatrix}x\\ y\end{bmatrix}的线性变换,详见《Essence of linear algebra》:求导是一种线性变换。
扩展一下:如果 P0P0P_0 点不是沿平行于 x 轴方向或平行于 y 轴方向,而是 沿与 x 轴成夹角 αα\alpha 的一条直线 lll 上移动,那么面积的增量与 P0" role="presentation" style="position: relative;">P0P0P_0 点在该直线上移动的距离的比值关系是什么呢?
假设 P0P0P_0 点在这条直线上移动的距离为 ΔtΔt\Delta t ,则有

{Δx=Δt⋅cosαΔy=Δt⋅sinα{Δx=Δt⋅cosαΔy=Δt⋅sinα

\left\{\begin{matrix}\Delta x = \Delta t \cdot cos \; \alpha \\ \Delta y = \Delta t \cdot sin \; \alpha \end{matrix}\right.
那么,矩形面积增量与移动距离的增量比值是:

limΔt→0ΔSΔt=limΔt→0(x0+Δt⋅cosα)⋅(y0+Δt⋅sinα)−x0⋅y0Δt=limΔt→0y0Δt⋅cosα+x0Δt⋅sinα+(Δt)2⋅cosα⋅sinαΔt=y0cosα+x0sinαlimΔt→0ΔSΔt=limΔt→0(x0+Δt⋅cosα)⋅(y0+Δt⋅sinα)−x0⋅y0Δt=limΔt→0y0Δt⋅cosα+x0Δt⋅sinα+(Δt)2⋅cosα⋅sinαΔt=y0cosα+x0sinα

\lim_{\Delta t \to 0} \frac{\Delta S}{\Delta t} = \lim_{\Delta t \to 0} \frac{(x_0 + \Delta t \cdot cos \; \alpha) \cdot (y_0 + \Delta t \cdot sin \; \alpha) - x_0 \cdot y_0}{\Delta t} \\= \lim_{\Delta t \to 0} \frac{y_0 \Delta t \cdot cos \; \alpha + x_0 \Delta t \cdot sin \; \alpha + (\Delta t)^2 \cdot cos \; \alpha \cdot sin \; \alpha}{\Delta t} \\ = y_0 cos \; \alpha + x_0 sin \; \alpha

与偏导数类似,上式也是一个“一元导数”。事实上,这就是方向导数,可记作

Fl=∂F∂lFl=∂F∂l

F_l = \frac{\partial F}{\partial l}

2,矢量描述
  从矢量角度来看,P0P0P_0 点沿与 x 轴成夹角 αα\alpha 的一条直线 lll 移动,这个移动方向可以看作是一个矢量 —— “方向矢量”

l→=(cosα,sinα)" role="presentation">l⃗ =(cosα,sinα)l→=(cosα,sinα)

\vec{l} = (cos \;\alpha, sin \;\alpha)
  如果 α=0α=0\alpha = 0 ,即沿平行 x 轴方向移动;如果 α=π2α=π2\alpha = \frac{\pi}{2} ,即沿平行 y 轴方向移动。因此,偏导数实际上是方向导数的一种特例。
  在回顾一下上一节“二元全微分的几何意义”:用切平面近似空间曲面。这个切平面实际上是由两条相交直线确定的平面,而这两条直线分别是 x 方向的偏导数向量 Px→Px→\vec{P_x} 和 y 方向的偏导数向量 Py→Py→\vec{P_y} 。很显然,这两个向量不但位于同一个平面,而且相互垂直。那么这两个向量合成的新向量也一定位于这个“切平面”。
注:关于偏导数向量相互垂直,可以很容易从偏导数“切片法”推导出来。
  将偏导数合成向量记作 P⃗ =(Fx,Fy)=(∂F∂x,∂F∂y)P→=(Fx,Fy)=(∂F∂x,∂F∂y)\vec{P} = (F_x,F_y) = (\frac{\partial F}{\partial x},\frac{\partial F}{\partial y}) 。如果对偏导数向量和方向向量进行矢量“内积”,则有:

P⃗ ⋅l⃗ =∂F∂xcosα+∂F∂ysinα=∂F∂lP→⋅l→=∂F∂xcosα+∂F∂ysinα=∂F∂l

\vec{P} \cdot \vec{l} = \frac{\partial F}{\partial x}cos \;\alpha + \frac{\partial F}{\partial y}sin \;\alpha = \frac{\partial F}{\partial l}
  这个内积在数值上刚好等于 l⃗ l→\vec{l} 方向的方向导数。
换句话说:方向导数就是偏导数合成向量与方向向量的内积
  
从向量角度看:
  内积在几何上表示投影,也就是说,方向导数(向量)是原向量在某个方向上的投影的变化率。

3,多元方向导数
  从上面的矢量内积出发,将 l⃗ l→\vec{l} 与 y 轴方向的夹角表示为 ββ\beta ,则方向导数的公式可以变化为:

∂F∂l=∂F∂xcosα+∂F∂ycosβ∂F∂l=∂F∂xcosα+∂F∂ycosβ

\frac{\partial F}{\partial l} = \frac{\partial F}{\partial x}cos \;\alpha + \frac{\partial F}{\partial y}cos \;\beta
  类似地,推广到多维空间

∂F∂l=∂F∂xcosα1+∂F∂ycosα2+∂F∂zcosα3+⋅⋅⋅∂F∂l=∂F∂xcosα1+∂F∂ycosα2+∂F∂zcosα3+⋅⋅⋅

\frac{\partial F}{\partial l} = \frac{\partial F}{\partial x}cos \;\alpha_1 + \frac{\partial F}{\partial y}cos \;\alpha_2 + \frac{\partial F}{\partial z}cos \;\alpha_3 + \cdot \cdot \cdot
  当然,从向量内积的角度更容易得到这个公式

P⃗ ⋅l⃗ =(∂F∂x,∂F∂,∂F∂z,⋅⋅⋅)⋅(cosα1,cosα2,cosα3,⋅⋅⋅)P→⋅l→=(∂F∂x,∂F∂,∂F∂z,⋅⋅⋅)⋅(cosα1,cosα2,cosα3,⋅⋅⋅)

\vec{P} \cdot \vec{l} = (\frac{\partial F}{\partial x}, \frac{\partial F}{\partial }, \frac{\partial F}{\partial z}, \cdot \cdot \cdot) \cdot (cos \;\alpha_1, cos \;\alpha_2, cos \;\alpha_3, \cdot \cdot \cdot)

二、梯度

1,梯度(gradient)
  还是从上面的矩形面积这个例子出发,来探索什么是“梯度”。
  假设 P0P0P_0 点的坐标是 (3–√,1)(3,1)(\sqrt{3},1) , 则

Fx=1,Fy=3–√,Fl=cosα+3–√sinαFx=1,Fy=3,Fl=cosα+3sinα

F_x = 1 \;,\; F_y = \sqrt{3}\;,\;F_l = cos \;\alpha + \sqrt{3}sin \;\alpha
  很明显,方向导数(标量)的大小随 矢量 l⃗ l→\vec{l} 的方向不同而不同。那么,这些方向导数中是否存在一个最大值呢?
  答案是肯定的!这就是“梯度”(标量)。

∇F=gradF=max{∂F∂l}∇F=gradF=max{∂F∂l}

\nabla \; F = grad \; F = max\{ \frac{\partial F}{\partial l} \}
  所以,梯度的第一层含义就是“方向导数的最大值”

2,梯度矢量
  梯度的第一层含义是“方向导数的最大值”,那么这个最大值是多少呢?或者说 矢量 l⃗ l→\vec{l} 取什么值时才能找到这个最大值?
  还是以矩形面积为例

gradF(3–√,1)=max{∂F∂l}=max{cosα+3–√sinα}=max{2sin(π6+α)}gradF(3,1)=max{∂F∂l}=max{cosα+3sinα}=max{2sin(π6+α)}

grad \; F(\sqrt{3},1) = max\{ \frac{\partial F}{\partial l} \} = max\{ cos \;\alpha + \sqrt{3}sin \;\alpha \} \\= max\{ 2sin( \frac{\pi}{6} + \alpha) \}
  显然, α=π3α=π3\alpha = \frac{\pi}{3} 时,取值最大,此时

l⃗ =(cosα,sinα)=(12,3–√2)l→=(cosα,sinα)=(12,32)

\vec{l} = (cos \;\alpha, sin \;\alpha) = (\frac{1}{2}, \frac{\sqrt{3}}{2})
  在比较一下偏导数向量

P⃗ =(Fx,Fy)=(1,3–√)P→=(Fx,Fy)=(1,3)

\vec{P} = (F_x,F_y) = (1,\sqrt{3})
  是不是似曾相识?对的,后者单位化后就变成了前者。
  从向量内积的角度来看,更容易理解:

∇F=gradF=max{∂F∂l}=max{P⃗ ⋅l⃗ }=max{∣∣P⃗ ∣∣⋅∣∣l⃗ ∣∣⋅cosθ}∇F=gradF=max{∂F∂l}=max{P→⋅l→}=max{|P→|⋅|l→|⋅cosθ}

\nabla \; F = grad \; F = max\{ \frac{\partial F}{\partial l} \} = max\{ \vec{P} \cdot \vec{l} \} \\ = max\{ \left | \vec{P} \right |\cdot \left | \vec{l} \right | \cdot cos \;\theta \}
  很明显, 两个向量的夹角 θ=0θ=0\theta = 0 时,取得最大值。
  至此,我们引出了梯度的第二层含义,或者说叫“梯度矢量”

∇F⃗ =gradF=(∂F∂x,∂F∂y)∇F→=gradF=(∂F∂x,∂F∂y)

\nabla \; \vec{F} = grad \; F = (\frac{\partial F}{\partial x},\frac{\partial F}{\partial y})
注意:
  上面提到的夹角 θθ\theta 在几何上表示原向量(坐标向量)与导数向量(变化率向量)之间的夹角,所以,梯度的几何含义就是:沿向量所在直线的方向变化率最大。
  
顺便扩展一下散度(divergence)和旋度(curl)的记号,它们都使用了Nabla算子(微分向量算子),分别如下:

∇⋅F⃗ ,∇×F⃗ ∇⋅F→,∇×F→

\nabla \cdot \vec{F} \;,\; \nabla \times \vec{F}

3,举例
  总结一下这一节的思路: 偏导数向量合成 →→\rightarrow 合成向量与方向向量内积 →→\rightarrow 方向导数 →→\rightarrow 方向导数的最值 →→\rightarrow 梯度 →→\rightarrow 梯度向量与偏导数合成向量相同
  转了一圈,又回来了。
  从偏导数合成向量到梯度矢量,让我想起了高中物理中的“力的合成与分解”和“沿合力方向做功最有效率”这些物理知识,恰好能与这些数学概念对应上。

  如上图,合力表示偏导数合成向量,“垂直分力”表示x方向和y方向的偏导数向量,那么方向向量则对应“做功”路径,而“沿合力方向做功”则表示方向向量与偏导数合成向量重合。Perfect !
注:在重力场或电场中,做功的结果是改变势能,因此,“做功最有效率”又可以表述为“势能变化率最快”。
注:关于梯度(gradient)可以参考以下文章:
https://math.oregonstate.edu/home/programs/undergrad/CalculusQuestStudyGuides/vcalc/grad/grad.html
https://betterexplained.com/articles/vector-calculus-understanding-the-gradient/

三、梯度下降法

1,梯度下降法
  梯度下降法(gradient descent)是一个一阶最优化算法,它的核心思想是:要想最快找到一个函数的局部极小值,必须沿函数当前点对应“梯度”(或者近似梯度)的反方向(下降)进行规定步长“迭代”搜索。如下图:

  看到上面这幅图,你能想到什么?
  我想到了两个概念:一是地理学中的“梯田”和“等高线”,下面的链接中,有一篇文章的作者将“梯度下降”形象的比作“从山顶找路下到山谷”,这么看来,等高线肯定与梯度下降有某种关联。
  第二个想到的是电学中的“带电物体的等势面”或者说是“电场等势线”。看一下wiki - potential gradient,可以扩展一下“势能梯度”的知识。
  很明显,梯度常常和势能联系在一起,那么势能是什么呢?它就是上图中的弧线圈。这个解释有点虚,给个更贴切的:我们可以把势能看作是 z=f(x,y)z=f(x,y)z = f(x,y) 中的这个 zzz ,即函数值。
这些弧线圈就表示在它上面的点 (x,y)" role="presentation" style="position: relative;">(x,y)(x,y)(x,y) 对应的 z=f(x,y)z=f(x,y)z = f(x,y) 的值相等。从空间几何的角度来看这些“弧线圈”,更容易理解: z=f(x,y)z=f(x,y)z = f(x,y) 表示空间曲面,用 z=cz=cz = c 这样一个平面去截空间曲面,它们的交线就是“弧线圈”,公式表示为

{z=f(x,y)z=c{z=f(x,y)z=c

\left\{\begin{matrix} z = f(x,y) \\ z = c \end{matrix}\right.
  当然啦,上图是把多个弧线圈画到(投影)了一个平面上。
  我们也可以这样来理解“梯度下降法”: 导数表征的是“函数值随自变量的变化率” →→\rightarrow 梯度是各方向导数中的最大值 →→\rightarrow 沿 “梯度矢量”移动必定变化最快 →→\rightarrow 沿“梯度矢量” 反方向下降(减少)最快。

google MLCC - Gradient descent

2,梯度下降法求极值
  求下列函数的极小值

f(x)=x4−3∗x3+2⇒f′(x)=4x3−9x2f(x)=x4−3∗x3+2⇒f′(x)=4x3−9x2

f(x) = x^4 - 3 * x^3 + 2 \; \Rightarrow \; f'(x) = 4x^3 - 9x^2

# From calculation, it is expected that the local minimum occurs at x=9/4cur_x = 6 # The algorithm starts at x=6
gamma = 0.01 # step size multiplier
precision = 0.00001
previous_step_size = cur_xdef df(x):return 4 * x**3 - 9 * x**2while previous_step_size > precision:prev_x = cur_xcur_x += -gamma * df(prev_x)previous_step_size = abs(cur_x - prev_x)print("The local minimum occurs at %f" % cur_x)

The local minimum occurs at 2.249965

注:关于“gradient descent”还可以参考以下资料:
https://www.analyticsvidhya.com/blog/2017/03/introduction-to-gradient-descent-algorithm-along-its-variants/
http://ruder.io/optimizing-gradient-descent/

3,梯度下降法与最小二乘法
  “机器学习”中有六个经典算法,其中就包括“最小二乘法”和“梯度下降法”,前者用于“搜索最小误差”,后者用于“用最快的速度搜索”,二者常常配合使用。代码演示如下:

# y = mx + b
# m is slope, b is y-intercept
def compute_error_for_line_given_points(b, m, coordinates):totalerror = 0for i in range(0, len(coordinates)):x = coordinates[i][0]y = coordinates[i][1]totalerror += (y - (m * x + b)) ** 2return totalerror / float(len(coordinates))# example
compute_error_for_line_given_points(1, 2, [[3, 6], [6, 9], [12, 18]])

22.0

  以上就是用“最小二乘法”来计算误差,当输入为 (1,2)(1,2)(1,2) 时,输出为 22.022.022.0

  很显然,最小二乘法需要不停地调整(试验)输入来找到一个最小误差。而应用“梯度下降法”,可以加快这个“试验”的过程。
  以上面这段程序为例,误差是斜率 m 和常数 b 的二元函数,可以表示为

e=g(m,b)e=g(m,b)

e = g(m,b)
  那么,对最小二乘法的参数调优就转变为了求这个二元函数的极值问题,也就是说可以应用“梯度下降法”了。
  “梯度下降法”可以用于搜索函数的局部极值,如下,求下列函数的局部极小值

f(x)=x5−2x3−2f(x)=x5−2x3−2

f(x) = x^5 - 2x^3 -2
  分析:这是一个一元连续函数,且可导,其导函数是:

f′(x)=5x4−6x2f′(x)=5x4−6x2

f'(x) = 5x^4 - 6x^2
  根据“一阶导数极值判别法”:若函数f(x)可导,且f’(x)在 x0x0x_0 的两侧异号,则 x0x0x_0 是f(x)的极值点。那么,怎么找到这个 x0x0x_0 呢?
  很简单,只需要沿斜率(导数值)的反方向逐步移动即可,如下图:导数为负时,沿x轴正向移动;导数为正时,沿x轴负方向移动。

current_x = 0.5 # the algorithm starts at x=0.5
learning_rate = 0.01 # step size multiplier
num_iterations = 60 # the number of times to train the function# the derivative of the error function (x ** 4 = the power of 4 or x^4)
def slope_at_given_x_value(x):return 5 * x ** 4 - 6 * x ** 2# Move X to the right or left depending on the slope of the error function
x = [current_x]
for i in range(num_iterations):previous_x = current_xcurrent_x += -learning_rate * slope_at_given_x_value(previous_x)x.append(current_x)   #print(previous_x)print("The local minimum occurs at %f, it is %f" % (current_x, current_x ** 5 - 2 * current_x ** 3 - 2))

The local minimum occurs at 1.092837, it is -3.051583

import numpy as np
import matplotlib.pyplot as plt
plt.plot(x, marker='*')
plt.show()

  沿梯度(斜率)的反方向移动,这就是“梯度下降法”。如上图所示,不管初始化值设为什么,在迭代过程只会越来越接近目标值,而不会偏离目标值,这就是梯度下降法的魅力。
  上面这张图是表示的是一个一元函数搜索极值的问题,未必能很好展示梯度下降法的魅力,你再返回去看上面那张“势能梯度图”,那是一个二元函数搜索极值的过程。左边的搜索路径很简洁,而右边的搜索路径,尽管因为初始值的设定,导致它的路径很曲折,但是,你有没有发现,它的每一次迭代事实上离目标都更近一步。我想,这就是梯度下降法的优点吧!
注:这段代码是一元函数求极值,如果是二元函数,则需要同时满足两个分量的偏导数的值为零,下面的线性回归程序算的就是二元偏导数。
  通过组合最小二乘法和梯度下降法,你可以得到线性回归,如下:

# Price of wheat/kg and the average price of bread
wheat_and_bread = [[0.5,5],[0.6,5.5],[0.8,6],[1.1,6.8],[1.4,7]]def step_gradient(b_current, m_current, points, learningRate):b_gradient = 0m_gradient = 0N = float(len(points))for i in range(0, len(points)):x = points[i][0]y = points[i][1]b_gradient += -(2/N) * (y -((m_current * x) + b_current))m_gradient += -(2/N) * x * (y -((m_current * x) + b_current))new_b = b_current -(learningRate * b_gradient)new_m = m_current -(learningRate * m_gradient)return [new_b, new_m]def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):b = starting_bm = starting_mfor i in range(num_iterations):b, m = step_gradient(b, m, points, learning_rate)return [b, m]gradient_descent_runner(wheat_and_bread, 1, 1, 0.01, 1000)

[3.853945094921183, 2.4895803107016445]

  上面这个程序的核心思想就是:在内层迭代的过程中,算出每一步误差函数相当于 m 和 b 的偏导数(梯度),然后沿梯度的反方向调整 m 和 b ;外层迭代执行梯度下降法,逐步逼近偏导数等于0的点。
  其中需要注意偏导数的近似计算公式,已知误差函数

E(m,b)=1N⋅∑i=0N[yi−(m⋅xi+b)]2E(m,b)=1N⋅∑i=0N[yi−(m⋅xi+b)]2

E(m,b) = \frac{1}{N} \cdot \sum_{i=0}^{N} [y_i - (m \cdot x_i + b)]^2
  即各点与拟合直线的距离的平方和,再做算术平均。然后可以计算偏导数为

∂E∂m=−2N⋅xi⋅∑i=0N[yi−(m⋅xi+b)]∂E∂b=−2N⋅∑i=0N[yi−(m⋅xi+b)]∂E∂m=−2N⋅xi⋅∑i=0N[yi−(m⋅xi+b)]∂E∂b=−2N⋅∑i=0N[yi−(m⋅xi+b)]

\frac{\partial E}{\partial m} = -\frac{2}{N} \cdot x_i \cdot \sum_{i=0}^{N} [y_i - (m \cdot x_i + b)] \\ \frac{\partial E}{\partial b} = -\frac{2}{N} \cdot \sum_{i=0}^{N} [y_i - (m \cdot x_i + b)]
  其中的求和公式在程序中表现为内层for循环
  下面再给出拟合后的效果图

import numpy as np
import matplotlib.pyplot as plt
a = np.array(wheat_and_bread)
plt.plot(a[:,0], a[:,1], 'ro')
b,m = gradient_descent_runner(wheat_and_bread, 1, 1, 0.01, 1000)
x = np.linspace(a[0,0], a[-1,0])
y = m * x + b
plt.plot(x, y)
plt.grid()
plt.show()

对比Numpy

import numpy as np
import matplotlib.pyplot as plt
a = np.array(wheat_and_bread)
plt.plot(a[:,0], a[:,1], 'ro')
m, b = np.polyfit(a[:,0], a[:,1], 1)
print([b,m])
x = np.linspace(a[0,0], a[-1,0])
y = m * x + b
plt.plot(x, y)
plt.grid()
plt.show()

[4.1072992700729891, 2.2189781021897814]

梯度向量与梯度下降法相关推荐

  1. 机器学习入门(09)— 偏导数、梯度概念、梯度下降法理论和实现

    1. 偏导数概念 对于式 4-6 而言 式(4.6)有两个变量,求导数时有必要区分对哪个变量求导数,即对 x0 和 x1 两个变量中的哪一个求导数.另外,我们把这里讨论的有多个变量的函数的导数称为偏导 ...

  2. TensorFlow基础11-(小批量梯度下降法和梯度下降法的优化)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,梯度下降法:求解函数极值问题 二,梯度下降法的优化 多层神经网络--非线性分类问题 损失函数不是凸函数,很难计算解析解 ...

  3. 梯度下降算法_梯度下降法的简单介绍以及实现

    梯度下降法的基本思想可以类比为一个下山的过程.假设这样一个场景:一个人被困在山上,需要从山上下来(i.e.找到山的最低点,也就是山谷).但此时山上的浓雾很大,导致可视度很低.因此,下山的路径就无法确定 ...

  4. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法

    本文首发于我的微信公众号里,地址:梯度提升(Gradient Boosting)算法 本文禁止任何形式的转载. 我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI ...

  5. 大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)

    第七节梯度下降之梯度概念和梯度迭代过程(2) 上一节中针对一元函数,找到了一个看起来还不错的一种寻求数值上的最小值的这种方式.大致是这么一个流程,F(w)和F'(w),上来先瞎蒙出来一组w,然后带到这 ...

  6. 梯度下降的超参数大于等于2什么意思_大白话5分钟带你走进人工智能-第七节梯度概念和梯度迭代过程(2)...

    第七节梯度下降之梯度概念和梯度迭代过程(2) 上一节中针对一元函数,找到了一个看起来还不错的一种寻求数值上的最小值的这种方式.大致是这么一个流程,F(w)和F`(w),上来先瞎蒙出来一组w,然后带到这 ...

  7. 大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)...

    第七节梯度下降之梯度概念和梯度迭代过程(2) 上一节中针对一元函数,找到了一个看起来还不错的一种寻求数值上的最小值的这种方式.大致是这么一个流程,F(w)和F`(w),上来先瞎蒙出来一组w,然后带到这 ...

  8. 什么是梯度?为什么梯度的方向总是指向函数值增大的方向?

    闲谈 对于梯度这个概念,我是这样的, 学习时,正序:导数–>偏导数–>方向导数–>梯度,从导数开始一步一步学到梯度这个概念,脑子里想 着:"梯度这个玩意儿有什么用,得记下来 ...

  9. OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))

    目录 形态学梯度概述 一.基本梯度 1.原理 2.代码 3.效果 二.内部梯度 1.原理 2.代码 3.效果 三.外部梯度 1.原理 2.代码 3.效果 四.方向梯度 1.原理 2.二值化图像(黑白) ...

  10. 【深度学习】梯度消失和梯度爆炸问题的最完整解析

    作者丨奥雷利安 · 杰龙 来源丨机械工业出版社<机器学习实战:基于Scikit-Learn.Keras和TensorFlow> 编辑丨极市平台 1 梯度消失与梯度爆炸 正如我们在第10章中 ...

最新文章

  1. Server-Side UI Automation Provider - WinForm Sample
  2. Oracle vs MySQL
  3. ES11新特性_动态import---JavaScript_ECMAScript_ES6-ES11新特性工作笔记065
  4. POJ 1740 A New Stone Game(博弈)题解
  5. python 爬虫性能_python-爬虫性能相关
  6. Il2CppDumper的使用方法,ILSpy中文版的下载地址
  7. Tomcat 下载、安装与配置
  8. 叶三《我们唱》-野孩子(白银饭店)
  9. linux字体美化包,linux字体美化
  10. reduceByKey一个巧妙的用法
  11. 用python画皮卡丘代码-用python画一只可爱的皮卡丘实例
  12. Ubuntu命令行下运行matlab
  13. Linux 中 Netcat 工具的使用
  14. 《思考的技术》的思考技术点
  15. 网络设计与集成 实验二 - 设备远程管理、VLAN 配置
  16. 使用 setpci 配置 PCI 设备
  17. diskgenius重新分区教程
  18. python文本内容归档辅助系统
  19. 2021面试前期准备——JS基础(持续更新)
  20. OpenWrt之kmod-nls详解

热门文章

  1. STM32外设驱动库分析与实现
  2. 正三角形二面体群表示为二阶矩阵形式
  3. 为什么我的电脑显示rpc服务器不可用,电脑提示RPC服务器不可用解决办法
  4. 硬件设计-USB2.0电路设计
  5. 视频流调试过程(海康威视+Kurento)
  6. 机器学习算法------6.4 模型评估(误差平方和、肘方法、轮廓系数法、CH系数)
  7. c#绝对值函数图像_C# 中如何取绝对值函数
  8. layui icon服务器上显示不出来,关于layui的动态图标不显示的解决方法
  9. 计算机的二课堂成果展示ppt,作品成果展示.ppt
  10. 平面方程、两平面夹角、点到平面距离