吴恩达-深度学习(第二章)

一、二元分类算法

输入如下图一张猫的图片,希望算法输出一个0或1标签指明图上是不是猫,输出1说明是猫,输出0说明不是猫,用符号y来表示输出结果

在计算机内保存一幅彩色图像,计算机要存储三个独立的矩阵,分别对应红、绿、蓝三种颜色,矩阵根据像素大小进行调整,如图像的大小是64×64,那么就会出现3个64×64的矩阵,分别对应红、绿、蓝三种颜色通道,将把这些矩阵中的像素值展开为一个向量x作为算法的输入,那么该向量x的维度将会是64×64×3,因为这就是图像的矩阵包含的元素总数。

所以,在二元分类问题中我们的目标是学习到这样的一个分类器:我们输入一幅以特征向量x表示的图像,然后预测对应的输出y是1还是0,即这幅图上是猫还是不是猫。

1.1 逻辑回归

给定的输入特征向量x和一幅图片对应,我们希望识别这是否是一张猫的图片,因此我们想要一种算法能够输出一个预测值,我们称之为(yhat),这代表对真实标签 Y 的估计,形式上讲 yhat是当给定输入特征x时,预测标签y为1的概率,换种说法就是当x是一张图片,就像我们上图看到的,你想要yhat告诉你这是一张猫图的概率,x是一个nx维的向量,约定逻辑回归的参数是 w,w也是一个nx维的向量,另外参数b是一个实数,因此给定了一个输入x以及参数w和b,那么如何产生输出yhat 呢?

 

 

 

逻辑回归函数:

 易知:

当z=0时,σ(z)=0.5

当z足够大(+ ∞)时,σ(z)趋近于1

当z足够小(- ∞)时,σ(z)趋近于0

如下图:

 尽可能学习到参数w,b,因此yhat就能很好地估计y等于1的概率

值得注意的是:进行网络编程时,通常会将参数w和参数b分开看待,这里的b对应一个偏置量。

1.2 逻辑回归损失函数

为了优化逻辑回归模型的参数W和B,需要定义一个代价函数

损失函数(Loss function):

 

假设y=1:则

 

欲使损失函数L达到最小,则需-logyhat尽可能大,即是使yhat尽可能大,而yhat不超过1,则yhat需无限趋近于1

假设y=0,则

 

 

欲使损失函数L达到最小,则需-log(1-yhat)尽可能大,即是使1-yhat尽可能大,而yhat不小于0,则yhat需无限趋近于0

算法参数的总体损失函数:

最后这个损失函数被单一的优化示例所定义,它将检测单一优化示例的运行情况,接下来,要设定代价函数,来检测优化组的整体运行情况,所以运用于参数W和B的代价函数J,是取m平均值,损失函数的总和运用于优化示例,这里的yhat是你的逻辑回归算法预计的输出值,用一组特定的W和B参数,所以展开后如下:

 损失函数适用于像这样单一的优化示例,损失函数反映的是你的参数成本,所以在优化你的逻辑回归模型时,我们要试着去找参数W和B,以此来缩小J的整体成本。

二、梯度下降

梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数J(θ0,θ1) 的最小值。

梯度下降背后的思想是:开始时我们随机选择一个参数的组合(θ0,θ1,…,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到找到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。

 梯度下降公式:

如果α选择太小,会导致每次移动的步幅都很小,最终需要很多步才能最终收敛
如果α选择太大,会导致每次移动的步幅过大,可能会越过最小值,无法收敛甚至会发散

 实现原理:

  • 偏导表示的是斜率,斜率在最低点左边为负,最低点右边为正。 θj减去一个负数则向右移动,减去一个正数则向左移动
  • 在移动过程中,偏导值会不断变小,进而移动的步幅也不断变小,最后不断收敛直到到达最低点
  • 在最低点处偏导值为0,不再移动

三、计算图

假设需完成下列运算:

 

令a=5,b=3,c=2

可以将其化成流程图的形式(见下图),从左往右计算(即正向传播)

 

而从右向左计算(即为反向传播)是通过求导数运用链式法则而进行的

此部分比较好理解,不再赘述(可参考视频:https://www.bilibili.com/video/BV1ev4y1U7j2?p=14&vd_source=69616045036075fc9c3b06dcfd524a5d)

四、逻辑回归梯度下降

之前建立了如下图的逻辑回归方程预测值y hat,

 

可以通过计算图表示它:

 

在逻辑回如中我们要做的就是修改参数w和b,来减少损失函数。

反向传播过程如下:

 

五、m示例上的梯度下降

之前已经学习了如何计算导数以及在单个训练样本情况下实现逻辑回归的梯度,现在,我们要做的是在m个训练样本上实现它。

首先,让我们回顾一下代价函数的定义:

 首先将J,dw1,dw2,db初始化为0,

 我们要做的是在训练集中使用一个for循环,并计算每个训练样本的导数,然后将它们相加,所以,这就是我们如何做到这一点,i是从1到m的循环,m是训练样本的数量,通过下述计算得到所对应的J,dw1,dw2,db值。

 而后对得到的J,dw1,dw2,db值进行平均值计算,将其均除以m得到平均值

值得注意的是:

dw1和dw2没有上标i,这是因为我们在这代码中把它们作为在整个训练集中的总和。

而与此形成鲜明对比的是 dzi,这只是对于单个训练样本dz,所以,这就是为什么这有一个上标i来代表某个训练样本,i是不断变化的。

(理解仍不足,有待补充)

六、向量化

6.1 向量化示例

在深度学习的实际应用中,你可能会遇到大量的训练数据,因为深度学习算法在此情况下表现更好。所以你的代码运行的运行速度非常重要,否则如果它运行在一个大的数据集上面,你将要等待非常长的时间去得到结果。所以在深度学习领域,实现向量化的能力成为一个关键技巧。

 在python编程中,向量化版本比非向量化版本效率高约300倍,通过向量化移除代码中的for循环,使得代码更简洁,并且运行速率也能得到极大的提升。

【建议】:

        当你在编写神经网络或逻辑回归时,都要尽可能避免使用显式的for循环,虽然有时候无法完全避免使用for循环,但如果你能使用内置函数,或者找到其他方式来计算你想要的答案 这通常会比直接使用for循环更快。

6.2 向量化逻辑回归

通过向量化消除逻辑回归中的for循环部分,简洁代码的同时提升运行速率。

首先回忆逻辑回归的前向传播

假设我们有m个训练样本:在预测样本时需要不断地执行下列公式来计算激活函数

 

 直至计算出所有m个训练样本的y值,不过为了实现前向传播,即计算出m个训练样本的预测结果,而有一种方法可以实现这个过程,但却不使用for循环,下面说明一下这个方法:

我们曾把矩阵X定义为训练的输入值,就像这样排列在不同的列中,这就是一个nx*m维的矩阵,而对上述公式的计算可以通过一行代码就能实现,即是运用向量化。

首先构造一个1*m维的行向量,方便计算z(1),z(2)直至z(m),都是在同一时间完成计算,实际上它可以表达成W的转置矩阵(W^T)与矩阵X相乘再加上这个向量。

6.3 向量化逻辑回归的梯度输出

如何使用向量化计算(同时计算)全部m个训练样本的梯度?

 用上述公式对全部m个训练样本的进行同样的计算,而后定义新变量dZ(m维行向量),有

 之前已学过如何计算A,同时也定义过Y,

 基于上述定义,易知:

 而dw与db可以由下式求出:

        将dw和db基于上式求出(并不需要在训练集上使用for循环),而后即可计算参数的更新.

计算导数的向量化具体实现方法如下:

 

6.4  python中广播的运行机制

下面给出python广播的示例:

 

Python广播的一些通用规则:

  1. 当一个m*n的矩阵A加减乘除另一个1*n的矩阵B时,矩阵B会复制m次成为一个m*n的矩阵B`,而后再逐元素进行A与B`的计算。
  2. 当一个m*n的矩阵A加减乘除另一个m*1的矩阵B时,矩阵B会复制n次成为一个m*n的矩阵B`,而后再逐元素进行A与B`的计算。
  3. 当一个m*1的矩阵A加减乘除一个实数C时,实数C会复制m次成为一个m*1的矩阵C`,而后再逐元素进行A与B`的计算。
  4. 当一个1*n的矩阵A加减乘除一个实数C时,实数C会复制n次成为一个1*n的矩阵C`,而后再逐元素进行A与B`的计算。

6.5  python--numpy向量的注释

使用numpy.random.randn创建向量时,需确保它是行/列向量,而非秩为1的矩阵。如下图,上半部分为错误示例,下半部分为正确示例。

 

【注】:

        ·对于不确定的向量,可以使用断言语句来确保其维度,如下:

        ·若得到一个秩为1的矩阵,可以使用reshape来改变其形状,使其成为所需的列/行向量,如:a = a.reshape((5,1))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值