深度学习入门

导数

[displaystyle frac{mathrm{d}(x)}{mathrm{d}x}=lim_{h o0}frac{f(x+h)-f(x)}{h} ]

h无限小,但是在python中不能设置得太小,否则会产生舍入误差。

np.float32最多到1e-45

由于h不可能无限接近0,(x + h)和x之间的斜率不能很好地近似x处的斜率,采用x+h和x-h来近似要更加精确。

因此可以定义求导函数为

def numerical_diff(f, x):
      h = 1e-4
      return (f(x+h) - f(x-h)) / (2*h)

利用微小的差分求导数的过程称为数值微分(numerical  differentiation)。而基于数学式的推导求导数的过程,称为“解析性求解”或者“解析性求导”。比如,y = x^2的导数,可以通过解析性地求解出来。因此,当x = 2时, y的导数为4。解析性求导得到的导数是不含误差的“真的导数”。

梯度

((dfrac{partial f}{partial x_0},dfrac{partial f}{partial x_1}))这样的由全部变量的偏导数汇总而成的向量称为梯度(gradient)。
梯度表示的是各点处的函数值减小最多的方向。

def numerical_gradient(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x)
    
    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = float(tmp_val) + h
        fxh1 = f(x) # f(x+h)
        
        x[idx] = tmp_val - h 
        fxh2 = f(x) # f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val # 还原值
        
    return grad

梯度下降法

函数的极小值、最小值以及鞍点(saddle point)处,梯度为0。
梯度法是要寻找梯度为0的地方,但是那个地 方不一定就是最小值(也有可能是极小值或者鞍点),只是沿着梯度的方向能够最大限度地减小函数的值。

[x_0=x_0-etadfrac{partial f}{partial x_0}\ x_1=x_1-etadfrac{partial f}{partial x_1} ]

原文地址:https://www.cnblogs.com/pengweii/p/12841619.html