该博客用来做吴恩达深度学习的学习总结归纳。
一、二分分类(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)=m1?i=1∑m?L(y^?(i),y(i))
三、梯度下降法
我们定义的成本函数本质上是一个凸函数,所以理论上一定会有全局最优解。同时根据凸函数的性质,初始值取在任意一点上,都会随着迭代过程到达全局最优解。 梯度下降法是指选择下降最快的方向进行迭代。方向为:
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
)
]
Z=[z^{(1)} ... z^{(m)}]=w^TX+[b...b](which\ is\ (1*m))\\ X=[x^{(1)}...x^{(m)}]
Z=[z(1)...z(m)]=wTX+[b...b](which?is?(1?m))X=[x(1)...x(m)]
|