深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)

本文主要是介绍深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

训练神经网络的几个重要组成部分 一

1,激活函数(activation functions)

激活函数是神经网络之于线性分类器的最大进步,最大贡献,即,引入了非线性。这些非线性函数可以被分成两大类,饱和非线性函数和不饱和非线性函数。


1,1 饱和非线性函数

1,1,1  Sigmoid

原函数:

sigmoid(x)=(1+e^{-1})^{-1}

函数的导数: 

sigmoid(x)'=sigmoid(x)*(1-sigmoid(x))

sigmoid函数的性质:

        结合指数函数的图像可知,当x<0时,-x>0,指数函数随着x的减小而增大,当x=-10时,几乎exp(-(-10))=exp(10),约等于2W2,如果x再继续小下去sigmoid的分母就变成无穷大了,此时sigmoid趋近于0。即,当x<0时,随着x越来越小,sigmoid函数越来越趋近于0。

when\; x<0\Rightarrow-x>0\Rightarrow exp(-x)>0\Rightarrow \lim_{x \to -\infty }exp(-x)=+\infty \Rightarrow sigmoid(x)=0

        反之,当x>0时,-x<0,指数函数随着x的增大而减小,当x=10时,几乎exp(-(10))=exp(-10),约等于0,如果x再增加下去sigmoid的分母就变成1了,此时sigmoid趋近于1/1=1。即,当x>0时,随着x越来越大,sigmoid函数越来越趋近于1。

when\; x>0\Rightarrow-x<0\Rightarrow exp(-x)<0\Rightarrow \lim_{x \to +\infty }exp(-x)=0 \Rightarrow sigmoid(x)=1

函数值始终为正,且不关于0对称。

 sigmoid函数的缺点:梯度消失

在计算损失函数L关于x的梯度时,不论上游梯度传过来的是什么,sigmoid函数的本地梯度为:

sigmoid(x)'=sigmoid(x)(1-sigmoid(x))

因此,当x过大时,sigmoid的值为1,1-sigmoid为0,则,本地梯度为0。当x过小时,sigmoid的值为0,同样会导致本地梯度为0。如此一来,损失函数L就无法通过梯度下降法去更新W。

        当然sigmoid函数还有其他问题,例如,均值不为0,和输出总是正数,这会导致梯度下降时的zig-zag问题,也就是梯度下降速度慢的问题。但相对于梯度消失这个最为严重的问题,可忽略不计。


1,1,2 Tanh(x)双曲正切函数

        双曲正切函数有点像是sigmoid函数经过整体向下平移后得到的函数。 

原函数:

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

函数的导数: 

tanh(x)'=1-(tanh(x))^{2}

函数的特点:

        函数的值域为-1~1,输出有正有负,均值为0,即函数值关于0对称。从一定程度上弥补了sigmoid函数的不足。

函数的缺点:梯度消失

已知双曲正切的函数为: 

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

他所对应的导数为: 

\frac{\partial tanh(x)}{\partial x}=1-(tanh(x))^{2}

该导数作为本地梯度,当x较大时,tanh(x)=1,平方后仍然为1,上面的导数为1-1=0。

当x较小时,tanh(x)=-1,平方后为1,导数为0。

这也就是说,双曲正切函数仍然会有梯度消失的问题,也就是梯度为0的问题

饱和非线性函数的小结: 

         饱和非线性函数在神经网络中指的是那些在输入值非常大或非常小时,其输出值趋于某个常数值的激活函数,也就是说他不能很好的保持x的原貌。常见函数有sigmoid和tanh。


1,2 不饱和非线性函数 

1,2,1 ReLU激活函数(Rectified Linear Unit)

原函数:

\begin{cases} ReLU(x)=0& x<=0\\ ReLU(x)=x & x>0 \end{cases}

函数的导数: 

\begin{cases} ReLU(x)'=0& x<=0\\ ReLU(x)'=1 & x>0 \end{cases}

ReLU函数的特性:

        1,不同于sigmoid和tanh,对于大于0的输入,在前向传播的过程中ReLU会使得输出等于输入,而不是把任何输入都限制在一个比较狭窄的值域内

        2,计算速度非常快,只需对输入x做一个判断。

        3,学习效率高,迭代速度快。

函数的问题:

\begin{cases} ReLU(x)'=0& x<=0\\ ReLU(x)'=1 & x>0 \end{cases}

        结合该函数的梯度来看,当x<0时,会出现本地梯度为0。如此一来,无论上游梯度传过来的是什么,最终结果都是0,使得梯度无法更新。也就说,ReLU函数依然存在梯度消失的问题。

        值得一提的是ReLU函数在著名的AlexNet中被首次提出,这也可以说是这篇paper最重要的贡献之一。ReLU的出现使得训练时的迭代速度比tanh快了接近6倍。


1,2,2 Leaky ReLU

         为了克服ReLU函数中,当x为负值时,梯度直接为0的情况,leaky ReLU使得x为负数时,依然会保留一个较小的梯度,这个值很小但不为0。

原函数:

\begin{cases} f(x)=\alpha x& x<=0\\ f(x)=x & x>0 \end{cases}

函数的导数: 

\begin{cases} f(x)'=\alpha & x<=0\\ f(x)'=1 & x>0 \end{cases}

函数的特性:

        1.  x > 0时:Leaky ReLU的输出等于输入,导数为1。

        2. x <= 0时:输出是输入乘以一个小于一的系数,导数为该系数。使得x为负时,避免了梯度为0的情况,依然可以跟新W。

函数存在的问题:

        虽然有非零梯度,但负值区间的梯度较小,导致该区间的权重更新速度较慢。


1,2,3 ELU

         ELU函数是ReLU函数更进一步的改进版。

原函数:

\begin{cases} f(x)=\alpha (e^{x}-1)& x<=0\\ f(x)=x & x>0 \end{cases}

函数的导数: 

\begin{cases} f(x)'=\alpha e^{x}& x<=0\\ f(x)'=1 & x>0 \end{cases}

函数的特性:

        1.  x > 0时:与Leaky ReLU相同。

        2. x <= 0时:导数恒为正,同样避免了梯度为0的情况,可以跟新W。


1,2,4 SELU


1,2,5 GELU


1,3 summary of activation functions

        在上面关于不饱和激活函数的介绍我到后面就懒得写了,主要原有是因为下面这个PPt中的结论。这个作者在三个著名的网络中,分别使用了不同的不饱和激活函数并比较了准确率。可见,ReLU函数在这三组实验中的表现并不俗,和表现最好的其他激活函数比也就相差了不到1%的准确率。但ReLU函数的计算确是最简单了,计算速度最快的。做到这里还得是人家AlexNet的作者Alex牛,ReLU函数就在在这篇文章中被首次提及并成功运用的。他的出现几乎彻底取代了原有的sigmoid函数和tanh函数。

         结合上面所说的,cs231n给出了如下建议:

1,在选择activation function时,不要太过纠结,直接无脑的使用ReLU就好,只是要明白为什么。

2,如果你想追求更好效果,即,更高准确率,可是试试其他激活函数。但不要用sigmoid和tanh。

3,在一些非常非常新的模型中可能会用到GeLU。


(全文完) 

--- 作者,松下J27

 参考文献(鸣谢): 

1,Stanford University CS231n: Deep Learning for Computer Vision

2,训练神经网络(第一部分)_哔哩哔哩_bilibili

3,10 Training Neural Networks I_哔哩哔哩_bilibili

4,Schedule | EECS 498-007 / 598-005: Deep Learning for Computer Vision 

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

这篇关于深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081713

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

idea lanyu方式激活

访问http://idea.lanyus.com/这个地址。根据提示将0.0.0.0 account.jetbrains.com添加到hosts文件中,hosts文件在C:\Windows\System32\drivers\etc目录下。点击获得注册码即可。

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号