深度学习-吴恩达-笔记-2-神经网络的编程基础

目录

二分类

逻辑回归

逻辑回归的代价函数

梯度下降法

导数

计算图

使用计算图求导

逻辑回归中的梯度下降

m个样本的梯度下降

向量化

向量化的更多例子

向量化逻辑回归

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

Python中的广播

关于python_numpy向量的说明

logistic损失函数的解释


【此为本人学习吴恩达的深度学习课程的笔记记录,有错误请指出!】

二分类


判断一个对象是否属于某个分类,其结果只有两种,是或否。

 

逻辑回归


逻辑回归是一个用于二分类的算法。

逻辑回归的假设函数是 sigmoid 函数:

 

逻辑回归的代价函数


逻辑回归中用到的损失函数是(单个训练样本):

逻辑回归的代价函数是对𝑚个样本的损失函数求和然后除以𝑚:

 

梯度下降法


通过最小化代价函数(成本函数) 𝐽(𝑤, 𝑏)来训练的参数𝑤和𝑏:

梯度下降法的形象化说明(这里假设w是一维):

逻辑回归的代价函数的梯度计算 (这里假设w是一维):

 

导数


函数的导数就是该函数在某一点上的斜率。

 

计算图


一个神经网络的计算,都是按照前向(输出)或反向(求导)传播的过程组织的。

举一个简单例子:

通过一个从左向右的过程(前向传播),就可以计算出 𝐽 的值。

 

使用计算图求导


现在看看如何利用计算图来求出函数 𝐽 的导数(反向传播)。

下面用到的求导公式(链式求导法则):

反向传播流程图:

这是一个计算流程图,正向传播从左到右计算代价函数 𝐽,然后再优化代价函数,利用反向传播从右到左计算导数。

 

逻辑回归中的梯度下降


逻辑回归的公式定义如下:

损失函数:

代价函数:

现在先考虑单个样本的情况,单个样本的代价函数定义如下:

𝑤 和 𝑏 的修正量可以表达如下:

推导如下:

最后一步反向推导,也就是计算 𝑤 和 𝑏 变化对代价函数𝐿的影响:

sigmoid函数求导过程:

 

m个样本的梯度下降


对 𝑚 个样本求和的全局代价函数,实际上是 1 到 𝑚 项各个损失的平均。 

它表明全局代价函数对 𝑤1 的微分,对 𝑤1 的微分也同样是各项损失对 𝑤1 微分的平均。

 

向量化


向量化是非常基础的去除代码中 for 循环的艺术,可以简化代码,并且提高计算速度。

在逻辑回归中:

如使用非向量化计算(for 循环,效率慢):

如使用向量化计算(一种并行计算,效率快):

 

向量化的更多例子


通过使用 numpy 内置函数可以避开显式的循环(loop)方式进行向量化,从而有效提高代码速度。

 

向量化逻辑回归


通过使用 numpy 内置函数,不需要 for 循环,利用 𝑚 个训练样本一次性计算出小写 𝑧 和小写 𝑎,用一行代码即可完成。

 

这就是在同一时间内完成一个所有 𝑚 个训练样本的前向传播向量化计算。

 

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


如何向量化地计算𝑚个训练数据的梯度(反向传播)。我们的目标是不使用 for 循环,而是向量:

利用前五个公式完成了前向和后向传播,也实现了对所有训练样本进行预测和求导,再利用后两个公式,梯度下降更新参数。

以上是通过一次迭代实现一次梯度下降,但如果希望多次迭代进行梯度下降,那么仍然需要 for 循环放在最外层即可。

 

Python中的广播


在 numpy 中,当一个 4 × 1的列向量与一个常数做加法时,实际上会将常数扩展为一个 4 × 1的列向量,然后两者做逐元素加法。

这种广播机制对于行向量和列向量均可以使用 (广播机制与执行的运算种类无关)。

例子1:

例子2:

numpy 广播机制:

如果两个数组的后缘维度的轴长度相符或其中一方的轴长度为 1,则认为它们是广播兼容的。广播会在缺失维度和轴长度为 1 的维度上进行。

后缘维度的轴长度: A.shape[-1] 即矩阵维度元组中的最后一个位置的值。

现在解释上图中的例子:

矩阵 𝐴𝑚,𝑛 和矩阵 𝐵1,𝑛 进行四则运算,后缘维度轴长度相符(都为 𝑛),可以广播,广播沿着轴长度为 1 的轴进行,即 𝐵1,𝑛 广播成为𝐵𝑚,𝑛 ,之后做逐元素四则运算。

矩阵 𝐴𝑚,𝑛 和矩阵 𝐵𝑚,1 进行四则运算,后缘维度轴长度不相符,但其中一方轴长度为1,可以广播,广播沿着轴长度为 1 的轴进行,即 𝐵𝑚,1 广播成为 𝐵𝑚,𝑛 ,之后做逐元素四则运算。

矩阵 𝐴𝑚,1 和常数 𝑅 进行四则运算,后缘维度轴长度不相符,但其中一方轴长度为 1,可以广播,广播沿着缺失维度和轴长度为 1 的轴进行,缺失维度就是 axis=0,轴长度为 1 的轴是 axis=1,即𝑅广播成为 𝐵𝑚,1,之后做逐元素四则运算。

总结一下 broadcasting,可以看看下面的图:

 

关于python_numpy向量的说明


Python 的特性允许你使用广播( broadcasting)功能,这是 Python 的 numpy 程序语言库中最灵活的地方。而我认为这是程序语言的优点,也是缺点。

python中的 𝑎 =𝑛𝑝. 𝑟𝑎𝑛𝑑𝑜𝑚. 𝑟𝑎𝑛𝑑𝑛(5)), 𝑎. 𝑠ℎ𝑎𝑝𝑒是(5, ),这里𝑎是一维数组,而不是向量。

python中的 𝑎 =𝑛𝑝. 𝑟𝑎𝑛𝑑𝑜𝑚. 𝑟𝑎𝑛𝑑𝑛(5, 1)), 𝑎. 𝑠ℎ𝑎𝑝𝑒是(5, 1),这里𝑎一个向量,建议使用向量方式。

写代码时还有一件经常做的事,那就是如果不完全确定一个向量的维度(dimension),我经常会扔进一个断言语句(assertion statement)来确保它是一个向量。

建议不使用一维数组,而是使用向量,这样你可以减少很多assert 语句来节省核矩阵和数组的维数的时间。另外,为了确保你的矩阵或向量所需要的维数时,建议使用 reshape 操作。

 

logistic损失函数的解释


先分析两个条件概率公式:

上述的两个条件概率公式可以合并成如下公式:

由于 log 函数是严格单调递增的函数,最大化 𝑙𝑜𝑔(𝑝(𝑦|𝑥)) 等价于最大化 𝑝(𝑦|𝑥),单个训练样本的损失函数表达式:

而这就是前面提到的损失函数的负数 (-𝐿(𝑦 ^ , 𝑦)) 。

对于𝑚个训练样本, 假设所有的训练样本服从同一分布且相互独立,所有这些样本的联合概率就是每个样本概率的乘积:

在统计学里面,有一个方法叫做最大似然估计,即求出一组参数, 使得给定样本的观测值概率最大, 令这个概率最大化等价于令其对数最大化,在等式两边取对数:

由于训练模型时,目标是让成本函数最小化,所以不是直接用最大似然概率,要去掉这里的负号,最后为了方便,可以对成本函数进行适当的缩放, 在前面加一个额外的常数因子 1/𝑚,即:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值