吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日(截止日期)之前完成DeepLearning的所有课程学习。每个课程对应一篇博客,根据学习进度随时更新。
参考课程

(一)深度学习概论

结构化数据和非结构化数据

结构化数据是已经清楚定义并组织的数据,如数据库。
非结构化数据不具有结构化特征,如图片、音频等。

提高效果的方法

-训练更大的神经网络
-投入更大规模的标记数据

(二)神经网络基础

二分分类

举例:识别输入图像x中有/没有猫,返回y(有为1,无为0)
图片在计算机中的存储形式

使用向量x存储矩阵中的三组数据,组织成nx1的向量,并将每个向量作为一列组织成整体输入X(一种约定),输出Y则为1xm的向量。

Logistic回归

在二分分类问题中,得到的结果是输入符合要求的期望,因此需要介于0和1之间。采用σ函数满足该限制。

Loss Function:考察单个样本数据和实际结果的接近程度。选择该形式是因为其直观上是凸函数,有唯一极小值,避免非凸函数的多个极值情况,便于求解。

Cost Function:考察样本总体对实际结果的拟合效果。

梯度下降法

初始化w和b,每次选择梯度最大的方向前进,或者停在最终结果处,由于成本函数是凸函数,所以存在唯一极小值。

其中,α代表学习率,即前进步长。

计算图、计算图的导数计算

导数计算采用链式法则从右向左进行,即dJ/da = (dJ/du)*(du/da)

单个训练样本时同理操作。

Logistic回归中的梯度下降法

对代价函数的每个累加项对应求导即可得到偏导值。
图中的J,dw1,dw2,db是累加项,所以最终要除以m。而zi,ai,dzi对应每个训练样本的值。求累加值增量时,采用4中的链式法则的思想。

向量化

向量化避免了在程序中显式使用for循环,有效减少运行时间。
例子中的操作方法:
import numpy
a = numpy.random.rand(1000000)
b = numpy.random.rand(1000000)
c= numpy.dot(a, b)
该操作比for循环计算并累加效率高得多。所以每次需要for循环时,查看numpy中是否有可调用的内置函数,避免使用for循环。
根据以上例子,我理解的向量化是用向量的形式,组织每轮循环中得到的结果,利用numpy内置函数高效地计算出矩阵相乘的结果。
在这里插入图片描述

逆向传播时通过向量化消除了两层的for循环,即在一次步进中没有循环。但如果想要多次迭代,还需在外层添加计数循环。
在这里插入图片描述

Python广播

在矩阵元素的运算(区别于矩阵乘法)中,将规模较小的矩阵(其实是向量)进行若干次复制后,再对对应位置的元素进行运算。

使用assert保证矩阵是预期的形状,如assert(a.shape==(3, 4))。调用reshape方法可以将矩阵保持期望形状,如a = a.reshape(3, 3)。

(三)浅层神经网络

计算神经网络的输出

在这里插入图片描述

以只有一个隐层的神经网络为例。直观上,多层的神经网络是多个单层神经网络的堆叠。
其中的每个节点都经过z = wTx + b, σ(z)的计算,如图所示。
在这里插入图片描述

对0层到1层的计算进行向量化,根据如下公式:
在这里插入图片描述

多样本向量化

将输入样本按列排列,进行向量化操作。此时对应A[i],在垂直方向,这个垂直索引对应于神经网络中的不同节点。例如节点位于矩阵的最左上角对应于激活单元,它是位于第一个训练样本上的第一个隐藏单元。它的下一个值对应于第二个隐藏单元的激活值。当水平扫描,将从第一个训练示例中从第一个隐藏的单元到第二个训练样本,第三个训练样本……
在这里插入图片描述

激活函数

在这里插入图片描述

通常tanh的表现优于sigmoid函数。但有例外情况:在二分类的问题中,对于输出层,因为y的值是 0 或 1,所以想让输出的数值介于 0 和 1 之间,而不是在-1 和+1 之间。所以需要使用 sigmoid 激活函数。
对于上面的例子,可以在隐层使用tanh,输出层使用sigmoid。
ReLU函数是最常用的。
如果不使用激活函数,那么多层的神经网络本质上仍然是一层,此时的隐藏层是多余的。为了构建多层神经网络,必须引入非线性的激活函数。

随机初始化

将各层的w初始化为0,会导致正向传播时的结果相同,从而导致反向传播时的结果也相同,无法起到训练的作用。
为此,应该把w的各个元素初始化为非0的较小的数。因为使用sigmoid或tanh激活函数时,若z过大或过小,会导致斜率趋近于0,降低运行效率。
b初始为0不会产生负面影响。
在这里插入图片描述

(四)深层神经网络

深层网络中的前向传播

有一个隐藏层的神经网络,就是一个两层神经网络。
当计算神经网络的层数时,不算输入层,只算隐藏层和输出层。
前向传播可以归纳为多次迭代:
𝑧[𝑙] = 𝑤[𝑙]𝑎[𝑙−1] + 𝑏[𝑙],
𝑎[𝑙] = 𝑔[𝑙](𝑧[𝑙])。

向量化实现过程可以写成:
𝑍[𝑙] = 𝑊[𝑙]𝑎[𝑙−1] + 𝑏[𝑙],
𝐴[𝑙] = 𝑔[𝑙](𝑍[𝑙]) (𝐴[0] = 𝑋)

深层网络中的反向传播

反向传播的步骤可以写成:
(1)𝑑𝑧[𝑙] = 𝑑𝑎[𝑙]∗ 𝑔[𝑙]′(𝑧[𝑙])
(2)𝑑𝑤[𝑙] = 𝑑𝑧[𝑙]⋅ 𝑎[𝑙−1]
(3)𝑑𝑏[𝑙] = 𝑑𝑧[𝑙]
(4)𝑑𝑎[𝑙−1] = 𝑤[𝑙]𝑇⋅ 𝑑𝑧[𝑙]
(5)𝑑𝑧[𝑙] = 𝑤[𝑙+1]𝑇𝑑𝑧[𝑙+1]⋅ 𝑔[𝑙]′(𝑧[𝑙])
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。
向量化实现过程可以写成:
(6)𝑑𝑍[𝑙] = 𝑑𝐴[𝑙]∗ 𝑔[𝑙]′(𝑍[𝑙])
(7)𝑑𝑊[𝑙] =1/𝑚(𝑑𝑍[𝑙]⋅ 𝐴[𝑙−1]𝑇)
(8)𝑑𝑏[𝑙] =1/𝑚(𝑛𝑝. 𝑠𝑢𝑚(𝑑𝑧[𝑙], 𝑎𝑥𝑖𝑠 = 1, 𝑘𝑒𝑒𝑝𝑑𝑖𝑚𝑠 = 𝑇𝑟𝑢𝑒))
(9)𝑑𝐴[𝑙−1] = 𝑊[𝑙]𝑇. 𝑑𝑍[𝑙]

核对矩阵的维数、深层神经网络的基本单元

建议:使用assert确保矩阵维数符合预期。debug时复现各个矩阵维数。
在这里插入图片描述

在这里插入图片描述

超参数

指能控制参数的参数。如学习率、迭代次数、层数、每层神经元数等。
可以通过尝试的方法确定超参数的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值