机器学习中的求导

版权声明:https://blog.csdn.net/z0n1l2 https://blog.csdn.net/z0n1l2/article/details/83515904

基础知识

机器学习中常见函数求导

  • 幂次
    ( x u ) = u x u 1 (x^u)^\prime=ux^{u-1}

  • 指数
    ( e x ) = e x (e^x)^\prime=e^{x}

  • 对数
    ( log a x ) = 1 x ln a (\log _ax)^\prime=\frac{1}{x\ln a}
    ( l n x ) = 1 x (ln x)^\prime=\frac{1}{x}

求导四则运算

( u ± v ) = u ± v (u \pm v) = u^\prime \pm v^\prime
( C u ) = C u (Cu)^\prime=Cu^\prime
( u v ) = u v + u v (uv)^\prime=u^\prime v + u v^\prime
( u v ) = u v u v v 2 (\frac{u}{v})^ \prime=\frac{u^\prime v - uv^\prime}{v^2}
显然除法的公式可以从乘法公式推导出来

复合函数求导

一个函数的自变量是另一个函数的因变量,前者称为复合函数。
y = f ( g ( x ) ) y=f(g(x)) 其中 y = f ( u ) y=f(u) , u = g ( x ) u=g(x) 都可导,则

d y d x = d f d g d g d x \frac{dy}{dx}=\frac{df}{dg}\frac{dg}{dx}

上面比较简单,因为 f f 中只有一个函数 g g , 如果
y = f ( g 1 ( x ) , g 2 ( x ) , g 3 ( x ) , . . . , g n ( x ) ) y=f(g_1(x), g_2(x),g_3(x),...,g_n(x))

d y d x = i = 1 n d f d g i d g i d x \frac{dy}{dx}=\sum_{i=1}^{n}\frac{df}{dg_i}\frac{dg_i}{dx}

f f 中包括多个函数,则每个函数都对 x x 求导,结果相加

再复杂一点
y = f ( g 1 ( x 1 , x 2 , x 3 , . . . , x m ) , g 2 ( x 1 , x 2 , x 3 , . . . , x m ) , g 3 ( x 1 , x 2 , x 3 , . . . , x m ) , . . . , g n ( x 1 , x 2 , x 3 , . . . , x m ) ) y=f(g_1(x_1,x_2,x_3,...,x_m), g_2(x_1,x_2,x_3,...,x_m),g_3(x_1,x_2,x_3,...,x_m),...,g_n(x_1,x_2,x_3,...,x_m))

d y d x j = i = 1 n d f d g i d g i d x j \frac{dy}{dx_j}=\sum_{i=1}^{n}\frac{df}{dg_i}\frac{dg_i}{dx_j}

求导的网络表示

数值求导

数值求导是严格按照导数定义进行的
f ( x ) = f ( x + d x ) f ( x ) d x f(x)^\prime = \frac{f(x+dx) - f(x)}{dx}
给定(x,dx),只要dx足够小,在一定误差范围内,把(x,dx)数值带入上式可以得到 f ( x ) f(x) x x 处的导数。这种方法是有误差的,而且随着参数增加,计算量也线性提高,实用性不高。但是它可以用来校验求导代码的正确性:完成求导代码同时也要完成前向代码,对输入和参数设置初始值,前向计算输出,然后对某个参数施加扰动,重新前向计算输出,两个输出的差除以扰动得到的就是该参数在当前输入下的扰动,在误差允许范围内,应该和求导代码给出的导数一致。

f ( x ) = w x = 2 x f(x) = wx = 2x

x x d x dx f ( x + d x ) f ( x ) f(x+dx)-f(x) $f^\prime = w =2 $
1 0.01 2.02 - 2 2.02 2 0.01 = 2 \frac{2.02-2}{0.01}=2
10 0.1 20.2 - 20 20.2 20 0.1 = 2 \frac{20.2-20}{0.1}=2
0.5 0.001 1.002 - 1 1.002 1 0.001 = 2 \frac{1.002-1}{0.001}=2

f ( x ) = x 2 f(x) = x^2

x x d x dx f ( x + d x ) f ( x ) f(x+dx)-f(x) $f^\prime = 2x $
1 0.01 1.0201 - 1 1.0201 1 0.01 = 2.010 2 x \frac{1.0201 - 1}{0.01}=2.010 \simeq 2x
10 0.1 102.01 - 100 102.01 100 0.1 = 20.1 2 x \frac{102.01 - 100}{0.1}= 20.1 \simeq 2x
0.5 0.001 0.251001 - 0.25 0.251001 0.25 0.001 = 1.001 2 x \frac{0.251001 - 0.25}{0.001}=1.001 \simeq 2x

f ( x ) = e x f(x) = e^x

x x d x dx f ( x + d x ) f ( x ) f(x+dx)-f(x) $f^\prime = e^x $
1 0.01 2.7456 - 2.7182 2.7456 2.7182 0.01 = 2.7319 e 1 \frac{2.7456 - 2.7182}{0.01}=2.7319 \simeq e^1
10 0.1 24343.0094 - 22026.46579 24343.0094 22026.46579 0.1 = 23165.436 e 10 \frac{24343.0094 - 22026.46579}{0.1}= 23165.436 \simeq e^{10}
0.5 0.001 1.65037 - 1.648721 1.65037 1.648721 0.001 = 1.64954590 e 0.5 \frac{1.65037 - 1.648721}{0.001}=1.64954590 \simeq e^{0.5}

为什么梯度负方向是局部下降最快的方向

证明: f ( x ) f(x) x 0 x_0 附近最小值是 x 1 x_1 , 则下降最快的方向和向量 x 1 x 0 x_1 - x_0 方向一致

  • 关键点

    1. 假设 x 0 x_0 附近的最小值点是 x 1 x_1 ,则下降最快的射线是 x 1 x 0 x_1 - x_0 ,而不是
      x 0 x 1 x_0 - x_1
    2. 同样在1中假设下, f ( x 1 ) f ( x 0 ) < 0 f(x_1) - f(x_0) < 0
  • 推导
    考虑泰勒展开式,忽略一阶以上的项
    f ( x ) = f ( x 0 ) + f ( x 0 ) ( x x 0 ) f(x) = f(x_0) + f^\prime(x_0)(x-x_0)

f ( x ) f ( x 0 ) = f ( x 0 ) ( x x 0 ) \rightarrow f(x) - f(x_0) = f^\prime(x_0)(x-x_0)
当前点是 x 0 x_0 ,令 x 1 x_1 x 0 x_0 附近的局部极小值点,则 x 1 x 0 x_1 - x_0 f ( x ) f(x) x 0 x_0 附近下降最快的方向
f ( x 1 ) f ( x 0 ) = f ( x 0 ) ( x 1 x 0 ) = a b c o s ( θ ) [ a b , a b ] \rightarrow f(x_1) - f(x_0) = f^\prime(x_0)(x_1-x_0) = |a||b|cos(\theta) \in [-|a||b|, |a||b|]
其中 a |a| f ( x 0 ) f^\prime(x_0) 的模, b |b| x 1 x 0 x_1-x_0 的模, θ \theta 是二者的夹角。

因为 x 1 x_1 x 0 x_0 附近的最小值点,则 f ( x 1 ) f ( x 0 ) = a b c o s θ = 1 θ = 180 f(x_1) - f(x_0) = -|a||b| \rightarrow cos\theta = -1 \rightarrow \theta = 180 ,即向量 x 1 x 0 x_1-x_0 这个梯度下降最快的方向和 f ( x ) f^\prime(x) 夹角180,方向相反

猜你喜欢

转载自blog.csdn.net/z0n1l2/article/details/83515904