第三周:浅层神经网络

1. 神经网络综述

首先,我们从整体结构上来大致看一下神经网络模型。

前面的课程中,我们已经使用计算图的方式介绍了逻辑回归梯度下降算法的正向传播和反向传播两个过程。如下图所示。神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层/中间层。这样从计算上来说,神经网络的正向传播和反向传播过程只是比逻辑回归多了一次重复的计算。正向传播过程分成两层,第一层是输入层到隐藏层,用上标[1]来表示:

第二层是隐藏层到输出层,用上标[2]来表示:

在写法上值得注意的是,方括号上标[i]表示当前所处的层数;圆括号上标(i)表示第i个样本。

同样,反向传播过程也分成两层。第一层是输出层到隐藏层,第二层是隐藏层到输入层。

2. 神经网络表示

单隐藏层神经网络就是典型的浅层(shallow)神经网络如下图所示。

 结构上,从左到右,可以分成三层:输入层(Input layer),隐藏层(Hidden layer)和输出层(Output layer)。输入层和输出层,顾名思义,对应着训练样本的输入和输出,很好理解。隐藏层是抽象的非线性的中间层。

在写法上,我们通常把输入矩阵X记为,把隐藏层输出记为,上标从0开始。用下标表示第几个神经元,注意下标从1开始。例如表示隐藏层第1个神经元,表示隐藏层第2个神经元。这样,隐藏层有4个神经元就可以将其输出写成矩阵的形式:

 最后,相应的输出层记为,即y^。这种单隐藏层神经网络也被称为两层神经网络(2 layer NN)。之所以叫两层神经网络是因为,通常我们只会计算隐藏层输出和输出层的输出,输入层是不用计算的。这也是我们把输入层层数上标记为0的原因()。

3. 计算神经网络的输出


接下来我们开始详细推导神经网络的计算过程。两层神经网络可以看成是逻辑回归再重复计算一次。如下图所示,逻辑回归的正向计算可以分解成计算z和a的两部分:

对于两层神经网络,从输入层到隐藏层对应一次逻辑回归运算;从隐藏层到输出层对应一次逻辑回归运算。每层计算时,要注意对应的上标和下标,一般我们记上标方括号表示layer,下标表示第几个神经元。例如表示第l层的第i个神经元。注意,i从1开始,l从0开始。

下面,我们将从输入层到输出层的计算公式列出来:

 然后,从隐藏层到输出层的计算公式为:

 其中a[1]为:

上述每个节点的计算都对应着一次逻辑运算的过程,分别由计算z和a两部分组成。

 为了提高程序运算速度,我们引入向量化和矩阵运算的思想,将上述表达式转换成矩阵运算的形式:

 之前也介绍过,这里顺便提一下,W[1]的维度是(4,3),b[1]的维度是(4,1),W[2]的维度是(1,4),b[2]的维度是(1,1)。这点需要特别注意。

4. 多个变量进行矢量化

上一部分我们只是介绍了单个样本的神经网络正向传播矩阵运算过程。而对于m个训练样本,我们也可以使用矩阵相乘的形式来提高计算效率。而且它的形式与上一部分单个样本的矩阵运算十分相似,比较简单。


不使用for循环,利用矩阵运算的思想,输入矩阵X的维度为(nx,m)。这样,我们可以把上面的for循环写成矩阵运算的形式:


其中,的维度是(4,m),4是隐藏层神经元的个数;的维度与相同;的维度均为(1,m)。

对上面这四个矩阵来说,均可以这样来理解:行表示神经元个数,列表示样本数目m。

5. 矢量化实现的解释

这部分Andrew用图示的方式解释了m个样本的神经网络矩阵运算过程。其实内容比较简单,只要记住上述四个矩阵的行表示神经元个数,列表示样本数目m就行了。

值得注意的是输入矩阵X也可以写成

6. 激活函数

神经网络隐藏层和输出层都需要激活函数(activation function),在之前的课程中我们都默认使用Sigmoid函数σ(x)σ(x)作为激活函数。其实,还有其它激活函数可供使用,不同的激活函数有各自的优点。下面我们就来介绍几个不同的激活函数g(x)。

sigmoid函数

tanh函数

 

ReLU函数


Leaky ReLU函数

 

如上图所示,不同激活函数形状不同,a的取值范围也有差异。

如何选择合适的激活函数呢?首先我们来比较sigmoid函数和tanh函数。对于隐藏层的激活函数,一般来说,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,+1]之间,隐藏层的输出被限定在[-1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果。因此,隐藏层的激活函数,tanh比sigmoid更好一些。

而对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数。

观察sigmoid函数和tanh函数,我们发现有这样一个问题,就是当|z|很大的时候,激活函数的斜率(梯度)很小。因此,在这个区域内,梯度下降算法会运行得比较慢。在实际应用中,应尽量避免使z落在这个区域,使|z|尽可能限定在零值附近,从而提高梯度下降算法运算速度。

为了弥补sigmoid函数和tanh函数的这个缺陷,就出现了ReLU激活函数。ReLU激活函数在z大于零时梯度始终为1;在z小于零时梯度始终为0;z等于零时的梯度可以当成1也可以当成0,实际应用中并不影响。

对于隐藏层,选择ReLU作为激活函数能够保证z大于零时,梯度始终为1,从而提高神经网络梯度下降算法运算速度。但当z小于零时,存在梯度为0的缺点,实际应用中,这个缺点影响不是很大。为了弥补这个缺点,出现了Leaky ReLU激活函数,能够保证z小于零是梯度不为0。

最后总结一下,

如果是分类问题,输出层的激活函数一般会选择sigmoid函数。但是隐藏层的激活函数通常不会选择sigmoid函数,tanh函数的表现会比sigmoid函数好一些。实际应用中,通常会会选择使用ReLU或者Leaky ReLU函数,保证梯度下降速度不会太小。其实,具体选择哪个函数作为激活函数没有一个固定的准确的答案,应该要根据具体实际问题进行验证(validation)。

7. 为什么需要非线性激活函数

我们知道上一部分讲的四种激活函数都是非线性(non-linear)的。那是否可以使用线性激活函数呢?答案是不行!下面我们就来进行简要的解释和说明。

假设所有的激活函数都是线性的,为了简化计算,我们直接令激活函数g(z)=zg,即a=z。那么,浅层神经网络的各层输出为:

我们对上式中a[2]进行化简计算:

 经过推导我们发现a[2]仍是输入变量x的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。

另外,如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,而失去了神经网络模型本身的优势和价值。

值得一提的是,如果是预测问题而不是分类问题,输出y是连续的情况下,输出层的激活函数可以使用线性函数。如果输出y恒为正值,则也可以使用ReLU激活函数,具体情况,具体分析。

8. 激活函数的导数-梯度

在梯度下降反向计算过程中少不了计算激活函数的导数即梯度。

我们先来看一下sigmoid函数的导数:

对于tanh函数的导数:

对于ReLU函数的导数:


对于Leaky ReLU函数:

9. 神经网络的梯度下降法

接下来看一下在神经网络中如何进行梯度计算。

该神经网络正向传播过程为:


其中,g(⋅)g(⋅)表示激活函数。

反向传播是计算导数(梯度)的过程,这里先列出来Cost function对各个参数的梯度:

反向传播的具体推导过程我们下一部分再进行详细说明。

10. 神经网络反向传播过程(optional)

我们仍然使用计算图的方式来推导神经网络反向传播过程。记得之前介绍逻辑回归时,我们就引入了计算图来推导正向传播和反向传播,其过程如下图所示:

 由于多了一个隐藏层,神经网络的计算图要比逻辑回归的复杂一些,如下图所示。对于单个训练样本,正向过程很容易,反向过程可以根据梯度计算方法逐一推导。

 总结一下,浅层神经网络(包含一个隐藏层),m个训练样本的正向传播过程和反向传播过程分别包含了6个表达式,其向量化矩阵形式如下图所示:

11. Random Initialization

神经网络模型中的参数权重W是不能全部初始化为零的,接下来我们分析一下原因。

举个简单的例子,一个浅层神经网络包含两个输入,隐藏层包含两个神经元。如果权重W[1]和W[2]都初始化为零,即:

 我们把这种权重W全部初始化为零带来的问题称为symmetry breaking problem。解决方法也很简单,就是将W进行随机初始化(b可初始化为零)。python里可以使用如下语句进行W和b的初始化:

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

这里我们将乘以0.01的目的是尽量使得权重W初始化比较小的值。之所以让W比较小,是因为如果使用sigmoid函数或者tanh函数作为激活函数的话,W比较小,得到的|z|也比较小(靠近零点),而零点区域的梯度比较大,这样能大大提高梯度下降算法的更新速度,尽快找到全局最优解。如果W较大,得到的|z|也比较大,附近曲线平缓,梯度较小,训练过程会慢很多。

当然,如果激活函数是ReLU或者Leaky ReLU函数,则不需要考虑这个问题。但是,如果输出层是sigmoid函数,则对应的权重W最好初始化到比较小的值。

12. 总结

本节课主要介绍了浅层神经网络。

首先,我们简单概述了神经网络的结构:包括输入层,隐藏层和输出层。然后,我们以计算图的方式推导了神经网络的正向输出,并以向量化的形式归纳出来。
接着,介绍了不同的激活函数并做了比较,实际应用中根据不同需要选择合适的激活函数。激活函数必须是非线性的,不然神经网络模型起不了任何作用。
然后,我们重点介绍了神经网络的反向传播过程以及各个参数的导数推导,并以矩阵形式表示出来。
最后,介绍了权重随机初始化的重要性,必须对权重W进行随机初始化操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式工程师应该知道的C语言

收集的一些嵌入式软件工程师面试题目 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 …

使用二分查找向一个有序数组中插入一个数据

折半查找法找到一个元素在数组中的下标* param arr 数组* param key 要查找的元素* return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置* 如:[1,4,6,7,10,11,15],查找8在数组中的位置,…

西北大学计算机考试,西北大学计算机技术

一、培养目标本专业是为培养适合国家建设需要的、具有严谨科学态度和敬业精神的计算机应用技术人才,通过硕士阶段的培养,应具备扎实的计算机系统的专业知识,了解相关领域的研究动态,熟悉现代化计算机应用技术和软硬件环境及工具。…

智慧交通day00-项目简介

汽车的日益普及在给人们带来极大便利的同时,也导致了拥堵的交通路况,以及更为频发的交通事故。智能交通技术已成为推动现代技术交通技术发展的重要力量,智能交通不仅能够提供实时的交通路况信息,帮助交通管理者规划管理策略&#…

Moblin MID开发学习笔记 - application launcher安装过程

(参照http://test.moblin.org/projects/application-launcher)a) 安装git:在Target下打开Terminal:# apt-get install git-coreb) 安装Genesis:(http://test.moblin.org/projects/genesis-application-lifecycle-manager)在Target下打开Terminal:# cd /usr/src/# git…

智慧交通day01-算法库01:numba

1 numba介绍 numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。 numba使用LLVM编译器架构将纯Python代码生成优化过的机器码,通过一些添加简单的注解,将面向数组和使用大量…

链表c++实现一

#include <iostream>using namespace std; typedef char nodeEntry; struct Node{ //数据成员 nodeEntry data; Node* next; //构建函数 Node(); Node(nodeEntry item,Node* link NULL);}; Node::Node(){ next NULL;} Node::Node(nodeEntry item,Node* link){ data it…

计算机语言恢复,win10系统找回消失不见语言栏的恢复方法

win10系统使用久了&#xff0c;好多网友反馈说关于对win10系统找回消失不见语言栏设置的方法&#xff0c;在使用win10系统的过程中经常不知道如何去对win10系统找回消失不见语言栏进行设置&#xff0c;有什么好的办法去设置win10系统找回消失不见语言栏呢&#xff1f;在这里小编…

MID开发笔记

RK:1 服务器&#xff1a;192.168.1.402 登录服务器命令:ssh softwin192.168.1.40 softwincn&#xff1b;界面在places ->connect to server,选择ssh&#xff0c;输入地址跟密钥即可。3 git中删除分支 git branch -D xxx&#xff0c;git log可以查看更新的信…

智慧交通day01-算法库02:imutils

1.imutils功能简介 imutils是在OPenCV基础上的一个封装&#xff0c;达到更为简结的调用OPenCV接口的目的&#xff0c;它可以轻松的实现图像的平移&#xff0c;旋转&#xff0c;缩放&#xff0c;骨架化等一系列的操作。 安装方法&#xff1a; pip install imutils在安装前应确…

linux 常用操作指令(随时更新)

ls: 查看当前目录下文件列表 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录&#xff0c;包括隐藏的a(all) mkdir 创建目录 -p 创建目录&#xff0c;若无父目录&#xff0c;则创建p(parent) cd 切换目录 touch 创建…

北京中软国际软件测试面试,中软国际软件测试面试题 2012年中软国际软件测试笔试题...

一&#xff0e;简答题&#xff1a;(60分)1. 写出软件测试的基本流程。(2. 分别用等价类划分和边界值方法设计测试用例测试密码域。要求密码必须是数字或字母且必须大于6位小于15位。(6分)3. 用SQL语句查询前十条记录&#xff1f;(6分)4. 什么是唯一索引&#xff0c;非唯一索引&…

16进制数组转字符串

修改函数原型&#xff0c;确保每次malloc后可以释放堆控件 char * HexToString(char *str,unsigned char Hex[],unsigned char lenth) {unsigned char i0,j0;unsigned char tema,temp;//char *str(char*)malloc(lenth*2);for(i0;i<lenth;i){tema(Hex[i]>>4)&0x0F;…

智慧交通day01-算法库03:cv.dnn

1.DNN模块 1.1. 模块简介 OpenCV中的深度学习模块&#xff08;DNN&#xff09;只提供了推理功能&#xff0c;不涉及模型的训练&#xff0c;支持多种深度学习框架&#xff0c;比如TensorFlow&#xff0c;Caffe,Torch和Darknet。 OpenCV那为什么要实现深度学习模块&#xff1f;…

高标清硬盘播出服务器,高标清4通道SDI硬盘播出服务器 XUAPX4000HD

原标题&#xff1a;高标清4通道SDI硬盘播出服务器 XUAPX4000HDXUAP多通道硬盘自动播出系全系统设计 IP/TS/SDI多种播出模式XUAP系统采用先进硬件译码技术的自动播出系统&#xff0c;可依设定时间自动化切换影片与触发连动外围设备&#xff0c;如 矩阵、录像机、切换器 等&#…

行为科学统计第3章

行为科学统计 Statistics for the Behavioral Sciences 人生很累&#xff0c;现在不累&#xff0c;以后更累啦&#xff5e; 第3章 集中趋势 引言&#xff1a;一个平均数最主要的优势是它提供了单个数字&#xff0c;这个数字可以描述整个分布&#xff0c;并且可以被用于与其他分…

linux驱动层获取当前的系统时间

#include <linux/timer.h> #include <linux/timex.h> #include <linux/rtc.h>/*添加到合适位置*/struct timex txc; struct rtc_time tm;do_gettimeofday(&(txc.time));rtc_time_to_tm(txc.time.tv_sec,&tm);printk("UTC time :%d-%d-%d %d:%d…

智慧交通day02-车流量检测实现01:总览

随着城市交通量的迅猛增加&#xff0c;车流量统计已成为智能交通系统中一项关键技术和热门研究方向。高效而精确的车流量检测可以交通管理者和决策者&#xff0c;以及驾驶员提供数据支撑&#xff0c;从而为交通调度&#xff0c;降低拥堵情况的发生&#xff0c;提高道路利用率有…

从qq服务器删除误收邮件,如何恢复从qq邮箱删除的电子邮件

Qq邮箱恢复意外删除的邮件方法第1步: 如果您删除邮件&#xff0c;则无论是普通删除还是完整删除&#xff0c;都可以选择在几秒钟内撤消&#xff0c;以便恢复以前意外删除的邮件. 也就是说&#xff0c;在删除消息后&#xff0c;请在删除上述提示后单击“撤消”. 如果提示消息消失…

linux-虚拟机安装

第一步&#xff1a;下载 安装虚拟机&#xff01; 链接: http://pan.baidu.com/s/1nuGLwsL 密码: 2qdy 第二步&#xff1a;镜像文件&#xff01; 链接: http://pan.baidu.com/s/1nuGLwsL 密码: 2qdy linux 命令大全&#xff1a; arch 显示机器的处理器架构(1) uname -m 显示机器…