【机器学习-05】-激活函数的选择,如神经网络使用激活函数的必要性
神经网络如果不适用激活函数 就和线性回归一样了
1. 核心总结:不同任务的激活函数选择
归纳了不同场景下的激活函数选择规则:
任务类型 | 激活函数 | 适用场景说明 |
---|---|---|
二分类 (Binary Classification) | sigmoid | 输出概率(0~1),如肿瘤恶性判断 |
回归 (Regression) | linear 或 relu | 输出连续值(如房价预测) |
隐藏层 (Hidden Layers) | relu | 默认选择,解决梯度消失,加速训练 |
2. 关键概念解析
-
Sigmoid
• 公式: σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
• 特点:输出概率,适合二分类最后一层。
• 示例:Dense(units=1, activation='sigmoid')
-
Linear
• 公式: f ( z ) = z f(z) = z f(z)=z
• 特点:无变换,直接输出线性值,适合回归任务。 -
ReLU (Rectified Linear Unit)
• 公式: ReLU ( z ) = max ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)
• 特点:隐藏层首选,计算高效,缓解梯度消失。
3. 代码示例(TensorFlow/Keras)
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
model = Sequential([
Dense(units=25, activation='relu'), # 隐藏层1:ReLU激活
Dense(units=15, activation='relu'), # 隐藏层2:ReLU激活
Dense(units=1, activation='sigmoid') # 输出层:二分类用Sigmoid
])
代码说明:
• 隐藏层:均使用 relu
激活函数,增强非线性表达能力。
• 输出层:二分类任务使用 sigmoid
,输出概率值。
4. 不同任务的完整模型配置建议
场景1:二分类任务(如垃圾邮件检测)
model = Sequential([
Dense(64, activation='relu', input_shape=(input_dim,)),
Dense(32, activation='relu'),
Dense(1, activation='sigmoid') # 输出概率
])
model.compile(optimizer='adam', loss='binary_crossentropy')
场景2:回归任务(如房价预测)
model = Sequential([
Dense(64, activation='relu', input_shape=(input_dim,)),
Dense(32, activation='relu'),
Dense(1, activation='linear') # 输出连续值
])
model.compile(optimizer='adam', loss='mse')
5. 常见问题解答(Q&A)
Q1:为什么隐藏层推荐使用ReLU?
• 答:ReLU计算高效,且能缓解梯度消失问题(相比Sigmoid/Tanh)。
Q2:回归任务能否用Sigmoid?
• 答:不建议。Sigmoid会限制输出范围(0~1),而回归需要任意实数。
Q3:多分类任务用什么激活函数?
• 答:输出层用 softmax
,隐藏层仍用 relu
。
6. 总结
• 二分类 → sigmoid
• 回归 → linear
或 relu
(非负输出时)
• 隐藏层 → relu
(默认首选)
神经网络使用激活函数的必要性
如果使用线性函数
神经网络为何不能使用线性激活函数?——基于图片的深度解析
1. 图片核心结论
图中通过线性回归的数学推导证明:在神经网络中使用线性激活函数(如 ( g(z)=z ))时,无论叠加多少层,最终等效于单层线性回归,失去深度学习的核心优势。
2. 关键推导过程(图中公式解析)
输入与单层变换
• 输入:单特征标量 ( x )
• 权重与偏置:标量 ( w ), ( b )
• 线性激活函数:( g(z) = z )
第一层输出:
a [ 1 ] = w [ 1 ] x + b [ 1 ] a^{[1]} = w^{[1]}x + b^{[1]} a[1]=w[1]x+b[1]
多层线性叠加
• 第二层输入:
a
[
1
]
a^{[1]}
a[1]
第二层输出:
a [ 2 ] = w [ 2 ] a [ 1 ] + b [ 2 ] = w [ 2 ] ( w [ 1 ] x + b [ 1 ] ) + b [ 2 ] a^{[2]} = w^{[2]}a^{[1]} + b^{[2]} = w^{[2]}(w^{[1]}x + b^{[1]}) + b^{[2]} a[2]=w[2]a[1]+b[2]=w[2](w[1]x+b[1])+b[2]
展开后:
a [ 2 ] = ( w [ 2 ] w [ 1 ] ) x + ( w [ 2 ] b [ 1 ] + b [ 2 ] ) a^{[2]} = (w^{[2]}w^{[1]})x + (w^{[2]}b^{[1]} + b^{[2]}) a[2]=(w[2]w[1])x+(w[2]b[1]+b[2])
令 w ′ = w [ 2 ] w [ 1 ] w' = w^{[2]}w^{[1]} w′=w[2]w[1], b ′ = w [ 2 ] b [ 1 ] + b [ 2 ] b' = w^{[2]}b^{[1]} + b^{[2]} b′=w[2]b[1]+b[2],则:
a [ 2 ] = w ′ x + b ′ a^{[2]} = w'x + b' a[2]=w′x+b′
结论:多层线性变换退化为单层线性回归 f ( x ) = w x + b f(x)=wx+b f(x)=wx+b。
3. 数学本质
• 线性函数的封闭性:线性变换的复合仍是线性变换。
• 表达能力局限:无法拟合非线性关系(如异或问题、图像分类等复杂模式)。
4. 反例验证
假设数据需拟合
y
=
x
2
y = x^2
y=x2:
• 线性网络:只能输出直线
y
=
w
x
+
b
y=wx+b
y=wx+b,无法逼近曲线。
• 非线性网络(如使用ReLU):可通过分段线性组合逼近曲线。
5. 解决方案
使用非线性激活函数(如ReLU、Sigmoid、Tanh)打破线性对称性:
• ReLU示例:
若
g
(
z
)
=
max
(
0
,
z
)
g(z) = \max(0,z)
g(z)=max(0,z),则:
a [ 2 ] = w [ 2 ] max ( 0 , w [ 1 ] x + b [ 1 ] ) + b [ 2 ] a^{[2]} = w^{[2]}\max(0, w^{[1]}x + b^{[1]}) + b^{[2]} a[2]=w[2]max(0,w[1]x+b[1])+b[2]
此时网络可表达非线性关系。
6. 代码对比
线性激活(失效)
# 两层线性网络 → 等效单层
layer1 = Linear(in_features=1, out_features=1) # 输出 w1*x + b1
layer2 = Linear(in_features=1, out_features=1) # 输出 w2*(w1*x + b1) + b2 = (w2*w1)x + (w2*b1 + b2)
非线性激活(有效)
# 使用ReLU激活
layer1 = Linear(in_features=1, out_features=10)
activation = nn.ReLU() # 引入非线性
layer2 = Linear(in_features=10, out_features=1)
7. 总结
• 图中证明:线性激活使多层网络退化为单层,失去深度学习的意义。
• 核心原则:必须使用非线性激活函数(如ReLU)才能实现:
• 特征的多层次抽象
• 复杂函数的逼近能力
• 解决非线性分类/回归问题
神经网络如果不适用激活函数 就和线性回归一样了