ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

9 激活函数简单原理及使用

2021-10-28 03:01:38  阅读:307  来源: 互联网

标签:tensor nn 梯度 torch ReLU 原理 print 激活 函数


激活函数简单原理及使用:

原文链接:https://zhuanlan.zhihu.com/p/172254089

目前用到的几个激活函数的发展及简单使用:

1 Sigmoid:

Sigmoid 的函数图像如上所示,从图像可以看出,函数两个边缘的梯度约为0,梯度的取值范围为(0, 0.25)。

使用 Sigmoid 作为激活函数时,在多层神经元的网络中浅层和深层网络参数的更新速率相差巨大。该现象就称为 “梯度消失(Vanishing Gradients)”。

Pytorch 中的用法:

import torch.nn as nn
import torch

t1 = torch.randn(3,3)
m = nn.Sigmoid()
t2 = m(t1)
print(t1)
print(t2)

torch.nn.Sigmoid() 没有什么参数,可直接调用。

2 Relu:

ReLU 激活函数的提出就是为了解决梯度消失问题,ReLU 的梯度只可以取两个值:0或1,当输入小于0时,梯度为0;当输入大于0时,梯度为1。好处就是:ReLU 的梯度的连乘不会收敛到0 ,连乘的结果也只可以取两个值:0或1 ,如果值为1 ,梯度保持值不变进行前向传播;如果值为0 ,梯度从该位置停止前向传播。 Sigmoid 和 ReLU 函数对比如下:

Pytorch 中的用法:

torch.nn.ReLU(inplace: bool = False)	# inplace 为 True,将会改变输入的数据,否则不会改变原输入,只会产生新的输出.
# 例子如下:
import torch
import torch.nn as nn

input1 = torch.tensor([50,-2,6,5,3])
input2 = torch.tensor([50,-2,6,5,3])

x1 = nn.ReLU(inplace = True)(input1)
x2 = nn.ReLU(inplace = False)(input2)

print(x1, input1)
print(x2, input2)

Output:
tensor([50,  0,  6,  5,  3]) tensor([50,  0,  6,  5,  3])
tensor([50,  0,  6,  5,  3]) tensor([50, -2,  6,  5,  3])

若 inplace=True,则对于上层网络传递下来的tensor直接进行修改,可以少存储变量y,节省运算内存。

3 Leakyrelu:

LeakyReLU的提出是为了解决神经元 ”死亡“ 问题(输入激活函数的值总为-,传播梯度恒为0,神经元无法继续学习),LeakyReLU 与 ReLU 很相似,仅在输入小于0的部分有差别,ReLU 输入小于0的部分值都为0,而 LeakyReLU 输入小于0的部分,值为负,且有微小的梯度。函数图像如下图:

Pytorch 中的用法:

torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)
# 例子
import torch
import torch.nn as nn

m = nn.LeakyReLU(0.1)
input = torch.tensor([-0.9, 3064])
print(input)
print(m(input))

Output:
tensor([-9.0000e-01,  3.0640e+03])
tensor([-9.0000e-02,  3.0640e+03])

4 Elu:

理想的激活函数应满足两个条件:

  • 输出的分布是零均值的,可以加快训练速度。

  • 激活函数是单侧饱和的,可以更好的收敛。

\[f(x)=\left\{\begin{array}{ll} x & \text { when } x>0 \\ \alpha\left(e^{x}-1\right) & \text { when } x \leq 0 \end{array}\right. \]

输入大于0部分的梯度为1,输入小于0的部分无限趋近于-α,超参数取值一般为 1

Pytorch 中的用法:

torch.nn.ELU(alpha=1.0, inplace=False)
# 例子
import torch
import torch.nn as nn

m = nn.ELU()
input = torch.tensor([-0.9, 3064])
print(input)
print(m(input))

Output:
tensor([-9.0000e-01,  3.0640e+03])
tensor([-5.9343e-01,  3.0640e+03])

标签:tensor,nn,梯度,torch,ReLU,原理,print,激活,函数
来源: https://www.cnblogs.com/SethDeng/p/15473763.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有