常见激活函数的用法

本文介绍了激活函数的重要性,并详细探讨了几种常见的激活函数,包括Sigmoid、Tanh、ReLU及其变种PReLU,以及用于多分类任务的Softmax函数。通过对比它们的优缺点,帮助读者更好地理解如何选择合适的激活函数。

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

常见激活函数的用法

1.为什么要使用激活函数
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

2.常用的激活函数

2.1 Sigmoid函数
sigmoid函数也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
f(x)=11+e−x \mathcal f(x) = \frac{1}{1+e^{-x}} f(x)=1+ex1
sigmoid函数
优点:特征相差比较复杂或是相差不是特别大时效果比较好。
缺点:

  • sigmoid函数要进行指数运算,收敛较慢。
  • 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,我们都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmoid函数,这个链条上的微分就很小很小了,况且还可能经过很多个sigmoid函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。
  • 函数输出不是以0为中心的,这样会使权重更新效率降低。

2.2 Tanh函数
也称为双曲切正切函数,取值范围为[-1,1],tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。其大致效果与sigmoid函数一致,不过其输出中心为0,实际应用中 tanh 会比 sigmoid 更好。
一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数,不过还得特殊情况特殊分析。
f(x)=ex−e−xex+e−x \mathcal f(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+exexex

tanh函数

2.3 Relu函数

f(x)=max⁡(0,x)\mathcal f(x) = \max(0,x) f(x)=max(0,x)
Relu函数
优点:

  • 输入值为正时,不存在梯度饱和问题。
  • 计算速度快。Relu函数只有线性关系,不管是前向传播还是反向传播,都比sigmoid和tanh要快很多。(sigmoid和tanh要计算指数,计算速度会比较慢)

缺点:

  • 输出也不是以0为中心的函数。
  • 在使用Relu函数时,对于learning rate的速率要谨慎设置。
  • 当输入是负数的时候,Relu是完全不被激活的,这就表明一旦输入到了负数,Relu就会死掉,在反向传播过程中,输入负数,梯度就会完全到0,这个和sigmoid函数、tanh函数有一样的问题。例如,一个非常大的梯度流过一个 Relu神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0。

2.4 PReLU函数
f(x)=max⁡(αx,x)\mathcal f(x) = \max(\alpha x,x) f(x)=max(αx,x)PReLU
PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,其中α为参数,取值范围为0~1,当α=0.01时,我们叫PReLU为Leaky ReLU。

2.5 softmax函数
Softmax - 用于多分类神经网络输出
f(x)j=exj∑i=1nezi\mathcal f(x)_j = \frac{e^{x_j}}{\sum_{i=1}^{n}e^{z_i}} f(x)j=i=1neziexj

<think>好的,我现在需要帮助用户找到用MATLAB实现常见深度学习激活函数的方法,比如ReLU和Sigmoid。首先,我需要回忆一下这些激活函数的数学表达式,然后思考如何在MATLAB中编写对应的代码。 用户提到的激活函数包括ReLU和Sigmoid,可能还有其他的,比如Tanh。我需要确保每个函数的实现正确,并且符合MATLAB的语法。根据用户提供的引用内容,用户可能已经看过一些示例,但需要更详细的解释和代码。 首先,Sigmoid函数的数学表达式是$\sigma(x) = \frac{1}{1 + e^{-x}}$。在MATLAB中,可以直接用数组运算来实现。例如,对于输入向量x,计算sigmoid可以用1./(1 + exp(-x))。需要注意的是,点运算符(.)的使用,确保对每个元素进行操作。 接下来是ReLU函数,它的定义是$f(x) = \max(0, x)$。在MATLAB中,可以用max(x, 0)来实现。同样,这里需要处理的是向量或矩阵的元素级别操作,所以max函数会自动处理每个元素。 然后是Tanh函数,数学表达式为$\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$。在MATLAB中,可以直接使用内置的tanh函数,但用户可能需要显式地编写代码,所以可能需要用(exp(x) - exp(-x))./(exp(x) + exp(-x)),或者直接调用tanh(x)。 另外,用户提供的引用中提到了Leaky ReLU和Softmax。Leaky ReLU的公式是$f(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{otherwise} \end{cases}$,其中α是一个小的正数,比如0.01。在MATLAB中可以用x.*(x>=0) + alpha*x.*(x<0)来实现。 Softmax函数用于多分类,公式为$\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}}$。需要注意数值稳定性问题,通常会对输入进行减去最大值的处理,防止指数爆炸。MATLAB中可以这样实现:exp(x) ./ sum(exp(x), 'all'),但可能需要调整维度,根据输入是向量还是矩阵。 接下来,我需要检查用户提供的引用内容,看看是否有代码示例或者需要注意的地方。引用1中的MATLAB代码已经展示了Sigmoid和ReLU的绘制,但用户可能需要更通用的函数实现,而不仅仅是绘图。引用2提到了Tanh的梯度消失问题,但可能不需要在代码中体现。引用3是Python的示例,但用户需要的是MATLAB,所以需要转换语法。 现在需要将这些函数封装成MATLAB函数,可能每个激活函数单独一个函数文件,或者在脚本中定义。例如,可以创建sigmoid.m、relu.m等文件,每个文件中定义对应的函数。 还需要考虑输入的处理,确保函数能够处理向量、矩阵,甚至高维数组。MATLAB的矩阵运算在这方面比较方便,但需要注意维度问题,尤其是在Softmax中可能需要指定沿着哪个维度求和。 另外,可能需要演示如何调用这些函数,比如生成输入x,计算对应的激活函数值,并绘制图像,如用户提供的引用中的示例。这样用户可以直观地看到激活函数的形状。 最后,需要确保代码的效率和正确性,例如避免循环,使用向量化操作,这对于MATLAB来说非常重要,可以提升性能。 总结步骤: 1. 为每个激活函数编写MATLAB函数代码。 2. 提供示例输入,展示如何调用这些函数。 3. 绘制图形,帮助用户可视化激活函数。 4. 考虑可能的错误处理,例如输入是否为空,但用户可能不需要太复杂的错误检查,因为是基础实现。 5. 引用用户提供的参考文献中的相关内容,指出代码的来源或参考,如引用1中的绘图方法。 可能的疑问点:是否需要处理梯度计算?用户的问题中可能没有提到,但引用2提到了梯度消失的问题,不过用户主要关注的是实现代码,所以可能不需要包含导数部分,除非用户特别要求。 现在开始组织代码,每个函数单独说明,并给出示例。例如: 对于Sigmoid函数: function y = sigmoid(x) y = 1./(1 + exp(-x)); end 对于ReLU: function y = relu(x) y = max(x, 0); end 对于Leaky ReLU,可能需要参数alpha,可以设置默认值: function y = leaky_relu(x, alpha) if nargin < 2 alpha = 0.01; end y = x.*(x >= 0) + alpha.*x.*(x < 0); end Softmax函数需要注意维度,假设输入是向量: function y = softmax(x) e_x = exp(x - max(x)); % 防止数值溢出 y = e_x / sum(e_x); end 或者处理矩阵,沿着特定维度,比如沿着列: function y = softmax(x) e_x = exp(x - max(x, [], 1)); % 按列减去最大值 y = e_x ./ sum(e_x, 1); % 按列求和 end 需要根据应用场景调整。 然后,演示如何使用这些函数,例如: x = linspace(-5,5); sigmoid_x = sigmoid(x); plot(x, sigmoid_x); 同样对于其他函数。用户提供的引用1中的代码已经做了类似的事情,可以引用作为示例。 最后,生成相关问题,可能需要包括梯度计算、比较不同激活函数的特点、如何在深度学习框架中使用这些激活函数等。</think>以下是在MATLAB中实现常见深度学习激活函数的详细说明,包含代码示例和可视化方法: ### 一、Sigmoid函数 数学表达式: $$\sigma(x) = \frac{1}{1 + e^{-x}}$$ MATLAB实现: ```matlab function y = sigmoid(x) y = 1./(1 + exp(-x)); % 点运算保证向量/矩阵输入兼容性 end ``` 可视化示例: ```matlab x = linspace(-5,5); % 生成-5到5的线性间隔向量 plot(x, sigmoid(x), 'r--'); legend('Sigmoid'); ``` 特点:输出范围(0,1),适用于二分类问题[^2] ### 二、ReLU函数 数学表达式: $$f(x) = \max(0,x)$$ MATLAB实现: ```matlab function y = relu(x) y = max(x, 0); % 内置函数自动处理数组 end ``` 可视化示例: ```matlab x = -10:0.1:10; plot(x, relu(x), 'b'); legend('ReLU'); ``` 特点:计算高效,缓解梯度消失[^1] ### 三、Leaky ReLU 数学表达式: $$f(x) = \begin{cases} x & x \geq 0 \\ \alpha x & x < 0 \end{cases}$$ MATLAB实现: ```matlab function y = leaky_relu(x, alpha) if nargin < 2 alpha = 0.01; % 默认泄露系数 end y = x.*(x >= 0) + alpha*x.*(x < 0); end ``` ### 四、Tanh函数 数学表达式: $$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$$ MATLAB实现(可直接调用内置函数): ```matlab function y = tanh_act(x) y = tanh(x); % 等价于(exp(x)-exp(-x))./(exp(x)+exp(-x)) end ``` 特点:输出范围(-1,1),中心对称特性有利于梯度更新 ### 五、Softmax函数 数学表达式: $$\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}$$ MATLAB实现(带数值稳定处理): ```matlab function y = softmax(x) x = x - max(x); % 防止数值溢出 ex = exp(x); y = ex ./ sum(ex); end ``` ### 可视化对比示例 ```matlab x = linspace(-5,5,200); subplot(2,2,1) plot(x,sigmoid(x)); title('Sigmoid') subplot(2,2,2) plot(x,relu(x)); title('ReLU') subplot(2,2,3) plot(x,leaky_relu(x)); title('Leaky ReLU') subplot(2,2,4) plot(x,tanh_act(x)); title('Tanh') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值