2 I! f i S+ K+ U* L) x) @0 m+ r% s: T; E0 B/ Y7 e1 w
1 D, f, u6 T/ ~9 r2 c2 S+ U7 x # V5 q% r$ x, u$ a' q# ? ! u) B: Y# a" z 5 j- D% \7 c; E! T$ g' l0 O2 q2 ^1 Z$ I6 y2 P
激活函数 ϕ(⋅ ) : O; }* l I- i4 c
可以有以下几种: 6 x. ?3 L8 |& c0 Z
- e {4 c1 Z+ R6 C) q (0)Softmax - 用于多分类神经网络输出- ^: j3 _9 \( } , V9 j9 R& I# L X1 H4 \ $ q" @2 q0 J0 d . u4 o0 ] U9 e# ^( u(1)阈值函数 、阶梯函数! H c- L. @) {2 a* M. e
6 ]* e( S) Y% B9 w# x5 E % t7 u s: a1 ]. c3 n
[. }( }4 ~% p) [( U) i. h. F/ {相应的输出 为 4 a& Y5 _% t1 q/ p" M4 W9 O' V# B8 p' O- n7 w g 6 d% ]* V! u3 u- ?, D. U, q/ E
. ^1 L0 _/ H" g
(2)分段线性函数 ' F$ F. z( O0 `# T H% {6 B% ~1 l1 q0 i
: [7 }2 v" |% O. q+ M+ A 8 [; z5 ?( r/ e- z* x 9 j2 q4 i/ `' \ u1 |, E0 l它类似于一个放大系数为 1 的非线性放大器,当工作于线性区时它是一个线性组合器, 放大系数趋于无穷大时变成一个阈值单元。 7 g6 w8 c( u5 G" O, i0 N' t : X3 l8 c: I& e% j(3)sigmoid 函数 (以前最常用) + s" y8 `, K5 T+ d8 X& N1 x6 O2 ?$ H
9 q/ E$ f- ?3 Y! W) x8 X9 y, g; d' H- K. y& @" ~- p
8 b$ F v! B* Y- h& `- u0 C参数 α > 0 可控制其斜率。 sigmoid 将一个实值输入压缩至[0,1]的范围,也可用于二分类的输出层。- ^$ Y' a0 t( E) Q; `, r L" p) |/ e
) f& Y$ N8 ^, t+ p2 _; S) Y3 ]
(4)tanh (双曲正切函数 ;Hyperbolic tangent function) , l1 x3 Z& b6 }7 ~+ c" |( k1 a( E* L8 w) y1 j $ c3 w* L) k3 Z. O4 A
: c' S: N( z% K
将 一个实值输入压缩至 [-1, 1]的范围,这类函数具有平滑和渐近性,并保持单调性. 0 }" \& x3 }3 N3 l! i u3 H# r9 l5 V + W# x) E4 ]7 }0 d# d, Q* `* W" p( C! O. H3 t
(5) relu (Rectified linear unit; 修正线性单元 ; 深度学习目前最常用的激活函数) ; s9 |9 N. ?) c" a& z 7 s- K9 \* V. T7 N. }5 W* M6 a: W
4 i' z6 n1 D+ @; H; v : H2 z" K$ P. V# Relu在tensorflow中的实现: 直接调用函数 + X5 z6 k/ y: |# U4 I
tf.nn.relu( features, name= None )0 L- Z: X4 t3 B9 M" ^
. m, l/ c! o& s% D: r0 Y3 K
与Sigmoid/tanh函数相比,ReLu激活函数的优点是:; H7 {2 k6 h$ s& L
3 O) ^1 f' Z1 j8 X; e& B+ J6 f 使用梯度下降(GD)法时,收敛速度更快 7 D c9 d# _3 L* ?9 \! n) |
相比Relu只需要一个门限值,即可以得到激活值,计算速度更快 ( a3 m. G1 O: g3 w/ R: ` 缺点是: Relu的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“Dead Neuron”。 / v8 S1 Q9 j$ L1 v! h5 M+ D. s3 l% ^: m
为了解决Relu函数这个缺点,在Relu函数的负半区间引入一个泄露(Leaky)值,所以称为Leaky Relu函数。 2 v: a0 T/ k I5 b$ Z5 `) N* j2 M! s/ I* @1 x# Y; N
(6)Leaky Relu (带泄漏单元的relu )$ ~& ?2 k V5 d6 k; P
. m- e' F2 f. `# u c 数学表达式: y = max(0, x) + leak*min(0,x) ; b r' \3 }# j$ |% k" z+ F' ?' ~' H1 K/ I- a9 T
与 ReLu 相比 ,leak 给所有负值赋予一个非零斜率, leak是一个很小的常数 ,这样保留了一些负轴的值,使得负轴的信息不会全部丢失) ; W: |( N4 ~' x. S, O+ J; ~. G 0 s$ x& {+ _9 l5 M; x* k# R% x+ r4 @$ D9 n
leaky ReLU1 |5 I0 \6 |& {6 k3 K1 _% H
8 x3 ~% e, T. _0 r" L 0 m( Q: l9 Q' [ [
9 m( ]. {& Q1 n1 b" f: W' N5 t1 K& U
#leakyRelu在tennsorflow中的简单实现! `8 }8 @* `- q+ R* z! l
tf.maximum(leak * x, x), , k, R$ i0 \. u2 C # ]5 c: b# ]1 _: l. q/ ?, p: K8 E5 }& a
比较高效的写法为:% V7 X7 X0 Q3 s+ U: k. J$ ^' S
' j, Z- |& ~ l2 ]
import tensorflow as tf6 Z0 H8 r) F6 G# B& ]2 [
def LeakyReLU(x,leak=0.2,name="LeakyReLU"): 0 D* Y/ x/ O% {+ ~! O, h( ?5 i with tf.variable_scope(name):' K) M! a L- A5 D v; {' t9 K7 c
f1 = 0.5*(1 + leak) 3 a" `0 V5 V5 f$ y f2 = 0.5*(1 - leak) 4 i/ u( G0 G# e# Q% b0 m) `0 g return f1*x+f2*tf.abs(x) |4 C% N. k. }$ h& A9 w/ N
6 N* f& X" H. `' w8 \
(vi) RReLU【随机ReLU】8 B) c5 ]1 i- K; n
7 X; `; L, e) p& T. d8 g
在训练时使用RReLU作为激活函数,则需要从均匀分布U(I,u)中随机抽取的一个数值 ,作为负值的斜率。$ M! r9 d3 v4 h2 D9 q6 a
# o# M; {6 i# f- [! k . E" j) Y; @* a0 R# x3 h" \" Z
$ i* z/ l' b" Q6 ~) t& ?6 L总结: 激活函数可以分为 两大类 8 e% Z1 c, I% A8 O& |9 s Z+ u / `2 C, h0 N6 N$ s/ Q/ l饱和激活函数: sigmoid、 tanh& Y8 A3 v8 l' s* ` s/ X
非饱和激活函数: ReLU 、Leaky Relu 、ELU【指数线性单元】、PReLU【参数化的ReLU 】、RReLU【随机ReLU】, k7 U1 J) H, K2 w- N' k
" ~# {% ~4 E, r; O# L1 g0 a, @" } ^! J. R( v _0 V) g( o& S
: m( n: r1 a8 I) |: h相对于饱和激活函数,使用“非饱和激活函数”的优势在于两点: # ?% b8 \3 b, n: U6 G j 1.首先,“非饱和激活函数”能解决深度神经网络【层数非常多!!】的“梯度消失”问题,浅层网络【三五层那种】才用sigmoid 作为激活函数。/ ]# P( c, Z) I# O/ C! ~, {
2.其次,它能加快收敛速度。 4 C& Y0 k2 j' Q4 l T) T% w
2 _# F$ L% I$ {/ z( B; E. a
其它激活函数:softplus、softsign3 z' _8 J6 H5 J0 u0 u