网站优化是做什么的,怀化seo,wordpress移动导航插件,oss做网站迁移学会钝感力#xff0c;走向美好的方向 —— 24.12.11 一、tanh激活函数
1. tanh函数的定义
tanh是双曲正切函数#xff08;Hyperbolic Tangent#xff09;#xff0c;数学表达式为
其函数图像是一个S型曲线#xff0c;以原点 (0#xff0c;0) 为中心对称#xff0c;定… 学会钝感力走向美好的方向 —— 24.12.11 一、tanh激活函数
1. tanh函数的定义
tanh是双曲正切函数Hyperbolic Tangent数学表达式为
其函数图像是一个S型曲线以原点 (00) 为中心对称定义域为(-∞∞)值域是( - 1,1)。
2.tanh函数的特点
① 输出范围有限 输出值始终在-1到1之间这使得在神经网络中使用时能够将神经元的输出限制在一个特定的区间内避免输出值过大或过小而导致的梯度消失或梯度爆炸问题(相对而言比没有范围限制的激活函数在这方面有优势)。 例如在一个多层神经网络中如果某一层的输出没有限制随着层数的增加输出可能会变得极大或极小而 tanh 函数可以起到一定的稳定输出的作用。
② 原点对称 tanh是奇函数即tanh(-x) -tanh(x)。这种对称性使得它在处理具有正负两种特征的数据时比较合适。 例如在一些需要区分正负信号的神经网络(如在处理包含正负情感倾向的文本分类任务)中tanh 函数能够更好地表示这种对称的特征空间
③ 单调性 在定义域内是单调递增函数这保证了其导数具有一定的良好性质有利于在反向传播算法中计算梯度。
3.导数及其性质
tanh 函数的导数为。这个导数在反向传播过程中用于计算梯度它的计算相对简单并且由于tanh(x) 的值域是(-1,1)所以 1 - tanh(x) ^ 2 的值域是 (0,1]这意味着在反向传播时,梯度的值始终是有限的不会出现像某些激活函数如 Relu 函数在某些情况下导数恒为1可能导致梯度爆炸那样导致梯度失控的情况。
4.应用场景
循环神经网络(RNN)
在 RNN 及其变体如 LSTM、GRU中经常被用作激活函数。
例如在处理(a)序列数据(如文本、时间序列等)时tanh 函数可以对神经元的输出进行有效激活将输出限制在合适的范围内帮助模型更好地处理序列中的长期依赖关系。假设在一个基于 RNN 的语言模型中每个时间步的隐藏状态通过 tanh 激活函数来更新这样可以使隐藏状态的值不会过大或过小从而更稳定地对文本席列进行建模。
神经网络隐藏层
在一般的多层前馈神经网络的隐藏层中也有应用。
它可以作为激活函数来引入非线性特性帮助神经网络拟合复杂的函数关系。
与 sigmoid 函数相比 tanh 函数的输出值域更宽能够提供更强的非线性表达能力使得神经网络能够更好地学习数据中的复杂模式。 二、手动实现tanh激活函数
isinstance()用于检査一个对象是否是某个特定类(或类型)的实例或者是否属于某几个类(或类型)之一。它返回一个布尔值即如果对象是指定类(或类型)的实例则返回True 否则返回False。
flatten() 是 numpy 库中 ndarray (多维数组)对象的一个方法它的主要作用是将多维数组转换为一维数组即将数组的维度降低到1维。这个过程不会改变原始数组的数据内容只是改变了数组的形状。
reshape() 是一种用于改变数组或张量形状的操作。它不会改变数据本身的内容只是改变了数据的存储形状使得数据可以按照新的维度结构进行访问和处理。
append()在列表末尾添加一个新元素这个方法会直接修改原始列表而不是返回一个修改后的新列表。
# coding:utf8
import torch
import numpy
手动实现tanh函数
def tanh(x):if isinstance(x, (list, tuple, numpy.ndarray)):result []if isinstance(x, numpy.ndarray):# 遍历numpy数组中的每个元素进行计算for element in x.flatten():result.append((numpy.exp(element) - numpy.exp(-element)) / (numpy.exp(element) numpy.exp(-element)))return numpy.array(result).reshape(x.shape)else:# 遍历列表或元组中的每个元素进行计算for element in x:result.append((numpy.exp(element) - numpy.exp(-element)) / (numpy.exp(element) numpy.exp(-element)))return resultelse:return (numpy.exp(x) - numpy.exp(-x)) / (numpy.exp(x) numpy.exp(-x))# 示例输入
x [1, 2, 3]
# torch实现的tanh
print(torch.tanh:,torch.tanh(torch.Tensor(x)))
# 自己实现的tanh
print(diy.tanh:,tanh(x))# 再测试下numpy数组作为输入的情况
numpy_x numpy.array([1, 2, 3])
print(torch.tanh(torch.Tensor(numpy_x)))
print(tanh(numpy_x))