神经网络和深度学习(五) ——深层神经网络基础

神经网络和深度学习(五)——深层神经网络基础

(原创内容,转载请注明来源,谢谢)

一、概述

本文是对深层神经网络的基础,主要讨论深层神经网络的算法、公式推导以及一些注意事项。

首先,符号表示上和之前的一样,用L表示总层数,上标[l]表示第l层,n表示数量,a表示每一层的输出,w、b是参数,输入层是第0层。

二、前向传播

前向传播,目的是计算出预测的输出结果。实际上,多层的神经网络,也是一步步向前进行计算,主要在于要把前一层的输出,当作下一层的输入。

这里每层,可以考虑用之前说的激活函数,对wTx+b的结果进行变换。现在仅考虑所有层都使用sigmoid,其他激活函数,区别在于计算结果不一样、反向传播的导数不一样,但是本质是一样的。

第一层,输入是3个x,则z[1]=w[1]Tx+b[1],且a[1]=g(z[1])=1/(1+e-z[1])。

第二层,输入则是第一层计算的结果a[1],则z[2]=w[2]T a[1]+b[2],且a[2]=g(z[2])=1/(1+e-z[2])。

后面的层同理。最后一层计算出来的a,即最终的预测结果y。

如果使用向量化,则是一次计算一层,把一层的神经元,整合在一起,进行矩阵运算,整合方式,例如A[1],是将第一层每个神经元计算出来的a[1],纵向并排在一起,形成一个大的矩阵A[1],参与运算。

三、参数w与b的维度

根据上面的讨论,可以看出,每一层的w和b,其维度是会变化的。w和b是为了辅助更好的预测结果的,故其数量是需要根据输入、输出的数量决定的。

1、w

先不考虑b,假设z=wx。考虑第一层,以下图为例。x的维度是(2,1),维度即行、列元素个数。

由于输出的a只是对z进行一层函数的处理,因此z的维度即a的维度,对于第一层而言,即第一层的神经元的数量(因为每个神经元就是一个输出),下图来看是(3,1)。

由wx=z,即(?,?) *(2,1)=(3,1),根据矩阵运算的原则,可以看出(?,?)=(3,2),即第一层的w,其是一个三行两列的矩阵。

再看第二层,(?,?)*(3,1)=(5,1),故(?,?)=(5,3),即第二层的w是一个五行三列的矩阵。以此类推,可以确定后面的w。

2、b

b是在wx的基础上,进行相加的,且由z=wx+b,可以看出,b和z的维度是一样的,即b的维度就是输出的维度。如第一层的b,即(3,1),第二层的b,即(5,1)。

3、确认维度的意义

在明确维度的情况下,后续调试代码、查找问题的时候,可以先清晰的看出,每一层的参数在个数上是否有误。

4、向量化的维度

上面提到的,都是一个样本的情况下,实际情况,输入的x的样本个数是m,即有m个x1、x2的输入,此时,输入的维度x变为(2,m),输出的维度a变成(3,m),则可以看出,w的维度是不需要变化的,仍是(3,2)。b的维度跟随a的维度,也变成(3,m)。

5、通用公式

设n[l]表示第l层神经元个数,m表示样本数量:

W的维度:(n[l],n[l-1]),b的维度=Z的维度=A的维度:(n[l], m)。

四、使用多层神经网络的原因

这个主要和业务场景有关,考虑到人脸照片处理。

人脸照片处理,过程大致为:接收图片;图片边界分析;边界组成(组成五官);组成人脸;输出。

这里每一步的处理结果,都是需要输出给下一步,因此,多层的情况下,每一层可以全责清晰,而且利于计算处理。

如果不用多层网络,只用1层的话,那一层需要非常多的神经元,这样计算量大而且不易调试。

五、搭建神经网络

1、反向传播

多层神经网络的反向传播,和单层没有本质上的区别,处理方式还是一个很长的链式求导法则,这里不细说,可以看上一篇文章,有详细的描述。建议大家都手工推导一遍,基本上就理解了。

2、构建网络

实际上,即针对输入(无论是样本输入,还是上一层网络的输出),结合本层的参数,整理成z=wx+b,再套用上激活函数,例如sigmoid、tanh、relu等,即可完成本层的计算输出。

在前向传播计算时,通常会缓存本层的z、w、b的结果,以便后面反向传播时使用,不用再次计算。

对于反向传播,最后一层的导数,要先考虑到损失函数L(a,y)=-(yloga + (1-y)log(1-a)),求出y对a的导数da=-y/a +(1-y)/(1-a),再计算本层的dw、db。然后再将da的结果往前一层传,逐层计算da、dw、db。

接着,将每一层的w、b减去本层对应的dw、db,即完成一次的优化。

重复上面的工作多次,直到整个系统足够优化。

六、参数与超参数

这个是个概念的说明,参数即实际参与需要优化的内容,即每一层的w、b。

而超参数,是协助优化w、b的参数,比如学习速率α、神经网络层数L、每一层的神经元的个数、激活函数的选择、正则化项系数等。这些参数,本身大部分不在设定后就不会变化(如L、神经元个数、激活函数等设定后不会变化,α可以变化但是变化也是为了优化更快)。

七、总结

前向和反向传播,最终的公式如下:

学习深层神经网络,实质就是浅层神经网络的堆叠,因此主要要学好单层、双层网络的推导和运用,后面多层的网络自然就融会贯通。

——written by linhxx 2018.02.03

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2018-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刘君君

JDK8的HashMap源码学习笔记

3048
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19710
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4519
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2527
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

19210
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3467
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2547
来自专栏xingoo, 一个梦想做发明家的程序员

AOV网络拓扑排序

这个算法,主要是为输出一个无环图的拓扑序列 算法思想: 主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入...

1965
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

462
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1736

扫码关注云+社区