二分类原理
分类函数
对率函数Logistic Function,本身是激活函数,又可以当作二分类的分类函数。
公式
a
(
z
)
=
1
1
+
e
−
z
a(z) = \frac{1}{1 + e^{-z}}
a(z)=1+e−z1
导数
a
′
(
z
)
=
a
(
z
)
(
1
−
a
(
z
)
)
a^{'}(z) = a(z)(1 - a(z))
a′(z)=a(z)(1−a(z))
输出值域
[
0
,
1
]
[0,1]
[0,1]
使用方式
此函数实际上是一个概率计算,它把
[
−
∞
,
∞
]
[-\infty, \infty]
[−∞,∞]之间的任何数字都压缩到[0,1]之间,返回一个概率值。这就是它的工作原理。
训练时,一个样本x在经过神经网络的最后一层的矩阵运算后的结果作为输入,经过Sigmoid后,输出一个[0,1]之间的预测值。我们假设这个样本的标签值为0(属于负类,另外一类是第1类属于正类),如果其预测值越接近0,就越接近标签值,那么误差越小,反向传播的力度就越小。
推理时,我们预先设定一个阈值,比如上图中的红线,我们设置阈值=0.5,则当推理结果大于0.5时,认为是正类;小于0.5时认为是负类;等于0.5时,根据情况自己定义。阈值也不一定就是0.5,也可以是0.65等等,阈值越大,准确率越高,召回率越低;阈值越小则相反。
正向计算
神经网络计算
(1)
z
i
=
w
x
i
+
b
z_i = wx_i+b \tag{1}
zi=wxi+b(1)
分类计算
(2)
a
i
=
1
1
+
e
−
z
i
a_i={1 \over 1 + e^{-z_i}} \tag{2}
ai=1+e−zi1(2)
损失函数计算
(3)
J
(
w
,
b
)
=
−
1
m
∑
i
=
1
m
y
i
ln
(
a
i
)
+
(
1
−
y
i
)
ln
(
1
−
a
i
)
J(w,b) = -{1 \over m} \sum^m_{i=1}y_i \ln (a_i)+(1-y_i) \ln (1-a_i) \tag{3}
J(w,b)=−m1i=1∑myiln(ai)+(1−yi)ln(1−ai)(3)
反向传播
对公式3求导: (4) ∂ J ∂ a i = − 1 m ∑ i = 1 m ( y i a i − 1 − y i 1 − a i ) = − 1 m ∑ i = 1 m y i − a i a i ( 1 − a i ) {\partial{J} \over \partial{a_i}}= -{1 \over m} \sum^m_{i=1} ({y_i \over a_i} - {1-y_i \over 1-a_i})=-{1 \over m} \sum^m_{i=1}{y_i-a_i \over a_i(1-a_i)} \tag{4} ∂ai∂J=−m1i=1∑m(aiyi−1−ai1−yi)=−m1i=1∑mai(1−ai)yi−ai(4)
对公式2求导: (5) ∂ a i ∂ z i = a i ( 1 − a i ) {\partial{a_i} \over \partial{z_i}}=a_i(1-a_i) \tag{5} ∂zi∂ai=ai(1−ai)(5)
用链式法则结合公式4,5:
∂ J ∂ z i = ∂ J ∂ a i ∂ a i ∂ z i {\partial{J} \over \partial{z_i}}={\partial{J} \over \partial{a_i}}{\partial{a_i} \over \partial{z_i}} ∂zi∂J=∂ai∂J∂zi∂ai
= − 1 m ∑ i = 1 m y i − a i a i ( 1 − a i ) ⋅ a i ( 1 − a i ) =-{1 \over m} \sum^m_{i=1}{y_i-a_i \over a_i(1-a_i)} \cdot a_i(1-a_i) =−m1i=1∑mai(1−ai)yi−ai⋅ai(1−ai)
= − 1 m ∑ i = 1 m ( y i − a i ) =-{1 \over m} \sum^m_{i=1}(y_i-a_i) =−m1i=1∑m(yi−ai)
(6) = 1 m ∑ i = 1 m ( a i − y i ) ={1 \over m} \sum^m_{i=1}(a_i-y_i) \tag{6} =m1i=1∑m(ai−yi)(6)
至此,我们得到了z的误差,进一步向后传播给w和b,对公式1求导可知:
(7) ∂ z i ∂ w = x i {\partial{z_i} \over \partial{w}} = x_i \tag{7} ∂w∂zi=xi(7)
(8) ∂ z i ∂ b = 1 {\partial{z_i} \over \partial{b}} = 1 \tag{8} ∂b∂zi=1(8)
用链式法则结合公式6,7,8:
(9) ∂ J ∂ w = ∂ J ∂ z i ∂ z i ∂ w = 1 m ∑ i = 1 m ( a i − y i ) x i {\partial{J} \over \partial{w}}={\partial{J} \over \partial{z_i}}{\partial{z_i} \over \partial{w}}={1 \over m} \sum^m_{i=1}(a_i-y_i)x_i \tag{9} ∂w∂J=∂zi∂J∂w∂zi=m1i=1∑m(ai−yi)xi(9)
(10) ∂ J ∂ b = ∂ J ∂ z i ∂ z i ∂ b = 1 m ∑ i = 1 m ( a i − y i ) {\partial{J} \over \partial{b}}={\partial{J} \over \partial{z_i}}{\partial{z_i} \over \partial{b}}={1 \over m} \sum^m_{i=1}(a_i-y_i) \tag{10} ∂b∂J=∂zi∂J∂b∂zi=m1i=1∑m(ai−yi)(10)
神经网络的线性二分类工作原理
如图所示:假设绿色方块为正类:标签值
y
=
1
y=1
y=1,红色三角形为负类:标签值
y
=
0
y=0
y=0。
从直观上理解,如果我们有一条直线,其公式为: z = w ⋅ x 1 + b z = w \cdot x1+b z=w⋅x1+b,如图中的虚线所示,则所有正类的样本的x2都大于z,而所有的负类样本的x2都小于z,那么这条直线就是我们需要的解决方案。用正例的样本来表示: (11) x 2 > z , 即 : x 2 > w ⋅ x 1 + b x2 > z,即:x2 > w \cdot x1 + b \tag{11} x2>z,即:x2>w⋅x1+b(11)
那么神经网络用矩阵运算+分类函数+损失函数这么复杂的流程,其工作原理是什么呢?
经典机器学习中的SVM确实就是用这种思路来解决这个问题的,即一个类别的所有样本在分割线的一侧,而负类样本都在线的另一侧。神经网络的正向公式是这样:
Z = w 1 ⋅ x 1 + w 2 ⋅ x 2 + b Z = w1 \cdot x1 + w2 \cdot x2 + b Z=w1⋅x1+w2⋅x2+b
A
=
s
i
g
m
o
i
d
(
Z
)
=
1
1
+
e
−
Z
A = sigmoid(Z) = {1 \over 1 + e^{-Z}}
A=sigmoid(Z)=1+e−Z1
当A>0.5时,为正类。当A<0.5时,为负类。我们用正类来举例子:
A = s i g m o i d ( Z ) = 1 1 + e − Z > 0.5 A = sigmoid(Z) = {1 \over 1 + e^{-Z}} > 0.5 A=sigmoid(Z)=1+e−Z1>0.5
做公式变形,再两边取自然对数,可以得到:
Z > 0 Z > 0 Z>0
即: Z = w 1 ⋅ x 1 + w 2 ⋅ x 2 + b > 0 Z = w1 \cdot x1 + w2 \cdot x2 + b > 0 Z=w1⋅x1+w2⋅x2+b>0 对上式做一下变形,把x2放在左侧,其他项放在右侧: (12) x 2 > − w 1 w 2 x 1 − b w 2 x2 > - {w1 \over w2}x1 - {b \over w2} \tag{12} x2>−w2w1x1−w2b(12) 简化一下两个系数,令w’=-w1/w2,b’=-b/w2: (13) x 2 > w ′ x 1 + b ′ x2 > w'x1 + b' \tag{13} x2>w′x1+b′(13) 比较一下公式11和13, (11) x 2 > w ⋅ x 1 + b x2 > w \cdot x1 + b \tag{11} x2>w⋅x1+b(11)
一模一样!这就说明神经网络的数学原理和我们在二维平面上的直观感觉是相同的。由此,我们还得到了一个额外的收获,即:
(14) w = w ′ = − w 1 / w 2 w = w' = - w1 / w2 \tag{14} w=w′=−w1/w2(14)
(15) b = b ′ = − b / w 2 b = b' = -b/w2 \tag{15} b=b′=−b/w2(15)
我们可以使用神经网络计算出w1,w2,B以后,换算成w,b来在二维平面上画那根直线,来直观地判断神经网络的正确性。
对数几率回归 Logistic Regressio(逻辑回归)
经过数学推导后可以知道,神经网络实际也是在做这样一件事:经过调整w和b的值,把所有正例的样本都归纳到大于0.5的范围内,所有负例都小于0.5。只说大于或者小于,无法做准确的量化计算,所以用一个对率函数来模拟。
那么问题又来了
为啥叫做“对数几率”函数呢?从哪里看出是“对数”了?“几率”是什么意思呢?
解答
(1)
z
=
w
x
+
b
z = wx+b \tag{1}
z=wx+b(1)
(2)
a
=
1
1
+
e
−
z
a={1 \over 1 + e^{-z}} \tag{2}
a=1+e−z1(2) 组合二者:
a
=
1
1
+
e
−
(
w
x
+
b
)
a={1 \over 1 + e^{-(wx+b)}}
a=1+e−(wx+b)1 做公式变形:
e
−
(
w
x
+
b
)
=
1
−
a
a
e^{-(wx+b)}={1-a \over a}
e−(wx+b)=a1−a 两侧取对数,再乘以-1:
(12)
ln
a
1
−
a
=
w
x
+
b
\ln {a \over 1-a} = wx+b \tag{12}
ln1−aa=wx+b(12)
上式中,如果a是把样本x的预测为正例的可能性,那么1-a就是其负例的可能性,a/(1-a)就是正负例的比值,称为几率(odds),反映了x作为正例的相对可能性,而对几率取对数就叫做对数几率(log odds, logit)。
优点
- 直接对分类可能性建模,无需事先假设数据分布,避免了假设分布不准确所带来的问题
- 不仅预测出类别,而是得到了近似的概率,这对许多需要利用概率辅助决策的任务很有用
- 对率函数是任意阶可导的凸函数,有很好的数学性,许多数值优化算法都可以直接用于求取最优解
总结
将数据输入到神经网络之后,不管是对权重还是偏置的回归,在二分类问题上,经过数学变换均可以映射到形式为 w x + b wx+b wx+b的变化,关于对数,则表示样本作为正例的可能性。