分割线
逻辑回归
已知:给定数据,包含数据的特征和label
问题:二分类,根据数据的特征,对数据二分类。
例子:给定一个肿瘤的特征,如大小形状等等,判断是否是恶性肿瘤。
基础:线性回归,输入一个肿瘤各种特征,经过线性变换得到一个预测值y,若y>0.5为恶性,y<0.5为良性。
大概原理:
逻辑回归是在线性回归的基础上,增加了一个sigmoid函数。 为什么要增加这么一个函数呢?一个原因是线性回归的鲁棒性很差,就是因为线性回归需要作用于整个实数域,或者说,对整个实数域敏感,而分类的话,只需要在0,1之间分类就好了。sigmiod函数就能把预测区间减少到零到一。同时这个函数是单调可微的。
有了Sigmoid fuction之后,由于其取值在[0,1],我们就可以将sigmoid的结果 ϕ(x)当作类别1的后验概率估计p(y=1|x),也就是该点属于类别1的概率。
如果这个结果>0.5那么归为类别1,反之归为类别0.
那我们现在逻辑回归模型预测的流程就变成了:输入数据及特征 -> 经过线性变换和sigmoid函数输出一个预测值 -> 根据预测值的大小分类。
loss function选取:
模型参数:ω和b,也就是权重和偏差。
一般机器学习和深度学习的训练就是降低损失函数。
逻辑回归特殊之处是用最大似然的方法来做,个人感觉和降低损失函数差不多。
为什么不用mse,理论上来说mse也可以作为loss function,但是其图像可能有较多局部最小值,不平滑。所以mse对于之后的sgd步骤不太友好。
那么极大似然函数如何推导:
ϕ(z)可以视为类别1的后验估计,即:
p
(
y
=
1
∣
x
;
ω
)
=
ϕ
(
ω
T
+
b
)
=
ϕ
(
z
)
p(y=1|x;\omega) = \phi(\omega^T+b) = \phi(z)
p(y=1∣x;ω)=ϕ(ωT+b)=ϕ(z)
那么关于类别0,自然有:(因为是二分类)
p
(
y
=
0
∣
x
;
ω
)
=
1
−
ϕ
(
z
)
p(y=0|x;\omega) = 1-\phi(z)
p(y=0∣x;ω)=1−ϕ(z)
把上面两个公式合起来写:
p
(
y
∣
x
;
ω
)
=
ϕ
(
z
)
y
⋅
(
1
−
ϕ
(
z
)
)
1
−
y
p(y|x;\omega)=\phi(z)^y \cdot (1−\phi(z))^{1−y}
p(y∣x;ω)=ϕ(z)y⋅(1−ϕ(z))1−y
y=1时转换为第一个式子,y=0时转换为第二个式子。
我们现在已知很多样本,我们需要找到参数
ω
\omega
ω,使用最大似然函数来估计参数:
L
(
ω
)
=
∏
i
=
1
n
p
(
y
(
i
)
∣
x
(
i
)
;
ω
)
=
∏
i
=
1
n
(
ϕ
(
z
(
i
)
)
)
y
(
i
)
⋅
(
1
−
ϕ
(
z
(
i
)
)
)
1
−
y
(
i
)
L(\omega) = \prod_{i=1}^n p(y^{(i)}|x{(i)};\omega) = \prod_{i=1}^n(\phi(z^{(i)}))^{y^{(i)}} \cdot (1−\phi(z^{(i)}))^{1−y^{(i)}}
L(ω)=i=1∏np(y(i)∣x(i);ω)=i=1∏n(ϕ(z(i)))y(i)⋅(1−ϕ(z(i)))1−y(i)
取对数:
l
(
ω
)
=
ln
L
(
ω
)
=
∑
i
=
1
n
y
(
i
)
ln
(
ϕ
(
z
(
i
)
)
)
+
(
1
−
y
(
i
)
)
ln
(
1
−
ϕ
(
z
(
i
)
)
)
l(\omega) = \ln L(\omega)=\sum_{i=1}^n y^{(i)} \ln (\phi(z^{(i)})) + (1-y^{(i)})\ln (1-\phi(z^{(i)}))
l(ω)=lnL(ω)=i=1∑ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
再取反:
J
(
ω
)
=
−
l
(
ω
)
=
−
∑
i
=
1
n
y
(
i
)
ln
(
ϕ
(
z
(
i
)
)
)
+
(
1
−
y
(
i
)
)
ln
(
1
−
ϕ
(
z
(
i
)
)
)
J(\omega)=-l(\omega) = -\sum_{i=1}^n y^{(i)} \ln (\phi(z^{(i)})) + (1-y^{(i)})\ln (1-\phi(z^{(i)}))
J(ω)=−l(ω)=−i=1∑ny(i)ln(ϕ(z(i)))+(1−y(i))ln(1−ϕ(z(i)))
这就是loss function了,因为最大似然函数估计参数是要最大化,所以我们取反后就是最小化,可以用gradient descent了。
当然这是对所有的数据(样本),只取一个看:
J
(
ϕ
(
z
)
,
y
;
ω
)
=
−
y
ln
(
ϕ
(
z
)
)
−
(
1
−
y
)
ln
(
1
−
ϕ
(
z
)
)
J(\phi(z),y;\omega) = - y \ln (\phi(z)) - (1-y)\ln (1-\phi(z))
J(ϕ(z),y;ω)=−yln(ϕ(z))−(1−y)ln(1−ϕ(z))
sgd训练:
sigmoid function有一个很好的性质就是
ϕ
′
(
z
)
=
ϕ
(
z
)
(
1
−
ϕ
(
z
)
)
\phi^{'}(z) = \phi(z)(1-\phi(z))
ϕ′(z)=ϕ(z)(1−ϕ(z))
sgd更新梯度如下:
∂
J
(
ω
)
∂
ω
j
=
⋯
=
−
∑
i
=
1
n
(
y
(
i
)
−
ϕ
(
z
(
i
)
)
)
x
j
(
i
)
\frac {\partial J(\omega)} {\partial \omega_j} = \cdots = -\sum_{i=1}^n (y^{(i)} - \phi(z^{(i)})) x_j^{(i)}
∂ωj∂J(ω)=⋯=−i=1∑n(y(i)−ϕ(z(i)))xj(i)
当然上面严格说来是gd不是sgd,sgd只需要更新几个而不是全部.
改进的随机梯度下降
1)在每次迭代时,调整更新步长alpha的值。随着迭代的进行,alpha越来越小,这会缓解系数的高频波动(也就是每次迭代系数改变得太大,跳的跨度太大)。当然了,为了避免alpha随着迭代不断减小到接近于0(这时候,系数几乎没有调整,那么迭代也没有意义了),我们约束alpha一定大于一个稍微大点的常数项,具体见代码。
2)每次迭代,改变样本的优化顺序。也就是随机选择样本来更新回归系数。这样做可以减少周期性的波动,因为样本顺序的改变,使得每次迭代不再形成周期性。
改进的随机梯度下降算法的伪代码如下:
################################################
初始化回归系数为1
重复下面步骤直到收敛{
对随机遍历的数据集中的每个样本
随着迭代的逐渐进行,减小alpha的值
计算该样本的梯度
使用alpha x gradient来更新回归系数
}
返回回归系数值
#################################################
几个问题:
交叉熵代价函数cross entropy通常用做多分类问题的loss function,其形式和上面的似然函数取对数很想,但其实是有信息论中信息熵的概论推导过来的。
sigmoid和softmax是神经网络输出层使用的激活函数,分别用于两类判别和多类判别。
binary cross-entropy和categorical cross-entropy是相对应的损失函数。