激活函数-Sigmoid, Tanh及ReLU

本文深入探讨了神经网络中激活函数的作用,解释了Sigmoid、Tanh和ReLU三种常见激活函数的特点与优缺点,揭示了它们如何解决线性组合限制,使神经网络能处理复杂非线性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是激活函数

 

在神经网络中,我们会对所有的输入进行加权求和,之后我们会在对结果施加一个函数,这个函数就是我们所说的激活函数。如下图所示。

为什么使用激活函数

我们使用激活函数并不是真的激活什么,这只是一个抽象概念,使用激活函数时为了让中间输出多样化,能够处理更复杂的问题。

如果不适用结果函数的话,每一层最后输出的都是上一层输入的线性函数,不管加多少层神经网络,我们最后的输出也只是最开始输入数据的线性组合而已。激活函数给神经元引入了非线性因素,当加入多层神经网络时,就可以让神经网络拟合任何线性函数及非线性函数,从而使得神经网络可以适用于更多的非线性问题,而不仅仅是线性问题。

有论文中把激活函数定义为一个几乎处处可微的函数f: R->R

有哪些激活函数

对于神经网络,一版我们会使用三种激活函数:Sigmoid函数、Tanh函数、ReLU函数。

基本概念:

饱和

当函数f(x)满足:

\lim_{x\rightarrow+\infty}f^{'}(x)=0

时,称为右饱和

当函数f(x)满足:

\lim_{x\rightarrow-\infty}f^{'}(x)=0

时,称为左饱和

当f(x)同时满足左饱和及右饱和时,称为饱和。

软包和与硬包和

在饱和定义的基础上,如果存在常数c1,当x>c1时候恒满足f^{'}(x)=0,称之为右硬饱和;同样的,如果存在c2,当x<c2时恒满足f^{'}(x)=0,称之为左硬饱和。如果同时满足了左饱和,又满足了右饱和,称之为硬包和。相对的,只有在x趋于极值时才能满足f(x)的倒数为0,则成为软饱和。

1. Sigmoid 函数

sigmoid 曾经风靡一时,但是由于sigmoid有自身的缺陷,现在用的比较少了。

函数公式如下:

f(x)=\frac{1}{1+e^{-x}},相应的f^{'}(x)=f(x)(1-f(x))

​​​​​​函数曲线如下:

优点:

<1> Sigmoid的取值范围在(0, 1),而且是单调递增,比较容易优化

<2> Sigmoid求导比较容易,可以直接推导得出。

缺点:

<1> Sigmoid函数收敛比较缓慢

<2> 由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合(从图上sigmoid的导数可以看出当x趋于无穷大的时候,也会使导数趋于0)

<3> Sigmoid函数并不是以(0,0)为中心点

2. Tanh函数

tanh为双切正切曲线,过(0,0)点。相比Sigmoid函数,更倾向于用tanh函数

函数公式:

f(x)=\frac{sinh(x)}{cosh(x)}=\frac{1-e^{-2x}}{1+e^{-2x}}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=\frac{e^{2x}-1}{e^{2x}+1}=2sigmoid(2x)-1

相应的f^{'}(x)=tanh{'}(x)=sech^{2}(x)=1-tanh^{2}(x)

函数曲线如下:

优点:

<1> 函数输出以(0,0)为中学

<2> 收敛速度相对于Sigmoid更快

缺点:

<1> tanh并没有解决sigmoid梯度消失的问题

3. ReLU函数

最近这几年很常用的激活函数。

公式如下:

f(x)=max(0, x)=\left\{\begin{matrix} 0 & (x \leqslant 0)& \\ x & (x > 0) & \end{matrix}\right.

图形图像:

优点:

<1> 在SGD中收敛速度要比Sigmoid和tanh快很多

<2> 有效的缓解了梯度消失问题

<3> 对神经网络可以使用稀疏表达

<4> 对于无监督学习,也能获得很好的效果

缺点:

<1> 在训练过程中容易出现神经元失望,之后梯度永远为0的情况。比如一个特别大的梯度结果神经元之后,我们调整权重参数,就会造成这个ReLU神经元对后来来的输入永远都不会被激活,这个神经元的梯度永远都会是0,造成不可逆的死亡。

参考:http://www.cnblogs.com/rgvb178/p/6055213.html

 

<think>好的,我现在需要帮助用户在MATLAB中绘制sigmoidtanhReLU和LeakyReLU激活函数的图像。首先,我得回忆一下这些激活函数的数学表达式,然后考虑如何在MATLAB中实现它们。 首先,用户提到了四个激活函数sigmoidtanhReLU和LeakyReLU。我需要逐一确认每个函数的定义。比如,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中可能有内置函数,但为了准确起见,可能需要手动实现或者调用正确的函数。ReLU和LeakyReLU可以用条件判断,或者更高效的方式,比如逐元素比较。 然后,关于绘图部分。用户希望将这四个函数绘制出来。在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的“神经元死亡”问题,允许负值区域有微小梯度。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值