激活函數在深度學習中扮演着非常重要的角色,它給網絡賦予了非線性,從而使得神經網絡能夠擬合任意復雜的函數。
如果沒有激活函數,無論多復雜的網絡,都等價於單一的線性變換,無法對非線性函數進行擬合。
目前,深度學習中最流行的激活函數為 relu, 但也有些新推出的激活函數,例如 swish、GELU 據稱效果優於relu激活函數。
激活函數的綜述介紹可以參考下面兩篇文章。
https://zhuanlan.zhihu.com/p/98472075
https://zhuanlan.zhihu.com/p/98863801
一,常用激活函數
- tf.nn.sigmoid:將實數壓縮到0到1之間,一般只在二分類的最后輸出層使用。主要缺陷為存在梯度消失問題,計算復雜度高,輸出不以0為中心。
- tf.nn.softmax:sigmoid的多分類擴展,一般只在多分類問題的最后輸出層使用。
- tf.nn.tanh:將實數壓縮到-1到1之間,輸出期望為0。主要缺陷為存在梯度消失問題,計算復雜度高。
- tf.nn.relu:修正線性單元,最流行的激活函數。一般隱藏層使用。主要缺陷是:輸出不以0為中心,輸入小於0時存在梯度消失問題(死亡relu)。
- tf.nn.leaky_relu:對修正線性單元的改進,解決了死亡relu問題。
- tf.nn.elu:指數線性單元。對relu的改進,能夠緩解死亡relu問題。
- tf.nn.selu:擴展型指數線性單元。在權重用tf.keras.initializers.lecun_normal初始化前提下能夠對神經網絡進行自歸一化。不可能出現梯度爆炸或者梯度消失問題。需要和Dropout的變種AlphaDropout一起使用。
- tf.nn.swish:自門控激活函數。谷歌出品,相關研究指出用swish替代relu將獲得輕微效果提升。
- gelu:高斯誤差線性單元激活函數。在Transformer中表現最好。tf.nn模塊尚沒有實現該函數。
二,在模型中使用激活函數
在keras模型中使用激活函數一般有兩種方式,一種是作為某些層的activation參數指定,另一種是顯式添加layers.Activation激活層。
import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras import layers,models tf.keras.backend.clear_session() model = models.Sequential() model.add(layers.Dense(32,input_shape = (None,16),activation = tf.nn.relu)) #通過activation參數指定 model.add(layers.Dense(10)) model.add(layers.Activation(tf.nn.softmax)) # 顯式添加layers.Activation激活層 model.summary()
參考:
開源電子書地址:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/
GitHub 項目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days