Bootstrap

吴恩达深度学习课程总结归纳(一)

该博客用来做吴恩达深度学习的学习总结归纳。

一、二分分类(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=1x)

二、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+ez1这样就将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 wb,目标则是得到训练后的样本,在计算测试集中预测值尽可能等于实际值: 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^+(1y)log(1y^))在这款损失函数中,如果你的实际值 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=1mL(y^(i),y(i))接下来我们讨论一下为什么要这样定义损失函数和成本函数。
我们回到 y ^ \hat{y} y^的定义: y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1x)。意味着这是用来表示 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=0x)=1y^这样的定义也就顺理成章。
所以在这里我们对整体的概率进行如下定义:
P ( y ∣ x ) = y ^ y ( 1 − y ^ ) ( 1 − y ) P(y|x)=\hat{y}^y(1-\hat{y})^{(1-y)} P(yx)=y^y(1y^)(1y)可以发现,该定义有如下性质:
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(yx)=1y^y=1,P(yx)=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(yx))=(ylogy^+(1y)log(1y^))我们预期 P ( y ∣ x ) P(y|x) P(yx)越大越好,但是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=1mP(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=1mlog(P(y(i))x(i))=m1i=1mL(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 wb的修改,后来想了想每次训练都是好多轮训练的过程,所以每一轮训练中保持 w 、 b w、b wb不变是合理的,而不是每训练一个 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,wRnx,xRnx这是向量化的结果。那么我们是否可以接着除去遍历所有样本的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 (1m))X=[x(1)...x(m)]A=σ(Z)dZ=AYdw=m1XdZTdb=m1i=1mdZ(i)w=wαdwb=bαdb终于,我们得到了完全矩阵化的logistic迭代方式。

;