CS231n-2017 Lecture4神经网络笔记

神经网络:

我们之前的线性分类器可以接受输入,进而给出评分,这是一种线性变换,再此基础上,我们对这种线性变换结果进行非线性变换,并输入到下一层线性分类器中,这个过程就像是人类大脑神经的运作一样,神经元接受信号,并输出神经递质给下一个神经元,表示是兴奋(正权重)/抑制(负权重)

激活函数:

上文提到的非线性变换,即使用激活函数,显然激活函数是非线性函数

常用的激活函数如下:

1.Sigmoid函数

\sigma(x) = \frac{1}{1+e^{-x}}

这个函数接受实数值,并将很大的负数变为0(抑制信号),很大的正数变为1(兴奋信号)

但在实际上已经很少使用,主要是因为以下两个缺点:

(1) Sigmoid函数饱和会使梯度消失

当激活函数的输出接近0或者接近1时,这里的局部梯度几乎为0,这就会导致一个问题,在反向传播的时候,我们要求的梯度会与这里的局部梯度相乘,从而导致要求的梯度为0,所谓梯度消失,则这个梯度对应的变量的信号将无法再传递

同时,为了防止这种饱和,需要在初始化权重矩阵时特别小心,否则就会导致很多神经元过饱和,神经网络无法再继续学习

(2) Sigmoid函数的输出不是以0为中心的

由于后续的神经元会以前面神经元的激活函数输出作为输入,导致其接收的输入总是正数,那么在反向传播的时候,会导致梯度要么全为正数,要么全为负数(比如对于f = Wx+b, x>0 ,会导致\nabla_Wf>0),这会导致梯度下降权重更新的时候忽然很大的正向忽然很大的负向所产生的z字形的下降。不过,在整个batch的数据的梯度被加起来后,对于权重的最终更新会有不同的正负,这样就一定程度地减轻了这个问题

2.Tanh函数

tanh(x) = 2\sigma(2x) - 1 = \frac{e^x-e^{-x}}{e^x+e^{-x}}

这个函数将实数值压缩到[-1,1] 之间

它也存在饱和问题,但和sigmoid函数不同的是,它的输出是以0为中心的

3.ReLU函数

ReLU(x) = \begin{cases} 0\text{,} & x<0 \\ x\text{,}& otherwise \end{cases}

优点:

1.相较于Sigmoid和Tanh,ReLU对随机梯度下降的收敛有巨大的加速作用

2.ReLU的计算资源开销较少,只需要对矩阵进行阈值计算得到

缺点:

当很大的梯度经过ReLU的神经元时,梯度下降将x更新至负数或者接近0,那么就会损失掉这个神经元的梯度,导致其死亡

这种情况在学习率较高的时候出现频率较高,由于步长过长,导致x在一次权重更新时就下降到0

4.Leaky ReLU

为了解决ReLU的死亡问题,我们对其进行改进,使公式变为

Leaky ReLU(x) = \begin{cases} 1\text{ ,}& x<0\\ 1+\alpha x\text{,}& otherwise \end{cases}

其中\alpha 是一个小常量

5.Maxout函数

Maxout = max{(W_1x+b_1,W_2x+b_2)}

可以发现ReLU是Maxout的特殊情况,即W_1 = 0, b_1 = 0

则Maxout拥有ReLU的所有优点,而没有其缺点

但由于W_1,b_1的存在,它每个神经元的参数都增加了一倍

激活函数的选择问题:

通常建议使用ReLU,并注意设置学习率,监控网络中死亡神经元的比例,若死亡比例较高,则可以尝试使用Leaky ReLU或Maxout,也可以尝试tanh,但不推荐sigmoid

神经网络结构:

层状结构:

神经网络被建模成神经元的集合,神经元之间以无环图的形式连接,通常是分层的,最普通的是全连接层(fully-connected layer),全连接层中的神经元与其前后两层的神经元是完全成对连接的,但在同一个全连接层的神经元之间没有连接,如图:

命名规则:

当我们说N层神经网络的时候,不把输入层算作一层

可使用ANN(Artificial Neural Networks)或MLP(Multi-Layer Perceptrons)来指代神经网络

输出层:

输出层通常没有激活函数

网络尺寸:

衡量神经网络尺寸的标准有两个:

1.神经元的个数

2.参数的个数

以上图举例

第一个网络有4+2=6个神经元(不算输入层),3\times4+4\times2=20 个权重参数,还有4+2=6个偏置,共26个可学习的参数

同理,第二个网络有41个可学习的参数

神经网络前向传播计算举例:

将神经网络组成层状,会方便我们使用矩阵乘法进行前向传播,以上图右边的神经网络举例

输入是[3\times1] 的向量,一个层所有连接的权重可以储存在一个矩阵中,比如第一个隐藏层的权重矩阵是一个[4\times3] 的矩阵W_1, 偏置是[4\times1] 的向量b_1, 假设第一层的激活函数为f,则f(W_1x+b_1) 即可得到第一个隐藏层的输出,后面几层的运算同理

表达能力:

可以这样来理解具有全连接层的神经网络,它们定义了一个由一系列函数组成的函数族,网络的权重就是每个函数的参数,已被证明,给出任意连续函数f(x) 和任意\epsilon>0 ,均存在至少含1个隐藏层的神经网络g(x) , 使得|f(x) - g(x)|< \epsilon 即神经网络可以近似任何连续函数

既然2层神经网络可以完美近似所有连续函数,那为什么需要将网络做得更深层呢?这是因为浅层网络实际训练效果较差

神经网络在实践中好用,是因为其表达出的函数不仅平滑,而且对于数据的统计特性有很好的拟合

但对于普通神经网络来说,层数并不是越多越好,其会面临梯度消失难以训练的问题,但对于卷积神经网络来说,层数是一个极为重要的因素,一个直观解释是,因为图像具有层次化结构,所以需要多层处理这种数据

如何设置层的数量和尺寸:

更大容量的神经网络可以表达更复杂的函数,但这既是优点也是缺点,优点是其可以分类更复杂的数据,缺点是可能造成对训练数据的过拟合

过拟合指的是网络对数据中的噪声有很强的拟合能力,而没有重视数据间的潜在基本关系(假设的),例如,下图中使用20个隐藏层的网络拟合了所有训练数据,但代价是把决策边界变成了许多不相连的红绿区域,即没有忽略异常点的噪声,而另外两个网络拟合的决策边界就较为宽泛,这样在实际测试中会有更好的泛化能力

但并不是不提倡使用大容量的神经网络,小网络更难使用梯度下降等局部方法来训练,而大网络效果更好。因此我们应该想别的办法来避免过拟合,例如在Loss函数中加入正则化,下图是20隐藏层网络正则化超参数取不同值时的训练效果

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

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

相关文章

暑期算法训练.5

目录 20. 力扣 34.在排序数组中查找元素的第一个位置和最后一个位置 20.1 题目解析&#xff1a; 20.2 算法思路&#xff1a; 20.3 代码演示&#xff1a; ​编辑 20.4 总结反思&#xff1a; 21.力扣 69.x的平方根 21.1 题目解析&#xff1a; 21.2 算法思路&#xff1a;…

【HDLBits习题详解 2】Circuit - Sequential Logic(5)Finite State Machines 更新中...

1. Fsm1&#xff08;Simple FSM 1 - asynchronous reset&#xff09;状态机可分为两类&#xff1a;&#xff08;1&#xff09;Mealy状态机&#xff1a;输出由当前状态和输入共同决定。输入变化可能立即改变输出。&#xff08;2&#xff09;Moore状态机&#xff1a;输出仅由当前…

多级缓存(亿级流量缓存)

传统缓存方案问题 多级缓存方案 流程 1.客户端浏览器缓存页面静态资源; 2. 客户端请求到Nginx反向代理;[一级缓存_浏览器缓存] 3.Nginx反向代理将请求分发到Nginx集群(OpenResty); 4.先重Nginx集群OpenResty中获取Nginx本地缓存数据;[二级缓存_Nginx本地缓存] 5.若Nginx本地缓存…

浅谈Rust语言特性

如大家所了解的&#xff0c;Rust是一种由Mozilla开发的系统编程语言&#xff0c;专注于内存安全、并发性和高性能&#xff0c;旨在替代C/C等传统系统编程语言。Rust 有着非常优秀的特性&#xff0c;例如&#xff1a;可重用模块 内存安全和保证&#xff08;安全的操作与不安全的…

React探索高性能Tree树组件实现——react-window、react-vtree

&#x1f680; 简介 在现代 Web 应用中&#xff0c;处理大量层级数据的树形结构是一个常见挑战。传统的树组件在面对成千上万个节点时往往会出现性能瓶颈&#xff0c;导致页面卡顿、内存占用过高等问题。本文将深入探讨如何使用 react-window 和 react-vtree 构建高性能的虚拟…

C++ 中的默认构造函数:非必要,不提供

《More Effective C&#xff1a;35个改善编程与设计的有效方法》 读书笔记&#xff1a;非必要不提供default constructor在 C 中&#xff0c;默认构造函数&#xff08;即无需任何参数即可调用的构造函数&#xff09;是对象“无中生有”的一种方式。它的核心作用是在没有外部信息…

如何选择低代码开发平台

选择低代码开发平台需要考虑平台的开发效率、灵活性和扩展能力、安全性和合规性、成本效益等关键因素。 具体来说&#xff0c;平台的灵活性和扩展能力尤为重要&#xff0c;这决定了平台是否能长期满足企业日益增长的复杂需求。例如&#xff0c;企业在评估平台时&#xff0c;应关…

电子数据取证领域的双轮驱动——手工分析 vs 自动化分析

在你刚步入电子数据取证领域时&#xff0c;可能很快就注意到一个普遍现象&#xff1a;大多数取证分析师前期都花费大量时间在网上查阅博客、PDF、推文等信息&#xff0c;寻找证据线索的“藏身之处”——例如注册表项、日志文件路径、可疑文件命名模式或远程登录痕迹等。这种信息…

《Python 实时通信全解:掌握 WebSocket 技术与 HTTP 的本质区别》

🚀《Python 实时通信全解:掌握 WebSocket 技术与 HTTP 的本质区别》 引言:通信方式的演进与 Python 的角色 在数字化世界里,**“实时性”**已经成为构建高质量应用的核心诉求。从聊天工具到股票交易系统,再到物联网设备管理——通信的即时响应能力直接决定用户体验。而…

GeoTools 自定义坐标系

前言在GIS开发中&#xff0c;坐标系统是重中之重&#xff0c;在接到任务时首先要确定的就是坐标系。大多数地图库或者互联网地图默认支持WGS84地理坐标系和Web墨卡托投影坐标系。而在我国要求使用自然资源数据使用2000国家大地坐标&#xff08;CGCS2000&#xff09;。1. 背景 经…

[特殊字符] Java反射从入门到飞升:手撕类结构,动态解析一切![特殊字符]

【&#x1f50d;震撼揭秘】 你是否曾想窥探Java类的内部结构&#xff1f;&#x1f914; 是否好奇Spring框架如何实现"万物皆可注入"&#xff1f;✨ 本文将带你从反射小白晋升为反射高手&#xff0c;用一行代码透视任意类的构造方法、成员变量和私有方法&#xff01;&…

CMake与catkin_make的find_package()命令使用说明

在 CMake 中&#xff0c;find_package() 是一个核心函数&#xff0c;用于查找并加载外部依赖库的配置。它的主要作用是定位头文件、库文件&#xff0c;并设置相关变量&#xff0c;以便后续编译和链接。以下是详细解析&#xff1a; 1. 基本语法 find_package(<PackageName&g…

Spring--BeanFactoryPostProcessor的用法

原文网址&#xff1a;Spring--BeanFactoryPostProcessor的用法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring的BeanFactoryPostProcessor的用法。 BeanPostProcessor和BeanFactoryPostProcessor的区别 项BeanPostProcessorBeanFactoryPostProcessor处理的对象处理…

了解类加载器吗?类加载器的类型有哪些?

一、什么是类加载器&#xff08;ClassLoader&#xff09; 类加载器是 Java 虚拟机中的一部分&#xff0c;负责将 .class 文件加载到 JVM 内存中&#xff0c;生成对应的 Class 对象。 Java 程序中所有的类在使用前都必须通过类加载器加载进 JVM&#xff0c;才能被执行。二、类加…

PHP面向对象高级特性:魔术方法、对象迭代器与设计模式应用

引言 在前一篇文章中,我们探讨了PHP的Traits、匿名类和对象比较机制。本文将深入PHP面向对象编程的更多高级特性,包括魔术方法、对象迭代器以及常用设计模式的实际应用,这些特性能够帮助开发者构建更加灵活和强大的面向对象系统。 魔术方法深度解析 魔术方法是PHP中一组以…

【Java基础】一个月教你轻松掌握Java——第三篇Git

一、Java概述&#xff08;之前的文章&#xff09;二、版本控制工具Git其实这个与Java基础关系不大&#xff0c;但是这个工具还是很重要的&#xff0c;不管是团队之间打比赛还是就业都应该学会它&#xff0c;秉持着学的早一些&#xff0c;用的时间长一点&#xff0c;会更熟练。&…

【C# in .NET】16. 探秘类成员-索引器:通过索引访问对象

探秘类成员-索引器:通过索引访问对象 在 C# 中,索引器(Indexer)是一种独特的类成员,它允许类或结构的实例像数组一样被索引访问,为数据访问提供了极大的灵活性。本文将从基础概念出发,深入.NET 框架底层,剖析索引器的实现机制,并通过实战案例展示其强大的应用价值。 …

idea出现:java: Target level ‘1.7‘ is incompatible with source level ‘1.8‘.解决办法

在文件->设置->java编译器&#xff0c;把这里版本对应上。这里用的是8版本

ssms(SQL 查询编辑器) 添加快捷键 Ctrl+D(功能等于Ctrl+C + Ctrl+V),一步到位

1,打开ssms 工具&#xff0c;打开对应添加快捷键得地方2&#xff0c;分配 快捷键3&#xff0c;看效果

数学建模--层次分析法

层次分析法&#xff08;AHP&#xff09;笔记 一、核心概念 &#xff08;一&#xff09;问题本质 面对多方案、多准则决策&#xff0c;将复杂问题分层拆解&#xff0c;通过定性与定量结合&#xff0c;确定各因素权重&#xff0c;选出最优方案&#xff0c;比如选“微博之星”时综…