深度解析 tanh tanh 激活函数
1. 引言
在现代深度学习中,激活函数(Activation Function)是神经网络的核心组件之一。它的主要作用是引入非线性,从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数,神经网络的输出将只是输入的线性组合,无法有效地解决复杂问题,例如图像识别、语音处理和自然语言理解。
在众多激活函数中,双曲正切函数(Hyperbolic Tangent Function,简称 (\tanh))是一个经典的选择,特别是在早期的深度学习模型中。它被广泛应用于隐藏层,尤其是在循环神经网络(RNN)中扮演重要角色。
1.1 激活函数的作用
神经网络的每一层通过激活函数来调整输出,从而能够:
- 引入非线性,使网络能够拟合复杂的模式。
- 限制输出范围,帮助网络更稳定地训练。
- 改善梯度传播,促进权重的高效更新。
1.2 为什么关注 tanh \tanh tanh?
( tanh ) (\tanh) (tanh) 函数之所以重要,是因为它在某些场景中具有独特的优势:
- 输出范围在 ( [ − 1 , 1 ] ) ([-1, 1]) ([−1,1]),比 Sigmoid 的 ( [ 0 , 1 ] ) ([0, 1]) ([0,1]) 更适合对称分布的数据。
- 输出是零中心的(Zero-centered),这对于梯度更新更加友好。
- 在时间序列建模、情感分析和回归任务中, ( tanh ) (\tanh) (tanh) 函数表现出色。
1.3 ( tanh ) (\tanh) (tanh) 的应用场景
虽然近年来 ReLU 等激活函数在许多深度学习任务中成为主流, ( tanh ) (\tanh) (tanh) 函数依然在以下场景中被广泛使用:
- 循环神经网络(RNN):用于隐藏层的状态更新,处理时间序列数据。
- LSTM 和 GRU:在这些改进的循环神经网络中, ( tanh ) (\tanh) (tanh) 被用于候选隐藏状态。
- 自然语言处理(NLP):在情感分析和翻译等任务中, ( tanh ) (\tanh) (tanh) 常用于处理对称数据。
2. t a n h tanh tanh 的数学定义与性质
2.1 数学公式与定义
( tanh ) (\tanh) (tanh) 是双曲正切函数(Hyperbolic Tangent Function)的简称,其数学公式定义为:
tanh ( x ) = sinh ( x ) cosh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{\sinh(x)}{\cosh(x)} = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+e−xex−e−x
其中:
- sinh ( x ) \sinh(x) sinh(x)是双曲正弦函数,定义为: s i n h ( x ) = e x − e − x 2 sinh(x) = \frac{e^x - e^{-x}}{2} sinh(x)=2ex−e−x。
- c o s h ( x ) cosh(x) cosh(x) 是双曲余弦函数,定义为: c o s h ( x ) = e x + e − x 2 cosh(x) = \frac{e^x + e^{-x}}{2} cosh(x)=2ex+e−x。
t a n h ( x ) tanh(x) tanh(x) 是一个标准的非线性函数,它可以将输入映射到一个有限范围内,广泛应用于神经网络的隐藏层。
2.2 输出范围与图像特性
-
输出范围:
− 1 ≤ tanh ( x ) ≤ 1 -1 \leq \tanh(x) \leq 1 −1≤tanh(x)≤1- 当 x → + ∞ x \to +\infty x→+∞, tanh ( x ) → 1 \tanh(x) \to 1 tanh(x)→1。
- 当 x → − ∞ x \to -\infty x→−∞, tanh ( x ) → − 1 \tanh(x) \to -1 tanh(x)→−1。
-
函数图像特性:
- tanh ( x ) \tanh(x) tanh(x) 是一个平滑的“S”形曲线,呈对称分布。
- 当 x = 0 x = 0 x=0, tanh ( 0 ) = 0 \tanh(0) = 0 tanh(0)=0。
- tanh ( x ) \tanh(x) tanh(x) 的变化主要集中在 [ − 2 , 2 ] [-2, 2] [−2,2] 范围内,越接近边界,变化越小。
图像特性:
- 中心对称:关于原点对称,满足奇函数的性质。
- 单调递增:随着 x x x 增大, tanh ( x ) \tanh(x) tanh(x) 也增大。
2.3 与 Sigmoid 的关系(对称性)
tanh ( x ) \tanh(x) tanh(x) 与 Sigmoid 激活函数有密切关系,可以通过公式转换为对方:
tanh ( x ) = 2 ⋅ Sigmoid ( 2 x ) − 1 \tanh(x) = 2 \cdot \text{Sigmoid}(2x) - 1 tanh(x)=2⋅Sigmoid(2x)−1
Sigmoid 的公式为:
Sigmoid ( x ) = 1 1 + e − x \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+e−x1
主要区别:
- 输出范围:
- Sigmoid 的输出范围是 [ 0 , 1 ] [0, 1] [0,1],适合处理概率问题。
- tanh ( x ) \tanh(x) tanh(x) 的输出范围是 [ − 1 , 1 ] [-1, 1] [−1,1],更适合对称分布。
- 零中心化:
- Sigmoid 的输出非零中心化,会影响梯度更新效率。
- t a n h ( x ) tanh(x) tanh(x) 是零中心化的,对梯度更新更加友好。
- 速度:
- tanh ( x ) \tanh(x) tanh(x) 在神经网络中通常比 Sigmoid 收敛更快。
2.4 ( tanh ) (\tanh) (tanh) 的导数与梯度计算
( tanh ( x ) ) (\tanh(x)) (tanh(x)) 的导数公式为:
d d x tanh ( x ) = 1 − tanh 2 ( x ) \frac{d}{dx} \tanh(x) = 1 - \tanh^2(x) dxdtanh(x)=1−tanh2(x)
推导过程:
- 根据定义:
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x - 对其求导:
d d x tanh ( x ) = ( e x + e − x ) ⋅ ( e x − e − x ) ′ − ( e x − e − x ) ⋅ ( e x + e − x ) ′ ( e x + e − x ) 2 \frac{d}{dx} \tanh(x) = \frac{(e^x + e^{-x}) \cdot (e^x - e^{-x})' - (e^x - e^{-x}) \cdot (e^x + e^{-x})'}{(e^x + e^{-x})^2} dxdtanh(x)=(ex+e−x)2(ex+e−x)⋅(ex−e−x)′−(ex−e−x)⋅(ex+e−x)′ - 简化后得:
d d x tanh ( x ) = 4 ( e x + e − x ) 2 = 1 − tanh 2 ( x ) \frac{d}{dx} \tanh(x) = \frac{4}{(e^x + e^{-x})^2} = 1 - \tanh^2(x) dxdtanh(x)=(ex+e−x)24=1−tanh2(x)
梯度特性:
- 当 tanh ( x ) \tanh(x) tanh(x) 接近 ± 1 \pm 1 ±1 时, t a n h ′ ( x ) tanh'(x) tanh′(x) 会趋近于 0,可能引发梯度消失问题。
- 当 x x x 在 [ − 1 , 1 ] [-1, 1] [−1,1] 内时,梯度值较大,有助于高效训练。
3. 为什么选择 t a n h tanh tanh
t a n h tanh tanh 函数作为一种经典的激活函数,凭借其独特的特性在深度学习中占有一席之地。它通过平滑的非线性变换和零中心化输出,为神经网络提供了强大的建模能力,尤其是在处理对称数据和时间序列问题时。
3.1 零中心化输出的优势
t a n h tanh tanh 的输出范围为 [ − 1 , 1 ] [-1, 1] [−1,1],并且是零中心化的。这一特性为神经网络的训练带来了多方面的优势:
-
权重更新更高效:
- 零中心化意味着正负输出值的对称性,这让权重的正负变化更加平衡,避免了像 Sigmoid 那样总是向一个方向偏移。
- 梯度更新时不容易产生偏移,从而加快收敛速度。
-
适合对称分布的数据:
- 如果输入数据经过标准化(均值为 0), t a n h tanh tanh 的输出能更好地保持对称性,从而与数据的分布更加匹配。
-
减小梯度爆炸风险:
- 零中心化输出有助于稳定梯度传播,避免因输出值过于偏向正值或负值而导致的梯度爆炸问题。
3.2 非线性特性如何提升神经网络表现
激活函数的非线性是神经网络能够拟合复杂关系的关键, t a n h tanh tanh 的非线性特性在以下方面提升了网络的表现:
-
引入非线性能力:
- 如果没有激活函数,神经网络的每一层只能执行线性运算(矩阵乘法和加法),即便网络很深,最终的输出仍是线性变换,无法解决复杂的非线性问题。
- t a n h tanh tanh 将输入数据通过非线性映射变换为 [ − 1 , 1 ] [-1, 1] [−1,1],使网络能够学习复杂的特征模式。
-
对中间特征的放大与压缩:
- 在 [ − 2 , 2 ] [-2, 2] [−2,2] 的输入范围内, t a n h tanh tanh 对输入值的变化较为敏感,能放大特征差异,从而更好地捕捉细节信息。
- 对于极值输入(非常大或非常小的值), t a n h tanh tanh 将输出压缩到接近 ( − 1 ) (-1) (−1) 或 ( 1 ) (1) (1),起到了正则化的作用,避免过拟合。
-
平滑的梯度变化:
- t a n h tanh tanh 是一个平滑的函数,其导数在大多数区间内都较为稳定。这让网络能够更平稳地调整权重,尤其是在处理非平滑输入时。
3.3 t a n h tanh tanh 的适用场景
t a n h tanh tanh 的特性使其在以下场景中表现尤为突出:
-
循环神经网络(RNN):
- 在时间序列任务中,RNN 使用隐藏状态来捕捉时间上的依赖关系, t a n h tanh tanh 常用于隐藏状态的激活函数。
- LSTM 和 GRU 等变体中, t a n h tanh tanh 用于候选状态的更新,帮助模型捕捉非线性时间依赖。
-
对称分布的回归问题:
- 如果输出目标在 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内, t a n h tanh tanh 是一个很好的激活函数选择。例如,用于归一化后的数据预测。
-
情感分析任务:
- 在 NLP 任务中,情感分布通常具有对称性(如正向情感与负向情感), t a n h tanh tanh 的零中心化输出能很好地反映这一特点。
-
中小规模神经网络:
- 在浅层网络或隐藏层较少的模型中, t a n h tanh tanh提供了足够的非线性能力和梯度稳定性。
-
特定场景下的对比分析:
- 例如,在对比两个输入的相似性时, t a n h tanh tanh 函数的对称性有助于捕捉输入特征的相对关系。
4. t a n h tanh tanh 在深度学习中的应用
双曲正切函数 t a n h tanh tanh因其零中心化的输出和非线性特性,在深度学习中得到了广泛应用。虽然近几年 ReLU 函数占据主导地位,但 t a n h tanh tanh 仍然在一些特定场景和模型中表现突出,尤其是在时间序列建模、循环神经网络(RNN)以及对称性任务中。
4.1 经典应用:循环神经网络(RNN)
在循环神经网络(RNN)中,(\tanh) 是隐藏层的默认激活函数。
RNN 通过隐藏状态捕捉序列数据中的时间依赖性, t a n h tanh tanh 在状态更新中起到关键作用。
隐藏状态更新公式:
h t = tanh ( W ⋅ x t + U ⋅ h t − 1 + b ) h_t = \tanh(W \cdot x_t + U \cdot h_{t-1} + b) ht=tanh(W⋅xt+U⋅ht−1+b)
- t a n h tanh tanh 的作用是对加权求和的结果进行非线性变换,平滑输出,并将其限制在 [ − 1 , 1 ] [-1, 1] [−1,1] 的范围内。
- 零中心化输出使得梯度更新更加平稳,从而在序列数据(如时间序列、语音信号)处理中表现良好。
4.2 在 LSTM 和 GRU 中的作用
LSTM(长短时记忆网络)和 GRU(门控循环单元)是 RNN 的改进版本,它们解决了标准 RNN 的梯度消失问题, t a n h tanh tanh 在这些模型中依然扮演重要角色。
-
LSTM 中的 (\tanh) 应用:
- t a n h tanh tanh 用于计算候选隐藏状态 h ~ t \tilde{h}_t h~t:
h ~ t = tanh ( W h ⋅ x t + U h ⋅ h t − 1 + b h ) \tilde{h}_t = \tanh(W_h \cdot x_t + U_h \cdot h_{t-1} + b_h) h~t=tanh(Wh⋅xt+Uh⋅ht−1+bh) - t a n h tanh tanh 的平滑输出帮助 LSTM 在记忆与遗忘之间进行动态平衡。
- t a n h tanh tanh 用于计算候选隐藏状态 h ~ t \tilde{h}_t h~t:
-
GRU 中的 (\tanh) 应用:
- GRU 的更新公式中,(\tanh) 被用来生成新隐藏状态:
h t = ( 1 − z t ) ⋅ h t − 1 + z t ⋅ tanh ( W ⋅ x t + U ⋅ ( r t ⋅ h t − 1 ) + b ) h_t = (1 - z_t) \cdot h_{t-1} + z_t \cdot \tanh(W \cdot x_t + U \cdot (r_t \cdot h_{t-1}) + b) ht=(1−zt)⋅ht−1+zt⋅tanh(W⋅xt+U⋅(rt⋅ht−1)+b) - t a n h tanh tanh 的非线性能力增强了模型的表达力,使其能够捕捉复杂的时间序列模式。
- GRU 的更新公式中,(\tanh) 被用来生成新隐藏状态:
4.3 自然语言处理(NLP)中的应用
在 NLP 任务中, t a n h tanh tanh 经常用于捕捉语义和情感信息:
-
情感分析:
- 由于情感数据通常具有对称性(正面情感与负面情感), t a n h tanh tanh 的零中心化输出可以很好地表达这种特性。
- 示例:在分类模型中, t a n h tanh tanh 用于隐藏层处理输入特征,例如句子嵌入。
-
句子匹配与相似度计算:
- 例如,在问答系统或文本匹配任务中, t a n h tanh tanh 可用于构造两个句子向量的相似度度量。
-
语言生成任务:
- 在生成任务中, t a n h tanh tanh 能帮助模型平滑输出,避免产生过于离散或不连贯的文本。
4.4 回归与对称性任务
对于某些对称分布的回归任务, t a n h tanh tanh 是隐藏层的良好选择。例如:
-
时间序列预测:
- (\tanh) 的平滑输出特性适合预测连续时间序列值,尤其是归一化后的目标值。
-
信号处理:
- 在音频信号处理或物理系统建模中, t a n h tanh tanh 常用于对对称性数据进行非线性建模。
4.5 其他场景中的应用
-
生成对抗网络(GAN):
- 在生成器或判别器中, t a n h tanh tanh 有时用于平滑输出,限制输出范围。
-
深层自动编码器(Deep Autoencoders):
- t a n h tanh tanh 可以作为隐藏层的激活函数,用于捕捉输入数据的非线性特征。
-
迁移学习与小规模模型:
- 在浅层网络或小规模模型中, t a n h tanh tanh 提供了足够的非线性能力,同时相较于 ReLU 减少了参数爆炸的风险。
5. t a n h tanh tanh 的优缺点
双曲正切函数 t a n h tanh tanh作为一种经典的激活函数,在深度学习的早期阶段得到了广泛应用。它具有独特的零中心化特性和非线性映射能力,但也存在一些局限性。以下将对 t a n h tanh tanh 的优缺点进行详细分析。
5.1 优点
-
零中心化输出
t a n h tanh tanh 的输出范围为 [ − 1 , 1 ] [-1, 1] [−1,1],且零中心化(输出可以为正或负)。- 优势:
- 零中心化可以避免激活值总是偏向某个方向,有利于权重的平衡更新。
- 相较于 Sigmoid(输出范围为 [ 0 , 1 ] [0, 1] [0,1]), t a n h tanh tanh 更适合数据对称分布的场景。
- 优势:
-
非线性特性
- t a n h tanh tanh 引入非线性,使神经网络能够学习和拟合复杂的非线性关系。
- 它在中间区域(接近 [ − 2 , 2 ] [-2, 2] [−2,2])对输入变化敏感,可以更好地捕捉特征差异。
-
输出范围适中
- t a n h tanh tanh 将输入限制在 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内,这在某些需要归一化输出的任务中非常有用,例如 RNN 和回归任务。
-
适合对称性任务
- 在处理对称数据(如情感分析、图像对称特征)时, t a n h tanh tanh 的对称性输出能够更好地表达特征。
-
梯度平滑
- t a n h tanh tanh 是一个平滑函数,其导数为 ( 1 − tanh 2 ( x ) ) (1 - \tanh^2(x)) (1−tanh2(x)),在输入范围内梯度变化较为平稳,适合于小型网络或浅层网络。
5.2 缺点
-
梯度消失问题
- 现象:
- 当输入值 x x x 较大或较小时, t a n h ( x ) tanh(x) tanh(x) 的输出接近 ( − 1 ) (-1) (−1) 或 ( 1 ) (1) (1),这时其导数趋近于 0。
- 梯度传播过程中,权重的更新会变得极其缓慢,尤其是在深层网络中,这一问题更加明显。
- 影响:
- 导致深层网络无法有效训练。
- 梯度消失问题是 t a n h tanh tanh 在深度学习中逐渐被 ReLU 替代的主要原因。
- 现象:
-
计算复杂度较高
- t a n h ( x ) tanh(x) tanh(x) 的计算涉及指数运算 e x e^x ex和 e − x e^{-x} e−x,相比 ReLU(简单的 m a x ( 0 , x ) max(0, x) max(0,x) 运算),计算成本更高,尤其在大型模型中可能成为瓶颈。
-
对极端值的敏感性较低
- 在输入值较大的情况下, t a n h ( x ) tanh(x) tanh(x) 的输出趋于饱和,梯度几乎为 0,这意味着网络对这些极端值的输入几乎失去了学习能力。
-
不适合深层网络
- 在深层神经网络中,由于梯度消失问题, t a n h tanh tanh 会导致模型收敛速度变慢,甚至可能无法训练。因此,在现代深层网络(如 CNN)中很少使用 t a n h tanh tanh。
5.3 总结对比
优点 | 缺点 |
---|---|
输出范围 [ − 1 , 1 ] [-1, 1] [−1,1],零中心化 | 梯度消失问题严重,尤其是深层网络 |
非线性映射能力强 | 计算复杂度高 |
输出平滑且范围适中 | 对极端值输入不敏感,导致学习能力下降 |
适合对称性任务 | 不适合深层网络的训练,效率较低 |
适用场景
尽管存在梯度消失问题, t a n h tanh tanh 在以下场景中仍然是一个不错的选择:
- 浅层网络:
- 网络深度较小、隐藏层较少的情况下, t a n h tanh tanh 的优点能得到充分发挥。
- 对称性任务:
- 在数据分布或任务目标具有对称性时(如情感分析), t a n h tanh tanh 的零中心化输出非常有帮助。
- 时间序列建模:
- t a n h tanh tanh 在 RNN、LSTM 和 GRU 中用于捕捉时间序列中的非线性关系。
- 归一化输出的需求:
- 当任务需要对隐藏层输出进行归一化(范围在 [ − 1 , 1 ] [-1, 1] [−1,1])时, t a n h tanh tanh 是自然的选择。
6. 实践:如何在深度学习框架中使用 t a n h tanh tanh
在深度学习框架中,如 TensorFlow 和 PyTorch, t a n h tanh tanh 是一个内置的激活函数,使用起来非常简单。以下内容将介绍如何在实际应用中使用 t a n h tanh tanh,包括代码示例和常见场景。
6.1 TensorFlow 中使用 t a n h tanh tanh
TensorFlow 提供了 t a n h tanh tanh 激活函数,可以直接在模型定义中调用。
1) 基本用法
import tensorflow as tf# 示例:定义一个简单的全连接层使用 tanh 激活函数
model = tf.keras.Sequential([tf.keras.layers.Dense(64, activation='tanh', input_shape=(100,)),tf.keras.layers.Dense(10, activation='softmax') # 输出层
])# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 模拟数据
import numpy as np
X = np.random.random((1000, 100)) # 输入数据
y = np.random.randint(0, 10, size=(1000,)) # 类别标签# 转换标签为 one-hot 编码
y_one_hot = tf.keras.utils.to_categorical(y, num_classes=10)# 训练模型
model.fit(X, y_one_hot, epochs=10, batch_size=32)
2) 自定义使用 t a n h tanh tanh
你也可以通过 TensorFlow 提供的数学函数直接使用 (\tanh):
# 自定义激活函数
def custom_tanh(x):return tf.math.tanh(x)# 使用自定义 tanh 激活函数
model = tf.keras.Sequential([tf.keras.layers.Dense(64, activation=custom_tanh, input_shape=(100,)),tf.keras.layers.Dense(10, activation='softmax')
])
6.2 PyTorch 中使用 t a n h tanh tanh
在 PyTorch 中, t a n h tanh tanh 是 torch.nn
模块的内置激活函数,使用起来也非常方便。
1) 基本用法
import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的网络
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc1 = nn.Linear(100, 64) # 全连接层self.tanh = nn.Tanh() # tanh 激活函数self.fc2 = nn.Linear(64, 10) # 输出层def forward(self, x):x = self.tanh(self.fc1(x))x = self.fc2(x)return x# 创建模型
model = SimpleModel()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 模拟数据
X = torch.rand(1000, 100) # 输入数据
y = torch.randint(0, 10, (1000,)) # 类别标签# 训练模型
for epoch in range(10):optimizer.zero_grad()outputs = model(X)loss = criterion(outputs, y)loss.backward()optimizer.step()print(f'Epoch [{epoch+1}/10], Loss: {loss.item():.4f}')
2) 自定义使用 t a n h tanh tanh
在 PyTorch 中,也可以直接使用 torch.tanh
函数来自定义逻辑:
# 自定义激活函数
def custom_tanh(x):return torch.tanh(x)# 在网络中使用自定义 tanh
class CustomModel(nn.Module):def __init__(self):super(CustomModel, self).__init__()self.fc1 = nn.Linear(100, 64)self.fc2 = nn.Linear(64, 10)def forward(self, x):x = custom_tanh(self.fc1(x))x = self.fc2(x)return x
6.3 t a n h tanh tanh 在 RNN/LSTM 中的使用
在处理时间序列或自然语言处理任务时, t a n h tanh tanh 是 RNN 和 LSTM 中的重要组成部分。
1) TensorFlow 示例
# 使用 LSTM,内部自动使用 tanh 激活函数
model = tf.keras.Sequential([tf.keras.layers.LSTM(64, activation='tanh', input_shape=(10, 50)),tf.keras.layers.Dense(10, activation='softmax')
])
2) PyTorch 示例
# PyTorch 中的 LSTM 自动使用 tanh
rnn = nn.LSTM(input_size=50, hidden_size=64, num_layers=1, batch_first=True)# 模拟输入数据
X = torch.rand(32, 10, 50) # Batch size = 32, Sequence length = 10, Input size = 50
output, (hn, cn) = rnn(X)
print(output.shape) # 输出维度
6.4 t a n h tanh tanh 在自定义任务中的应用
如果需要手动实现 t a n h tanh tanh 激活函数,可以通过以下方式:
TensorFlow 自定义实现 t a n h tanh tanh
# 实现 tanh 函数
def custom_tanh(x):return (tf.exp(x) - tf.exp(-x)) / (tf.exp(x) + tf.exp(-x))# 使用自定义实现
x = tf.constant([[1.0, -1.0], [0.5, -0.5]])
y = custom_tanh(x)
print(y.numpy())
PyTorch 自定义实现 t a n h tanh tanh
# 实现 tanh 函数
def custom_tanh(x):return (torch.exp(x) - torch.exp(-x)) / (torch.exp(x) + torch.exp(-x))# 使用自定义实现
x = torch.tensor([[1.0, -1.0], [0.5, -0.5]])
y = custom_tanh(x)
print(y)
6.5 实践建议
- 框架内置函数:对于大多数深度学习任务,直接使用 TensorFlow 或 PyTorch 提供的内置 t a n h tanh tanh 激活函数即可,无需手动实现。
- 适用场景:
- RNN、LSTM、GRU 等模型中, t a n h tanh tanh 是默认激活函数。
- 对称性数据或零中心化数据场景,可以考虑使用 t a n h tanh tanh。
- 替代方案:如果训练较深的网络且存在梯度消失问题,可以尝试使用 ReLU 或其变体作为激活函数。
通过这些示例,您可以在实际深度学习任务中轻松地将 t a n h tanh tanh 应用到模型中!
7. 对比分析: t a n h tanh tanh 与其他激活函数
激活函数是深度学习的核心组件,不同的激活函数有各自的优缺点和适用场景。以下从数学特性、优缺点和应用场景等方面对 t a n h tanh tanh 与其他常见激活函数(Sigmoid、ReLU、Leaky ReLU、Swish)进行对比分析。
7.1 t a n h tanh tanh 与 Sigmoid 的对比
特性 | t a n h tanh tanh | Sigmoid |
---|---|---|
数学公式 | t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x | σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1 |
输出范围 | [ − 1 , 1 ] [-1, 1] [−1,1] | [ 0 , 1 ] [0, 1] [0,1] |
零中心化 | 是 | 否 |
梯度消失问题 | 存在 | 更严重 |
计算复杂度 | 高 | 高 |
适用场景 | 对称性数据、隐藏层激活 | 输出概率值(二分类任务) |
总结
- t a n h tanh tanh 在隐藏层中表现优于 Sigmoid,主要因为它是零中心化的,权重更新更加平衡。
- Sigmoid 更适合用在输出层,特别是二分类任务中,可以直接输出概率值。
7.2 t a n h tanh tanh 与 ReLU 的对比
特性 | t a n h tanh tanh | ReLU |
---|---|---|
数学公式 | t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x | f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x) |
输出范围 | [ − 1 , 1 ] [-1, 1] [−1,1] | [ 0 , ∞ ) [0, \infty) [0,∞) |
零中心化 | 是 | 否 |
梯度消失问题 | 存在 | 不存在 |
计算复杂度 | 高 | 低 |
额外问题 | 无 | 可能有“神经元死亡”问题 |
适用场景 | 浅层网络、对称数据 | 深层网络(如 CNN、Transformer) |
总结
- ReLU 的优势:梯度传播稳定,计算简单,是深度神经网络的主流激活函数。
- t a n h tanh tanh 的优势:适合对称性任务,输出零中心化。对于较浅的网络或者对称分布数据,(\tanh) 的表现更好。
7.3 t a n h tanh tanh 与 Leaky ReLU 的对比
特性 | t a n h tanh tanh | Leaky ReLU |
---|---|---|
数学公式 | a n h ( x ) = e x − e − x e x + e − x anh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} anh(x)=ex+e−xex−e−x | ( f ( x ) = max ( 0 , x ) + α ⋅ min ( 0 , x ) (f(x) = \max(0, x) + \alpha \cdot \min(0, x) (f(x)=max(0,x)+α⋅min(0,x) |
输出范围 | [ − 1 , 1 ] [-1, 1] [−1,1] | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) |
零中心化 | 是 | 否 |
梯度消失问题 | 存在 | 不存在 |
神经元死亡问题 | 无 | 无(通过负斜率 (\alpha) 解决) |
计算复杂度 | 高 | 低 |
适用场景 | 对称性任务 | 深层网络,尤其是梯度稀疏或负值较多的场景 |
总结
- Leaky ReLU 解决了标准 ReLU 的“神经元死亡”问题,更适合深层网络。
- t a n h tanh tanh 适合对称性数据,但在深层网络中性能可能不如 Leaky ReLU。
7.4 t a n h tanh tanh 与 Swish 的对比
特性 | t a n h tanh tanh | Swish |
---|---|---|
数学公式 | t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x | f ( x ) = x ⋅ σ ( x ) f(x) = x \cdot \sigma(x) f(x)=x⋅σ(x) |
输出范围 | [ − 1 , 1 ] [-1, 1] [−1,1] | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) |
零中心化 | 是 | 否 |
梯度消失问题 | 存在 | 极少 |
计算复杂度 | 高 | 较高(包含 Sigmoid 运算) |
适用场景 | 对称性任务 | 深层网络,尤其是需要更强非线性能力的场景 |
总结
- Swish 是近年来提出的新型激活函数,在深层网络中表现更佳,尤其是在 Transformer 等复杂模型中。
- 相较于 Swish, t a n h tanh tanh 的应用更经典,但在现代深层网络中逐渐被替代。
7.5 总结对比表
激活函数 | 输出范围 | 零中心化 | 梯度消失问题 | 计算复杂度 | 适用场景 |
---|---|---|---|---|---|
t a n h tanh tanh | [ − 1 , 1 ] [-1, 1] [−1,1] | 是 | 存在 | 高 | 对称性任务、浅层网络 |
Sigmoid | [ 0 , 1 ] [0, 1] [0,1] | 否 | 更严重 | 高 | 二分类问题的输出层 |
ReLU | [ 0 , ∞ ) [0, \infty) [0,∞) | 否 | 无 | 低 | 深层网络(如 CNN) |
Leaky ReLU | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) | 否 | 无 | 低 | 深层网络,负值较多的场景 |
Swish | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) | 否 | 极少 | 较高 | 深层网络(如 Transformer) |
7.6 选择建议
-
使用 t a n h tanh tanh 的场景:
- 数据分布对称,输出需要在 [ − 1 , 1 ] [-1, 1] [−1,1] 范围内。
- 小型或浅层神经网络,例如 RNN 的隐藏层。
- 需要零中心化输出的场景。
-
替代方案:
- 如果存在梯度消失问题或计算资源有限,推荐使用 ReLU 或其变体(如 Leaky ReLU)。
- 在深层网络中,Swish 或 GELU(Gaussian Error Linear Unit)可能更适合。
通过对比分析可以看出, t a n h tanh tanh 仍然适合特定场景,但在现代深层网络中逐渐被 ReLU 和 Swish 替代。选择合适的激活函数,需要根据任务特点和模型复杂度综合考虑。
8. 实际场景: t a n h tanh tanh 在应用中的案例
尽管近年来 ReLU 和其变体成为主流激活函数, t a n h tanh tanh 函数仍在某些实际应用中扮演重要角色。以下列举几个典型场景,说明 t a n h tanh tanh 的独特优势和应用方式。
8.1 时间序列预测
场景描述:
时间序列数据(如天气、股票价格、传感器数据)通常具有非线性关系和长时间依赖性。由于 t a n h tanh tanh 的平滑性和零中心化输出特性,它在 RNN 和 LSTM 中是处理时间序列的核心激活函数。
应用案例:
预测未来几天的天气温度变化。
实现示例(使用 LSTM):
import tensorflow as tf
import numpy as np# 模拟时间序列数据
X = np.random.random((100, 10, 1)) # 100 条样本,每条样本有 10 个时间步,每步一个特征
y = np.random.random((100, 1)) # 对应的目标值# 定义模型
model = tf.keras.Sequential([tf.keras.layers.LSTM(64, activation='tanh', input_shape=(10, 1)),tf.keras.layers.Dense(1) # 输出预测值
])# 编译模型
model.compile(optimizer='adam', loss='mse')# 训练模型
model.fit(X, y, epochs=10, batch_size=16)
t a n h tanh tanh 的作用:
- 平滑激活输出,限制范围在 [ − 1 , 1 ] [-1, 1] [−1,1],避免数值不稳定。
- 零中心化输出有助于捕捉时间序列中的正负变化趋势。
8.2 自然语言处理(NLP)
场景描述:
在 NLP 任务(如情感分析、翻译、文本生成)中,(\tanh) 是许多经典模型(如 RNN、GRU、LSTM)的核心组件,用于捕捉上下文关系和语义特征。
应用案例:
进行情感分析,预测用户评论是正面还是负面。
实现示例(使用 RNN):
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, SimpleRNN, Dense# 模拟数据
vocab_size = 5000 # 词汇表大小
max_len = 100 # 最大序列长度
X = np.random.randint(1, vocab_size, size=(2000, max_len)) # 输入序列
y = np.random.randint(0, 2, size=(2000,)) # 二分类标签# 定义模型
model = Sequential([Embedding(input_dim=vocab_size, output_dim=64, input_length=max_len),SimpleRNN(128, activation='tanh'),Dense(1, activation='sigmoid') # 输出正负情感概率
])# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 训练模型
model.fit(X, y, epochs=5, batch_size=32)
t a n h tanh tanh 的作用:
- 捕捉文本序列中的上下文依赖关系。
- 平滑处理语义特征,特别适合情感分析等对称性任务。
8.3 图像对比度增强
场景描述:
在图像处理任务中, t a n h tanh tanh 常用于归一化和对比度调整。其输出范围( [ − 1 , 1 ] [-1, 1] [−1,1])有助于限制像素值,增强图像细节。
应用案例:
增强医学图像的对比度,以便医生更清晰地观察病灶。
实现示例(归一化图像像素值):
import numpy as np# 模拟灰度图像
image = np.random.random((256, 256)) * 255 # 灰度范围 [0, 255]# 使用 tanh 归一化
def normalize_image(image):normalized = np.tanh(image / 255.0 - 0.5) # 归一化到 [-1, 1]return normalizednormalized_image = normalize_image(image)
t a n h tanh tanh 的作用:
- 将像素值映射到 [ − 1 , 1 ] [-1, 1] [−1,1],便于进一步处理。
- 平滑调整对比度,避免过度增强。
8.4 对称性任务
场景描述:
在需要处理对称分布数据的任务中(如物理模拟、情感分类), t a n h tanh tanh 的零中心化输出特性可以很好地反映数据的对称性。
应用案例:
模拟物理系统中正负力的相互作用。
实现示例:
import torch
import torch.nn as nn# 模拟输入
x = torch.tensor([[1.0, -1.0], [0.5, -0.5]])# 使用 tanh 激活函数
tanh = nn.Tanh()
output = tanh(x)
print(output)
t a n h tanh tanh 的作用:
- 捕捉正负值之间的对称关系。
- 输出范围适中,避免数值爆炸。
8.5 自动编码器(Autoencoder)
场景描述:
在自动编码器中, t a n h tanh tanh 常用于隐藏层激活函数,帮助捕捉输入数据的非线性结构。
应用案例:
对高维图像数据进行降维压缩。
实现示例(简单自动编码器):
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense# 输入数据
input_dim = 784 # 假设输入是 28x28 的图像
input_layer = Input(shape=(input_dim,))# 编码器
encoded = Dense(128, activation='tanh')(input_layer)
encoded = Dense(64, activation='tanh')(encoded)# 解码器
decoded = Dense(128, activation='tanh')(encoded)
output_layer = Dense(input_dim, activation='sigmoid')(decoded)# 定义模型
autoencoder = Model(input_layer, output_layer)# 编译模型
autoencoder.compile(optimizer='adam', loss='mse')# 模拟数据
X = np.random.random((1000, 784)) # 输入图像数据
autoencoder.fit(X, X, epochs=10, batch_size=32)
t a n h tanh tanh 的作用:
- 限制隐藏层的输出范围,避免解码器产生不合理的值。
- 平滑降维过程,提高模型对输入数据的重构能力。
9. 结论
双曲正切函数 t a n h tanh tanh作为一种经典的激活函数,在深度学习的早期阶段发挥了重要作用。尽管随着深度网络的发展, t a n h tanh tanh 在某些场景中逐渐被 ReLU 和其他变体所取代,但它的独特特性使得它在特定任务中依然表现出色。
核心特性回顾
- 零中心化输出: t a n h tanh tanh 的输出范围为 [ − 1 , 1 ] [-1, 1] [−1,1],并且是零中心化的。这使得权重更新更加平衡,适合对称性数据和时间序列任务。
- 非线性映射能力: t a n h tanh tanh 能够引入非线性特性,使神经网络能够学习复杂的数据模式和关系。
- 平滑的梯度变化:在中间输入范围内 [ − 2 , 2 ] [-2, 2] [−2,2], t a n h tanh tanh 的梯度较大且稳定,有助于提高训练效率。
适用场景
- 时间序列建模:如天气预测、股票价格分析等场景, t a n h tanh tanh 在 RNN 和 LSTM 中表现优异。
- 自然语言处理:适用于情感分析、翻译等需要捕捉上下文关系的任务。
- 对称性任务:例如物理模拟、情感分类等,对称分布的数据特别适合使用 t a n h tanh tanh。
- 图像处理:用于像素归一化、对比度增强等图像预处理任务。
- 浅层网络:在隐藏层较少的网络中, t a n h tanh tanh 的非线性能力能够充分发挥。
优缺点总结
-
优点:
- 零中心化输出,适合对称数据。
- 输出范围限制,避免过大值影响训练稳定性。
- 平滑性强,适合连续性数据的特征学习。
-
缺点:
- 梯度消失问题:对于深层网络,极值输入导致梯度趋于 0,从而影响模型的训练效率。
- 计算复杂度较高:相比 ReLU, t a n h tanh tanh 涉及指数计算,速度略慢。
- 不适合非常深的网络,现代深度学习任务中逐渐被其他激活函数取代。
与其他激活函数的对比
t a n h tanh tanh 在浅层网络和特定任务中具有明显的优势,但在深层网络中,由于梯度消失问题,ReLU、Leaky ReLU 和 Swish 等激活函数表现更好。选择激活函数时,应根据任务特点、数据分布和模型深度综合考虑。
10. 附录
以下是本文相关内容的数学推导、代码示例和其他补充资料,为读者提供进一步学习和实践的基础。
10.1 数学推导
1) t a n h ( x ) tanh(x) tanh(x) 的公式推导
t a n h ( x ) tanh(x) tanh(x) 是双曲正切函数,其定义为:
tanh ( x ) = sinh ( x ) cosh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{\sinh(x)}{\cosh(x)} = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+e−xex−e−x
其中:
- s i n h ( x ) sinh(x) sinh(x)(双曲正弦函数): s i n h ( x ) = e x − e − x 2 sinh(x) = \frac{e^x - e^{-x}}{2} sinh(x)=2ex−e−x
- c o s h ( x ) cosh(x) cosh(x)(双曲余弦函数): c o s h ( x ) = e x + e − x 2 cosh(x) = \frac{e^x + e^{-x}}{2} cosh(x)=2ex+e−x
通过化简可得:
tanh ( x ) = e x − e − x 2 e x + e − x 2 = e x − e − x e x + e − x \tanh(x) = \frac{\frac{e^x - e^{-x}}{2}}{\frac{e^x + e^{-x}}{2}} = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=2ex+e−x2ex−e−x=ex+e−xex−e−x
2) t a n h ( x ) tanh(x) tanh(x) 的导数推导
t a n h ( x ) tanh(x) tanh(x) 的导数为:
d d x tanh ( x ) = 1 − tanh 2 ( x ) \frac{d}{dx} \tanh(x) = 1 - \tanh^2(x) dxdtanh(x)=1−tanh2(x)
推导过程:
- 根据定义:
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x - 对其求导:
d d x tanh ( x ) = ( e x + e − x ) ⋅ ( e x − e − x ) ′ − ( e x − e − x ) ⋅ ( e x + e − x ) ′ ( e x + e − x ) 2 \frac{d}{dx} \tanh(x) = \frac{(e^x + e^{-x}) \cdot (e^x - e^{-x})' - (e^x - e^{-x}) \cdot (e^x + e^{-x})'}{(e^x + e^{-x})^2} dxdtanh(x)=(ex+e−x)2(ex+e−x)⋅(ex−e−x)′−(ex−e−x)⋅(ex+e−x)′ - 化简后得:
d d x tanh ( x ) = 4 ( e x + e − x ) 2 = 1 − tanh 2 ( x ) \frac{d}{dx} \tanh(x) = \frac{4}{(e^x + e^{-x})^2} = 1 - \tanh^2(x) dxdtanh(x)=(ex+e−x)24=1−tanh2(x)
10.2 实现代码示例
1) 自定义 t a n h tanh tanh 激活函数
在深度学习框架中, t a n h tanh tanh 通常由框架提供,但也可以手动实现。
- TensorFlow 实现:
import tensorflow as tfdef custom_tanh(x):return (tf.exp(x) - tf.exp(-x)) / (tf.exp(x) + tf.exp(-x))x = tf.constant([1.0, -1.0, 0.5, -0.5])
y = custom_tanh(x)
print("Custom tanh output:", y.numpy())
- PyTorch 实现:
import torchdef custom_tanh(x):return (torch.exp(x) - torch.exp(-x)) / (torch.exp(x) + torch.exp(-x))x = torch.tensor([1.0, -1.0, 0.5, -0.5])
y = custom_tanh(x)
print("Custom tanh output:", y)
2) 自动编码器中的 (\tanh)
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense# 定义输入层
input_dim = 784 # 假设输入是 28x28 的图像
input_layer = Input(shape=(input_dim,))# 编码器部分
encoded = Dense(128, activation='tanh')(input_layer)
encoded = Dense(64, activation='tanh')(encoded)# 解码器部分
decoded = Dense(128, activation='tanh')(encoded)
output_layer = Dense(input_dim, activation='sigmoid')(decoded)# 自动编码器模型
autoencoder = Model(input_layer, output_layer)# 编译并训练
autoencoder.compile(optimizer='adam', loss='mse')
10.3 t a n h tanh tanh 的常见问题与解决方法
-
梯度消失问题:
- 现象:输入值较大时, t a n h ( x ) tanh(x) tanh(x) 的导数接近 0,导致梯度传播时更新缓慢。
- 解决方案:
- 使用 ReLU 或其变体(Leaky ReLU、Swish)替代。
- 对输入数据进行标准化,限制输入范围。
-
计算复杂度:
- 现象: t a n h tanh tanh 的计算涉及指数运算,相比 ReLU 等激活函数速度较慢。
- 解决方案:对于大型网络,优先选择计算简单的激活函数(如 ReLU)。
10.4 t a n h tanh tanh 在现代深度学习中的角色
尽管 t a n h tanh tanh 在现代深层网络中逐渐被其他激活函数替代,但它在以下场景中仍有不可替代的作用:
- 时间序列建模:如 LSTM、GRU 等。
- 对称性任务:如情感分析、物理模拟。
- 图像归一化:处理像素值范围的归一化问题。
10.5 常用激活函数对比总结表
激活函数 | 数学公式 | 输出范围 | 零中心化 | 优点 | 缺点 | 典型应用 |
---|---|---|---|---|---|---|
t a n h tanh tanh | e x − e − x e x + e − x \frac{e^x - e^{-x}}{e^x + e^{-x}} ex+e−xex−e−x | [ − 1 , 1 ] [-1, 1] [−1,1] | 是 | 零中心化,适合对称数据 | 梯度消失,计算复杂 | RNN、对称任务 |
Sigmoid | 1 1 + e − x \frac{1}{1 + e^{-x}} 1+e−x1 | [ 0 , 1 ] [0, 1] [0,1] | 否 | 简单直观,用于输出概率 | 梯度消失,非零中心 | 二分类输出 |
ReLU | m a x ( 0 , x ) max(0, x) max(0,x) | [ 0 , ∞ ) [0, \infty) [0,∞) | 否 | 计算简单,解决梯度消失问题 | 可能导致神经元死亡 | 深层网络(CNN、Transformer) |
Leaky ReLU | x x x(正值)或 α x \alpha x αx(负值) | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) | 否 | 解决神经元死亡问题 | 零中心化问题仍存在 | 深层网络 |
Swish | x ⋅ σ ( x ) x \cdot \sigma(x) x⋅σ(x) | ( − ∞ , ∞ ) (-\infty, \infty) (−∞,∞) | 否 | 强大的非线性能力,梯度稳定 | 计算复杂 | 深层网络(如 Transformer) |
参考文献与资源
- 深度学习激活函数教程:https://www.deeplearningbook.org/
- TensorFlow 官方文档:https://www.tensorflow.org/
- PyTorch 官方文档:https://pytorch.org/
- 激活函数对比与发展:https://arxiv.org/abs/1710.05941
相关文章:
深度解析 tanh tanh 激活函数
1. 引言 在现代深度学习中,激活函数(Activation Function)是神经网络的核心组件之一。它的主要作用是引入非线性,从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数,神经网络的输出将只是输入的线性组…...
【Golang 面试题】每日 3 题(二十五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
Unity Canvas中显示粒子特效
首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…...
excel精简使用工具
1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据,并且每一行都引用不同的列。为了实现这个目标,你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式,你可以使用以下公…...
上手体验微软全新整合的王炸平台Fabric
体验确实不错,微软强大的生态能力。 把可视化,数仓,数据胡,数据工厂,机器学习,数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心,消除数据孤岛问题。而且不同角色可…...
Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)
导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …...
RabbitMQ 可观测性最佳实践
RabbitMQ 简介 RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写,支持多种客户端。它通过使用交换机(Exchanges)、队列(Queues)和绑定(Bindings)来路由消息ÿ…...
束搜索、组束搜索介绍、异同及相关参数
束搜索(Beam Search)与组束搜索(Group Beam Search)介绍 束搜索(Beam Search) 束搜索是一种用于序列生成任务的解码算法,广泛应用于自然语言处理领域,如机器翻译、语音识别等。它的…...
深度学习与计算机视觉 (博士)
文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结:不同…...
新时期下k8s 网络插件calico 安装
1、k8s master节点初始化完毕以后一直处于notreadey状态,一直怀疑是安装有问题或者是初始化有问题(当然,如果真有问题要先解决这些问题),经过不断探索才发现是网络插件没有安装导致的,根据建议安装calico插…...
14:00面试,15:00就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV:ImageNet pre-trained model NLP:pre-trained model? 在计算机视觉中任务包含分类、检测、分割,任务类别数少,对应…...
Docker: 现代开发的利器,从入门到实践
引言 在现代软件开发中,开发人员面对的环境多种多样,不同操作系统、依赖、库版本等都会影响应用程序的正常运行。传统的开发和部署流程复杂且易错,"在我机器上可以跑"的困扰让许多开发者头疼。而 Docker,一个容器化技术…...
nuxt3 env环境变量
加载env文件 在package.json中指定运行某个env文件:nuxt build --dotenv .env.production 具体如下: "scripts": {"build-dev": "nuxt build --dotenv .env.test","build-prd": "nuxt build --dotenv .e…...
Vue3 自定义插件(plugin)
文章目录 Vue3 自定义插件(plugin)概述用法 Vue3 自定义插件(plugin) 概述 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 用法 Vue3 插件有2种定义方式: 对象形式。对象中有install方法。函数形式。函数本身就是安装方法,其中ÿ…...
HTB:Bank[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…...
Elastic-Job相关
文档参考视频:09_SpringBoot案例演示_哔哩哔哩_bilibili 一、Elastic-Job介绍 Elastic-Job 是一个轻量级、分布式的任务调度框架,旨在解决分布式环境下的定时任务调度问题。 1.1. Elastic-Job 的核心组件 Elastic-Job 是由多个核心组件构成的&#x…...
Ruby语言的正则表达式
Ruby语言的正则表达式详解 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中,正则表达式的使用非常灵活,并且具有良好的可读…...
“深入浅出”系列之QT:(5)Json数据格式处理详解
一、JSON数据结构 JSON主要有两种数据结构:JSON对象和JSON数组。 JSON对象:由键值对组成,每个键(key)是字符串,值(value)可以是字符串、数字、布尔值、null、JSON数组或JSON对象。对…...
cursor试用出现:Too many free trial accounts used on this machine 的解决方法
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Calico BGP网络问题
Calico BGP网络问题 文章目录 Calico BGP网络问题排除步骤calico-node 正常运行,但在 describe 中有警告信息错误现象 ip route 路由表中删除 blackhole后又会自动生成网卡选择无效导致 calico 的 pod 内容器未就绪问题现象原因分析问题解决方式一:直接修…...
Jenkins-部署-windows
Jenkins-部署-windows 一: Jenkins 资料 一: Jenkins 资料...
benchANT 性能榜单技术解读 Part 1:写入吞吐
近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...
【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷
一.填空题(每空2分,共30分) 1.算法的时间复杂性指算法中 元运算 的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中, O 提供了算法运行时间的一个上界。 3.设Dn…...
【25考研】川大计算机复试情况,重点是啥?怎么准备?
24年进入复试的同学中,有10位同学的复试成绩为0分。具体是个人原因还是校方原因,还尚不明确。但是C哥提醒,一定要认真复习!复试完后不要跟任何人讨论有关复试的题目及细节! 一、复试内容 四川大学复试内容较多…...
设计模式-结构型-适配器模式
在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…...
el-table表格合并某一列
需求:按照下图完成单元格合并,数据展示 可以看到科室列是需要合并的 并加背景色展示;具体代码如下: <el-tableref"tableA":data"tableDataList":header-cell-style"{ backgroundColor: #f2dcdb, col…...
分布式Id方案选择
分布式 ID 方案选择 在当今分布式系统日益盛行的背景下,分布式 ID 生成方案的选择成为了众多开发者关注的焦点。一个优秀的分布式 ID 方案,不仅能够确保生成的 ID 全局唯一,避免数据冲突,还能在高并发、大规模的分布式环境中保持…...
uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥
从下方的偏旁部首中选在1--3个组成上面文章中的文字,完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…...
【xLua】xLua-master签名、加密Lua文件
GitHub - Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. 如果你想在项目工程上操作,又发现项目工程并没导入Tools,可以从xLua-master工程拷贝到项目工程Assets…...
Yolo11改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer|即插即用
摘要 一、论文介绍 高光谱图像超分辨率的重要性:高光谱成像技术通过密集采样光谱特征,为材料区分提供丰富的光谱和空间结构信息,广泛应用于各领域。高光谱图像超分辨率(HSI-SR)旨在从低分辨率HSI生成高分辨率HSI。传统方法的局限性:传统方法依赖手工制作的先验,如低秩近…...
第二十八周学习周报
目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…...
太速科技-418-基于AD9361 +ZYNQ7020 的软件无线电 SDR 套件
基于AD9361 ZYNQ7020 的软件无线电 SDR 套件 一、板卡信息 ● ZYNQ芯片采用XC7Z020,逻辑容量更大,支持更大的逻辑设计; ● 内存采用两片512M DDR3,共1GByte,更大容量。 ● 支持千兆网口,支持ZEDFMCO…...
STM32裸机开发转FreeRTOS教程
目录 1. 简介2. RTOS设置(1)分配内存(2)查看任务剩余空间(3)使用osDelay 3. 队列的使用(1)创建队列(1)直接传值和指针传值(2)发送/接收…...
swagger导出json
要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...
大纲笔记幕布的替换
文章目录 前言类似的大纲软件探索 DynalistLogseq通过国内代码仓库建立 Git 仓库Logseq 的使用PC 端安卓端Git 操作Termux git 步骤Termux 的桌面组件:Termux widget 报错参考 前言 之前我一直用幕布,买了三年,奈何要过期了,又三…...
【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据
原理就是通过随机生成函数和平均值函数。 适用场景:在总体打分后,需要在小项中随机生成小分数 第一列:固定的平均值A2第二列: RANDBETWEEN(A2-10,A210)第三列:根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…...
单元测试MockitoExtension和SpringExtension
1. MockitoExtension MockitoExtension 是 JUnit 5 提供的一个扩展,用于支持 Mockito 的集成。它可以自动初始化标记为 Mock、InjectMocks 等的 Mockito 对象,而不需要显式调用 MockitoAnnotations.initMocks(this)。 主要特点: 自动初始化 Mock、Spy…...
springboot+vue使用easyExcel实现导出功能
vue部分 // 导出计算数据exportDataHandle(id) {this.$http({url: this.$http.adornUrl(/xxx/xxx/exportCalDataExcel),method: post,data: this.$http.adornData({id: id}),responseType: blob, // 重要:告诉axios我们希望接收二进制数据}).then(({data}) > {c…...
优化提示词改善答疑机器人回答质量
1.通过优化提示词来调整大模型的回答 1.1使用场景 默认提示词无法满足业务要求。 回答的内容太简单/困难,输出内容/格式/语气达不到要求等 1.2llama-index 的提示词模版 1.2.1llama-index 的默认模板 from llama_index.llms.dashscope import DashScope from lla…...
Spring AMQP-保证消费者消息的可靠性
为什么要保证消息的可靠性? 当MQ向消费者发送一个消息之后需要得到消费者的状态,因为消息并不一定就真的被消费者给消费了,可能在消费的过程中出现了一些意外,比如 1. 网络问题 2. 消息转换有问题 3. 消费者本身的业务处理有问题 …...
32单片机从入门到精通之数据处理——数学运算(十三)
无论你身在何处,无论你面对什么困难,只要对自己充满信心,坚持不懈地努力,相信自己的能力,你就能战胜任何困难,实现自己的目标。不要害怕失败,因为失败并不意味着你没有能力成功,只是…...
latex_学习
参考: https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_3)https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_2)https://www.overleaf.com/learn/latex/Free_online_introduction_to_LaTeX_(part_1) …...
小程序textarea组件键盘弹起会遮挡住输入框
<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡: 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…...
vue之element-ui文件上传(二)
一、点击上传,使用默认的action上传,添加校验,上传成功后,去除校验: <el-form-item label"文件md5" prop"fileMd5"><el-uploadv-if"!form.fileMd5"v-model"form.fileMd5&…...
DC/AC并网逆变器模型与仿真MATLAB
DC/AC并网逆变器是一种将直流电(DC)转化为交流电(AC),并将其与电网并联的设备。它的核心功能是实现直流电源(如光伏电池板或储能电池)与电网的有效连接,同时保证输出电能质量满足电网…...
python面向对象
面向对象简介 python完全采用了面向对象的思想,是真正面向对象的变成语言,完全支持面向对象的基本功能,例如:继承、多态、封装等 python中,一切皆为对象。前面学习的数据类型、函数等都是对象 面向过程和面向对象思…...
【UI自动化测试】selenium八种定位方式
🏡个人主页:謬熙,欢迎各位大佬到访❤️❤️❤️~ 👲个人简介:本人编程小白,正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话,记得点赞👍、收藏⭐️、评论💬&am…...
基于物联网疫苗冷链物流监测系统设计
1. 项目开发背景 随着全球对疫苗运输要求的提高,特别是针对温度敏感型药品(如疫苗)的冷链管理,如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中,任何温度或湿度的…...
实训云上搭建集群
文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…...