损失函数
我们在逻辑回归中用到的损失函数是:
L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
为什么要用这个函数作为逻辑损失函数?当我们使用平方误差作为损失函数的时候,你
会想要让这个误差尽可能地小,对于这个逻辑回归损失函数,我们也想让它尽可能地小,为
了更好地理解这个损失函数怎么起作用,举两个例子:
当y = 1时损失函数L=−log(y^),如果想要损失函数L尽可能得小,那么y^就要尽可能大,因为 sigmoid 函数取值[0,1],所以y^会无限接近于 1。
当y = 0时损失函数L(y^,y)=−(1−y)log(1−y^),如果想要损失函数L尽可能得小,那么y^就要尽可能小,因为 sigmoid 函数取值[0,1],所以y^会无限接近于 0
成本函数
损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:
逻辑回归中的梯度下降
假设样本只有两个特征x1和x2,为了计算z,我们需要输入参数w1、 w2和b,除此之外还有特征值x1和x2。因此z的计算公式为z=w1x1+w2x2
回想一下逻辑回归的公式定义如下:y^=a=σ(z))其中z=wTx+b,σ(z)=11+e−z
损失函数:
L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
代价函数:
假设现在只考虑单个样本的情况,单个样本的代价函数定义如下:
L(a,y)=−ylog(a)−(1−y)log(1−a)
其中a是逻辑回归的输出, y是样本的标签值
w和b的修正量可以表达如下
w=w−a∂J(w,b)∂w
, b=b−a∂J(w,b)∂b
因为我们想要计算出的代价函数L(a,y)的导数,首先我们需要反向计算出代价函
数L(a,y)关于a的导数,在编写代码时,你只需要用da 来表示dL(a,y)da
通过微积分得到:dL(a,y)da=−ya+(1−y)1−a
这个结果是通过对代价函数L(a,y)求a的偏导得出来的,求偏导时将y看成常量,a看成变量,通过求导公式得到loga的导数为1a,这里的loga 我更倾向于用lna来表示,因为loga求导过后会有个常量ln10,而lna 求导过后就是1a,虽然没有资料直接说明此处就是ln 但是通过对结果的反推,个人感觉应该是ln函数。同理对log(1−a) 求导得到−11−a,为什么要加个”−”号,因为这是复合函数,对log求完导后还要对1−a 求导,而1−a 对a求导得到的就是−1 ,因此需要加一个”− “号。
此时,我们已经完成代价函数对a 的偏导,接下来需要求代价函数对z的偏导。对z的求偏导,需要利用微分里的链式法则。即:dL(a,y)dz=dLdz=dLda⋅dadz
这里的dLda我们已经求出来过了,也就是da,前面有提到y^=a=σ(z),
而sigma函数的表达式又为11+e−z,即a=σ(z)=11+e−z 这时我们就可以求出a对z的偏导数了,也就是说求出dadz,同样的我们这里还是利用求导公式将1+e−z看做一个整体,令t=1+e−z,对σ(z)进行求导得到σ′(z)=−1t2 ,因为t 也是的z函数,所以还需要对t进行求导,求导方式同样是使用复合函数的求导原则得到t′=−e−z,因此,σ′(a)=−1(1+e−z)2⋅(−e−z)=e−z(1+e−z)2=1+e−z−1(1+e−z)2=a−a2
,为什么结果会变成a−a2,因为我们定义的a=σ(z)=11+e−z ,所以dadz最终结果为a−a2,再利用之前的链式法则,可以得到dL(a,y)dz=dLda⋅dadz=(−ya+(1−y)1−a)⋅(a−a2)=a−y
接下来需求求解的是就是dw=dL(a,y)dw,同样的还是利用链式法则我们可以得到
dw=dL(a,y)dw=dLdw=dLda⋅dadz⋅dzdw
,在前面的过程中我们求出了dLda和dadz,现在我们需要求的就是dzdw,因此我们需要知道w对z的函数也就是z=wx+b,这样求w对z的偏导就很容易了,只需将x看成常量即可,得到dzdw=x,所以dw=dz⋅x,同样的方法可以求出dzdb=1,也就是说db=dz
常见的求导公式