趋近智
构建 Keras 神经网络时,需要使用其 Sequential 和 Functional API 堆叠层。然而,仅仅堆叠像 Dense 这样的层通常是不够的。如果只使用执行线性运算的层(如矩阵乘法后加上偏置),那么堆叠起来的整体结果仍然是一个线性函数。线性函数的组合依然是线性函数。为了模拟复杂的模式,神经网络需要引入非线性。这就是激活函数发挥作用的地方。
激活函数被逐元素地应用于层(通常被称为预激活值或 logits)的输出,在传递给下一层之前对其进行转换。这种非线性转换使得网络能够学习输入和输出之间更为复杂的映射。
考虑一个只包含线性层的简单网络。每个层计算 output=W⋅input+b,其中 W 是权重矩阵,b 是偏置向量。如果你堆叠两个这样的层,输出会变成:
output2=W2⋅(W1⋅input+b1)+b2=(W2W1)⋅input+(W2b1+b2)
这仍然是 W′⋅input+b′ 的形式,它是一个线性转换。无论你堆叠多少个线性层,网络都只能表示线性关系。激活函数打破了这种线性,使网络能够近似任意复杂的函数。
Keras 提供了多种内置激活函数。下面介绍一些最常用的函数。
整流线性单元,或称 ReLU,是深度学习中最受欢迎的激活函数之一,尤其适用于隐藏层。它计算高效且通常表现良好。
它的定义简单:如果输入为正,则直接返回输入值;否则返回零。
f(x)=max(0,x)ReLU 常是前馈和卷积神经网络中隐藏层的默认选择。
Sigmoid 函数将其输入压缩到 (0, 1) 范围内。
f(x)=σ(x)=1+e−x1Sigmoid 主要用于二分类模型的输出层,其中输出需要被解释为概率。由于 ReLU 及其变体的普及,它现在在隐藏层中较不常见。
Softmax 函数是 Sigmoid 函数在多分类问题中的推广。它接收一个任意实值分数(logits)向量作为输入,并将其转换为一个 0 到 1 之间的值向量,这些值的总和为 1。这些输出可以被解释为每个类别的概率。
对于输入向量 x=[x1,x2,...,xN],第 i 个元素的 softmax 输出是:
f(x)i=∑j=1NexjexiSoftmax 是多分类网络中最后一层的标准激活函数。
双曲正切函数(或称 Tanh)将其输入压缩到 (-1, 1) 范围内。
f(x)=tanh(x)=ex+e−xex−e−xTanh 曾是隐藏层中流行的选择,但现在已大体被 ReLU 及其变体替代。它有时仍在使用,特别是在循环神经网络(RNN)中,尽管现代 RNN 架构常使用其他门控机制。
ReLU、Sigmoid 和 Tanh 激活函数的图示。注意它们不同的输出范围和形状,尤其是在 x=0 附近。
激活函数的选择取决于层的位置和具体的任务:
你可以使用 activation 参数为大多数 Keras 层指定激活函数:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 在Dense层内使用激活参数
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(784,)), # 隐藏层使用ReLU
layers.Dense(10, activation='softmax') # 输出层使用Softmax(多分类)
])
# 使用Activation层显式表示的等效方法
model_explicit = keras.Sequential([
layers.Dense(64, input_shape=(784,)),
layers.Activation('relu'), # 单独应用ReLU
layers.Dense(10),
layers.Activation('softmax') # 单独应用Softmax
])
# 你也可以直接传递函数对象
model_object = keras.Sequential([
layers.Dense(64, activation=tf.nn.relu, input_shape=(784,)),
layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
Keras 通过字符串名称(例如,'relu'、'sigmoid'、'softmax'、'tanh'、'linear')识别激活函数。使用 activation 参数是最常见和简洁的方法。独立的 layers.Activation 层提供了灵活性,尤其是在使用函数式 API 或自定义架构时,你可能希望独立应用激活函数。
理解激活函数对于构建高效的神经网络十分重要。它们是引入必要非线性的核心组成部分,使模型能够学习超越简单线性关系的复杂模式。当你使用函数式 API 或自定义层构建更复杂的模型时,你会看到如何策略性地放置这些非线性转换来支持强大的计算。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造