深度解析 tanh ⁡ tanh 激活函数

1. 引言

在现代深度学习中,激活函数(Activation Function)是神经网络的核心组件之一。它的主要作用是引入非线性,从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数,神经网络的输出将只是输入的线性组合,无法有效地解决复杂问题,例如图像识别、语音处理和自然语言理解。

在众多激活函数中,双曲正切函数(Hyperbolic Tangent Function,简称 (\tanh))是一个经典的选择,特别是在早期的深度学习模型中。它被广泛应用于隐藏层,尤其是在循环神经网络(RNN)中扮演重要角色。

1.1 激活函数的作用

神经网络的每一层通过激活函数来调整输出,从而能够:

  1. 引入非线性,使网络能够拟合复杂的模式。
  2. 限制输出范围,帮助网络更稳定地训练。
  3. 改善梯度传播,促进权重的高效更新。
1.2 为什么关注 tanh ⁡ \tanh tanh

( tanh ⁡ ) (\tanh) (tanh) 函数之所以重要,是因为它在某些场景中具有独特的优势:

  1. 输出范围在 ( [ − 1 , 1 ] ) ([-1, 1]) ([1,1]),比 Sigmoid 的 ( [ 0 , 1 ] ) ([0, 1]) ([0,1]) 更适合对称分布的数据。
  2. 输出是零中心的(Zero-centered),这对于梯度更新更加友好。
  3. 在时间序列建模、情感分析和回归任务中, ( 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+exexex

其中:

  • 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)=2exex
  • 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+ex

t a n h ( x ) tanh(x) tanh(x) 是一个标准的非线性函数,它可以将输入映射到一个有限范围内,广泛应用于神经网络的隐藏层。

2.2 输出范围与图像特性
  1. 输出范围
    − 1 ≤ tanh ⁡ ( x ) ≤ 1 -1 \leq \tanh(x) \leq 1 1tanh(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
  2. 函数图像特性

    • 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)=2Sigmoid(2x)1

Sigmoid 的公式为:
Sigmoid ( x ) = 1 1 + e − x \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+ex1

主要区别

  • 输出范围
    • 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)=1tanh2(x)

推导过程

  1. 根据定义:
    tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
  2. 对其求导:
    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+ex)2(ex+ex)(exex)(exex)(ex+ex)
  3. 简化后得:
    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+ex)24=1tanh2(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],并且是零中心化的。这一特性为神经网络的训练带来了多方面的优势:

  1. 权重更新更高效

    • 零中心化意味着正负输出值的对称性,这让权重的正负变化更加平衡,避免了像 Sigmoid 那样总是向一个方向偏移。
    • 梯度更新时不容易产生偏移,从而加快收敛速度。
  2. 适合对称分布的数据

    • 如果输入数据经过标准化(均值为 0), t a n h tanh tanh 的输出能更好地保持对称性,从而与数据的分布更加匹配。
  3. 减小梯度爆炸风险

    • 零中心化输出有助于稳定梯度传播,避免因输出值过于偏向正值或负值而导致的梯度爆炸问题。
3.2 非线性特性如何提升神经网络表现

激活函数的非线性是神经网络能够拟合复杂关系的关键, t a n h tanh tanh 的非线性特性在以下方面提升了网络的表现:

  1. 引入非线性能力

    • 如果没有激活函数,神经网络的每一层只能执行线性运算(矩阵乘法和加法),即便网络很深,最终的输出仍是线性变换,无法解决复杂的非线性问题。
    • t a n h tanh tanh 将输入数据通过非线性映射变换为 [ − 1 , 1 ] [-1, 1] [1,1],使网络能够学习复杂的特征模式。
  2. 对中间特征的放大与压缩

    • [ − 2 , 2 ] [-2, 2] [2,2] 的输入范围内, t a n h tanh tanh 对输入值的变化较为敏感,能放大特征差异,从而更好地捕捉细节信息。
    • 对于极值输入(非常大或非常小的值), t a n h tanh tanh 将输出压缩到接近 ( − 1 ) (-1) (1) ( 1 ) (1) (1),起到了正则化的作用,避免过拟合。
  3. 平滑的梯度变化

    • t a n h tanh tanh 是一个平滑的函数,其导数在大多数区间内都较为稳定。这让网络能够更平稳地调整权重,尤其是在处理非平滑输入时。
3.3 t a n h tanh tanh 的适用场景

t a n h tanh tanh 的特性使其在以下场景中表现尤为突出:

  1. 循环神经网络(RNN)

    • 在时间序列任务中,RNN 使用隐藏状态来捕捉时间上的依赖关系, t a n h tanh tanh 常用于隐藏状态的激活函数。
    • LSTM 和 GRU 等变体中, t a n h tanh tanh 用于候选状态的更新,帮助模型捕捉非线性时间依赖。
  2. 对称分布的回归问题

    • 如果输出目标在 [ − 1 , 1 ] [-1, 1] [1,1] 范围内, t a n h tanh tanh 是一个很好的激活函数选择。例如,用于归一化后的数据预测。
  3. 情感分析任务

    • 在 NLP 任务中,情感分布通常具有对称性(如正向情感与负向情感), t a n h tanh tanh 的零中心化输出能很好地反映这一特点。
  4. 中小规模神经网络

    • 在浅层网络或隐藏层较少的模型中, t a n h tanh tanh提供了足够的非线性能力和梯度稳定性。
  5. 特定场景下的对比分析

    • 例如,在对比两个输入的相似性时, 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(Wxt+Uht1+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 在这些模型中依然扮演重要角色。

  1. 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(Whxt+Uhht1+bh)
    • t a n h tanh tanh 的平滑输出帮助 LSTM 在记忆与遗忘之间进行动态平衡。
  2. 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=(1zt)ht1+zttanh(Wxt+U(rtht1)+b)
    • t a n h tanh tanh 的非线性能力增强了模型的表达力,使其能够捕捉复杂的时间序列模式。
4.3 自然语言处理(NLP)中的应用

在 NLP 任务中, t a n h tanh tanh 经常用于捕捉语义和情感信息:

  1. 情感分析

    • 由于情感数据通常具有对称性(正面情感与负面情感), t a n h tanh tanh 的零中心化输出可以很好地表达这种特性。
    • 示例:在分类模型中, t a n h tanh tanh 用于隐藏层处理输入特征,例如句子嵌入。
  2. 句子匹配与相似度计算

    • 例如,在问答系统或文本匹配任务中, t a n h tanh tanh 可用于构造两个句子向量的相似度度量。
  3. 语言生成任务

    • 在生成任务中, t a n h tanh tanh 能帮助模型平滑输出,避免产生过于离散或不连贯的文本。
4.4 回归与对称性任务

对于某些对称分布的回归任务, t a n h tanh tanh 是隐藏层的良好选择。例如:

  1. 时间序列预测

    • (\tanh) 的平滑输出特性适合预测连续时间序列值,尤其是归一化后的目标值。
  2. 信号处理

    • 在音频信号处理或物理系统建模中, t a n h tanh tanh 常用于对对称性数据进行非线性建模。
4.5 其他场景中的应用
  1. 生成对抗网络(GAN)

    • 在生成器或判别器中, t a n h tanh tanh 有时用于平滑输出,限制输出范围。
  2. 深层自动编码器(Deep Autoencoders)

    • t a n h tanh tanh 可以作为隐藏层的激活函数,用于捕捉输入数据的非线性特征。
  3. 迁移学习与小规模模型

    • 在浅层网络或小规模模型中, 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 优点
  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 更适合数据对称分布的场景。
  2. 非线性特性

    • t a n h tanh tanh 引入非线性,使神经网络能够学习和拟合复杂的非线性关系。
    • 它在中间区域(接近 [ − 2 , 2 ] [-2, 2] [2,2])对输入变化敏感,可以更好地捕捉特征差异。
  3. 输出范围适中

    • t a n h tanh tanh 将输入限制在 [ − 1 , 1 ] [-1, 1] [1,1] 范围内,这在某些需要归一化输出的任务中非常有用,例如 RNN 和回归任务。
  4. 适合对称性任务

    • 在处理对称数据(如情感分析、图像对称特征)时, t a n h tanh tanh 的对称性输出能够更好地表达特征。
  5. 梯度平滑

    • t a n h tanh tanh 是一个平滑函数,其导数为 ( 1 − tanh ⁡ 2 ( x ) ) (1 - \tanh^2(x)) (1tanh2(x)),在输入范围内梯度变化较为平稳,适合于小型网络或浅层网络。
5.2 缺点
  1. 梯度消失问题

    • 现象
      • 当输入值 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 替代的主要原因。
  2. 计算复杂度较高

    • t a n h ( x ) tanh(x) tanh(x) 的计算涉及指数运算 e x e^x ex e − x e^{-x} ex,相比 ReLU(简单的 m a x ( 0 , x ) max(0, x) max(0,x) 运算),计算成本更高,尤其在大型模型中可能成为瓶颈。
  3. 对极端值的敏感性较低

    • 在输入值较大的情况下, t a n h ( x ) tanh(x) tanh(x) 的输出趋于饱和,梯度几乎为 0,这意味着网络对这些极端值的输入几乎失去了学习能力。
  4. 不适合深层网络

    • 在深层神经网络中,由于梯度消失问题, 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 在以下场景中仍然是一个不错的选择:

  1. 浅层网络
    • 网络深度较小、隐藏层较少的情况下, t a n h tanh tanh 的优点能得到充分发挥。
  2. 对称性任务
    • 在数据分布或任务目标具有对称性时(如情感分析), t a n h tanh tanh 的零中心化输出非常有帮助。
  3. 时间序列建模
    • t a n h tanh tanh 在 RNN、LSTM 和 GRU 中用于捕捉时间序列中的非线性关系。
  4. 归一化输出的需求
    • 当任务需要对隐藏层输出进行归一化(范围在 [ − 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 tanhtorch.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 实践建议

  1. 框架内置函数:对于大多数深度学习任务,直接使用 TensorFlow 或 PyTorch 提供的内置 t a n h tanh tanh 激活函数即可,无需手动实现。
  2. 适用场景
    • RNN、LSTM、GRU 等模型中, t a n h tanh tanh 是默认激活函数。
    • 对称性数据或零中心化数据场景,可以考虑使用 t a n h tanh tanh
  3. 替代方案:如果训练较深的网络且存在梯度消失问题,可以尝试使用 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 tanhSigmoid
数学公式 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+exexex σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
输出范围 [ − 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 tanhReLU
数学公式 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+exexex 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 tanhLeaky 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+exexex ( 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 tanhSwish
数学公式 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+exexex 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 选择建议

  1. 使用 t a n h tanh tanh 的场景

    • 数据分布对称,输出需要在 [ − 1 , 1 ] [-1, 1] [1,1] 范围内。
    • 小型或浅层神经网络,例如 RNN 的隐藏层。
    • 需要零中心化输出的场景。
  2. 替代方案

    • 如果存在梯度消失问题或计算资源有限,推荐使用 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 normalized

normalized_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 和其他变体所取代,但它的独特特性使得它在特定任务中依然表现出色。

核心特性回顾
  1. 零中心化输出 t a n h tanh tanh 的输出范围为 [ − 1 , 1 ] [-1, 1] [1,1],并且是零中心化的。这使得权重更新更加平衡,适合对称性数据和时间序列任务。
  2. 非线性映射能力 t a n h tanh tanh 能够引入非线性特性,使神经网络能够学习复杂的数据模式和关系。
  3. 平滑的梯度变化:在中间输入范围内 [ − 2 , 2 ] [-2, 2] [2,2] t a n h tanh tanh 的梯度较大且稳定,有助于提高训练效率。
适用场景
  1. 时间序列建模:如天气预测、股票价格分析等场景, t a n h tanh tanh 在 RNN 和 LSTM 中表现优异。
  2. 自然语言处理:适用于情感分析、翻译等需要捕捉上下文关系的任务。
  3. 对称性任务:例如物理模拟、情感分类等,对称分布的数据特别适合使用 t a n h tanh tanh
  4. 图像处理:用于像素归一化、对比度增强等图像预处理任务。
  5. 浅层网络:在隐藏层较少的网络中, 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+exexex

其中:

  • 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)=2exex
  • 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+ex

通过化简可得:
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+ex2exex=ex+exexex

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)=1tanh2(x)

推导过程

  1. 根据定义:
    tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
  2. 对其求导:
    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+ex)2(ex+ex)(exex)(exex)(ex+ex)
  3. 化简后得:
    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+ex)24=1tanh2(x)
10.2 实现代码示例
1) 自定义 t a n h tanh tanh 激活函数

在深度学习框架中, t a n h tanh tanh 通常由框架提供,但也可以手动实现。

  • TensorFlow 实现
import tensorflow as tf

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("Custom tanh output:", y.numpy())
  • PyTorch 实现
import torch

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("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 的常见问题与解决方法
  1. 梯度消失问题

    • 现象:输入值较大时, t a n h ( x ) tanh(x) tanh(x) 的导数接近 0,导致梯度传播时更新缓慢。
    • 解决方案
      • 使用 ReLU 或其变体(Leaky ReLU、Swish)替代。
      • 对输入数据进行标准化,限制输入范围。
  2. 计算复杂度

    • 现象 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+exexex [ − 1 , 1 ] [-1, 1] [1,1]零中心化,适合对称数据梯度消失,计算复杂RNN、对称任务
Sigmoid 1 1 + e − x \frac{1}{1 + e^{-x}} 1+ex1 [ 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)

参考文献与资源

  1. 深度学习激活函数教程:https://www.deeplearningbook.org/
  2. TensorFlow 官方文档:https://www.tensorflow.org/
  3. PyTorch 官方文档:https://pytorch.org/
  4. 激活函数对比与发展:https://arxiv.org/abs/1710.05941

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技术支持】安卓无线adb调试连接方式

Android 10 及更低版本,需要借助 USB 手机和电脑需连接在同一 WiFi 下;手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices可以查看到手机);设置手机的监听adb tcpip 5555;拔掉 USB 线…

【网络】计算机网络的分类 局域网 (LAN) 广域网 (WAN) 城域网 (MAN)个域网(PAN)

局域网是通过路由器接入广域网的 分布范围 局域网Local Area Network:小范围覆盖,速度高,延迟低(办公室,家庭,校园,网络) 广域网Wide Area Network 大范围覆盖,速度相对低,延迟高…

scanf:数据之舟的摆渡人,静卧输入港湾的诗意守候

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节我们主要来学习scanf的基本用法,了解scanf返回值,懂得scanf占位符和赋值…

win10 gt520+p106双卡测试

安装391.35驱动失败,虽然gpuz和设备管理器显示正常但没有nvidia控制面板 重启进安全模式,ddu卸载,再次重启到安全模式,安装391.01驱动,显示3dvision安装失败,重启再看已经有nvidia控制面板了 修改p106注册表 AdapterType 1 EnableMsHybrid 1 计算机\HKEY_LOCAL_MACHINE\SYSTE…

C# OpenCV机器视觉:霍夫变换

在一个阳光灿烂得近乎放肆的午后,阿强的实验室就像被施了魔法的科学城堡,到处闪耀着神秘的科技光芒。阿强呢,像个即将踏上惊险征程的探险家,一屁股坐在那堆满奇奇怪怪设备的桌前,眼神中透露出按捺不住的兴奋劲儿&#…

【深度学习基础】线性神经网络 | 线性回归的简洁实现

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

工业级手持地面站(支持Android和IOS)技术详解!

一、硬件平台的选择 无人机遥控器为了支持Android和iOS系统,通常会选择高性能的处理器和操作系统作为硬件基础。例如,一些高端遥控器可能采用基于ARM架构的高性能处理器,这些处理器能够高效地运行Android或iOS操作系统,并提供足够…

CatLog的使用

一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…

vue elementui 大文件进度条下载

下载进度条 <el-card class"box-card" v-if"downloadProgress > 0"><div>正在下载文件...</div><el-progress :text-inside"true" :stroke-width"26" :percentage"downloadProgress" status"…

TensorRT-LLM中的MoE并行推理

2种并行方式&#xff1a; moe_tp_size&#xff1a;按照维度切分&#xff0c;每个GPU拥有所有Expert的一部分权重。 moe_ep_size: 按照Expert切分&#xff0c;每个GPU有用一部分Expert的所有权重。 二者可以搭配一起使用。 限制&#xff1a;二者的乘积&#xff0c;必须等于模…

计算机的错误计算(二百零五)

摘要 基于一位读者的问题&#xff0c;提出题目&#xff1a;能用数值计算证明 吗&#xff1f;请选用不同的点&#xff08;即差别大的数&#xff09;与不同的精度。实验表明&#xff0c;大模型理解了题意。但是&#xff0c;其推理能力值得商榷。 例1. 就摘要中问题&#xff0…

关于TCP/IP五层结构的理解

关于TCP/IP五层结构的理解 TCP/IP五层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本&#xff0c;由以下 5 层组成&#xff1a; 1. 应用层&#xff1a;应用层是体系结构中的最高层&#xff0c;定义了应用进程间通信和交互的规则。本…

Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具

1、目标 从库存栏中把道具拖到游戏场景中&#xff0c;库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中&#xff0c;我们只希望最外层的UIInventorySlot响应Raycast&#xff0c;他下面…

Sprint Boot教程之五十:Spring Boot JpaRepository 示例

Spring Boot JpaRepository 示例 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是一个基…

C++ STL map和set的使用

序列式容器和关联式容器 想必大家已经接触过一些容器如&#xff1a;list&#xff0c;vector&#xff0c;deque&#xff0c;array&#xff0c;forward_list&#xff0c;string等&#xff0c;这些容器统称为系列容器。因为逻辑结构为线性的&#xff0c;两个位置的存储的值一般是…

人工智能及深度学习的一些题目(三)

1、【填空题】 使用RNNCTC模型进行语音识别&#xff0c;在产生预测输出时&#xff0c;对于输入的音频特征序列通过网络预测产生对应的字母序列&#xff0c;可以使用&#xff08; beamsearch &#xff09;算法进行最优路径搜索。 2、【填空题】 逻辑回归模型属于有监督学习中的&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用&#xff0c;这是一个相当深奥且重要的概念。为了理解右值引用&#xff0c;我们需要先理解左值和右值的概念&#xff0c;然后再理解左值引用和右值引用。本文将详细解析这些概念&#xff0c;并通过实例进行说明&#xff0c;以揭示右值引用如何…

cp命令详解

&#x1f3dd;️专栏&#xff1a;计算机操作系统 &#x1f305;主页&#xff1a;猫咪-9527主页 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 1. 基本功能 2. 命令语法 3. 常用选项 4. 常见用法示例 4.1 复制单个文件 4.2 递归复制目录…

Git的学习和常见问题

文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git&#xff0c;记录了一…

《Mcal》--MCU模块

一、MCU模块的主要功能 控制系统时钟的产生。控制系统通用模块&#xff0c;该模块会涉及到Adc、Ftm等外设的配置。控制外设时钟。控制MCU运行的模式。初始化定义RAM Section。 比较重要的是时钟的配置。 二、系统时钟的配置 1、芯片时钟树 要想弄明白时钟配置&#xff0c;需…