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

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

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接