计划在9月4日(截止日期)之前完成DeepLearning的所有课程学习。每个课程对应一篇博客,根据学习进度随时更新。
参考课程
文章目录
- (一)深度学习概论
- 结构化数据和非结构化数据
- 提高效果的方法
- (二)神经网络基础
- 二分分类
- Logistic回归
- 梯度下降法
- 计算图、计算图的导数计算
- Logistic回归中的梯度下降法
- 向量化
- Python广播
- (三)浅层神经网络
- 计算神经网络的输出
- 多样本向量化
- 激活函数
- 随机初始化
- (四)深层神经网络
- 深层网络中的前向传播
- 深层网络中的反向传播
- 核对矩阵的维数、深层神经网络的基本单元
- 超参数
(一)深度学习概论
结构化数据和非结构化数据
结构化数据是已经清楚定义并组织的数据,如数据库。
非结构化数据不具有结构化特征,如图片、音频等。
提高效果的方法
-训练更大的神经网络
-投入更大规模的标记数据
(二)神经网络基础
二分分类
举例:识别输入图像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时复现各个矩阵维数。
超参数
指能控制参数的参数。如学习率、迭代次数、层数、每层神经元数等。
可以通过尝试的方法确定超参数的选择。