神经网络学习笔记 - 激活函数的作用、定义和微分证明
看到知乎 上对激活函数(Activation Function)的解释。
我一下子迷失了。
因此,匆匆写下我对激活函数的理解。
激活函数被用到了什么地方
目前为止,我见到使用激活函数的地方有两个。
逻辑回归(Logistic Regression)
神经网络(Neural Network)
这两处,激活函数都用于计算一个线性函数的结果。
了解激活函数
激活函数的作用:就是将权值结果转化成分类结果 。
2类的线性分类器
先说一个简单的情况 - 一个2类的线性分类器。
了解激活函数,先要明确我们的问题是:"计算一个(矢量)数据的标签(分类) "。
以下图为例:
训练
训练的结果,是一组( w , b ) ( w , b ) ,和一个线性函数f ( x ) = w x + b f ( x ) = w x + b 。
预测
我们现在仔细考虑一下,如何在预测函数中使用这个线性函数f ( x ) f ( x ) 。
先从几何方面理解一下,如果预测的点在分割线w x + b = 0 w x + b = 0 上,那么f ( x ) = w x + b = 0 f ( x ) = w x + b = 0 。
如果,在分割线的上方某处,f ( x ) = w x + b = 8 f ( x ) = w x + b = 8 (假设是8)。
8可以认为是偏移量。
注:取决于(w, b),在分割线上方的点可以是正的,也可能是负的。
例如: y - x =0,和 x - y = 0,这两条线实际上是一样的。
但是,应用点(1, 9)的结果, 第一个是8, 第二个是 -8。
问题
然后,你该怎么办???
如何用这个偏移量来得到数据的标签 ?
激活函数
激活函数的作用是:将8变成红色。
怎么变的呢?比如:我们使用sigmoid函数,sigmoid(8) = 0.99966464987。
sigmoid函数的结果在区间(0, 1)上。如果大于0.5,就可以认为满足条件,即是红色。
3类分类器的情况
我们再看看在一个多类分类器中,激活函数的作用。
以下图为例:
训练
3类a , b , c a , b , c 分类器的训练结果是3个( w , b ) ( w , b ) ,三个f ( x ) f ( x ) ,三条分割线。
每个f ( x ) f ( x ) ,可以认为是针对一个分类的model。因此:
f a ( x ) = w a x + b a f b ( x ) = w b x + b b f c ( x ) = w c x + b c (1) (1) f a ( x ) = w a x + b a f b ( x ) = w b x + b b f c ( x ) = w c x + b c
预测
对于预测的点x x ,会得到三个偏移量[ f a ( x ) , f b ( x ) , f c ( x ) ] [ f a ( x ) , f b ( x ) , f c ( x ) ] 。
使用激活函数sigmoid:
s i g m o i d ( [ f a ( x ) , f b ( x ) , f c ( x ) ] ) s i g m o i d ( [ f a ( x ) , f b ( x ) , f c ( x ) ] )
会得到一个向量, 记为:[ S a , S b , S c ] [ S a , S b , S c ] 。
这时的处理方法是:再次使用激活函数(没想到吧)
一般会使用激活函数softmax。
激活函数,在这里的作用是:计算每个类别的可能性。
最后使用argmax函数得到:最大可能性的类。
注:上面差不多是Logistic Regression算法的一部分。
注:softmax也经常被使用于神经网络的输出层。
激活函数的来源
在学习神经网络的过程中,激活函数的灵感来自于生物神经网络,被认为是神经元对输入的激活程度。
最简单的输出形式是:一个开关,0 , 1 0 , 1 。 要么0 0 ,要么1 1 。
也就是一个单位阶跃函数 (Heaviside step function)。
这种思想主要是一种灵感来源,并不是严格的推理。
常用的激活函数有哪些
名称
公式
取值范围
微分
图
sigmoid - S型
σ ( x ) = e x 1 + e x = 1 1 + e − x (2) (3) (2) σ ( x ) = e x 1 + e x (3) = 1 1 + e − x
( 0 , 1 ) ( 0 , 1 )
σ ′ ( x ) = ( 1 − σ ( x ) ) σ ( x ) (4) (4) σ ′ ( x ) = ( 1 − σ ( x ) ) σ ( x )
tanh(hyperbolic tangent) - 双曲正切
t a n h ( x ) = s i n h ( x ) / c o s h ( x ) = e x − e − x e x + e − x = e 2 x − 1 e 2 x + 1 = 1 − e − 2 x 1 + e − 2 x (5) (6) (7) (8) (5) t a n h ( x ) = s i n h ( x ) / c o s h ( x ) (6) = e x − e − x e x + e − x (7) = e 2 x − 1 e 2 x + 1 (8) = 1 − e − 2 x 1 + e − 2 x
( − 1 , 1 ) ( − 1 , 1 )
t a n h ′ ( x ) = 1 − t a n h ( x ) 2 (9) (9) t a n h ′ ( x ) = 1 − t a n h ( x ) 2
Rectified linear unit - ReLU - 修正线性单元
r e l u ( x ) = { 0 for x < 0 x for x ⩾ 0 (10) (10) r e l u ( x ) = { 0 for x < 0 x for x ⩾ 0
[ 0 , ∞ ) [ 0 , ∞ )
r e l u ′ ( x ) = { 0 for x < 0 1 for x ⩾ 0 (11) (11) r e l u ′ ( x ) = { 0 for x < 0 1 for x ⩾ 0
softmax
f ( → x ) = [ ⋯ e x i ∑ k = K k = 1 e x k ⋯ ] (12) (12) f ( x → ) = [ ⋯ e x i ∑ k = 1 k = K e x k ⋯ ]
( 0 , 1 ) ( 0 , 1 )
s o f t m a x ′ ( z t ) = ∂ y t ∂ z t = { ^ y t i ( 1 − ^ y t i ) , if i = j − ^ y t i ^ y t j , if i ≠ j (13) (13) s o f t m a x ′ ( z t ) = ∂ y t ∂ z t = { y t i ^ ( 1 − y t i ^ ) , if i = j − y t i ^ y t j ^ , if i ≠ j
激活函数的意义
名称
含义
sigmoid - S型
sigmoid的区间是[0, 1]。因此,可以用于表示Yes/No这样的信息。
比如:不要(0)/要(1)。
多用于过滤数据。比如:门。
tanh(hyperbolic tangent) - 双曲正切
tanh的区间是[-1, 1]。同样可以表示Yes/No的信息,而且加上了程度。
比如:
非常不可能(-1)/一般般(0)/非常可能(1)。
非常不喜欢(-1)/一般般(0)/非常喜欢(1)。
因此,tanh多用于输出数据。输出数据最终会使用softmax来计算可能性。
softmax
softmax用于输出层,计算每个分类的可能性。
Rectified linear unit - ReLU - 修正线性单元
ReLU的好处:ReLU对正值较少的数据,处理能力更强。
由于,其导数为{0, 1},可以避免梯度消失问题。
激活函数的微分的证明
sigmoid
sigmoid函数
σ ( x ) = 1 1 + e − x σ ′ ( x ) = ( 1 − σ ( x ) ) σ ( x ) (14) (14) σ ( x ) = 1 1 + e − x σ ′ ( x ) = ( 1 − σ ( x ) ) σ ( x )
证明
∂ σ ( x ) ∂ x = e − x ( 1 + e − x ) 2 = ( 1 + e − x − 1 1 + e − x ) ( 1 1 + e − x ) = ( 1 − σ ( x ) ) σ ( x ) (15) (16) (17) (15) ∂ σ ( x ) ∂ x = e − x ( 1 + e − x ) 2 (16) = ( 1 + e − x − 1 1 + e − x ) ( 1 1 + e − x ) (17) = ( 1 − σ ( x ) ) σ ( x )
tanh
tanh函数
tanh ( x ) = e 2 x − 1 e 2 x + 1 t a n h ′ ( x ) = 1 − t a n h ( x ) 2 (18) (18) tanh ( x ) = e 2 x − 1 e 2 x + 1 t a n h ′ ( x ) = 1 − t a n h ( x ) 2
证明
∂ t a n h ( x ) ∂ x = ( 1 − 2 e 2 x + 1 ) ′ = 2 ⋅ 2 e 2 x ( e 2 x + 1 ) 2 = 4 e 2 x ( e 2 x + 1 ) 2 = ( e 2 x + 1 ) 2 − ( e 2 x − 1 ) 2 ( e 2 x + 1 ) 2 = 1 − ( e 2 x − 1 e 2 x + 1 ) 2 = 1 − t a n h ( x ) 2 (19) (20) (21) (22) (23) (24) (19) ∂ t a n h ( x ) ∂ x = ( 1 − 2 e 2 x + 1 ) ′ (20) = 2 ⋅ 2 e 2 x ( e 2 x + 1 ) 2 (21) = 4 e 2 x ( e 2 x + 1 ) 2 (22) = ( e 2 x + 1 ) 2 − ( e 2 x − 1 ) 2 ( e 2 x + 1 ) 2 (23) = 1 − ( e 2 x − 1 e 2 x + 1 ) 2 (24) = 1 − t a n h ( x ) 2
softmax
激活函数softmax和损失函数会一起使用。
激活函数会根据输入的参数(一个矢量,表示每个分类的可能性),计算每个分类的概率(0, 1)。
损失函数根据softmax的计算结果^ y y ^ 和期望结果y y ,根据交叉熵方法(cross entropy loss) 可得到损失L L 。
softmax函数
softmax: ^ y t i = s o f t m a x ( o t i ) = e o t i ∑ k e o t k ^ y t = s o f t m a x ( z t ) = [ ⋯ e o t i ∑ k e o t k ⋯ ] s o f t m a x ′ ( z t ) = ∂ y t ∂ z t = { ^ y t i ( 1 − ^ y t i ) , if i = j − ^ y t i ^ y t j , if i ≠ j (25) (25) softmax: y t i ^ = s o f t m a x ( o t i ) = e o t i ∑ k e o t k y t ^ = s o f t m a x ( z t ) = [ ⋯ e o t i ∑ k e o t k ⋯ ] s o f t m a x ′ ( z t ) = ∂ y t ∂ z t = { y t i ^ ( 1 − y t i ^ ) , if i = j − y t i ^ y t j ^ , if i ≠ j
证明
s o f t m a x ′ ( z t ) = ∂ ^ y t ∂ z t if i = j ∂ ^ y t i ∂ o t i = ( e o t i ∑ k e o t k ) ′ = ( 1 − S ∑ k e o t k ) ′ // set S = ∑ k ≠ i e o t k = ( 1 − S S + e o t i ) ′ = S ⋅ e o t i ( S + e o t i ) 2 = S S + e o t i ⋅ e o t i S + e o t i = S S + e o t i ⋅ e o t i S + e o t i = ( 1 − e o t i S + e o t i ) ⋅ e o t i S + e o t i = ( 1 − e o t i ∑ k e o t k ) ⋅ e o t i ∑ k e o t k = ( 1 − ^ y t i ) ⋅ ^ y t i if i ≠ j ∂ ^ y t j ∂ o t i = ( e o t j ∑ k e o t k ) ′ = ( e o t j S + e o t i ) ′ // set S = ∑ k ≠ i e o t k = − e o t j ⋅ e o t i ( S + e o t i ) 2 = − e o t j S + e o t i ⋅ e o t i S + e o t i = − e o t j ∑ k e o t k ⋅ e o t i ∑ k e o t k = − ^ y t j ⋅ ^ y t i (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) s o f t m a x ′ ( z t ) = ∂ y t ^ ∂ z t if i = j (26) ∂ y t i ^ ∂ o t i = ( e o t i ∑ k e o t k ) ′ (27) = ( 1 − S ∑ k e o t k ) ′ // set S = ∑ k ≠ i e o t k (28) = ( 1 − S S + e o t i ) ′ (29) = S ⋅ e o t i ( S + e o t i ) 2 (30) = S S + e o t i ⋅ e o t i S + e o t i (31) = S S + e o t i ⋅ e o t i S + e o t i (32) = ( 1 − e o t i S + e o t i ) ⋅ e o t i S + e o t i (33) = ( 1 − e o t i ∑ k e o t k ) ⋅ e o t i ∑ k e o t k (34) = ( 1 − y t i ^ ) ⋅ y t i ^ (35) if i ≠ j (36) ∂ y t j ^ ∂ o t i = ( e o t j ∑ k e o t k ) ′ (37) = ( e o t j S + e o t i ) ′ // set S = ∑ k ≠ i e o t k (38) = − e o t j ⋅ e o t i ( S + e o t i ) 2 (39) = − e o t j S + e o t i ⋅ e o t i S + e o t i (40) = − e o t j ∑ k e o t k ⋅ e o t i ∑ k e o t k (41) = − y t j ^ ⋅ y t i ^
参照
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具