深度学习反向传播公式推导

损失函数


我们在逻辑回归中用到的损失函数是:

L(y^,y)=ylog(y^)(1y)log(1y^)

为什么要用这个函数作为逻辑损失函数?当我们使用平方误差作为损失函数的时候,你
会想要让这个误差尽可能地小,对于这个逻辑回归损失函数,我们也想让它尽可能地小,为
了更好地理解这个损失函数怎么起作用,举两个例子:
当y = 1时损失函数L=log(y^),如果想要损失函数L尽可能得小,那么y^就要尽可能大,因为 sigmoid 函数取值[0,1],所以y^会无限接近于 1。
当y = 0时损失函数L(y^,y)=(1y)log(1y^),如果想要损失函数L尽可能得小,那么y^就要尽可能小,因为 sigmoid 函数取值[0,1],所以y^会无限接近于 0

成本函数


损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:
深度学习反向传播公式推导

逻辑回归中的梯度下降


假设样本只有两个特征x1x2,为了计算z,我们需要输入参数w1w2和b,除此之外还有特征值x1x2。因此z的计算公式为z=w1x1+w2x2
回想一下逻辑回归的公式定义如下:y^=a=σ(z))其中z=wTx+bσ(z)=11+ez
损失函数:

L(y^,y)=ylog(y^)(1y)log(1y^)

代价函数:
深度学习反向传播公式推导
假设现在只考虑单个样本的情况,单个样本的代价函数定义如下:
L(a,y)=ylog(a)(1y)log(1a)

其中a是逻辑回归的输出, y是样本的标签值
wb的修正量可以表达如下
w=waJ(w,b)w
,
b=baJ(w,b)b



因为我们想要计算出的代价函数L(a,y)的导数,首先我们需要反向计算出代价函
L(a,y)关于a的导数,在编写代码时,你只需要用da 来表示dL(a,y)da
通过微积分得到:
dL(a,y)da=ya+(1y)1a

这个结果是通过对代价函数L(a,y)求a的偏导得出来的,求偏导时将y看成常量,a看成变量,通过求导公式得到loga的导数为1a,这里的loga 我更倾向于用lna来表示,因为loga求导过后会有个常量ln10,而lna 求导过后就是1a,虽然没有资料直接说明此处就是ln 但是通过对结果的反推,个人感觉应该是ln函数。同理对log(1a) 求导得到11a,为什么要加个””号,因为这是复合函数,对log求完导后还要对1a 求导,而1aa求导得到的就是1 ,因此需要加一个” “号。


此时,我们已经完成代价函数对a 的偏导,接下来需要求代价函数对z的偏导。对z的求偏导,需要利用微分里的链式法则。即:
dL(a,y)dz=dLdz=dLdadadz
这里的dLda我们已经求出来过了,也就是da,前面有提到y^=a=σ(z),
而sigma函数的表达式又为11+ez,即a=σ(z)=11+ez 这时我们就可以求出az的偏导数了,也就是说求出dadz,同样的我们这里还是利用求导公式将1+ez看做一个整体,令t=1+ez,对σ(z)进行求导得到σ(z)=1t2 ,因为t 也是的z函数,所以还需要对t进行求导,求导方式同样是使用复合函数的求导原则得到t=ez,因此,
σ(a)=1(1+ez)2(ez)=ez(1+ez)2=1+ez1(1+ez)2=aa2
,为什么结果会变成aa2,因为我们定义的a=σ(z)=11+ez ,所以dadz最终结果为aa2,再利用之前的链式法则,可以得到
dL(a,y)dz=dLdadadz=(ya+(1y)1a)(aa2)=ay


接下来需求求解的是就是dw=dL(a,y)dw,同样的还是利用链式法则我们可以得到
dw=dL(a,y)dw=dLdw=dLdadadzdzdw
,在前面的过程中我们求出了dLdadadz,现在我们需要求的就是dzdwwz也就是z=wx+b,这样求wz的偏导就很容易了,只需将x看成常量即可,得到dzdw=x,所以dw=dzx,同样的方法可以求出dzdb=1db=dz

常见的求导公式

深度学习反向传播公式推导