激活函数σ、tanh、relu、Leakyrelu

news/2025/2/6 2:50:45/

激活函数

        • 1- SIgmoid
          • 1-1 sigmoid导数
        • 2- tanh
          • 2-1 tanh函数导数
        • 3- ReLU
        • 4- LeakyReLu
        • 5- LR 公式推导

Sigmoid、tanh、ReLU、LeakyReLu

1- SIgmoid

sigmoid 函数将元素的值映射到0和1之间

sigmoid(x)=11+exp(−x)sigmoid(x)=\frac{1}{1+exp(-x)}sigmoid(x)=1+exp(x)1

import torch
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.sigmoid()
plt.title('sigmoid')
plt.axhline(0.5,ls='--')#画横线
plt.axvline(0,ls='--')#画竖线
plt.plot(x.detach(), y.detach(),'red')

在这里插入图片描述

1-1 sigmoid导数

sigmoid′(x)=sigmoid(x)(1−sigmoid(x))sigmoid^{'}(x)=sigmoid(x)(1-sigmoid(x))sigmoid(x)=sigmoid(x)(1sigmoid(x))

绘制sigmoid函数的导数。当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0

sigmoid斜率图

import torch
import matplotlib.pyplot as pltx = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.sigmoid()
x.grad = torch.zeros_like(x)#创建一个与x形状相同的全零张量,并将其赋值给x.grad属性,以便在之后的backward()计算中重新计算梯度。
y.sum().backward()
plt.plot(x.detach().numpy(), x.grad.detach().numpy())
plt.title('grad of sigmoid')
plt.show()

在这里插入图片描述

2- tanh

tanh(双曲正切)函数可以将元素的值变换到-1和1之间 ,阈值(-1,1)

tanh(x)=1−exp(−2x)1+exp(−2x)=ez−e−zez+e−ztanh(x)=\frac{1-exp(-2x)}{1+exp(-2x)}=\frac{e^z-e^{-z}}{e^z+e^{-z}}tanh(x)=1+exp(2x)1exp(2x)=ez+ezezez

函数图像

y = x.tanh()
plt.title('tanh')
plt.axvline(0,ls='--')
plt.axhline(0,ls='--')
plt.axhline(1,ls='--',c='gray')
plt.axhline(-1,ls='--',c='gray')
plt.plot(x.detach(), y.detach(),'red')

在这里插入图片描述

2-1 tanh函数导数

tanh′(x)=1−tanh2(x)tanh'(x)=1-tanh^2(x)tanh(x)=1tanh2(x)

y = x.tanh()
x.grad.zero_()
y.sum().backward()
plt.title('grad of tanh')
plt.plot(x.detach().numpy(), x.grad.detach().numpy())

在这里插入图片描述


σ和tanh有一个缺点,那就是z非常大或是非常小的时候,那么导数的梯度或者说这个函数的斜率就很小,拖慢梯度学习算法,造成梯度消失

3- ReLU

非线性激活函数,被称为修正线性单元

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.relu()
plt.title('relu')
plt.plot(x.detach(), y.detach(),c='red')
plt.axvline(0,ls='--')

在这里插入图片描述
给定元素x,该函数定义为:ReLU(x)=max(x,0)x,该函数定义为:ReLU(x)=max(x,0)x,该函数定义为:ReLU(x)=max(x,0)
显然,当输入为负数时,ReLU函数的导数为0;当输入为正数时,ReLU函数的导数为1。尽管输入为0时ReLU函数不可导,但是我们可以取此处的导数为0

4- LeakyReLu


f(x)=max(αx,x)f(x) = max(\alpha x, x)f(x)=max(αx,x)

def ReakyReLU(x, alpha=0.01):return np.where(x < 0, alpha * x, x)y=ReakyReLU(x.detach().numpy())
plt.plot(x.detach().numpy(),y)
plt.axhline(0,c='grey')
plt.title('ReakyReLU function')

在这里插入图片描述
LeakyReLu:g(z)=max(0.001z,z),g′(z)=[0.01ifz<0else1]Leaky ReLu:g(z)=max(0.001z,z), \\ g^{'}(z)=[0.01 \space if \space z<0\space else\space 1]LeakyReLu:g(z)=max(0.001z,z),g(z)=[0.01 if z<0 else 1]

其中,α\alphaα是一个小的正数,通常取0.01。与ReLU函数不同的是,当输入值小于0时,Leaky ReLU函数输出的是输入值的一个小的比例,而不是0。这样可以避免ReLU函数在输入为负时出现死亡神经元的问题,提高了模型的稳定性和泛化性能。

Summary
sigmoid:g′(z)=a(1−a)tanh:g′(z)=1−tanh2(z)=1−a2ReLu:g(z)=max(0,z),g′(z)=[0ifz<0else1]LeakyReLu:g(z)=max(0.001z,z),g′(z)=[0.01ifz<0else1]\\sigmoid:g^{'}(z)=a(1-a)\\ tanh: g^{'}(z)=1-tanh^{2}(z)=1-a^2\\ ReLu:g(z)=max(0,z) ,g^{'}(z)=[0 \space if \space z<0\space else\space 1]\\ Leaky ReLu:g(z)=max(0.001z,z),g^{'}(z)=[0.01 \space if \space z<0\space else\space 1]sigmoid:g(z)=a(1a)tanh:g(z)=1tanh2(z)=1a2ReLu:g(z)=max(0,z),g(z)=[0 if z<0 else 1]LeakyReLu:g(z)=max(0.001z,z),g(z)=[0.01 if z<0 else 1]

5- LR 公式推导

repeat some operations ,update the parameter weight and bais for the loss fun
z=wTx+bz=w^Tx+bz=wTx+b

y^=a=σ(z)=11+e−z\hat y=a =σ(z)=\frac{1}{1+e^{-z}}y^=a=σ(z)=1+ez1
损失函数
L(a,y)=−(ylog(a)+(1−y)log(1−a))L(a,y)=-(ylog(a)+(1-y)log(1-a))L(a,y)=(ylog(a)+(1y)log(1a))
通过链式求导法则求出参数-单个训练样本
求偏导
da=∂L∂a=−ya+1−y1−ada=\frac{\partial L}{\partial a}=-\frac{y}{a}+\frac{1-y}{1-a}da=aL=ay+1a1y

dz=∂L∂z=∂L∂a∗∂a∂z=∂L∂a∗a(1−a)=a−ydz=\frac{\partial L}{\partial z}= \frac{\partial L}{\partial a}*\frac{\partial a}{\partial z}=\frac{\partial L}{\partial a}*a(1-a)=a-ydz=zL=aLza=aLa(1a)=ay

z=w1∗x1+w2∗x2+......+bz=w1*x1+w2*x2+......+bz=w1x1+w2x2+......+b

dw1=∂L∂a∗∂a∂z∗∂z∂w1=dz∗x1dw1=\frac{\partial L}{\partial a}*\frac{\partial a}{\partial z}*\frac{\partial z}{\partial w1}=dz*x1dw1=aLzaw1z=dzx1

dw2=dz∗x2dw2=dz*x2dw2=dzx2
更新参数
w1:=w1−α⋅dw1w1:=w1-α·dw1w1:=w1αdw1

w2:=w2−α⋅dw2........w2:=w2-α·dw2........w2:=w2αdw2........

b:=w1−α⋅dbb:=w1-α·dbb:=w1αdb


http://www.ppmy.cn/news/34221.html

相关文章

【人人都能读标准】11. 原理篇总结:一个程序的完整执行过程

本文为《人人都能读标准》—— ECMAScript篇的第11篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式&#xff0c;并深入剖析了标准对JavaScript核心原理的描述。 我们一路走了很远很远&#xff0c;终于到了本书原理篇的最后一站。 在原理篇中&#xff0c;我们先讲了…

python基于XGBoost开发构建海上船舶航行轨迹多变量序列预测分析模型

在船舶航行状态评估、船舶碰撞概率检测等场景种有着对海面船舶航行轨迹较高的预测需求&#xff0c;准确实时地对航行轨迹进行预测分析有助于评估船舶航行的状态&#xff0c;及时对可能存在的潜在威胁进行发现预警处理&#xff0c;航行轨迹预测本质上来讲就是时间序列建模&#…

Vue项目预渲染

前言 Ajax 技术的出现&#xff0c;让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容&#xff0c;这就是单页应用。在一个单页应用中&#xff0c;往往只有一个 html 文件&#xff0c;然后根据访问的 url 来匹配对应的路由脚本&#xff0c;动态地渲染页面内容。单页应用…

C++ Qt自建网页浏览器

C Qt自建网页浏览器如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<C Qt自建网页浏览器>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文…

网络编程套接字( TCP )

目录 1、实现一个TCP网络程序&#xff08;单进程版&#xff09; 1.1、服务端serverTcp.cc文件 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端提供服务 服务端main函数命令行参数 服务端serverTcp.cc总代码 1.2、客户端clientTcp.cc文件 客户端main函数命令行…

MyBatis高频面试题

目录 1、Mybatis中#和$的区别 2、Mybatis的编程步骤是什么样的 3

【安全与风险】密码学介绍

密码学介绍密码历史密码换位&#xff08;Transposition&#xff09;与置换&#xff08;Substitution&#xff09;替换密码&#xff08;Substiution Cipher&#xff09;凯撒密码 &#xff08;100BC 公元前100年&#xff09;移位密码破坏替换密码维吉尼亚密码现代密码学核心原理从…

Qt调用Chrome浏览器

一、前言 最近有个小项目需要跳转网页&#xff0c;之前有了解过&#xff0c;但是没有在项目中使用过Qt网页嵌入&#xff1b; 结合自己之前的博客&#xff0c;有如下两种技术可以实现我的需求&#xff1a; 1、Qt–网页嵌入 2、Qt使用QAxWidget调用Windows组件 但是在实际开…