文章目录
- 2、Tanh函数
- 2.1 公式
- 2.2 对应的图像
- 2.3 对应生成图像代码
- 2.4 优点与不足
- 2.5 torch.tanh()函数
2、Tanh函数
2.1 公式
Tanh函数的公式:
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
f(x)=ex+e−xex−e−x
Tanh函数的导函数:
f
′
(
x
)
=
4
(
e
x
+
e
−
x
)
2
f'(x) = \frac{4}{(e^x+e^{-x})^2}
f′(x)=(ex+e−x)24 =
1
−
[
f
(
x
)
]
2
1 - [f(x)]^2
1−[f(x)]2
2.2 对应的图像
2.3 对应生成图像代码
import numpy as np
import matplotlib.pyplot as plt
# 定义 x 的范围
x = np.linspace(-10, 10, 1000)
# 计算 tanh 值
tanh_values = np.tanh(x)
# 计算 tanh 的导数 (1 - tanh^2(x))
derivative_values = 1 - tanh_values ** 2
# 绘制 tanh 函数
plt.plot(x, tanh_values, label='tanh(x)')
# 绘制 tanh 的导数
plt.plot(x, derivative_values, label='derivative of tanh(x)')
# 设置图例
plt.legend()
# 设置标题和轴标签
plt.title('Tanh Function and Its Derivative')
plt.xlabel('x')
plt.ylabel('y')
# 显示图形
plt.grid(True)
plt.show()
2.4 优点与不足
Tanh优点:
1、在分类任务中,双曲正切函数(Tanh)逐渐取代 Sigmoid 函数作为标准的激活函数,其具有很多神经网络所钟爱的特征。它是完全可微分的,反对称,对称中心在原点。
2、输出是S型曲线,具备打破网络层与网络层之间的线性关系,可以把网络层输出非线形地映射到 (−1,1) 区间里。负输入将被强映射为负,而零输入被映射为接近零;tanh 的输出间隔为1且值域是以0为中心的[-1,1](可以解决Sigmoid激活函数输出不以0为中心的问题。)
3、在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。
Tanh不足:
1、当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。
2、Tanh函数也需要进行指数运算,所以其也会存在计算复杂度高且计算量大的问题。
3、当神经网络的层数增多的时候,由于在进行反向传播的时候,链式求导,多项相乘,函数进入饱和区(导数接近于零的地方)就会逐层传递,这种现象被称为梯度消失。
2.5 torch.tanh()函数
在PyTorch中,torch.tanh 函数用于计算张量中每个元素的双曲正切(hyperbolic tangent)值。这个函数接受一个张量(tensor)作为输入,并返回一个新的张量,其中的每个元素都是输入张量对应元素的双曲正切值。
双曲正切函数 tanh(x) 的定义是 (e^x - e^-x) / (e^x + e^-x),其中 e 是自然对数的底数。tanh 函数的值域是 [-1, 1],并且它是奇函数,即 tanh(-x) = -tanh(x)。
以下是如何在PyTorch中使用 torch.tanh 的示例:
import torch
# 创建一个张量
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
# 计算双曲正切值
y = torch.tanh(x)
# 输出结果
print(y)
输出将是 x 中每个元素的 tanh 值:
tensor([-0.9640, -0.7616, 0.0000, 0.7616, 0.9640])
在深度学习中,tanh 激活函数常用于隐藏层,因为它可以将输入压缩到 [-1, 1] 的范围内,有助于梯度下降算法的稳定性。不过,在实践中,ReLU 激活函数由于其简单性和性能优势,现在更常用。