BP神经网络深度学习--吴恩达学习笔记(三)

11. m个样本的梯度下降:

(1)利用for循环计算:逻辑回归上需要编写两个 for 循环。第一个 for 循环是一个小循环遍历𝑚个训练样本,第二个 for 循环是一个遍历所有特征的 for 循环。如果有更多特征,从𝑑𝑤1,𝑑𝑤2,相似的计算从𝑑𝑤3一直下去到𝑑𝑤𝑛。所以看来需要一个 for 循环遍历所有𝑛个特征。

(2)当你应用深度学习算法,你会发现在代码中显式地使用 for 循环使你的算法很低效,同时在深度学习领域会有越来越大的数据集。所以能够应用你的算法且没有显式的 for 循环会是重要的,并且会帮助你适用于更大的数据集

(3)所以这里有一些叫做向量化技术,它可以允许你的代码摆脱这些显式的 for 循环。可以使你有时候加速你的运算,但有时候也未必能够。但是在深度学习时代向量化,摆脱 for 循环已经变得相当重要。因为我们越来越多地训练非常大的数据集,因此你真的需要你的代码变得非常高效。

12. 向量化

(1)向量化是非常基础的去除代码中 for 循环的艺术;

(2)向量化实现将会非常直接计算𝑤𝑇𝑥+b,代码如下:z=np.dot(w, x)+b,大大提高了计算的速度,此处有编程实例

(3)numpy 库有很多向量函数,比如 u=np.log 是计算对数函数(𝑙𝑜𝑔),np.abs()是计算数据的绝对值、np.maximum() 计算元素𝑦中的最大值,你也可以np.maximum(v,0) 、 𝑣 ∗∗ 2 代表获得元素 𝑦 每个值得平方、 1/𝑣获取元素 𝑦 的倒数等等。所以当你想写循环时候,检查 numpy 是否存在类似的内置函数从而避免使用循环(loop)方式;

13. 向量化逻辑回归:

(1)是一个 𝑛𝑥 行 𝑚 列的矩阵。我现在将它写为 Python  numpy 的形式 (𝑛𝑥, 𝑚) ,这只是表示 𝑋 是一个 𝑛𝑥 乘以 𝑚 的矩阵 𝑅𝑛𝑥×𝑚。

(2)广播:计算 𝑊𝑇𝑋 + [𝑏𝑏. . . 𝑏] ,numpy 命令是𝑍 = 𝑛𝑝. 𝑑𝑜𝑡(𝑤. 𝑇𝑋) + 𝑏。这里在 Python 中有一个巧妙的地方,这里 𝑏 是一个实数,或者你可以说是一个 1 × 1 矩阵,只是一个普通的实数。但是当你将这个向量加上这个实数时Python 自动把这个实数 𝑏 扩展成一个 1 × 𝑚 的行向量。所以这种情况下的操作似乎有点不可思议,它在 Python 中被称作广播(brosdcasting);

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

不使用for循环,而是向量循环,得到如下:

现在我们利用前五个公式完成了前向和后向传播,也实现了对所有训练样本进行预测和求导,再利用后两个公式,梯度下降更新参数。我们的目的是不使用 for 循环,所以我们就通过一次迭代实现一次梯度下降,但如果你希望多次迭代进行梯度下降,那么仍然需要 for 循环,放在最外层。不过还是觉得一次迭代就进行一次梯度下降,避免使用任何循环比较舒服一些。最后,我们得到了一个高度向量化的、非常高效的逻辑回归的梯度下降算法

15. Python 中的广播:

(1)axis用来指明将要进行的运算是沿着哪个轴执行,在 numpy 中,0 轴是垂直的,也就是列,而 1 轴是水平的,也就是行。

(2)使用 3 × 4的矩阵𝐴除以 1 × 4的矩阵𝑐𝑎𝑙:技术上来讲,其实并不需要再将矩阵𝑐𝑎𝑙 reshape(重塑)成 1 × 4,因为矩阵𝑐𝑎𝑙本身已经是 1 × 4了。但是我们写代码时不确定矩阵维度的时候,通常会对矩阵进行重塑来确保得到我们想要的列向量或行向量。重塑操作 reshape 是一个常量时间的操作,时间复杂度是𝑂(1),它的调用代价极低。

(3)numpy 广播机制:如果两个数组的后缘维度的轴长度相符或其中一方的轴长度为 1,则认为它们是广播兼容的。广播会在缺失维度和轴长度为 1 的维度上进行。后缘维度的轴长度:A.shape[-1] 即矩阵维度元组中的最后一个位置的值。最后,对于 Matlab/Octave 有类似功能的函数 bsxfun。总结如下图所示:

16. numpy向量的一些说明:

(1)Python 的特性允许你使用广播(broadcasting)功能,这是 Python 的 numpy 程序语言库中最灵活的地方。而我认为这是程序语言的优点,也是缺点。优点的原因在于它们创造出语言的表达性,Python 语言巨大的灵活性使得你仅仅通过一行代码就能做很多事情。但是这也是缺点,由于广播巨大的灵活性,有时候你对于广播的特点以及广播的工作原理这些细节不熟悉的话,你可能会产生很细微或者看起来很奇怪的 bug。例如,如果你将一个列向量添加到一个行向量中,你会以为它报出维度不匹配或类型错误之类的错误,但是实际上你会得到一个行向量和列向量的求和。

(2)在编写神经网络时,不要在它的 shape 是(5, )还是(𝑛, )或者一维数组时使

用数据结构。相反,如果你设置 𝑎 为(5,1),那么这就将置于 5 行 1 列向量中。在先前的操作里 𝑎 和 𝑎 的转置看起来一样,而现在这样的 𝑎 变成一个新的 𝑎 的转置,并且它是一个行向量。请注意一个细微的差别,在这种数据结构中,当我们输出 𝑎 的转置时有两对方括号,而之前只有一对方括号,所以这就是 1 行 5 列的矩阵和一维数组的差别。所以建议,在编程练习或者在执行逻辑回归和神经网络时,不需要使用这些一维数组。

(3)断言语句:在写代码时,如果不完全确定一个向量的维度(dimension),可以放进一个断言语句(assertion statement)。去确保在这种情况下是一个(5,1)向量,或者说是一个列向量。这些断言语句实际上是要去执行的,并且它们也会有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。如果你不小心以一维数组来执行,你也能够重新改变数组维数 𝑎 = 𝑟𝑒𝑠ℎ𝑎𝑝𝑒,表明一个(5,1)数组或者一个(1,5)数组,以致于它表现更像列向量或行向量。因此,要去简化你的代码,而且不要使用一维数组。总是使用𝑛 × 1 维矩阵(基本上是列向量),或者 1 × 𝑛 维矩阵(基本上是行向量),这样你可以减少很多 assert 语句来节省核矩阵和数组的维数的时间。另外,为了确保你的矩阵或向量所需要的维数时,不要羞于 reshape 操作。

17. 最大似然估计:即求出一组参数,使这个式子取最大值。

总结一下,为了最小化成本函数𝐽(𝑤, 𝑏),我们从 logistic 回归模型的最大似然估计的角度出发,假设训练集中的样本都是独立同分布的条件下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值