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