该博客用来做吴恩达深度学习的学习总结归纳。
一、二分分类(Binary Classification)
厘清概念:
在这里,x作为输入端,包含所有信息。y作为输出端,由于这是一个二分分类的问题,所以输出端y的可能性只有两个,在这里以0和1来表示,即y∈{0,1}。而对于不同的输入x(i),则也会对应不同的输出y(i)。这里的i指的是第i个样本。
X作为矩阵形式,包括多项x,其表现形式为X=[x(1) x(2) … x(m)]。对应输出Y也为矩阵形式,包括多项y,表现形式为Y=[y(1) y(2) … y(m)]。
这里给出一个新的表示形式y^hat,如下所示。
y
^
\hat{y}
y^这里的
y
^
\hat{y}
y^表示的是你对y的预测值。y只能是0和1的某一项,但是毕竟要考虑概率问题,所以需要预测y有多少把握是0或者有多少把握是1,因此
y
^
\hat{y}
y^也就应运而生了。我们一般可以这么表示,用来表示对应某个输入,用算法计算出结果为1的概率。
y
^
=
P
(
y
=
1
∣
x
)
\hat{y}=P(y=1|x)
y^=P(y=1∣x)
二、logistic回归
在线性回归中会有参数
w
w
w和
b
b
b用来计算,公式为:
y
^
=
w
T
x
+
b
\hat{y}=w^Tx+b
y^=wTx+b但是深度学习中这个回归不是很好的,因为考虑到你得到的结果
y
^
\hat{y}
y^是一个概率,所以应该收敛到0和1之间。所以怎么办呢?学者们想到了一个好法子,用sigmoid函数!
这里应该强调的是sigmoid函数是一种映射方式!!!
我们这里给出sigmoid函数的公式:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\cfrac{1}{1 +e^{-z}}
σ(z)=1+e−z1这样就将sigmoid函数映射到了0-1的区间范围内。但是也因此带来了z很大但是变化率很小的问题,这在之后就会用ReLU函数做改进,在此暂时不提及。
所以我们有了sigmoid函数,将
w
T
x
+
b
w^Tx+b
wTx+b作为sigmoid输入项
z
z
z输入到函数中,得到的值作为
y
^
\hat{y}
y^来输出,这样就可以将函数输出值映射到概率区间。
y
^
=
σ
(
w
T
x
+
b
)
\hat{y}=\sigma(w^Tx+b)
y^=σ(wTx+b)所以在实现logistic回归时,我们要做的就是学习参数
w
、
b
w、b
w、b,目标则是得到训练后的样本,在计算测试集中预测值尽可能等于实际值:
y
^
(
i
)
≈
y
(
i
)
\hat{y}^{(i)}\approx y^{(i)}
y^(i)≈y(i)。
损失函数(Loss Function)
这里终于要提到损失函数的定义了。
损失函数用来衡量输出函数
y
^
\hat{y}
y^与实际值
y
y
y有多接近(或者说有多大的差别)。由于我们会使用梯度下降法,所以平方差不是一个很好的选择,因为它会出现多个局部最优解,非凸函数。(当然误差函数肯定是越小越好的。)
这里给出新定义的损失函数
L
(
y
^
,
y
)
L(\hat{y},y)
L(y^,y):
L
(
y
^
,
y
)
=
−
(
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
)
L(\hat{y},y)=-(ylog\hat{y}+(1-y)log(1-\hat{y}))
L(y^,y)=−(ylogy^+(1−y)log(1−y^))在这款损失函数中,如果你的实际值
y
=
1
y=1
y=1,那么预测值
y
^
\hat{y}
y^越大才会使损失函数越小。同理如果你的实际值
y
=
0
y=0
y=0,那么预测值
y
^
\hat{y}
y^越小才会使损失函数越小。所以这个损失函数是合格的。
成本函数(Cost Function)
成本函数衡量模型在全体训练样本上的表现。定义形式为所有样本损失函数的和。
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
J(w,b)=\frac{1}{m}\displaystyle\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})
J(w,b)=m1i=1∑mL(y^(i),y(i))接下来我们讨论一下为什么要这样定义损失函数和成本函数。
我们回到
y
^
\hat{y}
y^的定义:
y
^
=
P
(
y
=
1
∣
x
)
\hat{y}=P(y=1|x)
y^=P(y=1∣x)。意味着这是用来表示
y
=
1
y=1
y=1的概率。考虑到二分类问题,
y
=
1
o
r
0
y=1\ or\ 0
y=1 or 0,那么
P
(
y
=
0
∣
x
)
=
1
−
y
^
P(y=0|x)=1-\hat{y}
P(y=0∣x)=1−y^这样的定义也就顺理成章。
所以在这里我们对整体的概率进行如下定义:
P
(
y
∣
x
)
=
y
^
y
(
1
−
y
^
)
(
1
−
y
)
P(y|x)=\hat{y}^y(1-\hat{y})^{(1-y)}
P(y∣x)=y^y(1−y^)(1−y)可以发现,该定义有如下性质:
y
=
0
,
P
(
y
∣
x
)
=
1
−
y
^
y
=
1
,
P
(
y
∣
x
)
=
y
^
y=0,P(y|x)=1-\hat{y}\\ y=1,P(y|x)=\hat{y}
y=0,P(y∣x)=1−y^y=1,P(y∣x)=y^显然,满足我们对二分问题概率的预期。同时,由于对数函数和原函数在单调性上有一致性,我们将原函数取对数:
l
o
g
(
P
(
y
∣
x
)
)
=
(
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
)
log(P(y|x))=(ylog\hat{y}+(1-y)log(1-\hat{y}))
log(P(y∣x))=(ylogy^+(1−y)log(1−y^))我们预期
P
(
y
∣
x
)
P(y|x)
P(y∣x)越大越好,但是logistics回归需要一个最小化的损失函数,所以在上式加上负号后就成为我们的损失函数啦。
我们再来讨论成本函数的问题。
假设我们有m个样本,且满足独立同分布。则
P
(
a
l
l
t
r
a
i
n
)
=
∏
i
=
1
m
P
(
y
(
i
)
∣
x
(
i
)
)
P(all\ train)=\prod_{i=1}^mP(y^{(i)}|x^{(i)})
P(all train)=i=1∏mP(y(i)∣x(i))这样我们取对数、取负并归一化后,其形式为:
−
1
m
∑
i
=
1
m
l
o
g
(
P
(
y
(
i
)
)
∣
x
(
i
)
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
=
J
(
w
,
b
)
-\frac{1}{m}\sum_{i=1}^mlog(P(y^{(i)})|x^{(i)})=\frac{1}{m}\displaystyle\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})=J(w,b)
−m1i=1∑mlog(P(y(i))∣x(i))=m1i=1∑mL(y^(i),y(i))=J(w,b)当当当当,我们就这样得到了满足凸函数性质的成本函数!
三、梯度下降法
我们定义的成本函数本质上是一个凸函数,所以理论上一定会有全局最优解。同时根据凸函数的性质,初始值取在任意一点上,都会随着迭代过程到达全局最优解。
梯度下降法是指选择下降最快的方向进行迭代。方向为:
w
=
w
−
α
d
J
(
w
)
d
w
w=w-\alpha\frac{dJ(w)}{dw}
w=w−αdwdJ(w)这里梯度下降法对应的是后向传播。从知乎上摘了一段。
前向传播通过训练数据和权重参数计算输出结果;反向传播通过导数链式法则计算损失函数对各参数的梯度,并根据梯度进行参数的更新。
所以我们使用梯度下降法的方式不断更新节点参数,以完成全局最优的过程。
在这里我以前一直很迷惑为什么要使用成本函数同时还能进行
w
、
b
w、b
w、b的修改,后来想了想每次训练都是好多轮训练的过程,所以每一轮训练中保持
w
、
b
w、b
w、b不变是合理的,而不是每训练一个
x
(
i
)
,
y
(
i
)
x(i),y(i)
x(i),y(i)就修改一次参数。
四、向量化
在代码当中,使用多个for循环无疑是愚蠢的。所以我们使用向量化来包含所有特征
x
(
i
)
x^{(i)}
x(i),不然多个for循坏会慢的要死,无论是python还是matlab。
在向量化后,公式改为:
z
=
w
T
x
+
b
,
w
∈
R
n
x
,
x
∈
R
n
x
z=w^Tx+b,w\in R^{n_x},x\in R^{n_x}
z=wTx+b,w∈Rnx,x∈Rnx这是向量化的结果。那么我们是否可以接着除去遍历所有样本的for循环呢?显然,矩阵化完全满足这一要求:
Z
=
[
z
(
1
)
.
.
.
z
(
m
)
]
=
w
T
X
+
[
b
.
.
.
b
]
(
w
h
i
c
h
i
s
(
1
∗
m
)
)
X
=
[
x
(
1
)
.
.
.
x
(
m
)
]
A
=
σ
(
Z
)
d
Z
=
A
−
Y
d
w
=
1
m
X
d
Z
T
d
b
=
1
m
∗
∑
i
=
1
m
d
Z
(
i
)
w
=
w
−
α
d
w
b
=
b
−
α
d
b
Z=[z^{(1)} ... z^{(m)}]=w^TX+[b...b](which\ is\ (1*m))\\ X=[x^{(1)}...x^{(m)}]\\ A=\sigma(Z)\\ dZ = A-Y\\ dw=\frac{1}{m}XdZ^T\\ db = \frac{1}{m}*\displaystyle\sum_{i=1}^mdZ^{(i)}\\ w=w-\alpha dw\\ b=b-\alpha db
Z=[z(1)...z(m)]=wTX+[b...b](which is (1∗m))X=[x(1)...x(m)]A=σ(Z)dZ=A−Ydw=m1XdZTdb=m1∗i=1∑mdZ(i)w=w−αdwb=b−αdb终于,我们得到了完全矩阵化的logistic迭代方式。