损失函数
我们在逻辑回归中用到的损失函数是:
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
常见的求导公式