【机器学习】(24)—— 神经网络激活函数

【机器学习】(24)—— 神经网络激活函数 神经网络激活函数ReLU、Sigmoid 与非线性文章目录神经网络激活函数ReLU、Sigmoid 与非线性1. 问题从哪里来2. 什么是激活函数3. Sigmoid压到 013.1 和逻辑回归的关系4. tanh压到 -115. ReLU小于 0 置零否则原样通过5.1 选激活时的实用顺序6. 手算同一套权重加上 ReLU 之后7. 完整神经网络的三块积木8. 动手有无激活能否合并成单层9. 能力边界与常见误区9.1 适用边界9.2 常见误区10. 关键术语速查11. 延伸阅读12. 小结摘要第 23 篇证明过隐藏层如果只做加权求和叠多少层都等价于一层线性模型。要让网络学弯、学交叉必须在神经元输出上插入非线性——这就是激活函数Activation Function。本文衔接第 06 篇已熟悉的 Sigmoid讲清 tanh 与ReLU用手算和代码对比「有无激活」的差别并说明隐藏层为何常常默认从 ReLU 起步。适合刚读完神经网络结构入门的读者。1. 问题从哪里来第 23 篇的结论是y ′ W ( 2 ) ( W ( 1 ) x b ( 1 ) ) b ( 2 ) y W^{(2)}(W^{(1)}\mathbf{x}\mathbf{b}^{(1)})b^{(2)}y′W(2)(W(1)xb(1))b(2)仍可合并成「某个W eff x b eff W_{\text{eff}}\mathbf{x}b_{\text{eff}}Weff​xbeff​」。加层改变了参数摆放没有改变「整体仍是线性」这件事。要学非线性关系就得在层与层之间塞进非线性数学运算。你其实早就用过一次逻辑回归把线性得分z zz送进 Sigmoid才得到( 0 , 1 ) (0,1)(0,1)概率第 05、06 篇。神经网络把同一思路用到每一个隐藏神经元上——不只是最后输出那一下。2. 什么是激活函数激活函数作用在神经元「加权和」之后、把结果交给下一层之前z w·x b a f(z) ← 激活 下一层拿 a 当输入符号含义z zz预激活值pre-activation线性部分f ff激活函数a aa激活后的输出进入下一层有了非线性f ff再堆层才有意义每一层都在前一层的非线性结果上继续变换整体可以逼近很复杂的输入–输出关系。第 17 篇靠人手做特征交叉激活之后的网络才更接近「自动学组合」的那条路。也可以把激活想成「闸门」线性部分先算出一个分数z zz激活再决定这个分数以什么形状往下传——压到概率区间、压到对称区间或干脆把负数掐掉。闸门不同网络能表示的函数族就不同。常见三类f ffSigmoid、tanh、ReLU。3. Sigmoid压到 01σ ( z ) 1 1 e − z \sigma(z) \frac{1}{1e^{-z}}σ(z)1e−z1​输出落在( 0 , 1 ) (0,1)(0,1)曲线呈 S 形。第 06 篇查表直觉仍然适用z 0 z0z0时σ 0.5 \sigma0.5σ0.5z zz很大时逼近 1z zz很负时逼近 0。在网络里Sigmoid 可以作为输出层二分类概率逻辑回归同款隐藏层能用但深层网络里不如 ReLU 常见原因稍后与「梯度消失」一起说两端太平梯度容易变得极小。汽车高效分类里若最后一层输出的是「是否高效」的概率用 Sigmoid 仍然很自然但若在每一层隐藏单元上都套 Sigmoid训练深层时往往更难受——这和「输出层要概率」不是同一需求别混着用。3.1 和逻辑回归的关系逻辑回归可以看成没有隐藏层、输出激活为 Sigmoid 的网络。加上隐藏层并在隐藏单元上也用非线性之后模型才从「一条超平面」走向「可弯折的决策面」。参数变多第 21 篇的过拟合控制依旧适用。4. tanh压到 -11tanh ⁡ ( z ) e z − e − z e z e − z \tanh(z) \frac{e^{z}-e^{-z}}{e^{z}e^{-z}}tanh(z)eze−zez−e−z​形状也像 S但值域是( − 1 , 1 ) (-1,1)(−1,1)大致关于原点对称零中心有时比 Sigmoid 更适合当隐藏激活。Sigmoidtanh值域( 0 , 1 ) (0,1)(0,1)( − 1 , 1 ) (-1,1)(−1,1)零点附近偏正可正可负深层隐藏层较少作默认曾常用现多被 ReLU 替代两端同样会饱和∥ z ∥ \|z\|∥z∥很大时斜率接近 0深层训练仍可能吃力。早期不少教程默认隐藏层用 tanh现在更常见的起点是 ReLUtanh 仍值得认识因为它帮助理解「零中心」与「饱和」这两个训练现象。5. ReLU小于 0 置零否则原样通过ReLURectified Linear Unit修正线性单元ReLU ⁡ ( z ) max ⁡ ( 0 , z ) \operatorname{ReLU}(z) \max(0,\ z)ReLU(z)max(0,z)z 0 z 0z0→ 输出0 00z ≥ 0 z \ge 0z≥0→ 输出z zz它看起来「有一半是直线」但整体仍是非线性折线因此「线性套 ReLU 再套线性」不能再合并成单层线性——第 23 篇的反例被打破了。工程上隐藏层常从 ReLU 起步常见理由点说明计算便宜不用指数比 Sigmoid / tanh 快深层更好训正半轴梯度为 1相对不易「梯度消失」够用很多表格 / 图像任务上表现稳定「梯度消失」可以先建立直觉反传时若每层梯度都乘一个很小的数Sigmoid 饱和区导数接近 0靠输入的那几层几乎学不动。ReLU 在z 0 z0z0时导数为 1这条链不那么容易断。细节会在反向传播篇展开。也有代价若大量神经元长期z 0 z0z0可能「死掉」很少更新dying ReLU可用 Leaky ReLU 等变体入门阶段先掌握标准 ReLU 即可。5.1 选激活时的实用顺序隐藏层先 ReLU二分类输出Sigmoid多分类输出Softmax后续篇回归输出多数情况不加激活或按标签是否非负再决定验证集上若训练不动再检查学习率、初始化其次才换激活变体6. 手算同一套权重加上 ReLU 之后沿用第 23 篇的微型网络。输入x ( 1.0 , 2.0 ) \mathbf{x}(1.0,\ 2.0)x(1.0,2.0)z 1 0.7 , z 2 0.4 \begin{aligned} z_1 0.7,\quad z_2 0.4 \\ \end{aligned}z1​​0.7,z2​0.4​加权和结果与上篇相同。无激活时h ( 0.7 , 0.4 ) h(0.7,\ 0.4)h(0.7,0.4)再线性得到y ′ − 0.24 y-0.24y′−0.24且可合并成等效单层。加 ReLU后两者都 0 00故a ReLU ⁡ ( z ) z a\operatorname{ReLU}(z)zaReLU(z)z这一组数碰巧与无激活相同。换一组权重让某个z zz变负差别就出现了设z 1 0.7 z_10.7z1​0.7z 2 − 0.5 z_2-0.5z2​−0.5则a 1 0.7 , a 2 ReLU ⁡ ( − 0.5 ) 0 a_10.7,\quad a_2\operatorname{ReLU}(-0.5)0a1​0.7,a2​ReLU(−0.5)0输出若仍用y ′ − 1.0 0.8 a 1 0.5 a 2 y-1.00.8 a_10.5 a_2y′−1.00.8a1​0.5a2​y ′ − 1.0 0.8 × 0.7 0.5 × 0 − 0.44 y-1.00.8\times 0.70.5\times 0 -0.44y′−1.00.8×0.70.5×0−0.44若没有 ReLUz 2 − 0.5 z_2-0.5z2​−0.5会继续乘进下一层结果不同。更重要的是无法再写成与「无隐藏层线性模型」完全等价的固定W eff W_{\text{eff}}Weff​——因为「小于 0 砍掉」阻断了线性合并。再看汽车直觉某个隐藏单元可能表示「偏重且大排量」一类的组合信号。当加权和为负时ReLU 相当于说「这个组合当前不成立先别往下传」为正时则按强度传递。这种开关式行为是纯线性层给不了的。7. 完整神经网络的三块积木到这里日常说的「神经网络」通常包含组件作用分层节点输入 / 隐藏 / 输出权重与偏置层与层之间的可学习连接激活函数把非线性塞进前向路径不同层可用不同f ff常见搭配隐藏层ReLU默认起点二分类输出Sigmoid回归输出常常不用激活或按标签范围另选提醒网络灵活不代表一定优于精心设计的特征交叉数据干净、评估正确第 1822 篇仍然优先。网络是多一条路不是免检通行证。对汽车油耗这类中小表格常见路径是线性 / 逻辑回归基线 → 少量手工特征 → 浅层 ReLU 网络。若浅层都过拟合先加数据或加强正则而不是先换更花的激活。8. 动手有无激活能否合并成单层importnumpyasnp Xnp.array([[1.0,2.0],[0.5,1.0]])W1np.array([[0.5,-0.4],[0.1,0.3]])b1np.array([0.0,0.2])W2np.array([0.8,0.5])b2-1.0defforward_linear(x):hx W1b1returnh W2b2defforward_relu(x):zx W1b1 anp.maximum(z,0.0)# ReLUreturna W2b2# 制造一个会触发 ReLU 截断的权重W1_negW1.copy()W1_neg[0,1]-2.0# 让 h2 更容易为负defforward_relu_neg(x):zx W1_negb1 anp.maximum(z,0.0)returnz,a,a W2b2print(all-positive hidden, linear vs relu:)print( linear,[forward_linear(x)forxinX])print( relu ,[forward_relu(x)forxinX])print(\nwith negative pre-activation:)forxinX:z,a,yforward_relu_neg(x)y_lin(x W1_negb1) W2b2print(fx{x}, z{z}, a{a}, y_relu{y:.4f}, y_no_act{y_lin:.4f})# 无激活时可合并有 ReLU 后对全体 x 不存在单一 W_effW_effW1 W2 b_effb1 W2b2print(\neffective linear matches no-act:,np.allclose(X W_effb_eff,[forward_linear(x)forxinX]))当隐藏预激活有正有负时y_relu与y_no_act会分开无激活时仍能被W_eff复现。这就是激活函数的存在感。若在隐藏层改用1/(1np.exp(-z))数值会落在( 0 , 1 ) (0,1)(0,1)一般也不能再与「无隐藏的线性模型」全局等价——非线性一旦插入合并技巧就失效。ReLU 只是最容易手算、也最常作为默认的那一种。9. 能力边界与常见误区9.1 适用边界本篇讲前向里的非线性训练时梯度如何过激活见下一篇反向传播。还有 Softmax、GELU、Swish 等入门先吃透 Sigmoid / tanh / ReLU。输出激活要服从任务概率用 Sigmoid / Softmax任意实数回归通常裸输出。9.2 常见误区误区正解有隐藏层就有非线性还要有非线性激活ReLU「是直线」所以是线性模型折线整体非线性且不可随意合并层隐藏层必须用 Sigmoid深层更常从 ReLU 起激活选得越花哨越好先 ReLU 数据纪律再谈花式变体输出也一律 ReLU回归标签可为负时会被错误截断激活可以替代清洗与划分脏数据、泄漏、不平衡仍按第 1822 篇处理选型时不必纠结「哪一种绝对最好」先保证前向里真的有非线性再用验证集比较 ReLU 与少数备选。多数入门项目里隐藏 ReLU 合适输出激活已经够用。10. 关键术语速查术语含义激活函数对z zz做非线性变换得到a aa预激活z zz加权和w ⋅ x b w\cdot xbw⋅xbSigmoid映射到( 0 , 1 ) (0,1)(0,1)tanh映射到( − 1 , 1 ) (-1,1)(−1,1)ReLUmax ⁡ ( 0 , z ) \max(0,z)max(0,z)梯度消失深层梯度过小靠前层难更新饱和激活落在斜率近 0 的区段11. 延伸阅读资源适合看什么专栏第 06 篇Sigmoid 与概率直觉专栏第 23 篇无激活时为何仍线性NumPy maximumReLU 的向量化写法专栏第 21 篇网络变强后的过拟合控制12. 小结激活函数把非线性插进「加权和 → 下一层」之间。Sigmoid、tanh、ReLU 是三条常用曲线隐藏层多数情况先试 ReLU二分类输出仍常用 Sigmoid。没有激活多层只是线性模型的花式写法有了激活堆层才开始具备拟合弯曲关系的能力。前向路径可以写成z Wx b → a f(z) → 再进入下一层结构第 23 篇加上激活本篇之后网络的前向计算路径齐了接下来要解决的是损失怎样把错误信号送回每一层的权重——即反向传播。下一篇进入反向传播说明损失怎样把梯度一层层传回到各层的权重与偏置网络怎样更新参数并真正学起来。系列导航上一篇【机器学习】23—— 神经网络入门下一篇预告反向传播——神经网络如何更新权重如果本篇对你有帮助欢迎点赞、收藏、关注博主机器学习专栏持续更新中下次更新不迷路。