神经网络
第一课:神经网络概述
在本周,您将学会实现神经网络。
上周,我们讨论了逻辑回归的流程图,通过特征x和参数w和b,它们允许你计算z然后用来计算a ,我们可以互换地使用这个输出,然后你可以计算损失函数L。
一个神经网络就这样形成了。
正如我之前已经提到的那样,你可以通过将许多小的sigmoid单元堆叠在一起来形成神经网络。而在此之前,该节点对应于计算的两个步骤。
首先是输入特征x以及一些参数w和b,从而可以计算得到z1,[1]表示这个神经节点的参数,也就是所谓的神经网络的一层。
注意不要把右上角的方括号和我们用来表示单个训练样本的圆括号弄混淆了。x(i)表示第i个训练样本,[1]和[2]表示不同神经网络层,这里表示神经网络层1和层2。
计算得到z[1]以后,类似于逻辑回归,会有一个对a[1]的计算,也就是z[1]的σ值,然后用另一个线性方程来计算z[2],然后再来计算z[2],然后在计算a[2],作为这个神经网络的最终结果,同样也可以使用y^表示。
关键点在于计算逻辑回归中的z以及后面a的计算,通过新的z计算新的a,最终就能计算得到最终的损失值L。
对于向后传播计算每一层的参数的梯度,在神经网络的构建中,我们最终会像这样作后传播式的运算。计算da[1],dz[1],da[2],dz[2]...最后计算得到dw[1],db[1],dw[2],db[2]...
第二课:神经网络表示
神经网络究竟代表什么?
单隐藏案例:
在使用监督学习训练的神经网络中,训练集包含输入x的值以及目标输出y。术语隐藏层指的是在训练集中,未观察到中间这些节点的真实值的事实。
关于神经网络中符号约定的一个有趣的事情是,你在这里看到的这个网络被称为两层神经网络。原因是当我们计算神经网络中的图层时,我们不计算输入图层。因此隐藏层是第一层,输出层是第二层。在我们的符号约定中,我们称输入层为零,因此技术上可能在这个神经网络中有三层。
因为有输入层,隐藏层和输出层。但是在阅读文献或者案例时,普遍认为这是一个两层神经网络。
因此隐藏层将与参数w和b相关联。我将编写上标[1]来表示这些是与隐藏层的第一层相关的参数。
这些矩阵和向量的维度?神经网络x通过运算方式而得到输出的y^。
第三课:计算神经网络的输出
神经网络计算它的输出的细节,你将会发现,我们只是将逻辑回归进行多次的重复。
让我们深入了解神经网路在计算什么?
在逻辑回归中,一个圆代表了两步计算:
首先计算z
然后计算sogmoid(z)作为激活函数
神经网络只是把这个过程做了很多次。首先我们注意隐藏层里面的一个节点。对于z和a,在符号上的惯例为a^[l]_i,这里的l表示的是第l层,这里的i则指的是第l层中的第i个节点。
各个单元都进行了类似的计算。
如果你实际实现一个神经网络,使用for循环来实现它似乎效率很低,所以我们下一步要做的就是将这四个等式向量化。
当我们进行向量化,一个经验能帮到你:
在一层中有不同的神经元时,我们就把它们堆叠起来,W[1]。到目前为止,我们已经通过这个向量矩阵计算了向量Z,接下来计算这些a。
对,通过堆叠。
总结,对于一个逻辑回归来说,要去预测一个结果,我们通过运算得出Z[1] = W[1]T x + b[1],同时a[1] = Sigmoid * z[1]。
对于第一层神经网络来说,如果输入是一组x(x向量),就可以计算z[1],w[1],b[1]...
我们可以用a[0]来代替输入x,推导下一层的表达式,这个表达式和第一层的表达式十分相似,得到w[2],b[2]...
...
最后的结果是一个实数,去和逻辑回归做一个类比,你会发现在逻辑回归运算里面的w其实就是起着在神经网络运算里面w[2]转置的作用,或者说神经网络的w[2]就是逻辑回归w的转置。
那么最后的输出单元与逻辑回归非常相似了。有些不同的是,我们现在不写逻辑回归参数w和b,我们写神经网络的w[2]和b[2]。
复习一下:对于逻辑回归来说,去实现一个输出,或者说预测一个结果,你会计算z = w^T*x + b,y^等于a,等于sigmoid of (z),当你有一个神经网络中有一个隐藏层,你需要做的就是通过这四个运算去计算最终的输出。你可以把这些运算想象成:
第一步——通过向量化运算得出隐藏层a[1]里这四个逻辑回归的输出
第二步——用a[1]的四个输出作为a[2]层的输入,就像第三第四个运算做的一样。
即你住需要那四行运算代码去计算神经网络的输出!
如何在多个样本上进行向量化算法运算?通过把训练样本堆叠在矩阵的不同列中,只要通过很小的改变,我们就能将逻辑回归中的向量化实现照搬过来,使得神经网络不仅能计算单个样本上的输出值,也可以计算整个训练样本集上的输出值。
第四课:跨多个示例进行矢量化
了解了如何在一个训练示例的情况下计算神经网络上的预测。 在本视频中,您将了解如何在多个培训示例中进行矢量化。
结果将与您在逻辑回归中看到的非常相似。 通过在矩阵的不同列中堆叠不同的训练样例,您将能够获取之前得到的方程式。通过很少的修改,改变它们,使神经网络几乎同时计算所有示例的输出。
如果我们有m个训练向量,我们需要重复这个过程 (单个训练实例的推导)。
然后当你想要计算所有的训练实例的预测时,你需要用一个循环i从1到m,然别实现图中的四个等式。
如何使用矢量化计算来去除这个for循环?
如果我们水平的索引整个训练例子,从左到右刚好扫过所有的训练集,而垂直索引相对于神经网络的不同节点(第一个训练例子的第一个隐藏单元的激活值,它下面的值对应着第二个隐藏单元对第一个训练实例的激活值,然后是第三个单元)。
即横向看是不同的训练实例,纵向看是不同的输入特征,这些输入特征其实也就是输入层的不同节点。
你现在知道了怎么实现神经网络矢量化,也就是把多个实例矢量化,我们需要多一些理由来解释为什么这是这种矢量化的一个正确实现?
第五课:矢量化实现的解释
证明为什么我们记下的方程是多个例子中矢量化的正确实现?
看几个样本前向传播计算:
即如果你将输入按列进行堆叠,经过计算后,你会得到对应的同样按列堆叠的结果。
总结:
如果你想实现前向传播,那么你要做的事情就是:
从i等于1到m,每次输入一个训练样本,然后把训练样本按列堆叠。这一行向量化操作,让你能同时处理m个样本。运用同样地方法,你会发现所有其他行都是所有这四行代码的正确向量化形式。
一个神经网络的不同层其实大致上都在做着相同的事,或者说一遍又一遍的做着相同的计算。
对于更深的神经网络,也只是在进行着两个步骤,仅仅比在这里看到的进行了更多次?
第六课:激活函数
当你建立一个神经网络的时候,你需要做的众多选择之一,是对隐藏层使用什么样的激活函数?以及对输出层的神经元使用什么样的激活函数?对隐藏层使用什么样的激活函数?
迄今为止我们使用的都是sigmiod函数?其他函数?
除了sigmoid函数以外,还有tanh函数。
tanh函数的效果要比sigmoid函数效果好,因为隐藏层激活函数输出的平均值介于1和-1之间,会更加逼近0(而不是0.5)。因此隐藏层激活函数输出的平均值,更加容易达到数据中心化的效果(逼近于0),从而使得下一层的学习变得更简单一些。
我几乎再也不适用sigmoid函数作为激活函数,因为tanh函数在大多数情况下都相当严格地由于sigmoid函数。一个例外是在输出层上,因为y的值是0或者1,你需要输出的y帽(拟合值)的输出在0个1之间,而不是在-1到1之间。因此,我使用sigmoid函数作为激活函数的特例就是当你使用二元分类的时候,用于输出层,这种情况下你可以使用sigmoid函数。
sigmoid函数和tanh函数的缺点之一是:
如果Z的值非常大或者非常小,那么关于这个函数导数的梯度或者斜率会变得很小,会接近于零,这会使得梯度下降变得缓慢。
一个在机器学习界很流行的小工具叫做线性整流函数。ReLu函数。
有一些大致规则来选取激活函数:
你处理的问题是二元分类问题,此时的输出为0或1,那么sigmoid激活函数在输出层的使用哈斯顺利成章的选择。而在其他神经元上使用ReLu会是一个用来作激活函数的更好选择。用在你的隐藏层上,我推荐使用线性整流函数,ReLu是目前广泛被人们使用的一个方法,虽然人们有时也会使用双曲函数。
ReLu函数的缺点之一是当z为负数的时候,其导数为0,但是在实际应用中并不是问题,不过还有另一个版本的ReLu,叫做Leaky ReLu,当z为赋值的时,函数值不是为0,而是包含一个很小的斜率。Leaky ReLu的效果通常要好于ReLu函数,虽然在实际使用中相对使用的比较少。Leaky ReLu和ReLu的共有优势就是,在z的数值空间里面,激活函数的导数或者说激活函数的斜率离零比较远,因此在实际当中使用普通的ReLu激活函数的话,神经网络的学习速度通常会比使用双曲函数或者sigmoid函数来的更快。主要原因是使学习变慢的斜率趋向0(降低学习速率)的现象变少了。
事实上在建立你的深度学习网络时,你通常会有很多选择来建立你的深度学习网络。从隐藏单元的数量到激活函数的选择,如何初始化权重,还有很多相类似的选择,多数时候很难得到现成的实践指导来精确的适配你的问题。
建议:如果你不确定哪个激活函数效果最好,你可以逐个尝试使用它们,并用交叉验证集或者说测试集去验证它们的效果。
第七课:为什么需要非线性激活功能?
事实上,要想让神经网络实现一些有趣的功能,非线性激活函数是不可或缺的。
如果你使用线性激活函数,或者叫恒等激活函数,那么神经网络的输出,仅仅是输入函数的线性变化,那么无论你的神经网络有多少层,它所做的仅仅是计算线性激活函数,这还不如去掉所有隐藏层(效果与不使用隐藏层的逻辑回归模型相同)。
因为两个线性函数的组合,仍然是线性函数。
只有一个地方会使用线性激活函数:
当g(z) = z时,即使用机器学习解决回归问题的时候,比如你想预测房价,y不是0或1,而是一个实数,任何值都可能存在。但此时,隐藏单元不应该使用线性激活函数,可以使用ReLu或者Tanh或者Leaky ReLu函数。所以唯一可以使用线性激活函数的地方通常就是输出层。
梯度下降?如何估计/计算单个激活函数的斜率或者导数?
第八课:激活函数的衍生物
神经网络实现反向传播时,需要计算激活函数的斜率或导数。
对激活函数的选择以及如何计算这些函数的斜率?
对sigmoid函数求积分:
对Tanh函数求积分:
对ReLu函数求积分:
你可以写一段代码定义在原点处的斜率值,不过定义为哪一种都是可以的。
第九课:神经网络的梯度下降
在本视频中,您将看到如何使用一个隐藏层实现神经网络的梯度下降。
如何实现你需要实现的方程式以获得反向传播或者使梯度下降工作?
为什么这些特定的方程是精确的方程,是计算神经网络所需梯度的正确方程?
当只有一个隐藏单元时:
这些之前都有讲过,现在直接给出计算这些导数的方程,dw(1),db(1),dw
(2),db(2)...下一节再进行推导。
第十课:反向传播求导公式推导(可选)
让我们使用计算图来了解这些方程式的推导方式:
以上就是逻辑回归了,现在当我们要计算神经网络的反向传播时,我们要做的其实很像这个,但是我们要做两次是因为现在我们的x不单单是一个输出单元,它会先成为一个隐藏层之后再变成一个输出单元。
当有一个隐藏层时:
在写反向传播时有一个注意事项:就是如果你确认你的矩阵维度匹配了的话,如果你从头到尾想一想你的矩阵,然后确认这些矩阵运算结果的维度都可以相互匹配,有时就已经可以消除许多反向传播过程中的bug了。
这些给了我们一些关于推导反向传播的理解,我们一共有6个等式,分别是dz2,dw2,db2,dz1,dw1和db1。
目前为止,我们已经推导出了对于只有一个训练样本的反向传播算法,但是不足为奇的是,比起一次只能训练一个样本,我们更想要可以向量化多个不同样本的训练模型。
把样本以列堆叠乘一个矩阵可以把这些所有问题解决:
事实表明如果你仔细研究下其中的数学,相同的技巧对于反向传播同样适用:
首先,如果你把这些不同训练样本的dz以列堆叠成一个矩阵,通过向量化实现。然后计算dw[2],db[2],dZ[1]。*表示单独元素间的乘法。最后计算剩下的两个(隐藏层)。
在所有机器学习算法中,我认为反向传播算法的推导,实际上是我见过用到的数学最复杂的推导之一。它需要知道线性代数以及矩阵的导数以从头开始重新导出它从第一原则。但是算法有效是最重要的,所以推导只是帮助你有足够的直觉来调整算法并使其工作。
在您实现神经网络之前,我想与您分享最后一个细节,即如何初始化神经网络的权重。事实证明,初始化参数,不是零而是进行随机初始化,这对训练神经网络非常重要。在下一个视频中,您将看到原因。
第十一课:随机初始化
当您更改神经网络时,随机初始化权重非常重要。对于逻辑回归,可以将权重初始化为零。
但是对于将参数的权重初始化为全零的神经网络然后应用梯度下降,它将不起作用?
b[1]可以初始化为0,但是如果将权重参数矩阵w[1]初始化为0,这样的初始化权重参数将会导致无论是用什么样的样本进行训练,a[1]1和a[1]2始终是相同的。即第一个激活函数和第二个激活函数是完全一致的。因为这些隐藏神经元在进行完全相同的计算工作。
当你进行反向传播时,由于对称问题,这些隐藏单元将会在同样地条件下被初始化。最终导致z[1]1的导数和z[1]的倒数也不会有差别,同样地,输出权重参数矩阵w[2]也等于[0, 0],但如果你使用这种方法来初始化神经网络,那么上面这个隐藏单元和下面隐藏单元也是相同的。
那么经过一次迭代,你会得到实现完全相同功能的隐藏单元。
经过以上分析,归纳出一个结果:
如果你在神经网络中将所有权重参数矩阵w的值初始化为零,由于两个隐藏单元肩负着相同的计算功能,并且也将同样的影响作用在输出神经元上,经过一次迭代后,依然会得到相同的结果。接下来进行二次迭代,三次迭代...无论你将这个神经网络训练多久,这两个隐藏单元仍然在使用同样地功能进行运算。
当使用更多的隐藏单元时,这种情况仍然会发生。
我们希望两个不同的隐藏单元能实现不同的功能,因此只有进行随机初始化能够解决这样的问题:
将权重参数矩阵w赋予非常小的随机初始值。
b不会由于初始值为0而产生对称(对称失效)问题。
为什么使用0.01?
我们通常比较喜欢使用非常非常小的随机初始值。当你使用sigmoid函数,tanh函数...时,如果步长过大,那么当你计算激活值的时候,z的值可能会非常大或者非常小,在这样的情况下,你可能最终会发现图上相对平坦的部分梯度的斜率非常小,这意味着梯度下降会非常缓慢。
总结:如果w过大,你可能会得到一个非常大的z,这会导致激活函数学习进度缓慢。如果你不使用激活函数,这种情况可能不明显。但是如果你使用二分类,并且你的输出单元使用了sigmoid函数,那么你不会希望初始参数过大。
还有一个结论:
有时候会有比0.01更为合适的数值,当你在训练一个仅含一个隐藏层的神经网络时,显而易见0.01这个数值在类似于这样不含过多隐藏层的浅层神经网络中是非常合适的。但当你要训练一个非常非常复杂的深度神经网络时,我们会使用一个不同的数值。如何挑选一个与0.01不同的数值??
但是通常情况下,我们都会选择一个相对比较小的数值。
您现在知道如何设计一个含有单独隐藏层的神经网络,初始化参数,使用前向传播进行预测以及在梯度下降时使用反向传播设计的导数运算。除了使用backprop计算导数和实现梯度下降。
吴恩达机器学习Week 4
第一课:深度L层神经网络
之前我们学习了单隐藏层神经网络中的前向传播和反向传播,逻辑回归,向量化,也了解了对权重参数进行随机初始化的重要性。
我们已经学过实现深度神经网络需要的大部分知识,本周将要做的是将这些想法融合在一起,以便您能够实现自己的深层神经网络。
什么是深度神经网络?
上图中的图片用于逻辑回归,你也看到过具有单个隐藏层的神经网络。所以这是一个具有2个隐藏层的神经网络和一个具有5个隐藏层的神经网络的示例。
我们说逻辑回归是一个非常“浅”的模型,而这里的模型是一个更深的模型,浅层与深度是一个程度问题。有些函数只有很深的神经网络才能学习而比较浅的网络模型无法做到这点。
我们一般先尝试逻辑回归,然后再尝试一个、两个隐藏层,可以把隐藏层的数量作为另一个超参数,你可以尝试很多不同的值。然后通过交叉验证或者测试集进行评估。
符号:
我们把输入特征成为x
x同时也是第零层的激活函数,所以a[0] = x
最后一层的激活函数a[L] = y帽
即a[L]等于神经网络的预测输出也就是等于预测值y帽
课程网站上的符号列表??
因此,单个隐藏层的神经网络,这将是一个2层神经网络。请记住,当我们计算神经网络中的图层时,我们不计算输入图层,我们只计算隐藏图层和输出图层。
第二课:深度网络中的前向传播
在上一个视频中,我们描述了什么是深层L层神经网络,并且还讨论了我们用来描述这种网络的符号。在此视频中,您将了解如何在深层网络中执行前向传播。
我们已经根据第一个隐藏层的计算公式计算出了z[1]和a[1],那么第二个隐藏层怎么处理呢?
第二层的激活函数就是权重参数矩阵w乘以第一层的输出函数,加上第二层的偏差向量,然后a[2]等于z[2]代入激活函数。这就是第二层的计算公式。后面几层以此类推,直到输出层。这样你就推导出了输出值y帽。
值得注意的是x = a[0],因为我们也可以把输入的特征向量x看作是第0层的激活函数输出。然后你就会发现所有屏幕上的等式看起来形式都相同。然后总结出通用规则(通用的前向传播等式)。
完成了对单一训练样本的前向传播通用公式的推导,怎么将其向量化应用到整个训练集中?
注意这些大写字母只是意味着把训练样本放入了矩阵的不同列中。整体向量化完成后,我们就得到y帽 = g(z[4]) = A[4],这就是将所有训练样本经过深度神经网络生成的预测值水平堆叠起来。
这样我们就在整个训练集上得到了向量化的前向传播公式。
如果你仔细观察这个向量化的过程,就会发现看起来很像for循环,当i取值范围是1到4时,当l取值范围是1到总层数大写L时,去计算第一层的激活函数,第二层的激活函数,类推至第三层和第四层。
为了尽可能避免使用for'循环,但这是唯一一处,我觉得除了使用for循环以外,并没有更好的实现方法。所以当你在实现前向传播的时候,使用一个for循环是可以接受的(被用来计算第一层、第二层和三四层的激活函数)。
至今还没有人提出过不用for循环就可以计算从1到L层的计算,也就是整个深度神经网络的计算工作。
总结:它和一层隐藏层的神经网络很像,只是将它重复了几次而已。
要学会通过矩阵维度的方法去鉴别自己的程序有没有错误。
第三课:获得正确的矩阵尺寸
在实现深度神经网络时,我经常用来检查代码正确性的调试工具之一。
拿一张纸,然后处理我正在使用的矩阵和维度。
所以一般检测的维度就是:L层的矩阵维度是(nL x n(L - 1)),bL的维度应该为nL x 1。这两个等式能帮助再次检查矩阵w以及矢量b的维度,确保都是正确的维度。
z
x
aL
z和a在这类网络中有着相同的维度。
当然,如果你用反向传播,dw的维度应该和w的维度一致,db和b的维度一致。
当我们一次性对多个例子采用矢量化会发生什么?
显而易见,w,b,dw和db的维度保持一致,但是z,a以及x的维度,在矢量化的过程中将会发生一点变化。
所以我希望我们经历的小练习有助于澄清你正在使用的各种矩阵的维度。当您为深度神经网络实现反向传播时,只要您完成代码并确保所有矩阵的维度都是一致的。这通常会有所帮助,它会在一些方面消除可能的错误。
因此,我希望通过练习来确定您将要使用的各种矩阵的尺寸是有帮助的。当您实现深度神经网络时,如果您保持与您正在使用的各种矩阵和向量的维度。
第四课:为什么选择深度神经网络?
为什么需要深入或者有很多隐藏层?
首先,什么是深度网络计算?如果您正在构建一个用于人脸识别或人脸检测的系统,那么这就是深度神经网络可以做的事情。也许你输入一张脸的图片然后你可以想到的神经网络的第一层可能是一个特征探测器或一个边缘探测器。
所以直观的,我们可以把神经网络的浅层看做是简单的检测函数,如检测边缘,然后在神经网络的后一层,将它们组合到一起,以便它能学习更多和更复杂的功能。我们从中获取的进一步的关键信息,仅仅是找到像边缘这样的简单事物,然后构建它们,将它们组合在一起以检测更复杂的事物。
并且这种类型的简单到复杂的分层表示或组合表示也适用于除图像和面部识别之外的其他类型的数据。
语音识别:
具有多个隐藏层的深层神经网络可能能够使较早的层学习这些较低级别的简单特征,将检测到的简单的事物放在一起,以便检测更复杂的事物,例如识别特定的单词甚至短语或句子。
有些人喜欢在深度神经网络和人类大脑之间进行类比,我们相信,或者神经科学家认为,人类的大脑也开始检测眼睛看到的边缘之类的简单事物,然后构建那些以检测更复杂的东西喜欢你看到的面孔。
关于为什么深度网络似乎运行良好的另一个原因如下:
这个结论来自电路领域,它涉及到什么类型的函数可以用不同的(与 或非)逻辑情况来计算。
对于一些数学函数,使用深层网络进行计算比使用浅层网络更容易。
深度网络确实有效。
有时候人们会过度使用并坚持使用大量的隐藏层。但是当我开始出现一个新问题时,我常常会开始进行逻辑回归,然后尝试使用一个或两个隐藏层并将其用作超参数。将其用作您调整的参数或超参数,以便尝试为您的神经网络找到正确的深度。
但是在过去的几年中,人们发现了一种趋势,即对于某些应用来说,非常非常深的神经网络,有时候可能有很多层,有时可能是问题的最佳模型。这就是为什么深度学习似乎运作良好的原因。
第五课:深层神经网络的构建
知道了前向传播和后向传播的基本框架,以及构建深度神经网络须知的要点。我们怎样把这些要点合并起来构造深度神经网络?
将Z[l]的值缓存是非常有用的,因为把ZL存起来对反向传播很有用。对于反向传播,我们只关注L层的计算,你将实现一个函数,它的输入为da
[l]和输出da[l-1]。
输入实际上包括L层的da[l]以及缓存。所以你可以使用已经计算好的z[l]值。输出中的da[l-1]你也可以输出梯度,以用于梯度下降学习算法。
这就是基本框架:怎么实现前向传播(前向函数),以及实现反向传播(反向函数)。
总结一下:在l层,你要有前向传播或前向函数,输入a[l-1]和输出a[l],以及为了计算,需要使用w[l]和b[l],以及设置缓存为0和反向函数。反向计算反过来。
如果你掌握了这两个函数,那么神经网络的基本计算将是如下这样的:
你将用特征向量a[0],最为输入,接着算出第一层的激励向量a[1],算的时候,你需要w[1]和b[1],同时也要缓存z[1]。接着把它们输入到第二层,接着使用w[2]和b[2],计算第二层的激励向量a[2],不断重复,直到最终,输出到a[l]等于y帽。沿着这个方向,我们缓存了所有的z值,这就是前向传播步。
急着做反向传播步,我们将要做的是一系列的后向,迭代,从中后向传播和计算梯度。你还会的到da[0],但是这个输入特征向量的导数没有什么用,至少对训练有监督的神经网络的权重是这样的,所以你就可以停止。
沿着这个方向,后向传播也会输出dw[l],db[l],最后计算出你需要的所有导数。
训练神经网络的一步迭代从a[0],也就是x开始,完成接下来的前向传播,计算y帽并用之进行后向传播,得到所有导数项以后,你可以用w减去学习速率乘以每层的dw来更新w,类似的更新b。
这就是神经网络的梯度下降的一步迭代。
细节:
从概念上讲,这里的缓存理解为存储,反向函数z的值是很有用的。但当你使用的时候,你发现缓存也许是获得参数w[1],b[1]在反向传播函数的数值时一种方便的方法。从操作上来说,当你计算反向传播时就复制参数到后面需要使用的地方是很方便的。
你现在已经学习了实现深度神经网络的基本架构。 在每一层中都有一个前向传播步骤,并且有一个相应的向后传播步骤。 并有一个缓存来传递信息从一个到另一个。
如何实际实现这些框架的架构?
第六课:前向和后向传播
前向传播:
反向传播:
总结一下:
以上就是实现一个三层神经网络,前向传播和反向传播的流程,最后还有用一个细节:
当前向传播时,我们会用输入数据X来进行初始化,反向传播又是如何初始化的呢?
当你使用逻辑回归做二元分类时,da[l]计算公式可以得出(最终输出损失函数对y帽求导),这个输出da的公式会用在最终层L上。当然如果要使用向量化实现,要先初始化反向传播,在L层用da[l]表示这个公式,即可得到实现向量化的方法。这也是如何初始化一个向量化版本反向传播的方法。
机器学习的复杂度来源于数据而非一行行代码。
当你在训练深度网络时,若能正确调整超参数,会让深度神经网络开发工作更为高效。
第七课:参数和超参数
有效地开发你的深度神经网络需要你不仅要很好地组织你的参数,还要你的超参数,那么什么是超参数?
决定真正参数的参数。
你的模型参数w和b以及你需要告诉你的学习算法其他东西,例如学习率α,因为我们需要设置α并且反过来将确定你的参数如何演变,或者你执行学习算法的梯度下降、迭代次数、激活函数、还有其他你知道需要设置的数字比如隐藏层的数量。
这些都是你需要告诉你的学习算法的东西,所以这些是控制最终参数w和b的参数,所以我们把所有这些东西都称为超参数。
实际上深度学习在后面的课程中有很多不同的超参数:动量、最小批大小以及各种形式的正则化参数等。
深度学习比机器学习多了很多的超参数。
当你在训练深度神经网络的时候,你会发现在超参数取值的问题上,会有很多不同的选择,而你需要尝试许多可能的值。
所以在深度学习算法中的超参数如何取值?
当你在尝试许多可能的取值时,是一个实验为依据的过程。
当你在创建新模型的时候,很难提前直到超参数的最优取值是多少?
所以我们通常会尝试许多不同的取值,就像图中的模型这样。尝试不同的参数配置,构建模型并运行,看看效果如何?然后循环往复直到找到最优值。
应用深度学习是一个基于实验的过程。(不断尝试然后找到最优值)
如今深度学习被应用到众多领域,从计算机视觉到语音识别,到自然语言处理,比如在线广告或者网页搜索,到许多结构化数据应用或者产品推荐等。某个领域的研究者尝试去拓展另一个领域,有时候关于超参数的直觉会延续,有时候可以完美集成对超参数配置的效果,有时候却得到大相径庭的效果。所以我建议大家:
多尝试几次,取不同的值,看看结果是否能让人满意,特别是开始新项目的时候。
如何系统性的取得最优值??
且对于已经运行良好的模型,很可能过了一年后,你会发现这些不是最优值了。可能是因为计算机基础结构,比如GPU和CPU的类型或者其他架构发生了改变。
经验:如果你研究一个问题很多年,你可以时不时地尝试一些不同的超参数取值。相信经过不端尝试和累计经验以后,你会养成关于最优超参数值选取的直觉。
逐个尝试超参数的取值,听起来可能是深度学习中不那么令人满意的地方,但这是因为深度学习的研究依然处于初级阶段,或许不久后对于超参数的最优值选取会出现更好的办法,但也可能因为CPU GPU和数据库在不断变化,这些方法在一段时间内不会趋于一致。你还是需要不断地尝试对超参数不同的取值,并在交叉验证集或者其他集合上进行评估然后选取最优解。
如何系统地探索超参数空间?
第八课:深度学习和人类大脑有什么关系?
那么,深度学习与大脑有什么关系呢?
总结以后发现相似度并不高。
但让我们看看为什么人们喜欢将深度学习和人类大脑之间进行类比?
当你构建神经网络时,你会运用前向传播和反向传播。由于我们很难直观的理解这些复杂的方程为什么能实现理想的效果,所以将深度学习和人类大脑进行类比可以让这个过程简化从而便于说明。这种解释(更简单)容易让大众更轻易地提及、使用或者报道。
对比方向:逻辑回归单位和sigmoid激活函数 vs 神经元
独立的逻辑单位:
神经网络中一个独立的神经元 vs 一个生物意义上的神经元(复杂得多)
我理解深度学习,我认为它非常善于学习,非常灵活的方程,非常复杂的方程,x到y的映射,监督学习中输入到输出映射。
我倾向于不再运用这个类比。
你现在已经知道如何运用正向传导,反向传导和梯度下降以及深层的神经网络结构!
网友评论