ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

eat_tensorflow2_in_30_days:TensorFlow 2.0 激活函数(Activation)实战指南

eat_tensorflow2_in_30_days:TensorFlow 2.0 激活函数(Activation)实战指南 教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载激活函数Activation Function是深度学习中引入非线性的核心机制它决定了神经网络能否拟合任意复杂函数。本文基于《eat_tensorflow2_in_30_days》开源教程的 english/Chapter5-3.md 章节展开系统梳理 TensorFlow 2.0 中tf.nn模块提供的常用激活函数sigmoid、softmax、tanh、relu、leaky_relu、elu、selu、swish、gelu的数学特性、优缺点与适用场景并结合仓库中低阶 API、中阶 API、高阶 API 各章的真实代码讲解在 Keras 模型中嵌入激活函数的两种标准方式。读完本文你将能够针对隐藏层与输出层正确选择激活函数并能在Sequential、函数式 API 与模型子类化三种建模方法中熟练使用。一、为什么神经网络离不开激活函数激活函数在深度学习中扮演着非常重要的角色它给网络赋予了非线性从而使得神经网络能够拟合任意复杂的函数。这一点在原文档中被反复强调如果没有激活函数无论多复杂的网络都等价于单一的线性变换无法对非线性函数进行拟合。从数学角度看多个线性变换的复合仍然是线性变换。假设网络每一层都只做y Wx b这样的仿射变换那么无论堆叠多少层整个网络最终都可以被化简为一个等价的线性变换其表达能力与单层线性模型没有任何区别。只有插入非线性激活函数层与层之间的复合才会真正产生非线性网络才具备逼近任意非线性函数万能逼近定理的能力。因此激活函数的选择直接决定了表达能力能否拟合目标函数训练稳定性是否会出现梯度消失vanishing gradient或梯度爆炸gradient exploding收敛速度输出是否以 0 为中心、梯度流是否顺畅。二、常用激活函数逐个解析原文档系统介绍了tf.nn模块中 9 个最常用的激活函数下表先给出全景对比随后逐一展开说明。激活函数输出范围主要用途核心缺陷tf.nn.sigmoid(0, 1)二分类输出层梯度消失、计算复杂度高、输出不以 0 为中心tf.nn.softmax(0, 1) 且和为 1多分类输出层仅适合输出层tf.nn.tanh(-1, 1)隐藏层历史方案梯度消失、计算复杂度高tf.nn.relu[0, ∞)隐藏层最流行输出不以 0 为中心、死亡 ReLUtf.nn.leaky_relu(-∞, ∞)隐藏层需人工设置负斜率超参tf.nn.elu(-1, ∞)隐藏层计算开销略高于 ReLUtf.nn.selu自归一化隐藏层配合 AlphaDropout需配合 lecun_normal 初始化tf.nn.swish(-∞, ∞)隐藏层计算成本高于 ReLUgelu(-∞, ∞)Transformer 中效果最佳tf.nn尚未内置1. sigmoid二分类输出的经典选择sigmoid将任意实数压缩到 0 到 1 之间输出天然可以解释为概率因此一般只在二分类问题的最后输出层使用。其数学形式为σ(x) 1 / (1 e^(-x))主要缺陷有三点原文档明确指出梯度消失当输入绝对值较大时sigmoid 导数趋近于 0深层网络中梯度连乘后会迅速衰减计算复杂度高涉及指数运算输出不以 0 为中心输出恒为正会导致后续层的梯度更新呈现锯齿式震荡收敛变慢。2. softmaxsigmoid 的多分类扩展softmax是 sigmoid 向多分类的自然推广它将一个 k 维实数向量映射为 k 个 (0, 1) 区间内且总和为 1 的概率分布一般只在多分类问题的最后输出层使用。其数学形式为softmax(x)_i e^(x_i) / Σ_j e^(x_j)由于输出之和恒为 1softmax 常与交叉熵损失如tf.keras.losses.CategoricalCrossentropy搭配使用。在仓库中softmax 也是 TensorFlow 核心 API 的代表性符号之一见 三、TensorFlow的层次结构.md 中如 tf.Variable, tf.constant, tf.function, tf.GradientTape, tf.nn.softmax...的列举。3. tanh以 0 为中心的双曲正切tanh将实数压缩到 -1 到 1 之间其输出期望为 0以 0 为中心这比 sigmoid 更有利于梯度更新。其数学形式为tanh(x) (e^x - e^(-x)) / (e^x e^(-x)) 2σ(2x) - 1主要缺陷与 sigmoid 类似存在梯度消失问题且计算复杂度高。在原文档中tanh 主要作为 sigmoid 的改进版被介绍其输出期望为 0 是相对 sigmoid 的核心优势。4. relu当前最流行的隐藏层激活函数relu修正线性单元Rectified Linear Unit是当前深度学习中最流行的激活函数一般用于隐藏层。其数学形式极为简洁relu(x) max(0, x)正是这种分段线性的形式让 relu 同时具备了非线性表达能力和高效的梯度传播正区间梯度恒为 1从根本上缓解了 sigmoid/tanh 的梯度消失问题。原文档同时指出其两个主要缺陷输出不以 0 为中心正区间输出恒为非负死亡 ReLUdying relu问题当输入小于 0 时梯度恒为 0一旦某个神经元落入负区间其参数将永远得不到更新神经元死亡。5. leaky_relu死亡 ReLU 问题的直接改进leaky_relu是对修正线性单元的改进核心思路是在负半轴给一个很小的非零斜率默认 0.2从而解决了死亡 ReLU 问题。其数学形式为leaky_relu(x) x, x ≥ 0 αx, x 0 α 为小正数如 0.2由于负区间不再是一刀切的 0神经元即使落入负区间也仍然能获得梯度更新。6. elu指数形式平滑负区间elu指数线性单元Exponential Linear Unit是对 relu 的又一改进能够缓解死亡 ReLU 问题。其数学形式为elu(x) x, x ≥ 0 α(e^x - 1), x 0与 leaky_relu 的线性负斜率不同elu 在负区间使用指数曲线输出会逐渐饱和因此对噪声更鲁棒但代价是计算开销略高于 ReLU。7. selu自归一化的扩展型指数线性单元selu扩展型指数线性单元Scaled Exponential Linear Unit是原文档中特性最特殊的一个。其核心能力是在权重使用tf.keras.initializers.lecun_normal初始化的前提下能够对神经网络进行自归一化self-normalization——即网络每一层的输出自动保持零均值和单位方差因此不可能出现梯度爆炸或者梯度消失问题。selu 的另一个使用前提原文档明确强调需要和 Dropout 的变种 AlphaDropout 一起使用。因为普通 Dropout 会破坏 selu 建立的自归一化性质而 AlphaDropout 在丢弃神经元时会按 selu 的尺度调整保留值从而维持归一化状态。8. swish谷歌出品的自门控激活函数swish是一种自门控self-gated激活函数由谷歌研究团队提出其数学形式为swish(x) x · σ(x)原文档指出相关研究指出用 swish 替代 relu 将获得轻微效果提升。swish 的特点在于它是自门控的门控信号由输入自身产生且函数整体光滑处处可导在深层网络中表现出优于 relu 的训练稳定性。不过需要留意swish 涉及 sigmoid 计算单次前向/反向的计算成本高于 relu。9. geluTransformer 中的最佳表现者gelu高斯误差线性单元Gaussian Error Linear Unit在 Transformer 系列模型中表现最好其数学形式为gelu(x) x · Φ(x)其中 Φ(x) 是标准正态分布的累积分布函数这使得 gelu 兼具确定性relu 式与随机正则化dropout 式的折中特性。需要特别注意的是原文档明确指出tf.nn模块尚没有实现该函数。在实际项目中使用 gelu 时需要自行实现或用第三方实现例如在 Transformer 类模型中手工定义其近似形式def gelu(x): return 0.5 * x * (1.0 tf.tanh( tf.sqrt(2.0 / tf.keras.backend.pi) * (x 0.044715 * tf.pow(x, 3)) ))三、在 Keras 模型中使用激活函数的两种方式原文档指出在 Keras 模型中使用激活函数一般有两种方式作为某些层的activation参数指定在Dense、Conv1D等层构造时直接传入显式添加layers.Activation激活层将激活函数当作一个独立的网络层插入。原文档给出了完整的示例代码这里完整复现并补充说明import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras import layers, models tf.keras.backend.clear_session() model models.Sequential() # 方式一通过 activation 参数指定将激活函数与 Dense 层融合 model.add(layers.Dense(32, input_shape(None, 16), activationtf.nn.relu)) model.add(layers.Dense(10)) # 方式二显式添加 layers.Activation 激活层 model.add(layers.Activation(tf.nn.softmax)) model.summary()两种方式的要点对比对比维度activation参数layers.Activation激活层代码位置在目标层构造时一并指定作为独立层插入网络可视化融合在目标层内部计算图中呈现为独立节点适用场景输出紧接某一层之后需要独立控制、复用或调试激活环节时需要注意的是activation参数既可以传tf.nn下的函数对象如tf.nn.relu也可以传字符串别名如relu、sigmoid。两种写法最终都会在 Keras 内部被解析并接入计算图。四、仓库源码佐证激活函数在三种 API 层级中的真实应用《eat_tensorflow2_in_30_days》教程的第 3 章恰好按照低阶 API → 中阶 API → 高阶 API的层次组织激活函数在每一层都有真实调用正好可以作为本文主题的源码级印证。1. 低阶 API手写正向传播时直接调用tf.nn函数在 3-1,低阶API示范.md 的 DNN 二分类模型中作者使用tf.Module手写网络正向传播时直接调用tf.nn.relu与tf.nn.sigmoidclass DNNModel(tf.Module): def __init__(self, nameNone): super(DNNModel, self).__init__(namename) self.w1 tf.Variable(tf.random.truncated_normal([2, 4]), dtypetf.float32) self.b1 tf.Variable(tf.zeros([1, 4]), dtypetf.float32) self.w2 tf.Variable(tf.random.truncated_normal([4, 8]), dtypetf.float32) self.b2 tf.Variable(tf.zeros([1, 8]), dtypetf.float32) self.w3 tf.Variable(tf.random.truncated_normal([8, 1]), dtypetf.float32) self.b3 tf.Variable(tf.zeros([1, 1]), dtypetf.float32) # 正向传播隐藏层用 relu输出层用 sigmoid二分类 tf.function(input_signature[tf.TensorSpec(shape[None, 2], dtypetf.float32)]) def __call__(self, x): x tf.nn.relu(x self.w1 self.b1) x tf.nn.relu(x self.w2 self.b2) y tf.nn.sigmoid(x self.w3 self.b3) return y这个例子生动印证了原文档的选型建议隐藏层用 relu二分类输出层用 sigmoid。2. 中阶 API 与高阶 API通过activation参数指定在 3-2,中阶API示范.md 与 3-3,高阶API示范.md 中模型分别通过函数式 API 和模型子类化构建统一使用activationrelu隐藏层与activationsigmoid输出层的字符串写法self.dense1 layers.Dense(4, activationrelu) self.dense2 layers.Dense(8, activationrelu) self.dense3 layers.Dense(1, activationsigmoid)3. 四大建模流程范例中的激活函数布局教程第 1 章的四个建模流程范例同样展示了激活函数的典型搭配1-1,结构化数据建模流程范例.md三隐藏层relu→ 输出层sigmoid二分类1-2,图片数据建模流程范例.mdDense(32, activationrelu)→Dense(1, activationsigmoid)1-3,文本数据建模流程范例.mdConv1D卷积层使用relu输出层使用sigmoid5-2,特征列feature_column.md特征列之后接两个relu隐藏层与sigmoid输出层。这些代码共同验证了原文档的结论无论模型如何构建隐藏层普遍选择 relu 系relu/leaky_relu/elu/selu/swish输出层根据任务选择 sigmoid二分类或 softmax多分类。五、激活函数选型实践建议综合原文档的逐项剖析与仓库各章节的实际用法可以总结出以下选型路线输出层按任务定二分类用sigmoid多分类用softmax回归任务则通常不接激活函数隐藏层默认relu作为最流行、性价比最高的默认选择遇到死亡 ReLU 时换用leaky_relu或elu追求自归一化与稳定性可尝试selu但必须同时满足lecun_normal权重初始化 AlphaDropout两个前提条件否则自归一化性质无法保证在 Transformer 类模型中gelu表现最佳但由于tf.nn尚未内置需要自行实现可参考本文第二节给出的近似形式追求极致精度的深层网络可以实验swish作为 relu 的替代据研究可带来轻微效果提升但需权衡其更高的计算成本。六、延伸阅读激活函数是 TensorFlow 中阶 API 的组成部分。教程将其编排在五、TensorFlow的中阶API一章中同章还包括数据管道 Dataset5-1,数据管道Dataset.md、特征列5-2,特征列feature_column.md、模型层5-4,模型层layers.md、损失函数5-5,损失函数losses.md、评估指标5-6,评估指标metrics.md、优化器5-7,优化器optimizers.md与回调函数5-8,回调函数callbacks.md。读者可以结合这些章节将激活函数与其他中阶 API 组件组合成完整可训练的模型。赞分享教程深度学习机器学习【免费下载链接】eat_tensorflow2_in_30_daysTensorflow2.0 is delicious, just eat it! 项目地址https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days点击查看免费下载相关推荐IDM 激活脚本(IDM-Activation-Script) 使用指南IDM 激活脚本 IDM Activation Script 使用指南 前言为什么需要IDM激活脚本 Internet Download ManageCLIAutoResearchClaw 原生接入 Anthropic Messages API适配器模式设计与零影响改造深度解析AutoResearchClaw 原生接入 Anthropic Messages API适配器模式设计与零影响改造深度解析 本文以 AutoResearchC人工智能大模型AI Agent自主智能体深度研究科研MCP 服务后端numpy-ml 激活函数全解析12 个 Activation 类的公式、梯度与神经网络集成实战numpy ml 激活函数全解析12 个 Activation 类的公式、梯度与神经网络集成实战 numpy ml 是一个Machine learning,机器学习人工智能上一篇最完整abu量化指标库MACD与RSI实战应用下一篇TVBoxOSC大屏看文档遥控器翻PDF的完整速查创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表