Softsign Tanh 速度对比

我最近对softsign这个函数比较偏爱,但是测试的时候,有时候发现其速度并不令人满意

网上资料很少,搜到了一篇博客

深度学习日常发问(三):激活函数性能对比_明曦君的博客-CSDN博客_mish激活函数和relu对比

但是这篇文章却说“Tanh的速度最快,而Softsign速度最慢”

十分不解,感觉tanh函数在计算的时候还包括幂次运算,没有道理比softsign快,写了如下的测试函数:

import torch
import time
from torch.nn import Softsign, Tanh

soft= Softsign()
tan = Tanh()


sum_soft = 0.
sum_tan = 0.
for i in range(1000):
	x = torch.randn(3, 1000, 1000)*10
	print(i)
	# print(x)

	time1 = time.time()
	y1 = soft(x)
	time2 = time.time()
	y2 = tan(x)
	time3 = time.time()

	sum_soft += time2 - time1
	sum_tan += time3 - time2

print("sum_soft = ", sum_soft)
print("sum_tan = ", sum_tan)

打印结果为:

sum_soft =  4.364975929260254
sum_tan =  1.6701316833496094

结果证明,他可能是对的,tanh确实比softsign要快。

如果放到GPU上去运算的话:

import torch
import time
from torch.nn import Softsign, Tanh

soft= Softsign()
tan = Tanh()
device = torch.device("cuda")
soft = soft.to(device)
tan = tan.to(device)

sum_soft = 0.
sum_tan = 0.
for i in range(1000):
	x = torch.randn(3, 1000, 1000)*10
	x = x.to(device)
	print(i)
	# print(x)

	time1 = time.time()
	y1 = soft(x)
	time2 = time.time()
	y2 = tan(x)
	time3 = time.time()

	sum_soft += time2 - time1
	sum_tan += time3 - time2

print("sum_soft = ", sum_soft)
print("sum_tan = ", sum_tan)

打印结果为:

sum_soft =  0.11101865768432617
sum_tan =  0.021539688110351562

softsigh速度依然比tan要慢

——————————————————————————

原因尚不可知,难道是因为求绝对值,比求幂次,还慢吗?

写了如下测试,比较求幂次和绝对值的速度

import time
import torch

sum_exp = 0.
sum_abs = 0.
for i in range(1000):
	x = torch.randn(3, 1000, 1000)*10
	print(i)
	# print(x)

	time1 = time.time()
	y1 = torch.exp(x)
	time2 = time.time()
	y2 = torch.abs(x)
	time3 = time.time()

	sum_exp += time2 - time1
	sum_abs += time3 - time2

print("sum_exp = ", sum_exp)
print("sum_abs = ", sum_abs)

打印结果为:

sum_exp =  1.2346689701080322
sum_abs =  1.3161406517028809

发现求绝对值真的比exp的速度还慢一点

但是numpy,却并不同

import time
import numpy as np

sum_exp = 0.
sum_abs = 0.
for i in range(1000):
	x = np.random.randn(3, 1000, 1000)*10
	print(i)
	# print(x)

	time1 = time.time()
	y1 = np.exp(x)
	time2 = time.time()
	y2 = np.abs(x)
	time3 = time.time()

	sum_exp += time2 - time1
	sum_abs += time3 - time2

print("sum_exp = ", sum_exp)
print("sum_abs = ", sum_abs)

打印结果为:

sum_exp =  17.33661985397339
sum_abs =  3.6888980865478516

整体来讲,numpy比pytorch慢很多,exp运算差了一个数量级,而求绝对值也慢了一倍

不过numpy自己比较,求绝对值比求exp快好几倍

稍微调试了一下,发现softplus的实现,是Python代码

 

而tanh的实现,没看到,可能是C++底层来实现的

 

 所以,这应该是两种环境的PK,导致softsign的速度没有提上来

但是如果导出来,同时用C++的runtime库来执行的话,猜想softsign应该还是会更快一些吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sigmod、tanh和relu都是常用的激活函数,它们的主要区别在于它们的输出范围和梯度。 sigmod函数的输出范围在到1之间,它的梯度在输出接近或1时非常小,这会导致梯度消失的问题,使得训练变得困难。 tanh函数的输出范围在-1到1之间,它的梯度在输出接近-1或1时也会变得非常小,同样会导致梯度消失的问题。 relu函数的输出范围在到正无穷之间,它的梯度在输出为正数时为常数1,这使得训练更加稳定,避免了梯度消失的问题。但是,当输入为负数时,relu函数的梯度为,这被称为“死亡relu”问题,可能会导致一些神经元永远不会被激活。 因此,选择哪种激活函数取决于具体的应用场景和数据特征。 ### 回答2: Sigmod、tanh 和 relu 都是深度学习中常用的激活函数。它们有各自的优缺点,下面将对它们进行对比分析。 Sigmod 是一种平滑的 S 形函数,它将输入值映射到 (0,1) 范围内。这种函数的主要优点在于可导性和平滑性,使得神经网络在反向传播时更容易计算。但是,sigmod 函数在它的输入靠近边界时出现饱和现象。这会导致梯度消失问题,在反向传播中,梯度可能会变得非常小,从而导致神经网络无法学习。因此,尽管 Sigmod 是最早被使用的激活函数之一,现在已经不再是主流选择。 Tanh 是另一种常用的激活函数,它能够将输入值映射到 (-1,1) 范围内。它的形状与 sigmod 函数类似,但它在输入为负数时产生负的输出,而在输入为正数时产生正的输出。与 sigmoid 相比,tanh 函数具有相同的可导性和平滑性,并且在输入为负数时梯度不会消失。但是,当输入靠近边界时,tanh 也会产生饱和现象,从而导致梯度消失。因此,在某些场景下,tanh 函数可能仍然存在梯度消失问题。 ReLU 是目前最流行的激活函数之一。ReLU 的主要优点是计算简单、稳定且在很多场景下可以避免梯度消失问题。除了计算简单之外,ReLU 还能够帮助模型更好地拟合数据。当输入为负数时,ReLU 的输出为 0,这种非线性伸缩有助于增强模型的表达能力并避免过拟合。 总的来说,激活函数在神经网络中扮演着至关重要的角色,而 Sigmod、tanh 和 relu 都有其独特的优缺点。根据实际应用需求,选择适当的激活函数可以提高模型的性能和准确度。 ### 回答3: sigmod,tanh和relu都是人工神经网络(ANN)中常用的激活函数,用来将线性输出转化为非线性输出,以增加模型的表示能力。这三种激活函数之间有很大的不同,具体如下: 1. sigmoid函数(sigmoid) sigmoid函数具有S形状,其范围在0到1之间。sigmoid函数可以将任何实数映射到0到1之间,通常用于二元分类器中。sigmoid函数在函数值接近1和0时斜率很小,在这些地方,梯度消失的风险很高,这会导致模型无法更新。此外,sigmoid函数还需要计算指数,计算代价较高。 2. 双曲正切函数(tanh) 双曲正切函数在函数值接近1和-1时斜率较小,因此也存在梯度消失的风险。但与sigmoid函数不同的是,tanh函数的范围在-1到1之间,因此可以将任何实数映射到-1到1之间。tanh函数也需要计算指数,计算代价较高。 3. 整流线性单元函数(ReLU) ReLU函数范围在0到正无穷之间,当函数值为负时,ReLU函数的梯度为0,因此ReLU函数存在梯度消失问题。但与sigmoid和tanh函数不同的是,ReLU函数计算代价低廉,易于优化。ReLU函数在许多深度学习任务中表现良好,使得深层网络易于训练。 总的来说,这三种激活函数都有其优点和缺点。sigmoid函数和tanh函数有梯度消失的风险,计算代价较高;ReLU函数易于优化,计算代价低廉,但存在梯度消失问题。在实践中,根据具体任务和网络结构的不同,我们可以选择不同的激活函数,以达到最优的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值