深度学习:01 神经网络与激活函数

news2024/12/27 13:54:24

目前,最广泛使用的定义是Kohonen于1988年的描述:

神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。

目录

对神经网络的概述 

神经网络的表示

激活函数

为什么激活函数都是非线性的

sigmoid 函数

tanh 函数

ReLU 函数

Leaky Relu 函数

参考资料


对神经网络的概述 

只用到高中阶段中学到的生物神经网络,我们便能知道在这个网络当中,每个神经元会与其他的神经元相连,当产生兴奋时,会向其相连的神经元发送化学信号,从而改变这些神经元内的电位,当某个神经元的电位超过了一个阈值,神经元被激活,也就是兴奋了,接着不断地传递信号给其他神经元。

a4edf9eaa2004370a368e5dcca61ee88.png

而在如今地深度学习也是借鉴了这样地结构,每一个神经元接收输入x,通过带权重地w地连接进行传递,将总输入信号与神经元的阈值进行比较,最后通过激活函数来确定是否激活,并将激活后的计算结果y输出,而我们所说的训练,所训练的就是这里面的权重w。

从数学地角度来说,就是输入x,输出y,斜率w。

 

神经网络的表示

我们可以将神经元拼接起来,两层神经元,即输入层+输出层(M-P神经元),构成感知机。 而多层功能神经元相连构成神经网络,输入层与输出层之间的所有层神经元,称为隐藏层:

8e54302344e14481a59240d0701cb9bc.png

如上图所示,输入层和输出层只有一个,中间的隐藏层可以有很多层(输出层也可以多个,例如经典神经网络GoogleNet)

激活函数

在概述时已经说到,神经元会受到化学物质的刺激,当达到一定程度的时候,神经元才会兴奋,并向其他神经元发送信息。神经网络中的激活函数就是用来判断我们所计算的信息是否达到了往后面传输的条件。

900508c14c6c4f4cac9d09c5a6ba81c6.png

为什么激活函数都是非线性的

在神经网络的计算中,无非就是矩阵相乘,输入的是线性,不论输出层有多少,相当于n个矩阵相乘,和一层相乘所获取的信息差距不大,那我们无非是要引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中,增加了神经网络模型泛化的特性。

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。 近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等),由于计算简单、效果好所以在多层神经网络中应用比较多。

下面来总结下较常见的激活函数:

# 下面内容都要有此片段
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
x= torch.linspace(-10,10,60)

sigmoid 函数

gif.latex?a%3D%5Cfrac%7B1%7D%7B1+e%5E%7B-z%7D%7D

导数 :gif.latex?a%5E%5Cprime%20%3Da%281%20-%20a%29

在sigmoid函数中我们可以看到,其输出是在(0,1)这个开区间,它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数输出就是1,起到了抑制的作用。

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.ylim((0, 1))
sigmod=torch.sigmoid(x)
plt.plot(x.numpy(),sigmod.numpy())

f8cf9213f6d44657a1512fefc4e14fb3.png

但是sigmod由于需要进行指数运算(这个对于计算机来说是比较慢,相比relu),再加上函数输出不是以0为中心的(这样会使权重更新效率降低),当输入稍微远离了坐标原点,函数的梯度就变得很小了(几乎为零)。在神经网络反向传播的过程中不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。这些不足,所以现在使用到sigmod基本很少了,基本上只有在做二元分类(0,1)时的输出层才会使用。

tanh 函数

gif.latex?a%3D%5Cfrac%7Be%5Ez-e%5E%7B-z%7D%7D%7Be%5Ez+e%5E%7B-z%7D%7D

 导数:gif.latex?a%5E%5Cprime%20%3D1%20-%20a%5E2

tanh是双曲正切函数,输出区间是在(-1,1)之间,而且整个函数是以0为中心的。

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.ylim((-1, 1))
tanh=torch.tanh(x)
plt.plot(x.numpy(),tanh.numpy())

24a4a23d91e74e5a806316f36c0fd364.png

与sigmoid函数类似,当输入稍微远离了坐标原点,梯度还是会很小,但是好在tanh是以0为中心点,如果使用tanh作为激活函数,还能起到归一化(均值为0)的效果。

一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数,但是随着Relu的出现所有的隐藏层基本上都使用relu来作为激活函数了。

ReLU 函数

Relu(Rectified Linear Units)修正线性单元

a=max(0,z)a=max(0,z) 导数大于0时1,小于0时0。

也就是说: z>0时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当 z<0时,梯度一直为0。 ReLU函数只有线性关系(只需要判断输入是否大于0)不管是前向传播还是反向传播,都比sigmod和tanh要快很多,当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。 但是实际的运用中,该缺陷的影响不是很大。

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.ylim((-3, 10))
relu=F.relu(x)
plt.plot(x.numpy(),relu.numpy())

86b1a5f038a5460bafa9815facdecd41.png

Leaky Relu 函数

为了解决relu函数z<0时的问题出现了 Leaky ReLU函数,该函数保证在z<0的时候,梯度仍然不为0。 ReLU的前半段设为αz而非0,通常α=0.01 a=max(αz,z)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.ylim((-3, 10))
l_relu=F.leaky_relu(x,0.1) # 这里的0.1是为了方便展示,理论上应为0.01甚至更小的值
plt.plot(x.numpy(),l_relu.numpy())

433d87ee72994ee98f2dcd6ced6f9874.png

理论上来讲,Leaky ReLU有ReLU的所有优点,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

ReLU目前仍是最常用的activation function,在隐藏层中推荐优先尝试!

参考资料

神经网络简介 [D. Kriesel] (dkriesel.com)

neuronalenetze-en-zeta2-1col-dkrieselcom.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年总结:从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

【Linux 环境变量】环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

1.问题&#xff1a;为什么自己写的程序需要加上./才能执行&#xff0c;但是指令可以直接使用&#xff0c;例&#xff1a;ls -al&#xff1f; 因为&#xff1a;不加"./"执行程序的时候会按环境变量PATH里面的各个路径找到就正常执行&#xff0c;找不到就报错&#xff…

SQL笔试题总结

文章目录前言一、列转行题目&#xff1a;将表Student转化为下面的形式展示先放答案逐步剖析二、row_number() over() 的使用题目&#xff1a;统计订单交易表&#xff08;orders&#xff09;每个商品交易金额最高的那一条数据先放答案逐步剖析三、逐行累加题目&#xff1a;还是订…

✿✿✿JavaScript --- jQuery框架二

目 录 1.高级事件 (1)浏览器一打开自动触发我们绑定的事件 (2) Trigger 传递数据 (3)自定义事件 (4)trigger 简写方案 (5)triggerHandler() (6)trigger和triggerHandler的区别 (7)on off one 2.动画 (1)显示 隐藏 动画 (2)队列动画 (3)下滑 上卷 (4)淡入淡出…

Nacos启动出现Error creating bean with name ‘memoryMonitor‘ 、‘externalDumpService‘

目录 &#x1f9e1;问题 &#x1f9e1;解决方法 &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &#x1f49f;好记性不如烂键盘&#x…

WSL2支持systemctl命令

文章目录背景相关知识systemdinit安装方法一&#xff1a;微软官方支持方法&#xff08;推荐&#xff09;方法二&#xff1a;安装daemonize实现参考背景 微软官方推出Windows Terminal第一时间&#xff0c;我就安装了这个终端软件。现在GitHub已经有86.8k星&#xff0c;且发布了…

一名普通Java程序员的2022的总结和2023的展望

前言今天是元旦节&#xff0c;也是2023年的第一天&#xff0c;首先祝各位亲朋好友们元旦快乐&#xff0c;在新的一年全家身体康健&#xff0c;诸事顺遂&#xff0c;阖家幸福&#xff0c;最重要的是身体健康&#xff0c;工作顺利&#xff0c;永无BUG永不加班&#xff01;&#x…

计算机组成原理【1】初识硬件

目录 考点1&#xff1a;硬件发展———————————————————————————— 一.计算机硬件的基本组成 1.早期冯诺依曼机 &#xff08;1&#xff09;冯.诺依曼计算机的特点: 2.现代计算机的结构 3.总结图 二.各个硬件的工作原理 1.寄存器MAR,MDR 2.主存…

EMNLP22 外部知识注入:Prompt-Learning for Short Text Classification

Prompt-Learning for Short Text Classification 任务形式&#xff1a;短文本分类问题&#xff0c;但是短文本的短长度、特征稀疏性和高模糊性给分类任务带来了巨大挑战。 1以往的工作&#xff0c;在注入外部信息上 大多数提示学习方法手动扩展标签词或仅考虑类别名称以纳入…

得分_UVa1585分子量_UVa1586数数字_UVa1225周期串_UVa455子序列_UVa10340

目录 P57_习题3-1_得分_UVa1585 P57_习题3-2_分子量_UVa1586 原子数范围0~99 书上给的代码 P57_习题3-3_数数字_UVa1225 P57_习题3-4_周期串_UVa455 P59_习题3-9_子序列_UVa10340 P57_习题3-1_得分_UVa1585 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&a…

网络原理2 TCP协议

TCP协议 文章目录TCP协议TCP的特点TCP的基本特性确认应答机制超时重传机制丢包连接管理机制TCP建立连接---三次握手TCP断开连接---四次挥手滑动窗口机制丢包问题流量控制机制拥塞控制机制延迟应答机制捎带应答机制面向字节流问题TCP中的异常处理程序崩溃了正常关机突然断电关机…

在前端解决跨域

1、环境依赖 C:\Users\cyberzhaohyvm>node -v v14.17.3 C:\Users\cyberzhaohyvm>vue -V vue/cli 5.0.4 2、在项目所在目录&#xff0c;安装axios 进入项目所在目录&#xff1a; D:\01sourcecode\10Tutorial\08Vue\17-2022-12-28-v2\elementui-demo npm install axios …

Redis单线程为什么这么快?

Redis单线程为什么这么快&#xff1f; 第一章 Redis单线程为什么这么快 Redis深度剖析【第一章】Redis单线程为什么这么快&#xff1f;前言一、Redis为什么要使用单线程&#xff0c;而不是多线程&#xff1f;单线程的优势如果Redis使用多线程&#xff1a;既然多线程切换存在消…

【博学谷学习记录】大数据课程-学习第一周总结

Linux服务器 对于Linux操作系统来说&#xff0c;其本身是一个整体&#xff0c;包括Linux内核、系统库和系统程序&#xff0c;Linux内核是其最基础的部分&#xff0c;它实现了对硬件资源的管理&#xff0c;并且提供了使用这些硬件资源的通用接口。 自1991年发布Linux内核来&…

项目实战之旅游网(十四)项目部署-Docker

为了节约资源&#xff0c;在生产环境中我们更多的是使用Docker容器部署SpringBoot应用&#xff0c; 我们要用maven里的docker插件来生成镜像并且远程连接Docker&#xff0c; 开启远程docker服务&#xff1a; # 修改docker配置文件 vim /lib/systemd/system/docker.service 把…

简阅人体姿态估计深度学习方法-simpread-Human Pose Estimation Deep Learning Approach

What is Human Pose Estimation? Human Pose Estimation (HPE) is a way of identifying and classifying the joints in the human body Human Pose Estimation(HPR 人体姿态估计)是一个对人体关节进行识别和分类的方法。 Essentially it is a way to capture a set of co…

Good Bye 2022: 2023 is NEAR C. Koxia and Number Theory

原题链接&#xff1a;Problem - C - Codeforces 题意&#xff1a; 给定一个长度为n的数组&#xff0c;请问是否存在一个数 x &#xff0c;使得任意两个数 与满足 。若是输出 YES &#xff0c;反之输出 NO 。 思路&#xff1a; 我们可以发现一个规律&#xff1a; 规律&#…

本周大新闻|沙特PIF再投Magic Leap,周融资超5.1亿美元

本周大新闻&#xff0c;AR方面&#xff0c;OVER推出众包AR地图Map2Earn&#xff1b;AR房产平台homeAR推扫码看房功能&#xff1b;苹果智能指环专利公布&#xff0c;支持手势和触觉反馈。 VR方面&#xff0c;奇遇MIX正式发布&#xff1b;AjnaLens将发布新XR头显&#xff1b;Gen…

Cartesi 2022 年 12 月回顾

查看你不想错过的更新2022 年 12 月 31 日 &#xff0c;我们将继续保持高昂的建设斗志一直持续到2023年。我们在2022年年底前参加了两次编程马拉松&#xff0c; 并不是一次。我们将 Cartesi 的技术带给了ETH India 活动的2000 多名建设者&#xff0c;我们还与 SuperwomenDAO 合…

RabbitMQ消息确认

目录 1. 消息确认作用 2 开发示例 2.1 生产者确认 2.2 消费者确认 1. 消息确认作用 保证消息的可靠性主要依靠三种机制&#xff1a;一个是消息的持久化&#xff0c;一个是事务机制&#xff0c;一个就是消息的确认机制。 1&#xff09;消息持久化 消息持久化是将消息写入…