神经网络基础知识、常用激活函数及其Python图形绘制
在人工智能与机器学习研究与应用领域,神经网络占有重要地位。神经网络(Neural Networks, NNs),又称人工神经网络(Artificial Neural Networks, ANNs),是模拟生物神经网络进行信息处理的一种数学模型。它以对大脑的生理研究成果为基础,其目的在于模拟大脑的某些机理与机制,实现一些特定的功能。ANNs可以用硬件电路来实现,也可以用计算机程序来模拟,ANNs是人工智能研究的一种方法。本文首先对人工神经网络基本知识进行解读,然后介绍神经网络中的一些常用激活函数,并给出几个激活函数的Python图形绘图示例。
内容目录
一、神经网络基础知识
1.生物神经元
2.人工神经元模型与感知器
二、常用激活函数
1.阶跃函数
2.符号函数
3.S型函数及其导数
4.双曲正切函数及其导数
5.ReLU函数及其导数
6.带泄漏的ReLU函数
7.ELU函数
三、激活函数Python图形绘图举例
1.S型函数及其导数Python图形绘制
2.双曲正切S型函数及其导数Python图形绘制
3.ReLU函数及其导数Python图形绘制
4.带泄漏的ReLU函数Python图形绘制
5.ELU函数Python图形绘制
一、神经网络基础知识
1.生物神经元
科学研究发现,人脑大约有1000亿 (1011)个神经元(每个神经元大约有104个连接),这些神经元通过1000万亿(1015)个连接构成一个大规模的神经网络系统。神经元是神经网络的基本信息处理单元。生物神经元由细胞体(Soma/Cell body)、树突(Dendrite)、轴突(Axon)、突触(Synapse)等部分组成,见图1(a)、(b)所示。其中,细胞体是神经元的主体,由细胞核、细胞质和细胞膜三部分组成;树突相当于细胞体的输入端,用于接受其他神经元的输入信号,每个神经元可以有一个或多个树突;轴突相当于细胞体的输出端,用于传出细胞体产生的输出电化学信号,每个神经元只有一个轴突;突触是一个细胞体的轴突和另一个细胞体的树突间的连接,相当于神经元之间(如神经元i与神经元j之间)的输入输出接口(见图1(b))。
图1 生物神经元原理图
现代生理学研究表明,人类的大脑活动不是一个生物神经元所能完成的,也不是多个生物神经元功能的简单叠加,而是多个生物神经元构成的非线性动态处理系统。在大脑神经系统中,每个神经元都通过突触与系统中的很多其他神经元相联系,突触的“连接强度”越大,接受的信号就越强;反之,突触的“连接强度”越小,接受的信号就越弱。突触的“连接强度”可以随着神经系统受到的训练而改变。例如,新记忆的形成就是通过改变突触的强度实现的,认识一位新朋友面孔的过程包含了多个突触的改变过程。
生物神经系统具有下面六个特征:
(1)神经元及其连接;
(2)神经元之间的连接强度决定了信号的传递强弱;
(3)神经元之间的连接强度可以随训练而改变;
(4)信号可以是起刺激(excite)作用的,也可以是起抑制(inhibit)作用的;
(5)一个神经元接受信号的累积效果决定该神经元的状态;
(6)每个神经元可以有一个阈值(threshold)。
2.人工神经元模型与感知器
人工神经网络没有生物神经网络那么复杂,但它们之间有两个关键的相似之处:首先,两个网络的构成都是可计算单元(处理单元)的高度互连;其次,处理单元之间的连接决定了网络的功能。最简单的单输入神经元见图2所示。
图2 单输入神经元
在图2 中,标量输入x乘于标量权值w(weight: 权值或权重)得到wx,再送到加法器Σ,另一个输入1乘于偏置b (bias/offset/threshold: 偏置或阈值),再将其送到加法器Σ;加法器Σ输出u通常被称为净输入(net input),它被送到一个传输函数f ;传输函数f也称为激活函数(activation function),它用于限制神经元的输出幅度,在f中产生神经元的标量输出y。
对人工神经元的理解,我们可以将人工神经元与前面的生物神经元进行类比:细胞体对应于加法器和激活函数,神经元的输入代表树突的信号,神经元输出y代表轴突的信号;权值w对应于突触的连接强度(w为正表示激活activate,w为负表示抑制inhibit)。
神经元输出按下式计算:
y=f(wx+b)= f(u)
如,若w=3, x=2.2, b=1, 则:u= wx+b =7.6,y=f(u)=f(7.6)
偏置值除了有常数输入值1外,它很像一个权值。但是如果不想使用偏置值,也可忽略它。w和b是神经元的可调整标量参数。设计者可以选择特定的激活函数,在一些学习规则中调整参数w和b,以满足特定的需要。
图3 多输入神经元/感知器示意图
图3所示的感知器是一个由多个输入、单个神经元、单个输出构成的最简单神经网络,它是一种简单的两类线性分类模型。
关于神经网络中的权值下标wij:采用人们习惯表示权值元素的下标。权值矩阵元素下标的第一个下标表示权值相应连接所指定的目标神经元编号,第二个下标表示权值相应连接的源神经元编号。据此,w12的含义:该权值表示从第2个源神经元(此处即为第2个输入x2)到第1个神经元(此处图3的多输入神经神经元编号为1)的连接。
二、常用激活函数
神经网络中神经元的激活函数可以是u的线性函数或非线性函数。激活函数用于限制神经网络中神经元的输出幅度以及实现神经网络模型的非线性等。特别是在深度神经网络中,若不采用非线性激活函数,神经网络将无法解决现实世界中的复杂非线性问题(如图像、视频、音频、文本、自然语言处理等)。
在神经网络中,常用激活函数有阶跃函数(Step function)、符号函数(Sign function)、S型函数(Sigmoid function)、双曲正切函数(hyperbolic tangent function)、ReLU函数(Rectified Linear Unit,修正线性单元)、带泄漏的ReLU函数(Leaky ReLU)、ELU函数(Exponential Linear Unit,指数线性单元)等。
1.阶跃函数
阶跃函数又称为阈值函数或阈值单元,用该函数可以将输入分成两类(对于二分类问题,设输出0标签对应于一个类别 ,输出1标签对应于另一个类别。u<0时,输出0标签;u≥0时,输出1标签)。
2.符号函数
符号函数同样可以将输入分成两类(对于二分类问题,设输出负标签-1对应于一个类别 ,输出正标签1对应于另一个类别。u<0时,输出-1负标签;u≥0时,输出1正标签)。
3. S型函数及其导数
S型函数:
S型函数可以将输入变换到0~1之间。S型函数在浅层神经网络中应用较为普遍,但它目前被更简单的ReLU取代。
S型函数的导数:
4. 双曲正切S型函数及其导数
双曲正切函数:
说明:双曲正切函数定义tanh(u)=sinh(u)/cosh(u)。其中,双曲正弦函数sinh(u)=(eu-e-u)/2 ,双曲余弦函数cosh(u)=(eu+e-u)/2;因此,tanh(u)=(eu-e-u)/(eu+e-u)。
双曲正切函数可以将输入变换到-1~1之间。
双曲正切函数的导数:
5. ReLU函数及其导数
ReLU函数:
y=f(u)=max(0,u)
ReLU函数提供了一个很简单的非线性变换,它只保留正数输入,并将负数输入清零。
ReLU函数的导数:
注意:Relu函数在u=0处的导数不存在。
6.带泄漏的ReLU函数
LeakyReLU(u)=max(αu,u)
带泄漏的ReLU函数在输入u<0时,能保持一个很小的梯度α。这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活,以便给网络继续学习的机会。这里的超参数α定义了函数“泄漏”的程度,它是函数在u<0时的斜率,α通常是小于1的很小常数,如取α=0.01。
7. ELU函数
ELU函数是一个近似零中心化非线性函数。其中,α为超参数,它决定了u≤0时的饱和曲线,并调整输出均值在0附近。
三、激活函数Python图形绘图举例
这里以S型函数及其导数、双曲正切函数及其导数、ReLU函数及其导数、带泄漏的ReLU函数及ELU函数为例,介绍Python图形绘制并在当前目录存储所绘制的图形。本文使用Jupyter Notebook,要知道存储图形所在的当前目录,可在In[]的单元(Cell)输入import os和os.getcwd()命令,执行命令后,显示当前目录如图4所示。
图4 显示当前目录命令
1.S型函数及其导数Python图形绘制
S型函数及其导数图形绘制Python代码:
#S型激活函数及其导数图形绘制代码
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inlinedef sigmoid(u):return 1/(1+np.exp(-u))def sigmoid_derivation(z):return sigmoid(z)*(1-sigmoid(u))u = np.linspace(-5, 5, 200)
plt.figure()
plt.style.use('seaborn-darkgrid')
plt.plot(u, sigmoid(u), "b-.", linewidth=2)
props = dict(facecolor='black', shrink=0.1)
plt.annotate('Saturating', xytext=(3.5, 0.7), xy=(5, 1), arrowprops=props, fontsize=14, ha="center")
plt.annotate('Saturating', xytext=(-3.5, 0.3), xy=(-5, 0), arrowprops=props, fontsize=14, ha="center")
plt.title("Sigmoid Activation Function", fontsize=14)
plt.savefig('sigmoid.png')u = np.linspace(-5, 5, 200)
plt.figure()
plt.style.use('seaborn-darkgrid')
plt.plot(u, sigmoid_derivation(u), "b-.", linewidth=2)
props = dict(facecolor='black', shrink=0.1)
plt.annotate('Max Value', xytext=(0, 0.15), xy=(0, 0.25), arrowprops=props, fontsize=14, ha="center")
plt.title("Derivation of Sigmoid Function", fontsize=14)
plt.savefig('sigmoid_derivation.png')
程序执行后,显示S型激活函数及其导数图形见图5所示。
图5 S型激活函数及其导数图形
程序运行后,S型激活函数的图形和S型激活函数导数的图形见图5所示{从图4的Out[]的单元(Cell)显示输出可知,运行程序后,S型激活函数的图形文件“sigmoid.png”和S型激活函数导数的图形文件“sigmoid_derivation.png”存储在”C:/users/86131”目录中}。
从图5导数曲线可以看出S型函数的缺点:S型函数在远离原点的两端存在梯度消失现象。
2.双曲正切函数及其导数Python图形绘制
双曲正切函数及其导数图形绘制Python代码:
#双曲正切函数及其导数图形绘制代码
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inlinedef tanh(z):return (np.exp(z)-np.exp(-z))/(np.exp(z)+np.exp(-z))def tanh_derivation(z):return (1- tanh(z)**2)z = np.linspace(-5, 5, 200)
plt.figure()
plt.style.use('seaborn-darkgrid')
plt.plot(z, tanh(z), "b-.", linewidth=2)
props = dict(facecolor='black', shrink=0.1)
plt.annotate('Saturating', xytext=(3.5, 0.7), xy=(5, 1), arrowprops=props, fontsize=14, ha="center")
plt.annotate('Saturating', xytext=(-3.5, 0.3), xy=(-5, 0), arrowprops=props, fontsize=14, ha="center")
plt.title("Hyperbolic Tangent Activation Function", fontsize=14)
plt.savefig('tanh.png')z = np.linspace(-5, 5, 200)
plt.figure()
plt.style.use('seaborn-darkgrid')
plt.plot(z, tanh_derivation(z), "b-.", linewidth=2)
props = dict(facecolor='black', shrink=0.1)
plt.annotate('Max Value', xytext=(2.9, 0.8), xy=(0, 1), arrowprops=props, fontsize=14, ha="center")
plt.title("Derivation of Hyperbolic Tangent Function", fontsize=14)
plt.savefig('tanh_derivation.png')
程序执行后,显示双曲正切函数及其导数图形见图6所示。
图6 双曲正切激活函数及其导数图形
双曲正切激活函数解决了S型函数不是(0,0)对称的问题,但从图6的导数曲线不难看出,在自变量取较大的负值或正值时,仍然在存在梯度消失问题。
3.ReLU函数及其导数Python图形绘制
ReLU函数及其导数图形绘制Python代码:
#ReLU函数及其导数图形绘制代码
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inlinedef relu(z):return np.maximum(0, z)def derivative_relu(z):return (z >= 0).astype(z.dtype)z = np.linspace(-5, 5, 200)plt.figure()
plt.plot(z, relu(z), "b-.", linewidth=2, label="ReLU")
plt.grid(True)
plt.legend(loc='upper left', fontsize=12)
plt.title("ReLU Activation Function", fontsize=14)
plt.savefig('relu.png')plt.figure()
plt.plot(z, derivative_relu(z), "g-.", linewidth=2, label="ReLU Derivation")
plt.grid(True)
plt.legend(loc='upper left', fontsize=12)
plt.title("Derivative of ReLU Activation Function", fontsize=14)
plt.savefig('relu_derivative.png')
程序执行后,显示ReLU函数及其导数图形见图7所示。
图7 ReLU函数及其导数图形
ReLU函数优点:(1)在正区间解决了梯度消失问题;(2)计算速度很快,只需判断输入是否大于0;(3)收敛速度远快于Sigmoid函数和tanh函数。由于ReLU实践效果显著,它是目前最受欢迎的激活函数之一。
ReLU函数缺点:(1)ReLU输出不是(0,0)对称;(2)存在死亡神经元问题(Dead ReLU Problem),如图7所示,导数在自变量小于零时恒为0,这意味着某些神经元可以永远不被激活,导致相应的权值参数可能永远不能被更新。
4.带泄漏的ReLU函数Python图形绘制
带泄漏的ReLU函数图形绘制Python代码:
#带泄漏的ReLU函数图形绘制代码
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inlinedef leaky_relu(z, alpha=0.01):return np.maximum(alpha*z, z)z = np.linspace(-5, 5, 200)
plt.plot(z, leaky_relu(z, 0.05), "b-", linewidth=2)
plt.plot([-5, 5], [0, 0], 'k-')
plt.plot([0, 0], [-0.5, 4.2], 'k-')
plt.grid(True)
props = dict(facecolor='black', shrink=0.1)
plt.annotate('Leak', xytext=(-3.5, 0.5), xy=(-5, -0.2), arrowprops=props, fontsize=14, ha="center")
plt.title("Leaky ReLU activation function", fontsize=14)
plt.axis([-5, 5, -0.5, 4.2])plt.savefig("leaky_relu_plot.png")
plt.show()
程序执行后,显示带泄漏的ReLU函数图形见图8所示。
图8 带泄漏的ReLU函数图形
5. ELU函数Python图形绘制
ELU函数图形绘制Python代码:
#ELU函数图形绘制代码
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inlinedef elu(z, alpha=1):return np.where(z < 0, alpha * (np.exp(z) - 1), z)z = np.linspace(-5, 5, 200)
plt.plot(z, elu(z), "b-", linewidth=2)
plt.plot([-5, 5], [0, 0], 'k-')
plt.plot([-5, 5], [-1, -1], 'k--')
plt.plot([0, 0], [-2.2, 3.2], 'k-')
plt.grid(True)
plt.title(r"ELU activation function ($\alpha=1$)", fontsize=14)
plt.axis([-5, 5, -2.2, 3.2])plt.savefig("elu_plot.png")
plt.show()
程序执行后,显示ELU函数图形见图9所示。
图9 ELU函数图形
(作者Email:yuanzywhu@163.com)
发布日期:2020年11月29日
神经网络基础知识、常用激活函数及其Python图形绘制相关推荐
- 深度学习:神经网络基础知识总结
[神经网络基础知识总结]: 定义: 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它 ...
- 一篇文章理解深度神经网络5个常用激活函数
一篇文章理解深度神经网络5个常用激活函数 1.Sigmoid 2.Tanh 3.ReLU 4.Leaky ReLU 5.Maxout 小结 1.Sigmoid Sigmoid非线性激活函数的数学表达式 ...
- Python图形绘制
文章目录 前言 一.turtle海龟绘图 二.Python图形绘制 三.绘画小黄人 习题巩固 前言 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour P ...
- 100天精通Python丨基础知识篇 —— 08、Python 最常用的 20 个包(按使用频率排序)
本文收录于 <100天精通Python专栏 - 快速入门到黑科技>专栏,是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造,分基础知识篇和黑科技应用两大部分 ...
- 卷积神经网络 神经网络,卷积神经网络基础知识
卷积神经网络通俗理解 . 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetwork ...
- 最全神经网络基础知识讲解
神经网络是所有 AI 算法的核心,如今,深度神经网络用于从图像识别和对象检测到自然语言处理和生成的各种任务.在剖析了构成神经网络的基本构建块及其工作原理之后,本问将深入研究神经架构类型及其各自的用途. ...
- revit找不到附加模块程序集_TensorFlow基础知识——常用模块(一)
1 本节简述 对于开展深度学习开发的目标而言,我们需要掌握的除了必要的深度学习理论基础.必要的开发依赖库基础知识.基本的开发套路之外,我们还需要掌握它常见的外围小帮手都有哪些.这些小帮手就是深度学习依 ...
- python二级考试选择题公共基础知识_计算机二级Python易忘考点整理
事先声明,这里记录的是我刷二级题时遇到的不熟悉的问题时记录下来的笔记.可能并不适合所有人,仅供参考. 任何问题请联系邮箱:admin@likehide.com (因为不常上网站,所以留言和私信可能无法 ...
- 关于卷积神经网络的书籍,卷积神经网络基础知识
有没有好理解的关于神经网络的书推荐 肯定是matlab用的神经网络设计了,通俗易懂,很多实例!!戴葵翻译的美国经典神经网络<神经网络设计>神经网络概念非常简单(如果是科班出身),看一个下午 ...
最新文章
- 好多Javascript日期选择器呀--1
- 单连接算法与全连接算法
- 初识ES-IK分词器的拓展和停用词典
- 获取redis实例绑定cpu的情况
- 第七次团队作业——日不落战队
- C#学习笔记:预处理指令
- qt 正则 html,Qt 正则表达式 (一)
- hihocoder第212周-动态规划
- bzoj 4260: Codechef REBXOR(01字典树)
- Android--获取当前系统的语言环境
- 02. Prefer consts, enums, and inlines to #defines
- TCP: SYN ACK FIN RST PSH URG
- H53D旋转-遁地龙卷风
- teechart的addarray_TeeChart绘图控件 - 之三 - 提高绘图的效率
- m7405d粉盒清零方法_联想打印机多功能一体机硒鼓清零方法汇总
- win10解决IE浏览器安装不上的问题
- Java/大数据常见面试
- 数据挖掘概念与技术——读书笔记(1)
- java字符串==_Java字符串(String)
- Docker 大热,还不了解 Dockerfile 你就OUT啦~
热门文章
- Google guava之ListMultimap简介说明
- html、css 实现二级菜单
- xilinx vivado modelsim联合仿真出现behav/compile.bat‘ script “Please check that the file has the correct ‘r
- jq选择器中加变量参数
- 在Ubuntu 20.04中安装CLion
- 广告语中常用非法的词语,夸大性质的关键字
- angular2保留两位小数点
- Azure Kinect DK的一些驱动问题
- LeetCode_每日一题 面试题 16.24. 数对和
- DapuStor亮相网络、体系结构和存储国际峰会(NAS 2021)