注:说实话如果单纯看书,我觉得难度很大,但现在有了ChatGPT,不懂的直接甩过去,给我讲的明明白白,顺带一连串的彩虹屁,让我觉得我马上就能训练出ChatGPT 6!
导数就是一个函数在他的参数作用下,变化的速率。
并不是所有函数都可以求导,对那些不可以求导的,如果我们仍然想在深度学习里面去训练,可以用中间结果,而不是最终结果(举例比如分类问题,他们的值不连续)。
函数的导数可以有多种表示形式:
f′(x)=y′=dxdy=dxdf=dxdf(x)下面是一些常见函数的导数:
dxdCdxdxndxdexdxdlnx=0=nxn−1=ex=x−1for any constant C 然后是一些求导时候函数组合的常用规则:
dxd[Cf(x)]dxd[f(x)+g(x)]dxd[f(x)g(x)]dxdg(x)f(x)=Cdxdf(x)=dxdf(x)+dxdg(x)=f(x)dxdg(x)+g(x)dxdf(x)=g2(x)g(x)dxdf(x)−f(x)dxdg(x) 首先偏导数是指固定其他变量,只研究一个变量的导数。用数学公式的话就是:
∂xi∂y=h→0limhf(x1,…,xi−1,xi+h,xi+1,…,xn)−f(x1,…,xi,…,xn)简单一点也就是这个公式:
∂xi∂y=∂xi∂f=∂xif=∂if=fxi=fi=Dif=Dxif 公式不太好理解,看下面的例子:
z=x2+y2然后 x 的偏导数就是:计算时把除 x 以外的变量当作常数。对 z=x2+y2 来说,y2 相对于 x 就是常数项:
x2+常数那结果就是:
∂x∂f=2x梯度下降的公式就是,对所有的变量分别求偏导数,然后把他们放到一个向量里面,然后再把这个向量转置一下,就行了:
∇xf(x)=[∂x1f(x),∂x2f(x),...,∂xnf(x)]T那为什么最后要转置一下呢?因为比如有x,y,z三个变量,那这个函数的输入就是
f=xyz同时假设他的梯度是:
∇f=456学习率用这个:
η=0.1那么计算结果就是:
123−0.1456=0.61.52.4如果求梯度的时候不转置一下,计算的时候就要先转置一下,要不然无法计算。
据说这是深度学习里面最重要的公式。用最简单的话描述就是:把从 x_i 到 y 的所有路径都找出来,每条路径上的导数相乘,最后全部相加。公式的简单版本是:
dxdy=dudy⋅dxdu而它的超长版本就是:
∂xi∂y=∂u1∂y∂xi∂u1+∂u2∂y∂xi∂u2+⋯+∂um∂y∂xi∂um举一个实际的例子:
u1=x+y u2=xy z=u1+u2而我们要求的就是:
∂x∂z计算结果就是:
∂x∂z=1+y我们大学的微积分里面讲求导一般是2种方法,一种是数值微分,另一种是符号函数求导。但这里新增了一种方法就是自动微分。
最笨的方法,根据导数定义:
f′(x)=hf(x+h)−f(x)比如下面的方程:
f(x)=x2x=3h=0.0001那对应的计算过程就是:
(3.00012−32)/0.0001≈6.0001但这种方法很慢,有误差,基本不会用,只是一种定义
比如下面的求导过程:
x2+3x+5↓2x+3当这个函数越来越长的时候,表达式会爆炸,在深度学习里面不适用
想要理解自动微分,我们有个前提条件得知道,深度学习里面,我们是知道计算步骤的,步骤里面的参数的值我们也知道(只是不知道最优质,最初一般是用随机数填充,慢慢调整),然后我们把计算步骤全部记下来,然后反向求导。这个反向过程是用了上面的链式法则。
因为正向求导和反向求导的计算量不一样,反向求导计算量少,比如下面的例子,我们分别用正向求导和反向求导都来一遍,对比一下。
abL=w1x=w2a=b2假设这一轮的输入是:
w1=2,x=3,w2=4我们先计算w1的偏导数,也就是说我们想计算:
∂w1∂L然后开始我们的表演,下面用到了链式法则,如果忘记了记得复习一下。先计算a=w1x:
a=w1x=2∗3=6对应的导数:∂w1∂a=∂w1∂(w1x)=x∂w1∂w1=x=3然后计算b=w2a:
b=w2a=4∗6=24∂w1∂b=∂w1∂(w2a)=w2∗∂w1∂a=w2∗3=12然后我们再计算L=b2:
L=b2=242=576b∂L=∂b∂b2=2b∂b∂b=2b∂w1∂L=∂w1∂b2=2b∂w1∂b=2b∗12=2∗24∗12=576这次我们是想要计算
∂w2∂L然后我们要逐步开始计算,a=w1x, a=6不变,然后求导:
∂w2∂a=∂w2∂w1x=0第二步b=w2a,b=24不变,然后求导:
∂w2∂b=∂w2∂(w2a)=a∂w2∂w2=6第三步计算L=b2,L=576不变,然后求导:
∂w2∂L=∂w2∂b2=2b∂w2∂b=2b∗6=2∗24∗6=288那我们先正向算一下结果:
abL=w1x=2×3=6=w2a=4×6=24=b2=24×24=576现在开始反向传播,L=b2,那么:
∂b∂L=2b=48然后看b=w2a:
w2∂b=w2∂(w2a)=a=6∂w2∂L=∂b∂L∗∂w2∂b=48∗6=288∂a∂b=∂a∂(w2a)=w2∂a∂a=4∂a∂L=∂b∂L∗∂a∂b=48∗4=192最后看a=w1x:
∂w1∂a=∂w1∂(w1x)=x∂w1∂w1=3∂x∂a=x∂(w1x)=w1∂x∂x=2∂w1∂L=∂a∂L∗∂w1∂a=192∗3=576∂x∂L=∂a∂L∗∂x∂a=192∗2=384所以通过上面的对比可以看出,反向求导顺手得多,而且计算步骤也比较节省。