激活函数σ、tanh、relu、Leakyrelu、LR_BP反向传播推导

部署运行你感兴趣的模型镜像


Sigmoid、tanh、ReLU、LeakyReLu

1- SIgmoid

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

s i g m o i d ( x ) = 1 1 + e x p ( − 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导数

s i g m o i d ′ ( x ) = s i g m o i d ( x ) ( 1 − s i g m o i d ( 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 plt

x = 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)

t a n h ( x ) = 1 − e x p ( − 2 x ) 1 + e x p ( − 2 x ) = e z − e − z e z + e − z tanh(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函数导数

t a n h ′ ( x ) = 1 − t a n h 2 ( 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 , 该函数定义为: R e L U ( x ) = m a x ( 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 ) = m a x ( α 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')

在这里插入图片描述
L e a k y R e L u : g ( z ) = m a x ( 0.001 z , z ) , g ′ ( z ) = [ 0.01   i f   z < 0   e l s e   1 ] 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
s i g m o i d : g ′ ( z ) = a ( 1 − a ) t a n h : g ′ ( z ) = 1 − t a n h 2 ( z ) = 1 − a 2 R e L u : g ( z ) = m a x ( 0 , z ) , g ′ ( z ) = [ 0   i f   z < 0   e l s e   1 ] L e a k y R e L u : g ( z ) = m a x ( 0.001 z , z ) , g ′ ( z ) = [ 0.01   i f   z < 0   e l s e   1 ] \\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 = w T x + b z=w^Tx+b z=wTx+b

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

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

z = w 1 ∗ x 1 + w 2 ∗ x 2 + . . . . . . + b z=w1*x1+w2*x2+......+b z=w1x1+w2x2+......+b

d w 1 = ∂ L ∂ a ∗ ∂ a ∂ z ∗ ∂ z ∂ w 1 = d z ∗ x 1 dw1=\frac{\partial L}{\partial a}*\frac{\partial a}{\partial z}*\frac{\partial z}{\partial w1}=dz*x1 dw1=aLzaw1z=dzx1

d w 2 = d z ∗ x 2 dw2=dz*x2 dw2=dzx2
更新参数
w 1 : = w 1 − α ⋅ d w 1 w1:=w1-α·dw1 w1:=w1αdw1

w 2 : = w 2 − α ⋅ d w 2........ w2:=w2-α·dw2........ w2:=w2αdw2........

b : = w 1 − α ⋅ d b b:=w1-α·db b:=w1αdb

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think>好的,我现在需要帮助用户在MATLAB中绘制sigmoid、tanhReLULeakyReLU激活函数的图像。首先,我得回忆一下这些激活函数的数学表达式,然后考虑如何在MATLAB中实现它们。 首先,用户提到了四个激活函数:sigmoid、tanhReLULeakyReLU。我需要逐一确认每个函数的定义。比如,sigmoid函数通常是$f(x) = \frac{1}{1 + e^{-x}}$,tanh是双曲正切函数,表达式为$f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$,或者也可以用双曲函数库里的函数。ReLU比较简单,就是$f(x) = \max(0, x)$,而LeakyReLU则是当x小于0时,乘以一个小的斜率,比如0.01,所以表达式是$f(x) = \begin{cases} x & \text{if } x \geq 0 \\ 0.01x & \text{otherwise} \end{cases}$。 接下来,考虑如何在MATLAB中实现这些函数。对于sigmoid,可能需要用元素级运算,比如用exp函数计算指数。同样,tanh在MATLAB中可能有内置函数,但为了准确起见,可能需要手动实现或者调用正确的函数。ReLULeakyReLU可以用条件判断,或者更高效的方式,比如逐元素比较。 然后,关于绘图部分。用户希望将这四个函数绘制出来。在MATLAB中,通常需要生成一个x值的向量,然后计算对应的y值,再使用plot函数绘制。可能需要设置不同的颜色和线条样式来区分各个激活函数。同时,添加网格、标签、标题和图例也是必要的步骤,以便图像更清晰。 需要注意的几点:首先,生成x的范围,比如从-5到5,步长0.1,这样可以覆盖函数的典型变化区域。其次,处理每个函数时,确保数组运算正确,避免维度错误。例如,sigmoid函数中的指数运算应该是对每个元素进行操作,而不是矩阵运算。可能需要使用点运算符(如.*和.^)来确保按元素计算。 对于LeakyReLU,可能需要使用逻辑索引来处理x中大于等于0和小于0的部分。例如,在MATLAB中,可以这样实现:y = x .* (x >= 0) + 0.01 * x .* (x < 0)。或者使用max函数结合不同的条件。 另外,用户提到在Python中使用detach()来切断计算图,但在MATLAB中不需要处理张量计算图的问题,因为MATLAB主要用于数值计算而不是深度学习框架中的自动微分。因此,这部分可以忽略,直接处理普通的数值数组即可。 接下来,需要整合这些步骤到一个MATLAB脚本中。可能需要分几个子图,或者在同一图中用不同颜色绘制,但考虑到四个函数放在同一图中可能比较拥挤,所以分四个子图更合适,每个子图显示一个函数。 然后,检查代码的正确性。例如,sigmoid函数是否计算正确,tanh是否有内置函数或者是否需要手动实现。在MATLAB中,tanh函数是内置的,可以直接使用。ReLU可以用max函数,LeakyReLU可能需要逻辑索引。 最后,确保图像的展示效果良好,包括坐标轴标签、标题、图例、网格线等。可能需要使用hold on来在同一图中绘制多个函数,但如果是分四个子图的话,每个子图独立显示一个函数更清晰。 现在,我需要将上述思考转化为具体的MATLAB代码步骤,并确保每个激活函数的正确性,以及绘图的正确设置。同时,需要按照用户的要求,使用中文回答,并生成相关问题。最后,根据用户提供的引用,检查是否有需要引用的地方,比如激活函数的定义或绘图方法是否来自参考内容。但用户提供的引用主要是关于Python的实现,而这里的问题是关于MATLAB的,因此可能引用部分不适用,但需要确认是否有相关内容需要标注。</think>### 分步实现方法 1. **定义输入范围** 生成从$-5$到$5$的连续输入值,步长$0.1$,用于绘制平滑曲线: ```matlab x = -5:0.1:5; ``` 2. **定义激活函数** - **Sigmoid**: $$f(x) = \frac{1}{1 + e^{-x}}$$ ```matlab sigmoid = 1 ./ (1 + exp(-x)); ``` - **Tanh**: $$f(x) = \tanh(x)$$(直接使用MATLAB内置函数) ```matlab tanh_y = tanh(x); ``` - **ReLU**: $$f(x) = \max(0, x)$$ ```matlab relu = max(0, x); ``` - **LeakyReLU**: $$f(x) = \begin{cases} x & x \geq 0 \\ 0.01x & x < 0 \end{cases}$$ ```matlab leakyrelu = x .* (x >= 0) + 0.01 * x .* (x < 0); ``` 3. **绘制图像** 使用`subplot`将四个函数绘制在同一窗口的不同子图中: ```matlab figure; % Sigmoid subplot(2,2,1); plot(x, sigmoid, 'b', 'LineWidth', 2); title('Sigmoid'); grid on; % Tanh subplot(2,2,2); plot(x, tanh_y, 'r', 'LineWidth', 2); title('Tanh'); grid on; % ReLU subplot(2,2,3); plot(x, relu, 'g', 'LineWidth', 2); title('ReLU'); grid on; % LeakyReLU subplot(2,2,4); plot(x, leakyrelu, 'm', 'LineWidth', 2); title('LeakyReLU'); grid on; ``` ### 完整代码 ```matlab x = -5:0.1:5; % Sigmoid sigmoid = 1 ./ (1 + exp(-x)); % Tanh tanh_y = tanh(x); % ReLU relu = max(0, x); % LeakyReLU leakyrelu = x .* (x >= 0) + 0.01 * x .* (x < 0); % 绘图 figure; subplot(2,2,1); plot(x, sigmoid, 'b', 'LineWidth', 2); title('Sigmoid'); grid on; subplot(2,2,2); plot(x, tanh_y, 'r', 'LineWidth', 2); title('Tanh'); grid on; subplot(2,2,3); plot(x, relu, 'g', 'LineWidth', 2); title('ReLU'); grid on; subplot(2,2,4); plot(x, leakyrelu, 'm', 'LineWidth', 2); title('LeakyReLU'); grid on; ``` ### 效果说明 - **Sigmoid** 输出范围$(0,1)$,适用于概率映射[^1]。 - **Tanh** 输出范围$(-1,1)$,中心对称性有助于收敛[^2]。 - **ReLU** 在$x>0$时线性增长,避免梯度消失。 - **LeakyReLU** 改进ReLU的“神经元死亡”问题,允许负值区域有微小梯度。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elvis_hui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值