神经网络第一篇:激活函数是连接感知机和神经网络的桥梁

2024-06-24 11:18

本文主要是介绍神经网络第一篇:激活函数是连接感知机和神经网络的桥梁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面发布的文章介绍了感知机,了解了感知机可以通过叠加层表示复杂的函数。遗憾的是,设定合适的、能符合预期的输入与输出的权重,是由人工进行的。从本章开始,将进入神经网络的学习,首先介绍激活函数,因为它是连接感知机和神经网络的桥梁。如果读者认知阅读了本专题知识,相信你必有收获。

感知机数学表达式的简化

前面我们介绍了用感知机接收两个输入信号的数学表示如下:

                                         

现在将上式改成更加简洁的形式,我们不妨想一下,上面的表达式(或者说是函数)输出y只有两种值0和1。因此,我们引入一个新函数将上式改写成下式:

                                        

式(2)中,输入信号的总和会被函数h(x)转换,转换后的值就是输出y。而式(3)所表示的h(x)在输入超过0时返回1,否则返回0。不难理解,式(1)和式(2)、(3)做的是一件事情。其实这和数学中的复合函数的意思一样(将b+w1x1+w2x2整体作为变量x,变量名可随便取)。

激活函数登场

 我们刚引入的h(x)函数能将输入信号的总和转换为输出信号(只有0和1),这种函数就是激活函数。正如“激活”二字,激活函数就是决定如何来激活输入信号的总和。读者意识可能有点模糊,我们对上面的式子再分析一下,将式(2)分为两个阶段,如下式,第一阶段是计算输入信号的加权和,第二阶段则用激活函数来转换这一加权和。

                                      

式(4)计算输入信号和偏置b的总和,记为a,接着用h()函数将a转换为输出y。这里我们用下图来形象地表示式(4)和式(5)。

                                     

    0表示神经元,这里我们新增了一个输入信号为常数1的神经元(灰色),其权重为b,主要是把偏置b(控制神经元被激活的容易程度)添加至感知机中。把上图和上面的公式结合起来分析,节点a接收了输入信号的加权和,接着节点a被激活函数h()转换为节点y输出。注意节点和神经元是一样的意思。

试想什么样的函数的输出只有0和1两种值,毫无疑问,阶跃函数(0处突变为1)的输出就是这样的。这里科普一下,一般而言,单层感知机也称为朴素感知机,即使用了阶跃函数作为激活函数的单层网络。多层感知机指神经网络,即使用了sigmoid函数等平滑函数作为激活函数的多层网络。

式(3)表明,输入一旦超过阀值,激活函数就切换输出,因此在感知机中的激活函数是“阶跃函数”。我们不难发问,如果感知机使用其他函数作为激活函数,结果会怎么样呢?答案是使用其他激活函数,那我们就进入了神经网络的世界了。下面我们详细介绍在神经网络中常用的几种激活函数。

阶跃函数

    如式(3),输入大于0,输出为1,否则输出为0。Python实现如下:

import numpy as npimport matplotlib.pylab as plt"""numpy轻易实现"""def step_function(x):return np.array(x>0,dtype=np.int) #true为1,false为0"""绘图"""x=np.arange(-3.0,3.0,0.1)y=step_function(x)plt.plot(x,y)plt.ylim(-0.1,1.1)plt.show()


 

sigmoid函数

在神经网络中,sigmoid函数常作为激活函数,其表达式如下:

                                      

式(6)中exp(-x)表示e-x次方的意思。实际上,感知机和神经网络的主要区别就在于激活函数的不同。Sigmoid函数作为激活函数,对信号进行转换,转换后的信号被传送给下一个神经元。Python实现如下:

"""sigmoid函数,除了函数不一样,绘图代码同上"""def sigmoid(x):return 1/(1+np.exp(-x))  #numpy的广播功能

 

                                     

 

比较

绘图代码如下:

# coding: utf-8
#阶跃函数和sigmoid函数比较
import numpy as np
import matplotlib.pylab as pltdef sigmoid(x):return 1 / (1 + np.exp(-x))    def step_function(x):return np.array(x > 0, dtype=np.int)x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(x)
y2 = step_function(x)plt.plot(x, y1)
plt.plot(x, y2, 'k--')
plt.ylim(-0.1, 1.1) #指定图中绘制的y轴的范围
plt.show()

                                              

不同点:

    (1)sigmoid函数是一条平滑的曲线,即输出随输入发生连续的变化,阶跃函数以0为界,发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习极有帮助。

    (2)阶跃函数只能输出0或1(二元信号),而sigmoid函数可输出连续的实数信号。

相同点:

    (1)形状相似,输入小时,输出接近0;输入增大时,输出向1靠近。也就是说,当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。

    (2)输出信号值均在0~1之间。

    (3)两者都是非线性函数。阶跃函数是一条折线,sigmoid函数是一条曲线。实际上,神经网络的激活函数必须使用非线性函数,否则加深层的意义就没有了。对于线性函数而言,不管如何加深层,总存在与之等效的无隐藏层的神经网络。举个例子,激活函数h(x)=cx,把y(x)=h(h(x))的运算对应2层神经网络,显然y(x)=c·c·x=c2·x=ax(a= c2)。所以为了利用多层神经网络的优势,激活函数必须使用非线性函数。

Relu函数

    Sigmoid函数的使用历史比较久,现在主要流行ReLU(Rectified Linear Unit)函数,如下:

                                      

    式(7)表明,输入大于0,则直接输出该值;输入小于等于0时,输出0。Python实现也很简单,代码如下:

# 只给出函数,绘图代码同上def relu(x):return np.maximum(0, x) #小于0的为0,大于0的为其本身

 

 

                              

本章剩余部分的内容一直采用sigmoid函数作为激活函数,在靠后的知识点中,才使用ReLU函数。

今天的内容就讲到这里了,希望读者好好回顾一下激活函数的产生及特点。下一篇知识点,将介绍使用numpy数组实现神经网络。欢迎读者订阅我的微信公众号“Python生态智联”,充分利用好零碎时间学AI

 

这篇关于神经网络第一篇:激活函数是连接感知机和神经网络的桥梁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys