开始断断续续看吴恩达老师的深度学习课程一段时间了,学习完了第一部分,不管是看视频还是做课后练习都让我有疯狂吹一下这个课程的冲动,是真的讲的很好啊!!
看完也想着自己慢慢总结一下加深理解,嗯,希望我不是下一个从入门到放弃的案例
单神经元(感知机)
感知机听着高大上一点,但是单神经元还是通俗易懂,就是字面意思一个神经元,这个概念来源于生物学,当一个神经元受到刺激信号(输入),自身的电位就会发生变化,如果这个电位超过了某个阈值,它就会兴奋起来并向其他神经元传递刺激信号(输出),将这个生物过程数学化就得到了以下模型:
其中
w
w
w 表示输入到神经元的连接的权重,
b
b
b 表示阈值,
f
f
f 表示激活函数,输出
y
y
y可以由下式得到
y
=
f
(
∑
i
=
0
n
w
i
x
i
+
b
)
y = f(\sum_{i=0}^n w_ix_i + b)
y=f(i=0∑nwixi+b)
n
n
n为输入神经元的个数,对于上图
n
=
3
n=3
n=3。上式就是一个神经元的输入–输出机制。
激活函数
f
f
f 常用的有 sigmoid, tanh和ReLU。Logistic回归使用的就是sigmoid函数。
Logistic回归解决二分类问题
简单来说,分类问题可以表示为给定一个特征向量,分类器得出这组特征对应的标签,对于二分类问题就是输出0或1。如果将输入特征和权重向量化,则分类问题可以表示为这样的一个映射关系(就是上面感知机的输入输出关系啊!):
w
T
x
+
b
⟶
y
^
w^Tx+b \longrightarrow \hat{y}
wTx+b⟶y^ 其中
w
∈
R
n
w \in R^n
w∈Rn,
x
∈
R
n
x \in R^n
x∈Rn,
n
n
n为输入特征的数量。输出
y
^
=
p
(
y
=
1
∣
x
)
\hat{y}=p(y=1|x)
y^=p(y=1∣x),表示分类到1的概率,因此
y
^
∈
[
0
,
1
]
\hat{y} \in [0,1]
y^∈[0,1]。
那么为什么不用线性函数来进行分类,直接让
y
^
=
w
T
x
+
b
\hat{y}=w^Tx+b
y^=wTx+b ?显然这样计算会导致
y
^
\hat{y}
y^ 的值无限增大,不满足
y
^
∈
[
0
,
1
]
\hat{y} \in [0,1]
y^∈[0,1] 这个条件。
上面提到Logistic回归使用了sigmoid函数,首先看看sigmoid函数的表达式:
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1 从表达式就可以看出sigmoid函数的函数值是一个小于等于1的正数,从函数图像能够更直观地看到这一点:
可以看出曲线从0平滑增长到1,所以可以很好地满足二分类任务的需求。这样对于Logistic回归
y
^
=
σ
(
w
T
x
+
b
)
\hat{y}=\sigma(w^Tx+b)
y^=σ(wTx+b)接下来就是怎么训练出一个Logistic回归分类器。训练这个分类器的过程实质上就是根据给定的样本的特征和标签(所以这是一个有监督的学习任务)来学习出感知机的权重和阈值参数。
为了训练出一个Logistic回归分类器,首先需要定义损失函数,进而通过梯度下降的方式优化这个损失函数得到最优的权重和阈值。直观上来讲,最简单的损失函数就是计算分类器的输出值
y
^
\hat{y}
y^ 和真实值之间的误差
e
r
r
o
r
=
1
2
(
y
^
−
y
)
2
error=\frac 12 (\hat{y}-y)^2
error=21(y^−y)2,但这样做的问题是error函数是非凸的,存在多个局部最优解,因此在使用梯度下降法可能会陷入局部最优解而无法找到全局最优解。所以在Logistic回归中损失函数用另一个函数来替代
L
(
y
,
y
^
)
=
−
(
y
log
y
^
+
(
1
−
y
)
log
(
1
−
y
^
)
)
L(y, \hat{y})=-(y\log\hat{y}+(1-y)\log(1-\hat{y}))
L(y,y^)=−(ylogy^+(1−y)log(1−y^)) 这个函数有一个很好的特性就是它是一个凸函数,也就是说我们可以使用梯度下降的方法很好地去逼近它的全局最优。
上面的损失函数是对于单个样本的,对于一次训练的多个样本需要对损失函数进行求和得到总的损失,进而求得使的这个总的损失最小的
w
w
w 和
b
b
b 。即
min
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
(
i
)
,
y
^
(
i
)
)
=
−
1
m
∑
i
=
1
m
y
(
1
)
log
y
^
(
i
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
\min J(w,b)=\frac 1m\sum_{i=1}^m{L(y^{(i)}, \hat{y}^{(i)})}=-\frac 1m\sum_{i=1}^m{y^{(1)}\log\hat{y}^{(i)}+(1-y^{(i)})\log(1-\hat{y}^{(i)})}
minJ(w,b)=m1i=1∑mL(y(i),y^(i))=−m1i=1∑my(1)logy^(i)+(1−y(i))log(1−y^(i)) 式中
m
m
m为样本数量。在得到总的损失之后,就可以通过梯度下降的方式不断地更新
w
w
w 和
b
b
b,也就是重复以下过程,直到找到全局最优解(或是一个理想的解)
w
=
w
−
α
d
J
(
w
,
b
)
d
w
w=w-\alpha\frac{dJ(w,b)}{dw}
w=w−αdwdJ(w,b)
b
=
b
−
α
d
J
(
w
,
b
)
d
b
b=b-\alpha\frac{dJ(w,b)}{db}
b=b−αdbdJ(w,b) 其中
α
\alpha
α表示学习率(通常是一个正值),通俗地说就是梯度下降的步长。
可以以一个一维
y
=
f
(
x
)
y=f(x)
y=f(x) 凸函数为例来简单理解一下梯度下降法的原理。
如图最优解对应 x ∗ x^* x∗,假设初始解为 x 0 x_0 x0,显然此时梯度 d y d x < 0 \frac{dy}{dx}<0 dxdy<0,则根据梯度下降的参数更新方式 x = x − α d y d x x=x-\alpha\frac{dy}{dx} x=x−αdxdy 知 x x x 会增大,假定第一次更新后到达 x 1 x_1 x1,以同样的方式顺着图中的轨迹最终到达最优解 x ∗ x^* x∗ 的位置。同理,如果初始解为 x 0 ′ x'_0 x0′,则梯度大于0, x x x 在更新的过程中会减小最终到达 x ∗ x^* x∗。可以看到步长参数 α \alpha α 会影响参数下一步的位置,因此 α \alpha α 的设置对求解结果也有很大的影响。关于梯度下降原理更详细的介绍可以看另外一位不知名大佬的文章。
至于梯度的求解,也就是分别求
J
(
w
,
b
)
J(w,b)
J(w,b) 关于
w
w
w 和
b
b
b的偏导数。首先先来看看
L
(
y
,
y
^
)
L(y, \hat{y})
L(y,y^)关于它们的偏导:
d
w
=
d
L
(
y
,
y
^
)
d
w
=
d
L
(
y
,
y
^
)
d
y
^
d
y
^
d
w
dw=\frac{dL(y, \hat{y})}{dw}=\frac{dL(y, \hat{y})}{d\hat{y}}\frac{d\hat{y}}{dw}
dw=dwdL(y,y^)=dy^dL(y,y^)dwdy^ 这下是不是就有头绪了
d
L
(
y
,
y
^
)
d
y
^
=
−
y
y
^
+
1
−
y
1
−
y
^
\frac{dL(y, \hat{y})}{d\hat{y}}=-\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}}
dy^dL(y,y^)=−y^y+1−y^1−y 再结合上面求解
y
^
\hat{y}
y^的过程,
d
y
^
d
w
=
x
σ
′
(
w
)
\frac{d\hat{y}}{dw}=x\sigma'(w)
dwdy^=xσ′(w)但是
σ
′
(
w
)
\sigma'(w)
σ′(w) 怎么求呢,这里就必须提到sigmoid函数的一个优秀的性质了:
σ
′
(
w
)
=
σ
(
w
)
(
1
−
σ
(
w
)
)
\sigma'(w)=\sigma(w)(1-\sigma(w))
σ′(w)=σ(w)(1−σ(w)) 这样
d
y
^
d
w
=
x
σ
′
(
w
)
=
x
σ
(
w
)
(
1
−
σ
(
w
)
)
=
x
y
^
(
1
−
y
^
)
\frac{d\hat{y}}{dw}=x\sigma'(w)=x\sigma(w)(1-\sigma(w))=x\hat{y}(1-\hat{y})
dwdy^=xσ′(w)=xσ(w)(1−σ(w))=xy^(1−y^)代入求
d
w
dw
dw的式子就可以得到
d
w
=
d
L
(
y
,
y
^
)
d
w
=
x
(
y
^
−
y
)
dw=\frac{dL(y, \hat{y})}{dw}=x(\hat{y}-y)
dw=dwdL(y,y^)=x(y^−y)优不优秀,厉不厉害!同样的方式可以求得
L
(
y
,
y
^
)
L(y, \hat{y})
L(y,y^)关于
b
b
b 的偏导
d
b
=
d
L
(
y
,
y
^
)
d
b
=
(
y
^
−
y
)
db=\frac{dL(y, \hat{y})}{db}=(\hat{y}-y)
db=dbdL(y,y^)=(y^−y),这样,由于
J
(
w
,
b
)
J(w,b)
J(w,b) 是
L
(
y
,
y
^
)
L(y, \hat{y})
L(y,y^)的线性加和,所以
d
w
=
d
J
(
w
,
b
)
d
w
=
1
m
X
(
Y
^
−
Y
)
T
dw=\frac{dJ(w,b)}{dw}=\frac{1}{m}X(\hat{Y}-Y)^T
dw=dwdJ(w,b)=m1X(Y^−Y)T
d
b
=
d
J
(
w
,
b
)
d
b
=
1
m
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
db=\frac{dJ(w,b)}{db}= \frac{1}{m}\sum_{i=1}^m (\hat{y}^{(i)}-y^{(i)})
db=dbdJ(w,b)=m1i=1∑m(y^(i)−y(i))
这里将
d
w
dw
dw写成了向量的形式,
X
=
[
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
]
X=[x^{(1)},x^{(2)},...,x^{(m)}]
X=[x(1),x(2),...,x(m)] ,
Y
^
=
[
y
^
(
1
)
,
y
^
(
2
)
,
.
.
.
,
y
^
(
m
)
]
\hat{Y}=[\hat{y}^{(1)},\hat{y}^{(2)},...,\hat{y}^{(m)}]
Y^=[y^(1),y^(2),...,y^(m)],
Y
=
[
y
(
1
)
,
y
(
2
)
,
.
.
.
,
y
(
m
)
]
Y=[y^{(1)},y^{(2)},...,y^{(m)}]
Y=[y(1),y(2),...,y(m)]。
至此,Logistic回归的过程就完了。总结一下就是
- 根据样本的输入特征求预测标签值(利用感知机和sigmoid激活函数);
- 利用所有样本的真实标签和预测得到的标签计算损失函数( J ( w , b ) J(w,b) J(w,b);
- 分别求解损失函数对 w w w和 b b b的梯度,进而更新 w w w和 b b b;
- 重复上面三个步骤直到求得令 J ( w , b ) J(w,b) J(w,b) 最小的 w w w和 b b b。
程序
python版本的代码可以在我的GitHub上下载。