| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 吴恩达神经网络深度学习阶段二 -> 正文阅读 |
|
[人工智能]吴恩达神经网络深度学习阶段二 |
神经网络概览 上周我们学习了逻辑回归,我们了解了这个模型如何与下面公式建立联系。 ? 如上所示,首先你需要输入特征 x ?,参数 w ?和 b?,通过这些你就可以计算出 z, 把许多sigmoid单元堆叠起来形成一个神经网络。 ? ? ?在逻辑回归中,通过直接计算 z得到结果a 。而这个神经网络中,我们反复的计算 z 和 a ,计算 a?和 z,最后得到了最终的输出loss function。逻辑回归中,有一些从后向前的计算用来计算导数 d a 、 d z 。同样,在神经网络中我们也有从后向前的计算,看起来就像这样,最后会计算 da2,dz2,从左到右反向计算。 神经网络表示 如图所示,我们有输入特征x1,x2,x3,他们被竖直堆叠起来,这样被称为输入层,而另外一层是隐藏层,最后一层只有一个节点的是输出层,它负责产生预测值。隐藏层的含义:在一个神经网络中,当你使用监督学习训练它的时候,训练集包含了输入 x 也包含了目标输出 y?,所以术语隐藏层的含义是在训练集中,这些中间结点的准确值我们是不知道到的,也就是说你看不见它们在训练集中应具有的值。你能看见输入的值,你也能看见输出的值,但是隐藏层中的东西,在训练集中你是无法看到的。所以这也解释了词语隐藏层,只是表示你无法在训练集中看到他们。但是它只能叫做一个两层的神经网络。原因是当我们计算网络的层数时,输入层是不算入总层数内,所以隐藏层是第一层,输出层是第二层。第二个惯例是我们将输入层称为第零层,所以在技术上,这仍然是一个三层的神经网络,因为这里有输入层、隐藏层,还有输出层。但是在传统的符号使用中,如果你阅读研究论文或者在这门课中,你会看到人们将这个神经网络称为一个两层的神经网络,因为我们不将输入层看作一个标准的层。 ?当然隐藏层和输出层都是有参数w,b的,将之标为w[1],b[1],这些参数适合第一层的隐藏层有关系的。 神经网络的输出 logistics回归有两个步骤,先算出z,再用激活函数算出a ?如上图所示,神经网络输出与logistics回归相似将其将其分为两步 第一步:计算z计算w 第二步:激活函数计算a 隐藏层的第二个以及后面两个神经元的计算过程一样,只是注意符号表示不同,最终结果如图: 向量化计算: ? ? 神将网络中第一层输入一个x,得出a[1],通过相似的衍生发现后一层可以写成相似的形式 ? ?根据给出的一个单独的输入特征向量,运用四行代码计算出一个简单神经网络的输出。接下来你将了解的是如何一次能够计算出不止一个样本的神经网络输出,而是能一次性计算整个训练集的输出。 如下图所示,这是m个训练样本的神经网络计算。 ? ? ?在神经网络向前传播的过程中,会用到sigmoid函数 在通常情况下使用非线性函数tanh函数或者双区正切函数,总体上优于sigmoid函数 结果表明在隐藏层使用g函数较优是因为值域在-1到1之间,其均值是更接近于0均值的。所以,在不同的神经网络层中,激活函数可以不同。为了表示不同的激活函数,在不同的层中,使用方括号上标来指出 g 上标为 [ 1 ]的激活函数,可能会跟 g 上标 [ 2 ]? 为不同。方括号上标代表隐藏层,方括号上标表示输出层。 这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu的一个优点是:当 z zz 是负值的时候,导数等于0。 这里也有另一个版本的Relu被称为Leaky Relu。当 z是负值时,这个函数的值不是等于0,而是轻微的倾斜,如图。这个函数通常比Relu激活函数效果要好,尽管在实际中Leaky ReLu使用的并不多。 为什么神经网络需要非线性激活函数?事实证明:要让你的神经网络能够计算出有趣的函数,你必须使用非线性激活函数。事实证明,如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是计算线性函数,所以不如直接去掉全部隐藏层。在我们的简明案例中,事实证明如果你在隐藏层用线性激活函数,在输出层用sigmoid函数,那么这个模型的复杂度和没有任何隐藏层的标准Logistic回归是一样的,如果你愿意的话,可以证明一下。在这里线性隐层一点用也没有,因为这两个线性函数的组合本身就是线性函数,所以除非你引入非线性,否则你无法计算更有趣的函数,即使你的网络层数再多也不行。 激活函数的导数 简单介绍一下几个激活函数的导数,在神经网络中使用反向传播的时候,你真的需要计算激活函数的斜率或者导数。针对以下四种激活,求其导数如下: ?当z=10或-10时,导数约等于0 当z=0时,导数=g(z)[1-g(z)] 当神经网络中a = g(z)时,导数=a(1-a) ? ? ? ?神经网络中的梯度下降法 矩阵 W [ 1 ]?的维度就是( n [ 1 ] , n [ 0 ] )就是 n [ 1 ]维向量,可以写成( n [ 1 ] , 1),就是一个的列向量。 矩阵 W [ 2 ]?的维度就是( n [ 2 ] , n [ 1 ]??), b [ 2 ]?的维度就是( n [ 2 ] , 1?)维度。 训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是初始化成全零。当你参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:(i=1,2,...,m) 正向传播方程如下: 反向传播方程如下: (其中np.sum是python中的numpy命令,axist = 1表示水平相加求和,keepdims是防止python生成那些奇怪的秩数(n,)) 直观理解反向传播
? 这里的矩阵:W [ 2 ]?的维度是: ( n [ 2 ] , n [ 1 ] ) ,z [ 2 ] , d z [ 2 ]?的维度都是: ( n [ 2 ] , 1 )?,如果是二分类,那维度就是 ( 1 , 1 ) 。z [ 1 ] , d z [ 1 ]?的维度都是: ( n [ 1 ] , 1 )? 证明过程: 见公式3.42,其中 W [ 2 ] T d z [ 2 ]??维度为: ( n [ 1 ] , n [ 2 ] ) 、 ( n [ 2 ] , 1 )?相乘得到 ( n [ 1 ] , 1 ),和 z [ 1 ]维度相同,g [ 1 ] ′ ( z [ 1 ] )?的维度为 ( n [ 1 ] , 1 ),这就变成了两个都是 ( n [ 1 ] , 1 )?向量逐元素乘积。实现后向传播有个技巧,就是要保证矩阵的维度相互匹配。最后得到 d W [ 1 ]?和 d b [ 1 ]? ? ? ? ? ?随机初始化 当你训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为0当然也是可以的。但是对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。 ?这个问题的解决方法就是随机初始化参数。你应该这么做:把 W [ 1 ]?设为np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如0.01,这样把它初始化为很小的随机数。然后 b ?没有这个对称的问题(叫做symmetry breaking problem),所以可以把 b 初始化为0,因为只要随机初始化 W你就有不同的隐含单元计算不同的东西,因此不会有symmetry breaking问题了。相似的,对于 W [ 2 ]你可以随机初始化, b [ 2 ]可以初始化为0。 为什么这个常数是0.01而不是更大的数呢??如果过大,则会导致函数的值停留在一个饱和值,及变化很小,也就是说学习很慢,当然使用其他的常数也可以,只要适合即可。 深层网络中的前向传播 ?向量化实现过程可以这样写: ? 在进行深度学习的过程中一定要主义矩阵前后的维数是否符合,这样能大大提高运算的成功率 假设有m个样本其中w的维度是w(n[l],n[l-1])? ? ,? ? b的维度是b(n[l],m)? ,? ?z和a的维度是(n[l],m) 神经深度学习网络能解决很多问题,不过其实你不需要很大的神经网络,但是要有深度,要有较多的隐藏层。 ? 如果你在建一个人脸识别或是人脸检测系统,深度神经网络所做的事就是,当你输入一张脸部的照片,然后你可以把深度神经网络的第一层,当成一个特征探测器或者边缘探测器。在这个例子里,我会建一个大概有20个隐藏单元的深度神经网络,是怎么针对这张图计算的。隐藏单元就是这些图里这些小方块,举个例子,这个小方块(第一行第一列)就是一个隐藏单元,它会去找这张照片里“|”边缘的方向。那么这个隐藏单元(第四行第四列),可能是在找(“—”)水平向的边缘在哪里。之后的课程里,我们会讲专门做这种识别的卷积神经网络,到时候会细讲,为什么小单元是这么表示的。你可以先把神经网络的第一层当作看图,然后去找这张照片的各个边缘。我们可以把照片里组成边缘的像素们放在一起看,然后它可以把被探测到的边缘组合成面部的不同部分(第二张大图)。比如说,可能有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这许多的边缘结合在一起,就可以开始检测人脸的不同部分。最后再把这些部分放在一起,比如鼻子眼睛下巴,就可以识别或是探测不同的人脸。 深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。 另外一个,关于神经网络为何有效的理论,来源于电路理论,它和你能够用电路元件计算哪些函数有着分不开的联系。根据不同的基本逻辑门,譬如与门、或门、非门。在非正式的情况下,这些函数都可以用相对较小,但很深的神经网络来计算,小在这里的意思是隐藏单元的数量相对比较小,但是如果你用浅一些的神经网络计算同样的函数,也就是说在我们不能用很多隐藏层时,你会需要成指数增长的单元数量才能达到同样的计算结果。 搭建深层网络神经快 ?神经网络的一步训练包含了,从 a [ 0 ] 开始,也就是 x 然后经过一系列正向传播计算得到 y ^,之后再用输出值计算这个(第二行最后方块),再实现反向传播。现在你就有所有的导数项了, w 也会在每一层被更新为 w = w ? α d w ,b也一样, b = b ? α b ,反向传播就都计算完毕,我们有所有的导数值,那么这是神经网络一个梯度下降循环。 ? ?前向传播和反向传播 由图易知,输入一个变量,经过处理输出,图片左侧为单位样本,右侧为多个样本 ?同理这是反向传播 反向传播的步骤如下图,第五步是由第四步代入第一步得到的 ? 向量化实现的过程: 参数vs超参数 什么是超参数? learning rate?α \alphaα?(学习率)、iterations(梯度下降法循环的数量)、?L(隐藏层数目) 等等,这些都需要你来设置,且最终控制着参数w、b,这些就是超参数。 然而,当你开始开发新应用时,预先很难确切知道,究竟超参数的最优值应该是什么。所以通常,你必须尝试很多不同的值,并走这个循环,试试各种参数。试试看5个隐藏层,这个数目的隐藏单元,实现模型并观察是否成功,然后再迭代。这页的标题是,应用深度学习领域,一个很大程度基于经验的过程,凭经验的过程通俗来说,就是试直到你找到合适的数值。 但参数设定这个领域,深度学习研究还在进步中,所以可能过段时间就会有更好的方法决定超参数的值,也很有可能由于CPU、GPU、网络和数据都在变化,这样的指南可能只会在一段时间内起作用,只要你不断尝试,并且尝试保留交叉检验或类似的检验方法,然后挑一个对你的问题效果比较好的数值。 近来受深度学习影响,很多领域发生了变化,从计算机视觉到语音识别到自然语言处理到很多结构化的数据应用,比如网络广告、网页搜索、产品推荐等等;有些同一领域设置超参数的直觉可以推广,但有时又不可以,特别是那些刚开始研究新问题的人们应该去尝试一定范围内的结果如何,甚至那些用了很久的模型得学习率或是其他超参数的最优值也有可能会改变。 当然深度学习和大脑有什么关系? 其实关系不大,但这个类比还是很粗略的,这是一个logistic回归单元的sigmoid激活函数,这里是一个大脑中的神经元,图中这个生物神经元,也是你大脑中的一个细胞,它能接受来自其他神经元的电信号。 ? ? ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 8:24:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |