深度学习中常见的非线性函数(激活函数)

  在深度学习的神经网络中,神经元进行X(输入)*   W(权重)+   b(偏执)的计算之后会增加一个非线性函数,最终得到该神经元的输出。这是因为X*W+b是一个线性的操作,如果神经元只有线性操作,那么这个神经网络无论有多少深,有多少个神经元它最终拟合的依然是一个线性函数,这样的拟合没有任何意义,所以会在计算完成以后增加一个非线性函数,这样只要我的神经网络只要够深,神经元够多,就能拟合任何函数。 并且在卷积神经网络中,进行了卷积或者池化等操作后通常也会在后面加上一个非线性函数。下面我们就来介绍一下常见的非线性函数,以及他们之间的区别。

1.Sigmoid函数

首先是最常见的Sigmod函数,每一个输入值都会被压缩到(0,1)的范围内,在x接近0的一小段范围内可以近似得将它看作线性函数,x稍微比0大一点,它的值就非常接近1,稍微比0小一点,它的值就非常接近0。

仔细观察这个函数你会发现,只有在x等于0的附近这个函数的才有较大的梯度,其余地方梯度都很小,如果我们的x很大,或者很小梯度甚至会接近0,在进行梯度下降时会造成梯度消失的现象,反向传播得到的梯度很小,每次只对权重w更新一点点甚至不更新,造成梯度下降缓慢。同时,函数中用到了指数运算,计算量会相对高一点,不过这无伤大雅。

2.tanh函数

 tanh函数和Sigmoid函数很相似,只不过它的值的范围在(-1,1)之间,所以它也会有梯度消失的现象。

3.ReLU函数

 函数输入<=0,输出为0;输入>0输出等于输入。

ReLU函数在输入>0的区域梯度恒为1,输入空间有一半的区域没有梯度消失,并且ReLU函数的计算成本也不高。相较于前面两个ReLU函数的收敛速度、计算速度更快。因此在2012年左右,AlexNet出现之后,ReLU函数开始被大量使用。但正如上面所说有一半的区域没有梯度消失,相对的,就有一半的区域梯度为0。所以ReLU函数任然会发生梯度消失的现象,只是相较于上面两个函数会少很多。

4.Leaky ReLU函数

 这是在ReLU函数的基础上进行的升级,在负半轴上也添加一个斜率,这样就不会再有梯度消失的现象发生。同时,Leaky ReLU和ReLU的计算速度大致相同,都是取一个最大值。 

对于负半轴的斜率,也可以不用指定为0.01,而是作为一个需要学习的函数放入神经网络中,增加它的灵活性。

5.ELU函数

 与Leaky ReLU不同,ELU函数在负半轴引入了指数运算。一些观点认为这样的模型对噪音具有更强的鲁棒性,但这样也在函数的负半轴又带来了梯度消失的现象,同时因为指数运算,ELU的计算时间也会更长。

如何选择函数,根据使用经验来说,ReLU函数是最好的,因为函数的性质,它可能在绝大多数情况下表现都非常不错。但并非在所有问题上ReLU都是表现最好的,可能某一具体问题上,其他函数表现更好。所以不妨在具体的问题上对每一函数都进行测试,选择性能最好的那一个。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MATLAB ,可以使用多种方法来处理非线性函数。以下是一些常见的方法: 1. 数值解法:使用数值方法求解非线性方程的根。其,最常用的方法是牛顿迭代法(`fzero`函数)和二分法(`fminbnd`函数)。 ```matlab % 使用牛顿迭代法求解非线性方程的根 f = @(x) x^2 - 2; root = fzero(f, 1); % 在 x=1 附近求解 f(x)=0 的根 % 使用二分法求解非线性方程的根 f = @(x) x^2 - 2; root = fminbnd(f, 1, 2); % 在 x=1 和 x=2 的区间内求解 f(x)=0 的根 ``` 2. 优化方法:将非线性问题转化为优化问题,并使用优化算法求解。常用的优化算法包括遗传算法、模拟退火算法和粒子群优化算法等。 ```matlab % 使用遗传算法求解非线性最小化问题 fitnessfcn = @(x) x^2 - 2; options = gaoptimset('Display', 'iter'); [x, fval] = ga(fitnessfcn, 1, [], [], [], [], [], [], [], options); % 使用模拟退火算法求解非线性最小化问题 objfun = @(x) x^2 - 2; x0 = 1; options = saoptimset('Display', 'iter'); [x, fval] = simulannealbnd(objfun, x0, [], [], options); % 使用粒子群优化算法求解非线性最小化问题 objfun = @(x) x^2 - 2; nvars = 1; options = optimoptions('particleswarm', 'Display', 'iter'); [x, fval] = particleswarm(objfun, nvars, [], [], options); ``` 3. 符号计算:使用符号计算工具箱进行非线性函数的分析和处理。符号计算工具箱可以用于求解方程、求导、积分等。 ```matlab % 求解非线性方程的根 syms x; eqn = x^2 - 2 == 0; roots = solve(eqn, x); % 求解非线性方程组的根 syms x y; eqn1 = x + y == 3; eqn2 = x - y == 1; [solx, soly] = solve([eqn1, eqn2], [x, y]); % 求解非线性微分方程 syms y(t); eqn = diff(y) + y == t; ySol(t) = dsolve(eqn); ``` 这些方法只是 MATLAB 处理非线性函数的一部分示例,具体的选择取决于你的问题和需求。你可以根据具体情况选择合适的方法来处理非线性函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值