【NLP 14、激活函数 ② tanh激活函数】

学会钝感力,走向美好的方向

------ 24.12.11

一、tanh激活函数

1. tanh函数的定义

tanh是双曲正切函数(Hyperbolic Tangent),数学表达式为

其函数图像是一个S型曲线,以原点 (0,0) 为中心对称,定义域为(-∞,+∞),值域是( - 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():**在列表末尾添加一个新元素,这个方法会直接修改原始列表,而不是返回一个修改后的新列表。

python 复制代码
# 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 result
    else:
        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))
相关推荐
徽4403 分钟前
农田植被目标检测数据标注与模型训练总结1
人工智能·目标检测·计算机视觉
千里念行客2405 分钟前
国产射频芯片“小巨人”昂瑞微今日招股 拟于12月5日进行申购
大数据·前端·人工智能·科技
余蓝8 分钟前
本地部署!文生图LCM超简单教程
图像处理·人工智能·深度学习·ai作画·stable diffusion·dall·e 2
千里念行客24010 分钟前
昂瑞微将于12月2日初步询价 助推国产射频芯片自主创新
人工智能·科技·社交电子·api·电子
l***74941 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源
智慧地球(AI·Earth)1 小时前
DeepSeek开源IMO金牌模型:AI数学垄断时代终结
人工智能
选与握2 小时前
深度学习基本知识+tensorflow
人工智能
大千AI助手2 小时前
ROUGE-SU4:文本摘要评估的跳连智慧
人工智能·机器学习·nlp·rouge·文本摘要·大千ai助手·rouge-su4
草莓熊Lotso2 小时前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
stormsha3 小时前
裸眼3D原理浅析AI如何生成平面裸眼3D图像以科幻战士破框而出为例
人工智能·计算机视觉·平面·3d·ai