激活函数可视化

https://segmentfault.com/a/1190000014001934?utm_source=channel-hottest

前言

简单来说,激活函数在神经网络里的作用就是引入Non-linearity。假如没有激活函数的话,一个多层的神经网络等同于一个一层的神经网络。简单来说,一个神经网络的层可以写成$act(WX)$,其中$W$是权重,$act$是激活函数。两层也就是 $act(W_2(act(W_1X)))$,如果现在没有了$act$,那这两层就能写成$W_2W_1X$,然后我们简单的用$W=W_2W_1$替换,就变成了$WX$。也就是一个两层的神经网络退化成了一个单层的神经网络。

所以说激活函数在神经网络里面是必要的,但不同的激活函数有各自的优缺点,在不同的任务中,大家会选择不同的激活函数。现在很难一概而论说哪个激活函数一定就最好。所以最好还是多试几个,找到最适合自己任务的。

所以这篇文章也不会给出一个最好的激活函数,也就是讲讲每种激活函数的特性。看看激活函数是如何引入非线性的,以及神经网络如何利用这个非线性做而分类的。

激活函数介绍

S形(Sigmoidal)函数

Sigmoid函数是神经网络初期的激活函数。更早的是在Percepton里面使用的threshold函数,不过threshold函数零点不可导,其他部分导数又全是0,无法通过Backpropagation(BP)训练,故这里不做介绍。Sigmoid函数可以看作threshold函数的soft版本,它从0平滑的过渡到1。在之后又发展出多种S形的激活函数,先上公式和图像(函数图$f(x)$及导数图$f‘(x)$):

Sigmoid: f(x)=11+e−x

Tanh: f(x)=ex−e−xex+e−x

Arctan: f(x)=arctan(x)

Softsign: f(x)=x1+|x|

ISRU: f(x)=x1+αx2−−−−−−√


从图中可以看到sigmoid导数小,最大的地方导数才0.25,这样在BP的时候,往后乘一乘梯度就没有嘞,也就是深层网络经常会遇到的Gradient Vanishing(梯度消失)。另外sigmoid的输出在0-1之间,而神经网络更好的输入的值是关于原点对称的。

tanh作为sigmoid的改进版,一定程度上减轻了以上的两个问题,tanh在原点附近接近$f(x)=x$,关于原点对称且在原店附近导数接近1。就是希望能够做到原点附近的数据不被压缩能够很好的传递到下一层,而周边的数据被一定程度的压缩来引入非线性。

其他不常用的激活函数如反正切$arctan$,$softsign$,以及Inverse Square Root Unit(ISRU)同样减轻了以上问题。从导数的函数图中可以看到$arctan$的导数较大,估计对学习速度应该会有帮助。sigmoid和tanh被广泛使用据说是因为导数比较好求(来自这里)。$\sigma‘(x) = \sigma(x) (1-\sigma(x)) $,$tanh‘(x) = 1 - tanh^2(x) $。

ReLU及其变体

上面说的Sigmoidal函数都或多或少都存在梯度消失的问题,这使得深层的网络难以训练。后来出现的ReLU(Rectified Linear Unit)基本解决了这个问题,它保证了至少在$x>0$的时候导数是不会减少的。这样在BP的过程中梯度就不会莫名消失。只不过ReLU有个dead neuron的问题,从函数图上可以看到,负半轴的值为0导数也为0,也就是forward pass和backward pass都不能传递任何信息。在使用ReLU的时候不要用太大的learning rate,否则很容易造成一堆dead neuron。

后来出现了Leaky ReLU(LReLU)解决了dead neuron的问题,而且使得输出数据分布在0的两侧,一定程度上对学习有帮助。后来有人做了一些改进如Parametric ReLU (PReLU)以及Randomized ReLU (RReLU)。在PReLU里,下面公式里的$\alpha$是变量,可通过BP学习,Randomized ReLU则是在训练时随机在一定范围内选择$\alpha$,而在测试中则是使用均值。如训练时$\alpha$在 $\left[0.1,0.3\right]$ 范围内随机选择,则在测试时$\alpha$的值即为$0.2$。

ReLU: f(x)={0,x,x < 0x ≥ 0

ReLU6: f(x)=???0,x,6,x < 00 ≤ x ≤ 6x > 6

Leaky ReLU: f(x)={αx,x,x < 0x ≥ 0, where 0<α<1

形状差不多的还有Softplus,Swish,Exponential Linear Unit (ELU),以及Scaled ELU(SELU),公式如下:

Softplus: f(x)=log(1+ex)

ELU: f(x)={αex−1,x,x < 0x ≥ 0

SELU: f(x)={s(αex−1),sx,x < 0x ≥ 0

其中SELU的$a = 1.6732632423543772848170429916717$,$s = 1.0507009873554804934193349852946$。这两个数字都是作者在论文中算出来的。90页的推导过程,简直神一般。

Softplus相对ReLU的好处是其在每个点的导数都不为0,避免了使用ReLU出现的dead neuron的问题。ELU相对于ReLU的优点是其输出在原点两侧且在每个点导数都不为0。SELU在论文中介绍的优点是,如果输入是均值为0,标准差为1的话,经过SELU激活之后,输出的均值也为0,标准差也为1,如果是这样的话,不知道是不是能少用几层Batch Norm。这三个激活函数的计算时间较ReLU,Leaky ReLU要长,当想要极限的优化网络速度的时候,这也能是一个优化点。

上图!

其他激活函数

Swish是最近(2017.10) Google Brain提出的激活函数,据说效果不错,Tanh-shrink和Bent-identity分别是在pytorch内建的激活函数库和Wikipedia上看到的,在此也附上图。后续想做个测试,应该也蛮有意思的!在这儿就先附上公式和图。

Swish: f(x)=xσ(x), where σ is sigmoid function

Tanh-shrink: f(x)=x−tanh(x)

Bent-identity: f(x)=x2+1−−−−−√−12+x


神经网络如何改变数据分布

上面的分析给出了激活函数的定义,接下来我们看看激活函数如何改变数据分布。这里用一个中心点在原点的螺旋状的数据(见下图中identity一列)来表示数据分布,为了让图形简单一点,咱们忽略bias,于是一个层可以写作$H=act(WX)$。从公式可以看出,神经网络的一层会对输入的数据先做一个线形的变换,然后再通过激活函数做非线性的变换。之后我们再把激活后的数据映射回原来的空间($X‘ = W^{-1}H$)。这么做的结果是,对于激活函数不改变的点,它该在什么位置就还在什么位置,也就可以和原图的螺线比较着看激活函数的效果。

这个螺线的数据的$x, y$可以作为两个节点的输入层的输入数据。这里的$W$的维度可以有多种理解。

1\. 假设$W$是一个$n\times2$的矩阵,那么这个$act(WX)$就相当与一个$n$个节点的隐层;
2\. 从空间的角度上说,这相当于把数据映射到一个$n?$维的空间后,再在新的空间中做非线性变换;
3\. 把$W$拆成$n$个$1\times2$的矩阵,就还可以理解成$n$个$X$的线形组合,在思考决策边界的时候有用。

这里主要采用第二种思维,下面这张图各列显示了不同的激活函数在$n=2,5,30$时对应的变换。让$W$的值都在$[-1,1]$之间取值,这样$W$就能在映射到$2,5,30$维空间时产生旋转、缩放、斜切、拉伸等效果(不包括平移)。

这里我就选了几种激活函数玩玩。可以看到identity函数($f(x)=x$)是不改变数据形状的,不管映射到多少维。S型函数将周围的一圈都映射到了一起去,其中sigmoid挤压的最甚(所以输入的时候一定得standardize,否则信息全都被压缩了)。ReLU很好的保留了其中的一部分信息,且醉着维度的增加,保留的信息也增加(MobileNet V2就是基于这种想法设计了Inverted Residual Block)。ELU其实在低维就能够保存不少信息,看起来图形会稍微好看一些,实际的效果还是有待验证。tanhshrink觉得比较有意思也就加上去了。

神经网络学习的过程

上面给出了神经网络如何扭曲数据分布的,其实在$W$随机取值的情况下,我们很难去理解神经网络如何去学习的,下面来看看神经网络如何根据标签改变扭曲的过程。这里就选了ReLU和Sigmoid,4个节点的隐层。最后使用了softmax做分类,下图显示了输入数据和对应的神经网络。

不同于以上的图在输入数据$(x, y)$的二维空间,下面这些图的横坐标和纵坐标分别是$x‘, y‘$,这两个值是unnormalized probability。对于一个坐标点$(x‘, y‘)$,假如 $x‘>y‘$,则预测类别为蓝点,反之则为红点。所以这里我们也把$y‘=x‘$这条线画出来,代表了在$x‘, y‘$这个平面的决策边界。以下是以ReLU为激活函数的神经网络学习的过程,从螺线可以看出来原始的数据分布正在慢慢的被扭曲,直到这条黑线能够穿过红线和蓝线之间。在训练的过程中,每个红点都会把它周围的空间(蓝线)往左上角拉,相反每个蓝点都会往右下角拉,在这两个力以及权重衰减的力的作用下,空间就会被扭曲成需要的样子(如右下角所示)。

下面这张图显示了Sigmoid学习的过程。和ReLU的情况很像,只是它扭曲的方式不太一样

两个学习的过程都特别的像折纸,对,就是折纸!当你发现直直的一剪刀剪不出个圆的时候,你就可以考虑折出几个皱褶,然后再给一剪刀。再提一下,如果是多个隐层的话,相当于把上面的图当作输入再进行扭曲。从折纸的角度上说,就类似于“对折再对折再对折”这种做法,这样就能用少量的隐层节点做出更多的非线性(褶子)。

神经网络学习的结果

最后来看看不同激活函数的决策边界(下图)。这次的坐标还是原始输入的$(x, y)$,这相当于把上面的图往回展平以后,上图的黑线所在的位置。Sigmoid 4的意思就是对于一个4个节点的隐层,使用Sigmoid作为激活函数的神经网络。可以看出决策边界是由3个不同斜率的决策边界组成的(实际上这里有4条边界,有两个决策边界太近了就没体现出来)。Softplus可以看出来这4条边,ReLU这张图虽然只有6个边界,但它其实可以有8条,这是因为当两个ReLU形成的决策边界相交时,会产生两个转折点,4个决策边界能产生8条线。

最后试了一下300个隐层的情况,可以看出来决策边界已经很接近圆了。是的!等于多折几下,再给一刀。

如果想玩动图,就上这儿http://playground.tensorflow....

结论

所以说,神经网络就像剪纸,激活函数决定怎么折,节点数决定在原图上折几个折痕,隐层的数量决定折几次。

如果想让结果在$(0,1)$之间,使用sigmoid(如LSTM的各种gates);如果想训练的很深,不要用S系的;ReLU,LReLU什么的多试几个,不会错的。

需要注意如果使用ReLU,则最好使用He Initialization。实际上这次的实验中所有ReLU系的激活函数(除了Softplus),使用He Initialization都收敛的比较快。如果使用Sigmoid,则使用Xavier Initialization,要不真的能把空间扭曲成一个奇怪的形状,然后长时间不收敛

原文地址:https://www.cnblogs.com/jukan/p/10789607.html

时间: 2024-10-11 00:17:50

激活函数可视化的相关文章

Tensorflow搭建神经网络及使用Tensorboard进行可视化

创建神经网络模型 1.构建神经网络结构,并进行模型训练 import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #python的结果可视化模块 """定义一个添加神经层的函数 inputs:输入数据 in_size:输入神经元的个数 out_size:输出神经元的个数 activation_function:激活函数"""def add_layer(inpu

TensorBoard: 可视化学习

当使用Tensorflow训练大量深层的神经网络时,我们希望去跟踪神经网络的整个训练过程中的信息,比如迭代的过程中每一层参数是如何变化与分布的,比如每次循环参数更新后模型在测试集与训练集上的准确率是如何的,比如损失值的变化情况,等等.如果能在训练的过程中将一些信息加以记录并可视化得表现出来,是不是对我们探索模型有更深的帮助与理解呢? Tensorflow官方推出了可视化工具Tensorboard,可以帮助我们实现以上功能,它可以将模型训练过程中的各种数据汇总起来存在自定义的路径与日志文件中,然后

CNN 可视化结果分析

本文试图对CNN到底做了什么,给出一些分析解释.通过观察卷积层的输出构成的灰度图,试图寻找这个卷积在物理上有什么作用.训练数据是一些验证码图片,用了四个卷积层和两个全连接层的模型,在训练集上训练到98%的准确率,验证集80%.具体代码可参考我前面的这篇博文<CNN识别图形验证码>.图片似乎只有翻墙才能看到,不好意思. 可视化结果分别从以下几个角度做分析: 1 看每个卷积层经过激活函数(relu)后的输出图像 第一个卷积层的结果(相对比较容易懂): 为了方便人眼观察,对每一幅图的像素值都做了一个

学习笔记TF056:TensorFlow MNIST,数据集、分类、可视化

MNIST(Mixed National Institute of Standards and Technology)http://yann.lecun.com/exdb/mnist/ ,入门级计算机视觉数据集,美国中学生手写数字.训练集6万张图片,测试集1万张图片.数字经过预处理.格式化,大小调整并居中,图片尺寸固定28x28.数据集小,训练速度快,收敛效果好. MNIST数据集,NIST数据集子集.4个文件.train-label-idx1-ubyte.gz 训练集标记文件(28881字节)

学习TensorFlow,TensorBoard可视化网络结构和参数

在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可以显示网络结构,又可以显示训练和测试过程中各层参数的变化情况.本博文分为四个部分,第一部分介绍相关函数,第二部分是代码测试,第三部分是运行结果,第四部分介绍相关参考资料. 一. 相关函数 TensorBoard的输入是tensorflow保存summary data的日志文件.日志文件名的形式如:e

[论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks

概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexNet的一些问题,并在AlexNet基础上做了一些改进,使得网络达到了比AlexNet更好的效果.同时,作者用"消融方法"(ablation study)分析了图片各区域对网络分类的影响(通俗地说,"消融方法"就是去除图片中某些区域,分析网络的性能). 反卷积神经网络(D

TensorFlow(九):卷积神经网络实现手写数字识别以及可视化

上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data',one_hot=True) #每个批次的大小 batch_size = 100 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #参数概要 def vari

0、PlayGround可视化

Tensorflow新手通过PlayGround可视化初识神经网络 是不是觉得神经网络不够形象,概念不够清晰,如果你是新手,来玩玩PlayGround就知道,大神请绕道. PlayGround是一个在线演示.实验的神经网络平台,是一个入门神经网络非常直观的网站.这个图形化平台非常强大,将神经网络的训练过程直接可视化.同时也能让我们对Tensorflow有一个感性的认识. PlayGround的网址是:http://playground.tensorflow.org/ PlayGround页面如图

Tensorflow实战 手写数字识别(Tensorboard可视化)

一.前言 为了更好的理解Neural Network,本文使用Tensorflow实现一个最简单的神经网络,然后使用MNIST数据集进行测试.同时使用Tensorboard对训练过程进行可视化,算是打响学习Tensorflow的第一枪啦. 看本文之前,希望你已经具备机器学习和深度学习基础. 机器学习基础可以看我的系列博文: https://cuijiahua.com/blog/ml/ 深度学习基础可以看吴恩达老师的公开课: http://mooc.study.163.com/smartSpec/