深度学习理论基础14-数值微分

先来看一个导数的公式


其中h是趋近无限小的数。导数表示x方向的微小变化导致f(x)的值在多大程度发生变化。

如果用代码帮助你的理解,这个代码是这样的:

def numerical_diff(f, x):
    h = 10e-50
    return (f(x+h) - f(x)) / h

现在你大约了解了导数是怎么回事(学渣才不知道的吧,喂!)

但是这个实现是不能用的。因为小数点后50位早就被计算机省略了。10e-50对计算机来说就是个0。
所以这个实现需要改进。实际上可以把h改为0.0001。
咦,这个值会不会太大了?造成导数的误差太大吧?没关系,有一个很好的办法可以把误差缩小。
中心差分!(谁人不屑?又谁人懵逼?)


(f(x+h) - f(x-h)) / (2*h)
通过图表可以看出,f(x+h) 与 f(x-h)的中点位置已经非常接近真实的导数了。
相像一下,(f(x+h) - f(x)) / h(注意:这叫向前差分)的图像怎么表示呢?它与导数的误差大约是什么水平呢?
当你想明白中心差分比向前差分更准确这一点,请继续下面的内容。
--------偏导数--------
下面是一个函数(多个变量)的公式


代码

def function_2(x):
    return x[0]**2 + x[1]**2


图像化表示:


那么,什么是偏导数呢?
为x0赋值,求此时x1的导数,这就叫偏导数了。
为x1赋值,求此时x0的导数,这也叫偏导数了。
偏导数怎么求?
第一步,为其中一个变量赋值,得到一个新的函数
第二步,求这个新函数在某点的导数
问题举例:求x 0 = 3, x 1 = 4时,关于x 0 的偏导数
第一步:为其中一个变量赋值,得到一个新的函数
因为要求关于x0的偏导数,所以把x1赋值,得到函数

def function_tmp1(x0):
    return x0**2 + 4**2


第二步,求这个新函数在某点的导数
实际我们求的是function_tmp1()在点3的导数。
这个还真难不倒我们,
d=numerical_diff(function_tmp1, 3)
结果为6.00000000000378
至此,我们掌握了类似“求x 0 = 3, x 1 = 4时,关于x 0 的偏导数”这样的问题的求解步骤。
请理解偏导数并掌握其实现方法。下一节将会使用偏导数的知识去实现梯度。
而后面深度学习的实现又依赖于梯度法,人工智能的问世又依赖于深度学习,
火星殖民又依赖于人工智能(好严谨的逻辑,我竟然无言以对。。。)


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值