梯度下降 gradient descent

导数

导数反映的是函数 f ( x ) f(x) f(x) x x x 轴上某一点处沿着 x x x 轴正方向的变化率/变化趋势。

f ′ ( x 0 ) = lim ⁡ Δ x → 0 Δ y Δ x = lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f'(x_0)=\lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x \to 0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x} f(x0)=Δx0limΔxΔy=Δx0limΔxf(x0+Δx)f(x0)

  • f ′ ( x ) > 0 f'(x)>0 f(x)>0,说明 f ( x ) f(x) f(x) 的函数值在 x x x 点沿 x x x 轴正方向趋于增加。

  • f ′ ( x ) &lt; 0 f&#x27;(x)&lt;0 f(x)<0,说明 f ( x ) f(x) f(x) 的函数值在 x x x 点沿 x x x 轴正方向趋于减少。

偏导数

因为曲面上的每一点都有无穷多条切线,描述曲面函数的导数相当困难。偏导数就是选择其中一条切线,并求出它的斜率。

  • 假设 ƒ ƒ ƒ 是一个多元函数。例如:

z = f ( x , y ) = x 2 + x y + y 2 z = f(x, y) = x^2 + xy + y^2 z=f(x,y)=x2+xy+y2

  • 一种求出这些切线的好办法是把其他变量视为常数。例如,欲求出以上的曲面函数在点 ( 1 , 1 , 3 ) (1, 1, 3) 1,1,3 y = 1 y = 1 y=1 平面的切线。(右图为 y = 1 y = 1 y=1 切面)

  • 我们把变量 y y y 视为常数,过对 x x x 求导:

    ∂ z ∂ x = 2 x + y {\displaystyle {\frac {\partial z}{\partial x}}=2x+y} xz=2x+y

  • 得到点(1, 1, 3)的与 x O z xOz xOz 平面平行的切线的斜率为 3。

一般地,函数 f ( x 1 , . . . , x n ) f(x_1,...,x_n) f(x1,...,xn) 在点 ( a 1 , . . . , a n ) (a_1,...,a_n) (a1,...,an) 关于 x i x_i xi 的偏导数定义为:

∂ f ∂ x i ( a 1 , … , a n ) = lim ⁡ h → 0 f ( a 1 , … , a i + h , … , a n ) − f ( a 1 , … , a n ) h {\displaystyle {\frac {\partial f}{\partial x_{i}}}(a_{1},\ldots ,a_{n})=\lim _{h\to 0}{\frac {f(a_{1},\ldots ,a_{i}+h,\ldots ,a_{n})-f(a_{1},\ldots ,a_{n})}{h}}} xif(a1,,an)=h0limhf(a1,,ai+h,,an)f(a1,,an)

方向导数

导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。而方向导数则是求某一点在某一趋近方向上的导数值,反映函数在特定方向上的变化率:

梯度

梯度即函数在某一点最大的方向导数,函数沿梯度方向函数有最大的变化率,梯度的值是最大方向导数的值。

利用有限差值计算梯度

x x x 所有维度进行迭代,在每个维度上产生一个很小的变化 h h h,通过观察函数值变化,计算函数在该维度上的偏导数。最后,所有的梯度存储在变量 grad 中:

def eval_numerical_gradient(f, x):
  """  
  一个f在x处的数值梯度法的简单实现
  - f是只有一个参数的函数
  - x是计算梯度的点
  """ 

  fx = f(x) # 在原点计算函数值
  grad = np.zeros(x.shape)
  h = 0.00001

  # 对x中所有的索引进行迭代
  it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
  while not it.finished:

    # 计算x+h处的函数值
    ix = it.multi_index
    old_value = x[ix]
    x[ix] = old_value + h # 增加h
    fxh = f(x) # 计算f(x + h)
    x[ix] = old_value # 存到前一个值中 (非常重要)

    # 计算偏导数
    grad[ix] = (fxh - fx) / h # 坡度
    it.iternext() # 到下个维度

  return grad

实际中用中心差值公式(centered difference formula) [ f ( x + h ) − f ( x − h ) ] / 2 h [f(x+h)-f(x-h)]/2h [f(x+h)f(xh)]/2h 效果较好。

代价函数的梯度

  • 对于 1 维特征的假设函数:

h θ ( x ) = θ 0 + θ 1 ∗ x h_{θ}(x) = θ_0 + θ_1 * x hθ(x)=θ0+θ1x

  • 不同参数的 θ i θ_i θi 可以拟合出不同的直线:
  • 代价函数 J ( θ ) J(θ) J(θ) 随参数 θ i θ_i θi 的变化而变化:
  • 有 2 维特征时,代价函数表现为曲面图。

  • 优化目标函数,可以沿着 负梯度方向 不断下降,逐步降低函数损失值,以此达到最优点:

  • θ 0 , θ 1 θ_0, θ_1 θ0,θ1 初始值不同的时候,可能会找到不同局部最小值,这个正是 梯度下降算法 的特点。

  • 一般线性回归的代价函数都是凸函数,只有一个全局最优值,如下图:

梯度下降的详细算法

先决条件

  • 确认优化模型的 假设函数代价函数。比如对于线性回归,假设函数表示为:

    h θ ( x 1 , x 2 , . . . x n ) = θ 0 x 0 + θ 1 x 1 + . . . + θ n x n h_\theta(x_1, x_2, ...x_n) = \theta_0x_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} hθ(x1,x2,...xn)=θ0x0+θ1x1+...+θnxn

    即:
    h θ ( X ) = X θ h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta} hθ(X)=Xθ

    其中 θ i θ_i θi 为模型参数, x i x_i xi 为每个样本 x x x 的第 i i i 个特征值。 X X X m ∗ ( n + 1 ) m * (n+1) m(n+1) 维的矩阵, m m m 代表样本的个数, n + 1 n+1 n+1 代表样本的特征数,多加的1维作为偏置项。

  • 对应于上面的假设函数,代价函数为:

    J ( θ 0 , θ 1 . . . , θ n ) = 1 2 m ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y ( j ) ) 2 J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})^2 J(θ0,θ1...,θn)=2m1j=0m(hθ(x0(j),x1(j),...xn(j))y(j))2

    即:
    J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) J(θ)=21(XθY)T(XθY)
    其中 Y Y Y 是样本的标签值,维度为 m ∗ 1 m*1 m1

算法过程

  1. 确定当前位置的代价函数的梯度,对于 θ θ θ 向量,其梯度表达式如下:

    ∂ ∂ θ J ( θ ) = ∂ ∂ θ i J ( θ 0 , θ 1 . . . , θ n ) = 1 m ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y ( j ) ) x i ( j ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) =\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})x_i^{(j)} θJ(θ)=θiJ(θ0,θ1...,θn)=m1j=0m(hθ(x0(j),x1(j),...xn(j))y(j))xi(j)

    即:

    ∂ ∂ θ J ( θ ) = X T ( X θ − Y ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y}) θJ(θ)=XT(XθY)

  2. 用学习速率 α α α 乘以代价函数的梯度,得到当前位置将要下降的距离:
    α ∂ ∂ θ J ( θ ) = α ∂ ∂ θ i J ( θ 0 , θ 1 . . . , θ n ) \alpha\frac{\partial}{\partial\theta}J(\theta) =\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n) αθJ(θ)=αθiJ(θ0,θ1...,θn)

  3. 同步更新所有的 θ θ θ,对于 θ i θ_i θi,其更新表达式如下。更新完毕后继续转入步骤1。

    θ i = θ i − α ∂ ∂ θ i J ( θ 0 , θ 1 . . . , θ n ) \theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n) θi=θiαθiJ(θ0,θ1...,θn)

    即:

    θ = θ − α X T ( X θ − Y ) \mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y}) θ=θαXT(XθY)

代价损失中 θ 偏导数公式推导

代价损失函数对于 θ i θ_i θi 的偏导数计算,推导如下:

假设函数:

h θ ( x 1 , x 2 ) = θ 0 x 0 + θ 1 x 1 h_\theta(x_1, x_2) = \theta_0x_0 + \theta_{1}x_1 hθ(x1,x2)=θ0x0+θ1x1

代价损失函数:

J ( θ 0 , θ 1 ) = 1 2 m ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) ) − y ( j ) ) 2 J(\theta_0, \theta_1)=\frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}) - y^{(j)})^2 J(θ0,θ1)=2m1j=0m(hθ(x0(j),x1(j))y(j))2

= 1 2 m ∑ j = 0 m ( ( θ 0 x 0 ( j ) + θ 1 x 1 ( j ) ) − y ( j ) ) 2 =\frac{1}{2m}\sum\limits_{j=0}^{m}((\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)}) - y^{(j)})^2 =2m1j=0m((θ0x0(j)+θ1x1(j))y(j))2

= 1 2 m ∑ j = 0 m ( ( θ 0 x 0 ( j ) + θ 1 x 1 ( j ) ) 2 + y ( j ) 2 − 2 ( θ 0 x 0 ( j ) + θ 1 x 1 ( j ) ) y ( j ) ) =\frac{1}{2m}\sum\limits_{j=0}^{m}((\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)})^2 + {y^{(j)}}^2 - 2(\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)})y^{(j)}) =2m1j=0m((θ0x0(j)+θ1x1(j))2+y(j)22(θ0x0(j)+θ1x1(j))y(j))

= 1 2 m ∑ j = 0 m ( θ 0 2 x 0 ( j ) 2 + θ 1 2 x 1 ( j ) 2 + 2 θ 0 x 0 ( j ) θ 1 x 1 ( j ) + y ( j ) 2 − 2 θ 0 x 0 ( j ) y ( j ) − 2 θ 1 x 1 ( j ) y ( j ) ) =\frac{1}{2m}\sum\limits_{j=0}^{m}(\theta_0^2{x_0^{(j)}}^2 + \theta_1^2{x_1^{(j)}}^2 + 2\theta_0x_0^{(j)}\theta_{1}x_1^{(j)}+ {y^{(j)}}^2 - 2\theta_0x_0^{(j)}y^{(j)} - 2\theta_{1}x_1^{(j)}y^{(j)}) =2m1j=0m(θ02x0(j)2+θ12x1(j)2+2θ0x0(j)θ1x1(j)+y(j)22θ0x0(j)y(j)2θ1x1(j)y(j))

代价损失函数对于 θ 0 θ_0 θ0 的偏导数:
∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 2 m ∑ j = 0 m ( 2 θ 0 x 0 ( j ) 2 + 2 x 0 ( j ) θ 1 x 1 ( j ) − 2 x 0 ( j ) y ( j ) ) \frac{\partial}{\partial\theta_0}J(\theta_0, \theta_1)= \frac{1}{2m}\sum\limits_{j=0}^{m}(2\theta_0{x_0^{(j)}}^2 + 2x_0^{(j)}\theta_{1}x_1^{(j)}- 2x_0^{(j)}y^{(j)} ) θ0J(θ0,θ1)=2m1j=0m(2θ0x0(j)2+2x0(j)θ1x1(j)2x0(j)y(j))

= 1 m ∑ j = 0 m ( θ 0 x 0 ( j ) 2 + x 0 ( j ) θ 1 x 1 ( j ) − x 0 ( j ) y ( j ) ) = \frac{1}{m}\sum\limits_{j=0}^{m}(\theta_0{x_0^{(j)}}^2 + x_0^{(j)}\theta_{1}x_1^{(j)}- x_0^{(j)}y^{(j)} ) =m1j=0m(θ0x0(j)2+x0(j)θ1x1(j)x0(j)y(j))

= 1 m ∑ j = 0 m ( θ 0 x 0 ( j ) + θ 1 x 1 ( j ) − y ( j ) ) x 0 ( j ) = \frac{1}{m}\sum\limits_{j=0}^{m}(\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)}-y^{(j)} )x_0^{(j)} =m1j=0m(θ0x0(j)+θ1x1(j)y(j))x0(j)

= 1 m ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) ) − y ( j ) ) x 0 ( j ) = \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}) - y^{(j)})x_0^{(j)} =m1j=0m(hθ(x0(j),x1(j))y(j))x0(j)

即:

∂ ∂ θ J ( θ ) = ∂ ∂ θ i J ( θ 0 , θ 1 . . . , θ n ) = 1 m ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y ( j ) ) x i ( j ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) =\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})x_i^{(j)} θJ(θ)=θiJ(θ0,θ1...,θn)=m1j=0m(hθ(x0(j),x1(j),...xn(j))y(j))xi(j)

即:

∂ ∂ θ J ( θ ) = X T ( X θ − Y ) \frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y}) θJ(θ)=XT(XθY)

批量梯度下降(Batch Gradient Descent,BGD)

  • 批量梯度下降法,就是在梯度下降的每一步中,都 使用所有的样本 来进行更新。前面的梯度下降算法过程,就是批量梯度下降法。

θ i = θ i − α ∑ j = 0 m ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiαj=0m(hθ(x0(j),x1(j),...xn(j))yj)xi(j)

  • 由于我们有 m m m 个样本,这里求梯度的时候就用了所有 m m m 个样本的梯度数据。

  • 在大规模的应用中(比如ILSVRC挑战赛),训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。

随机梯度下降法(Stochastic Gradient Descent,SGD)

随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的 m m m 个样本的数据,而是仅仅选取一个样本 j j j 来求梯度。对应的更新公式是:

θ i = θ i − α ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiα(hθ(x0(j),x1(j),...xn(j))yj)xi(j)

  • 随机梯度下降法,和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用 1 个样本来梯度下降。自然各自的优缺点都非常突出。

  • 对于训练速度来说,随机梯度下降法由于每次仅仅采用 1 个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。

  • 对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

小批量梯度下降法(Mini-batch Gradient Descent,MBGD)

  • 小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于 m m m 个样本,我们采用 x x x 个样本来迭代, 1 &lt; x &lt; m 1&lt;x&lt;m 1<x<m

  • 小批量数据的大小是一个超参数,但是一般并不需要通过交叉验证来调参。它一般由存储器的限制来决定的,比如 32,64,128 等。之所以使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是 2 的倍数,那么运算更快。

  • 对应的更新公式是:

    θ i = θ i − α ∑ j = t t + x − 1 ( h θ ( x 0 ( j ) , x 1 ( j ) , . . . x n ( j ) ) − y j ) x i ( j ) \theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)} θi=θiαj=tt+x1(hθ(x0(j),x1(j),...xn(j))yj)xi(j)

  • 使用向量化操作的代码,一次计算 100 个数据 比100次计算 1 个数据要高效很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值