PyTorch基础 :三角函数与特殊运算
文章目录
- PyTorch 基础:三角函数与特殊运算
- 一、三角函数:从基础到双曲
- 1. 基础三角函数
- (1)`torch.sin(input, out=None)`:正弦函数
- (2)`torch.cos(input, out=None)`:余弦函数
- (3)`torch.tan(input, out=None)`:正切函数
- 2. 反三角函数
- (1)`torch.asin(input, out=None)`:反正弦函数
- (2)`torch.acos(input, out=None)`:反余弦函数
- 3. 双曲三角函数
- (1)`torch.sinh(input, out=None)`:双曲正弦函数
- (2)`torch.cosh(input, out=None)`:双曲余弦函数
- 二、常用特殊函数:`abs`、`sigmoid`、`sign`
- 1. `torch.abs(input, out=None)`:绝对值函数
- 2. `torch.sigmoid(input, out=None)`:Sigmoid 函数
- 3. `torch.sign(input, out=None)`:符号函数
- 三、其他特殊函数速览(图二补充)
- 四、总结:函数分类与应用场景
PyTorch 基础:三角函数与特殊运算
在深度学习中,除了基础的加减乘除,还会频繁用到三角函数(如 sin
、cos
)、特殊函数(如 sigmoid
、abs
)等。这些函数是构建复杂模型(如物理仿真、激活函数设计)的基础。本文将系统讲解 PyTorch 中张量相关的三角函数和常用特殊函数,涵盖函数原型、参数、示例及分析。
一、三角函数:从基础到双曲
三角函数用于处理角度与边长的关系,PyTorch 提供了完整的三角函数支持,包括基础三角函数(sin
、cos
等)和双曲三角函数(sinh
、cosh
等)。
1. 基础三角函数
(1)torch.sin(input, out=None)
:正弦函数
- 数学定义:计算张量中每个元素的正弦值,outi=sin(inputi)\text{out}_i = \sin(\text{input}_i)outi=sin(inputi)。
- 参数:
input
:输入张量(元素通常为弧度值)。out
(可选):输出张量,存储结果。
- 值域:[−1,1][-1, 1][−1,1]。
代码示例:
import torchx = torch.tensor([0, torch.pi/2, torch.pi], dtype=torch.float32)
result = torch.sin(x)
print("输入张量 x:", x)
print("sin(x) 结果:", result)
运行结果:
输入张量 x: tensor([0.0000, 1.5708, 3.1416])
sin(x) 结果: tensor([0.0000, 1.0000, 0.0000])
结果分析:
- sin(0)=0sin(0) = 0sin(0)=0,sin(π/2)=1\sin(\pi/2) = 1sin(π/2)=1,sin(π)=0\sin(\pi) = 0sin(π)=0,与数学定义一致。
- 输入需为弧度值(如
torch.pi
表示圆周率 π\piπ)。
(2)torch.cos(input, out=None)
:余弦函数
- 数学定义:计算张量中每个元素的余弦值,outi=cos(inputi)\text{out}_i = \cos(\text{input}_i)outi=cos(inputi)。
- 参数:同
torch.sin
。 - 值域:[−1,1][-1, 1][−1,1]。
代码示例:
x = torch.tensor([0, torch.pi/2, torch.pi], dtype=torch.float32)
result = torch.cos(x)
print("cos(x) 结果:", result)
运行结果:
cos(x) 结果: tensor([ 1.0000, 0.0000, -1.0000])
结果分析:
- cos(0)=1\cos(0) = 1cos(0)=1,cos(π/2)=0\cos(\pi/2) = 0cos(π/2)=0,cos(π)=−1\cos(\pi) = -1cos(π)=−1,符合数学规律。
(3)torch.tan(input, out=None)
:正切函数
- 数学定义:计算张量中每个元素的正切值,outi=tan(inputi)=sin(inputi)/cos(inputi)\text{out}_i = \tan(\text{input}_i) = \sin(\text{input}_i)/\cos(\text{input}_i)outi=tan(inputi)=sin(inputi)/cos(inputi)。
- 参数:同
torch.sin
。 - 注意:当输入为 $ \pi/2 + k\pi$((k) 为整数)时,正切值会趋近于无穷大(
inf
)。
代码示例:
x = torch.tensor([0, torch.pi/4, torch.pi/2 - 0.1], dtype=torch.float32)
result = torch.tan(x)
print("tan(x) 结果:", result)
运行结果:
tan(x) 结果: tensor([0.0000, 1.0000, 9.9666])
结果分析:
- tan(0)=0\tan(0) = 0tan(0)=0,tan(π/4)=1\tan(\pi/4) = 1tan(π/4)=1,tan(π/2−0.1)≈10\tan(\pi/2 - 0.1) \approx 10tan(π/2−0.1)≈10(因 π/2\pi/2π/2 附近正切值陡峭)。
2. 反三角函数
(1)torch.asin(input, out=None)
:反正弦函数
- 数学定义:计算张量中每个元素的反正弦值,outi=arcsin(inputi)\text{out}_i = \arcsin(\text{input}_i)outi=arcsin(inputi)。
- 参数:同
torch.sin
。 - 定义域:[−1,1][-1, 1][−1,1],超出范围会返回
nan
。 - 值域:[−π/2,π/2][-\pi/2, \pi/2][−π/2,π/2](弧度)。
代码示例:
x = torch.tensor([-1.0, 0.0, 1.0], dtype=torch.float32)
result = torch.asin(x)
print("asin(x) 结果:", result)
运行结果:
asin(x) 结果: tensor([-1.5708, 0.0000, 1.5708])
结果分析:
- arcsin(−1)=−π/2\arcsin(-1) = -\pi/2arcsin(−1)=−π/2,arcsin(0)=0\arcsin(0) = 0arcsin(0)=0,arcsin(1)=π/2\arcsin(1) = \pi/2arcsin(1)=π/2,符合数学定义。
(2)torch.acos(input, out=None)
:反余弦函数
- 数学定义:计算张量中每个元素的反余弦值,outi=arccos(inputi)\text{out}_i = \arccos(\text{input}_i)outi=arccos(inputi)。
- 参数:同
torch.sin
。 - 定义域:[-1, 1],超出范围返回
nan
。 - 值域:[0, π\piπ](弧度)。
代码示例:
x = torch.tensor([-1.0, 0.0, 1.0], dtype=torch.float32)
result = torch.acos(x)
print("acos(x) 结果:", result)
运行结果:
acos(x) 结果: tensor([3.1416, 1.5708, 0.0000])
结果分析:
- arccos(−1)=π\arccos(-1) = \piarccos(−1)=π,arccos(0)=π/2\arccos(0) = \pi/2arccos(0)=π/2,arccos(1)=0\arccos(1) = 0arccos(1)=0,与数学规律一致。
3. 双曲三角函数
双曲函数是三角函数的“双曲版本”,常用于物理、工程等领域(如描述悬链线形状)。
(1)torch.sinh(input, out=None)
:双曲正弦函数
- 数学定义:outi=sinh(inputi)=einputi−e−inputi2\text{out}_i = \sinh(\text{input}_i) = \frac{e^{\text{input}_i} - e^{-\text{input}_i}}{2}outi=sinh(inputi)=2einputi−e−inputi。
- 参数:同
torch.sin
。 - 值域:(−∞,+∞)(-\infty, +\infty)(−∞,+∞)。
代码示例:
x = torch.tensor([0.0, 1.0, -1.0], dtype=torch.float32)
result = torch.sinh(x)
print("sinh(x) 结果:", result)
运行结果:
sinh(x) 结果: tensor([ 0.0000, 1.1752, -1.1752])
结果分析:
- sinh(0)=0\sinh(0) = 0sinh(0)=0,sinh(1)≈1.1752\sinh(1) \approx 1.1752sinh(1)≈1.1752,sinh(−1)=−sinh(1)\sinh(-1) = -\sinh(1)sinh(−1)=−sinh(1)(双曲正弦是奇函数)。
(2)torch.cosh(input, out=None)
:双曲余弦函数
- 数学定义:outi=cosh(inputi)=einputi+e−inputi2\text{out}_i = \cosh(\text{input}_i) = \frac{e^{\text{input}_i} + e^{-\text{input}_i}}{2}outi=cosh(inputi)=2einputi+e−inputi。
- 参数:同
torch.sin
。 - 值域:[1, +∞\infty∞]。
代码示例:
x = torch.tensor([0.0, 1.0, -1.0], dtype=torch.float32)
result = torch.cosh(x)
print("cosh(x) 结果:", result)
运行结果:
cosh(x) 结果: tensor([1.0000, 1.5431, 1.5431])
结果分析:
- cosh(0)=1\cosh(0) = 1cosh(0)=1,cosh(1)≈1.5431\cosh(1) \approx 1.5431cosh(1)≈1.5431,cosh(−1)=cosh(1)\cosh(-1) = \cosh(1)cosh(−1)=cosh(1)(双曲余弦是偶函数)。
二、常用特殊函数:abs
、sigmoid
、sign
这些函数在深度学习中高频使用(如 sigmoid
作为激活函数,abs
处理绝对值),需重点掌握。
1. torch.abs(input, out=None)
:绝对值函数
- 数学定义:计算张量中每个元素的绝对值,outi=∣inputi∣\text{out}_i = |\text{input}_i|outi=∣inputi∣。
- 参数:
input
:输入张量(支持整数、浮点数)。out
(可选):输出张量,存储结果。
- 用途:处理负数,确保结果非负。
代码示例:
x = torch.tensor([-1, 2, -3.5], dtype=torch.float32)
result = torch.abs(x)
print("输入张量 x:", x)
print("abs(x) 结果:", result)
运行结果:
输入张量 x: tensor([-1.0000, 2.0000, -3.5000])
abs(x) 结果: tensor([1.0000, 2.0000, 3.5000])
结果分析:
- 所有负数的符号被去除,结果为非负,符合绝对值定义。
2. torch.sigmoid(input, out=None)
:Sigmoid 函数
- 数学定义:outi=11+e−inputi\text{out}_i = \frac{1}{1 + e^{-\text{input}_i}}outi=1+e−inputi1。
- 参数:同
torch.abs
。 - 值域:(0,1)(0, 1)(0,1)。
- 用途:作为激活函数,将输入映射到 ((0, 1)) 区间,常用于二分类任务(如逻辑回归)。
代码示例:
x = torch.tensor([-1.0, 0.0, 1.0], dtype=torch.float32)
result = torch.sigmoid(x)
print("sigmoid(x) 结果:", result)
运行结果:
sigmoid(x) 结果: tensor([0.2689, 0.5000, 0.7311])
结果分析:
- 当输入为负无穷时,输出趋近于 0;输入为 0 时,输出为 0.5;输入为正无穷时,输出趋近于 1。
- 上述示例中,sigmoid(−1)≈0.2689\text{sigmoid}(-1) \approx 0.2689sigmoid(−1)≈0.2689,sigmoid(0)=0.5\text{sigmoid}(0) = 0.5sigmoid(0)=0.5,sigmoid(1)≈0.7311\text{sigmoid}(1) \approx 0.7311sigmoid(1)≈0.7311,符合函数曲线。
3. torch.sign(input, out=None)
:符号函数
- 数学定义:
- $
\text{out}_i =
\begin{cases}
1, & \text{若 } \text{input}_i > 0 \
0, & \text{若 } \text{input}_i = 0 \
-1, & \text{若 } \text{input}_i < 0
\end{cases}
$ - 参数:同
torch.abs
。 - 用途:提取元素的符号信息(正、负、零)。
代码示例:
x = torch.tensor([-1, 0, 3.5], dtype=torch.float32)
result = torch.sign(x)
print("sign(x) 结果:", result)
运行结果:
sign(x) 结果: tensor([-1., 0., 1.])
结果分析:
- 负数返回
-1
,零返回0
,正数返回1
,精准提取符号信息。
三、其他特殊函数速览(图二补充)
除上述重点函数外,图二中还包含一些常用特殊函数,这里快速介绍核心功能:
函数名 | 数学定义/功能 | 典型用途 |
---|---|---|
torch.erf() | 误差函数 erf(x)=2π∫0xe−t2dt\text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dterf(x)=π2∫0xe−t2dt | 统计分布、概率计算 |
torch.neg() | 取反运算 outi=−inputi\text{out}_i = -\text{input}_iouti=−inputi | 符号反转 |
torch.reciprocal() | 倒数运算 outi=1/inputi\text{out}_i = 1/\text{input}_iouti=1/inputi | 数值倒数计算 |
torch.rsqrt() | 平方根的倒数 outi=1/inputi\text{out}_i = 1/\sqrt{\text{input}_i}outi=1/inputi | 优化器中的梯度缩放 |
torch.sign() | 符号函数 | 提取符号信息 |
torch.lerp() | 线性插值 outi=inputi+α(endi−inputi)\text{out}_i = \text{input}_i + \alpha (\text{end}_i - \text{input}_i)outi=inputi+α(endi−inputi) | 动画插值、模型融合 |
torch.cumsum() | 累加和(沿指定维度累加元素) | 前缀和计算、累计统计 |
四、总结:函数分类与应用场景
函数类型 | 核心函数 | 典型应用场景 |
---|---|---|
基础三角函数 | sin 、cos 、tan | 物理仿真、信号处理 |
反三角函数 | asin 、acos | 几何计算、角度恢复 |
双曲三角函数 | sinh 、cosh | 工程建模(如悬链线) |
特殊运算 | abs (绝对值) | 非负处理、误差计算 |
激活函数 | sigmoid | 二分类任务、逻辑回归 |
符号提取 | sign | 符号信息提取、数据清洗 |
- 构建复杂的数学模型(如物理系统、概率分布);
- 设计自定义激活函数(如
sigmoid
变体); - 处理数据中的符号、绝对值等特殊需求。
建议结合具体场景(如神经网络激活函数、数值计算)反复练习,加深理解。