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

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

相关文章

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

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

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据