首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习】揭开激活函数的神秘面纱

【机器学习】揭开激活函数的神秘面纱

作者头像
小言从不摸鱼
发布于 2024-09-10 11:56:19
发布于 2024-09-10 11:56:19
28600
代码可运行
举报
文章被收录于专栏:机器学习入门机器学习入门
运行总次数:0
代码可运行

学习目标 🍀 理解非线性因素 🍀 知道常见激活函数


🍔 什么是激活函数

激活函数(Activation Function)是神经网络中非常关键的组成部分,主要用于在神经网络的节点(或称神经元)上引入非线性因素。这是因为神经网络的基本计算单元是线性加权和,而单纯的线性组合无法模拟现实世界中复杂的非线性关系。通过引入激活函数,神经网络能够学习并模拟各种复杂的映射关系。

🐻 激活函数的主要作用包括:

  1. 引入非线性:如前所述,通过激活函数可以为神经网络提供非线性建模能力,使得神经网络能够学习并解决复杂的问题。
  2. 控制信息的传递:激活函数通过决定哪些信息能够通过(即函数值非零)或哪些信息被抑制(即函数值为零或接近零),来影响网络的训练过程和输出结果。

🐼 常见的激活函数包括:

  • Sigmoid函数
  • Tanh函数
  • ReLU(Rectified Linear Unit)函数
  • SoftMax函数

🍔 网络非线性因素的理解

激活函数用于对每层的输出数据进行变换, 进而为整个网络结构结构注入了非线性因素。此时, 神经网络就可以拟合各种曲线。如果不使用激活函数,整个网络虽然看起来复杂,其本质还相当于一种线性模型,如下公式所示:

  1. 没有引入非线性因素的网络等价于使用一个线性模型来拟合
  2. 通过给网络输出增加激活函数, 实现引入非线性因素, 使得网络模型可以逼近任意函数, 提升网络对复杂问题的拟合能力.

🍔 常见的激活函数

激活函数主要用来向神经网络中加入非线性因素,以解决线性模型表达能力不足的问题,它对神经网络有着极其重要的作用。我们的网络参数在更新时,使用的反向传播算法(BP),这就要求我们的激活函数必须可微。

2.1 sigmoid 激活函数

sigmoid 激活函数的函数图像如下:

从 sigmoid 函数图像可以得到,sigmoid 函数可以将任意的输入映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1 的,但是输入的数据之间相差 100 倍的信息就丢失了。

对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会有明显差异,输入值在 [-3, 3] 之间才会有比较好的效果。

通过上述导数图像,我们发现导数数值范围是 (0, 0.25),当输入 <-6 或者 >6 时,sigmoid 激活函数图像的导数接近为 0,此时网络参数将更新极其缓慢,或者无法更新。

一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少。sigmoid函数一般只用于二分类的输出层。

在 PyTorch 中使用 sigmoid 函数的示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F


def test():
    _, axes = plt.subplots(1, 2)

    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.tanh(x)
    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('Sigmoid 函数图像')

    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    torch.sigmoid(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Sigmoid 导数图像')

    plt.show()


if __name__ == '__main__':
    test()

2.2 tanh 激活函数

Tanh 叫做双曲正切函数,其公式如下:

Tanh 的函数图像、导数图像如下:

由上面的函数图像可以看到,Tanh 函数将输入映射到 (-1, 1) 之间,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者 >3 时将被映射为 -1 或者 1。其导数值范围 (0, 1),当输入的值大概 <-3 或者 > 3 时,其导数近似 0。

与 Sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失。

若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F


def test():

    _, axes = plt.subplots(1, 2)

    # 函数图像
    x = torch.linspace(-20, 20, 1000)
    y = F.tanh(x)
    axes[0].plot(x, y)
    axes[0].grid()
    axes[0].set_title('Tanh 函数图像')

    # 导数图像
    x = torch.linspace(-20, 20, 1000, requires_grad=True)
    F.tanh(x).sum().backward()

    axes[1].plot(x.detach(), x.grad)
    axes[1].grid()
    axes[1].set_title('Tanh 导数图像')

    plt.show()

if __name__ == '__main__':
    test()

2.3 ReLU 激活函数

ReLU 激活函数公式如下:

函数图像如下:

从上述函数图像可知,ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。

但是,如果我们网络的参数采用随机初始化时,很多参数可能为负数,这就使得输入的正值会被舍去,而输入的负值则会保留,这可能在大部分的情况下并不是我们想要的结果。

ReLU 的导数图像如下:

ReLU是目前最常用的激活函数。 从图中可以看到,当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”。

与sigmoid相比,RELU的优势是:

采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

2.4 SoftMax

softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

计算方法如下图所示:

Softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节点,作为我们的预测目标类别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch


if __name__ == '__main__':

    scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
    probabilities = torch.softmax(scores, dim=0)
    print(probabilities)

程序输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tensor([0.0212, 0.0177, 0.0202, 0.0202, 0.0638, 0.0287, 0.0185, 0.0522, 0.0183,
        0.7392])

🍔 小节

本小节带着同学们了解下常见的激活函数,以及对应的 API 的使用。除了上述的激活函数,还存在很多其他的激活函数,如下图所示:

这么多激活函数, 我们应该如何选择呢?

🍬 对于隐藏层(输入层和输出层之间的都是隐藏层):

  1. 优先选择RELU激活函数
  2. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。
  3. 如果你使用了Relu, 需要注意一下Dead Relu问题, 避免出现大的梯度从而导致过多的神经元死亡。
  4. 不要使用sigmoid激活函数,可以尝试使用tanh激活函数

🍬 对于输出层(输出 y 的那一层):

  1. 二分类问题选择sigmoid激活函数
  2. 多分类问题选择softmax激活函数
  3. 回归问题选择identity激活函数
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
『中级篇』docker容器安装wordpress(37)
PS:大家想一想,类似这种的应用可能需要2个,也有可能需要3个4个,这样的操作是不是很繁琐,我们的希望这样的多个容器形式一个组group,统一化管理,一起安装,一起控制。这就出现了docker-Compose。下次继续吧老铁开始怼docker-Compose。
IT架构圈
2018/08/01
4880
『中级篇』docker容器安装wordpress(37)
『中级篇』docker的魅力初体验-5分钟安装wordpress不走弯路(三)
说docker如何好如何好,还是拿点实际的例子来说吧,先看看网友装一个wordopress都费了多大的劲吧。 安装截图 官网安装教程:wordpress中文安装教程 咱们也用docker在一个新的c
IT架构圈
2018/05/31
4560
『中级篇』docker Image概述(13)
什么是镜像,镜像是怎么产生的,通过这节的学习的Docker container机制要比虚拟机的机制要小巧,原因何在?本节课程的内容是连接12节的,所以肯定跟12节的github有关系:https://github.com/limingios/docker.git 什么是Image 文件和meta data的集合(root filesystem) 对于linux系统来说分为:,就是内核空间(kernel space)和用户空间(user space),内核空间linux kernel,就理解成root fil
IT架构圈
2018/06/27
5340
「走进k8s」Docker 简介和安装(一)
PS:docker已经安装成功了。之前写的文章太官方了,现在要让更通俗,很易懂的方式让更多人了解和使用docker。
IT架构圈
2019/07/30
4.3K0
「走进k8s」Docker 简介和安装(一)
『中级篇』多容器复杂应用的部署(30)
通过前几次学习,对于docker的网络特别是单机,今天这次主要一起来看比较复杂的,会用到前面学到的docker的网络知识。今天创建一个application。这篇的源码在:https://github.com/limingios/docker.git 中的docke/No.2/labs/flask-redis/ 源码分析 application的app.py程序解释:启动一个应用程序web端,访问一个redis,用户每次访问redis对应的key就会增加1,app的主机,端口是5000 [1240] fro
IT架构圈
2018/07/12
6280
『中级篇』数据持久化之Data Volume(34)
源码https://github.com/limingios/docker No.3 方便学习数据持久化存储
IT架构圈
2018/07/19
5810
『中级篇』在docker-swarm集群里通过serivce部署wordpress(46)
PS :不知道大家还有没有影响讲docker的多机网络的时候,多机的overlay网络的时候,使用的第三方的kv的外置的第三方的存储etcd。我们在用了swarm就不需要这个第三方了,整个这块是swarm自己来维护的,swarm的底层机制会同步网络的创建。最后对于所有的clus节点都可以可以访问service的wordpress的问题,下次在说吧。
IT架构圈
2018/08/09
4960
『中级篇』Docker Compose的安装和基本使用(39)
PS: docker-compose的概念有直观的理解,包括compose的命令行和使用。
IT架构圈
2018/07/28
1.1K0
『中级篇』在docker-swarm集群里通过serivce部署wordpress(46)
PS :不知道大家还有没有影响讲docker的多机网络的时候,多机的overlay网络的时候,使用的第三方的kv的外置的第三方的存储etcd。我们在用了swarm就不需要这个第三方了,整个这块是swarm自己来维护的,swarm的底层机制会同步网络的创建。最后对于所有的clus节点都可以可以访问service的wordpress的问题,下次在说吧。
IT架构圈
2018/08/16
3670
『中级篇』在docker-swarm集群里通过serivce部署wordpress(46)
『中级篇』Docker Compose的安装和基本使用(39)
PS: docker-compose的概念有直观的理解,包括compose的命令行和使用。 建议使用docker-compose up -d 后台来运行,如果不后台运行很麻烦ctrl+c的话上边的应用就关闭了。
IT架构圈
2018/08/01
7530
『中级篇』Docker Compose的安装和基本使用(39)
『中级篇』docker Image概述(13)
什么是镜像,镜像是怎么产生的,通过这节的学习的Docker container机制要比虚拟机的机制要小巧,原因何在?本节课程的内容是连接12节的,所以肯定跟12节的github有关系:https://github.com/limingios/docker.git ####什么是Image 文件和meta data的集合(root filesystem) 对于linux系统来说分为:,就是内核空间(kernel space)和用户空间(user space),内核空间linux kernel,就理解成root
IT架构圈
2018/06/10
7310
『中级篇』Docker Compose到底是什么(38)
PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还是docker-compose.yml文件更方便些吧。
IT架构圈
2018/07/26
7930
「docker实战篇」python的docker-docker系统管理-基础概念(28)
PS:说了下docker的优越性,vagrant的方式搭建了一个centos7的docker环境。一定要了解集装箱的概念对了解docker很有必要。
IT架构圈
2019/04/26
6450
「docker实战篇」python的docker-docker系统管理-基础概念(28)
『中级篇』docker之CI/CD持续集成—真实Python项目的CI演示(72)
修改Runner的 /etc/gitlab-runner/config.toml文件,在其中的 [runner.docker]下增加:
IT架构圈
2019/07/08
1.1K0
『中级篇』docker之CI/CD持续集成—真实Python项目的CI演示(72)
源码地址:https://github.com/limingios/docker-cloud-flask-demo
IT架构圈
2018/09/27
2.7K0
『中级篇』Docker-Stack部署wordpress(49)
PS:docker-stack 就是通过yml类似docker-compose的文件来进行多机的部署。
IT架构圈
2018/08/14
5800
『中级篇』Docker 水平扩展和负载均衡(40)
PS:Docker的scale 可以扩展,也可以所有,他们自动来控制的。web=10 可以改成5 其中的6,7,8,9,10就被删除了。
IT架构圈
2018/07/29
1.9K0
『中级篇』Docker 水平扩展和负载均衡(40)
『中级篇』Docker Compose到底是什么(38)
PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还是docker-compose.yml文件更方便些吧。
IT架构圈
2018/08/01
3910
『中级篇』Docker Compose到底是什么(38)
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样部署随便挂哪个主机我们都不担心。 源码:https://github.com/limingios/netFuture/blob/master/docker-swarm/
IT架构圈
2019/03/04
6900
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
Docker 以及 docker-compose 的部署
1. Docker部署 1.1 方式一: 下载软件源 wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo 安装 yum install docker-ce -y
HaydenGuo
2019/12/13
9060
Docker 以及 docker-compose 的部署
推荐阅读
相关推荐
『中级篇』docker容器安装wordpress(37)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档