# Activation
[Activation解釋](http://tflearn.org/layers/core/#activation)
[Activation源碼](https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)
def activation(incoming, activation='linear', name='activation'):
""" Activation.
Apply given activation to incoming tensor.
Arguments:
incoming: A `Tensor`. The incoming tensor.
activation: `str` (name) or `function` (returning a `Tensor`).
Activation applied to this layer (see tflearn.activations).
Default: 'linear'.
"""
## Activation解釋
激活函數(Activation Function)運作時激活神經網絡中某一部分神經元,将激活資訊向後傳入下一層的神經網絡。神經網絡的數學基礎是處處可微的,是以選取激活函數要保證資料輸入與輸出也是可微的。
### 激勵函數的作用
如果不使用激活函數,此時激活函數本質上相當于f(x)=ax+b。這種情況先,神經網絡的每一層輸出都是上層輸入的線性函數。不難看出,不論神經網絡有多少層,輸出與輸入都是線性關系,與沒有隐層的效果是一樣的,這個就是相當于是最原始的感覺機(Perceptron)。至于感覺機,大家知道其連最基本的異或問題都無法解決,更别提更複雜的非線性問題。
神經網絡之是以能處理非線性問題,這歸功于激活函數的非線性表達能力
### TFLearn官方提供的激活函數:
[Activation Functions](https://www.tensorflow.org/api_guides/python/nn#activation-functions)
-
tf.nn.relu
-
tf.nn.relu6
-
tf.nn.crelu
-
tf.nn.elu
-
tf.nn.selu
-
tf.nn.softplus
-
tf.nn.softsign
-
tf.nn.dropout
-
tf.nn.bias_add
-
tf.sigmoid
-
tf.tanh
***sigmoid函數***
被稱為S型函數,它可以将整個實數區間映射到(0,1)區間,是以經常被用來計算機率,它也是在傳統神經網絡中被經常使用的一種激活函數。
優點:它輸出映射在(0,1)内,單調連續,非常适合用作輸出層,并且求導比較容易;
缺點:具有軟飽和性,一旦輸入落入飽和區,一階導數就變得接近于0,很容易産生梯度消失。
飽和性:當|x|>c時,其中c為某常數,此時一階導數等于0,通俗的說一階導數就是上圖中的斜率,函數越來越水準。
sigmoid函數的用法如下:
g = tflearn.input_data(shape=[None, 1])
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2.,
loss='mean_square')
sigmoid函數的優點:
在x=5的點和x=10的點原本相差很遠(10-5=5)的點,在激活之後,也就是x=5和x=10對應的y坐标的值,相差的不大。比如說有一個噪聲誤差,在x=1000處,其他的點都分布在x=5到x=10之間,那麼sigmoid的函數就可以很好的去掉這種誤差帶來的影響。
***tanh***
雙曲正切函數,它将整個實數區間映射到了(-1,1),tanh函數也具有軟飽和性。它的輸出是以0為中心,tanh的收斂速度比sigmoid要快,由于存在軟飽和性,是以tanh也存在梯度消失的問題。
***relu激活函數***
現在是最受歡迎的激活函數,經常被使用在神經網絡中。relu函數的定義:f(x)=max(x,0)
在TensorFlow中還包括了relu函數的擴充函數如:relu6和crelu,除此之外還有leaky relu、PRelu、RRelu等。
- relu6激活函數:定義min(max(features,0),6),也就是說它的取值區間被限定在了[0,6]之間。
***softmax函數***
[Softmax 函數的特點和作用](https://www.cnblogs.com/liuyu124/p/7332476.html)
softmax 是一個不錯的激活函數。通過取每個元素的指數,然後歸一化向量(使用任意的範數(norm),比如向量的普通歐幾裡得距離)進而将 softmax 應用于向量。
我們先來直覺看一下,Softmax究竟是什麼意思
我們知道max,假如說我有兩個數,a和b,并且a>b,如果取max,那麼就直接取a,沒有第二種可能
但有的時候我不想這樣,因為這樣會造成分值小的那個饑餓。是以我希望分值大的那一項經常取到,分值小的那一項也偶爾可以取到,那麼我用softmax就可以了 現在還是a和b,a>b,如果我們取按照softmax來計算取a和b的機率,那a的softmax值大于b的,是以a會經常取到,而b也會偶爾取到,機率跟它們本來的大小有關。是以說不是max,而是 softmax 那各自的機率究竟是多少呢,我們下面就來具體看一下,
也就是說,是該元素的指數,與所有元素指數和的比值
這個定義可以說非常的直覺,當然除了直覺樸素好了解以外,它還有更多的優點
***dropout函數***
dropout函數會以一個機率為keep_prob來決定神經元是否被抑制。如果被抑制,該神經元輸出為0,如果不被抑制則該神經元的輸出為輸入的1/keep_probbe倍,每個神經元是否會被抑制是互相獨立的。神經元是否被抑制還可以通過調節noise_shape來調節,當noise_shape[i] == shape(x)[i],x中的元素是互相獨立的。如果shape(x)=[k,l,m,n](k表示資料的個數,l表示資料的行數,m表示資料的列,n表示通道),當noise_shape=[k,1,1,n],表示資料的個數與通道是互相獨立的,但是與資料的行和列是有關聯的,即要麼都為0,要麼都為輸入的1/keep_prob倍。
dropout函數對于機器學習中是非常常用的,是以會單獨提取出來讨論。
## 常見激活函數優缺點比較
[激活函數的比較和優缺點,sigmoid,tanh,relu](https://blog.csdn.net/u011684265/article/details/78039280)
- Sigmoid實作簡單、計算量小。----缺點:函數梯度飽和、收斂緩慢。
- tanh在特征相差明顯時的效果會很好,在循環過程中會不斷擴大特征效果。-----缺點:與 sigmoid 的差別是,tanh 是 0 均值的,是以實際應用中 tanh 會比 sigmoid 更好。
-
ReLU得到的 SGD 的收斂速度會比 sigmoid/tanh 快很多。-----缺點:訓練的時候很”脆弱”,很容易就”die”了
例如,一個非常大的梯度流過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何資料有激活現象了,那麼這個神經元的梯度就永遠都會是 0. 如果 learning rate 很大,那麼很有可能網絡中的 40% 的神經元都”dead”了。
- Softmax 的特點 1)單側抑制。 2)相對寬闊的興奮邊界。 3)稀疏激活性。softmax回歸進行的多分類,類與類之間是互斥的,即一個輸入隻能被歸為一類;多個logistic回歸進行多分類,輸出的類别并不是互斥的,即"蘋果"這個詞語既屬于"水果"類也屬于"3C"類别。
## 使用場景
一般二分類問題中,隐藏層用tanh函數,輸出層用sigmod函數。
多分類神經網絡輸出通常使用softmax
tanh在特征相差明顯時的效果會很好 在循環過程中會不斷擴大特征效果
ReLU用于隐層神經元輸出
# Dropout
[Dropout解釋](http://tflearn.org/layers/core/#dropout)
[Activation源碼](https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)
def dropout(incoming, keep_prob, noise_shape=None, name="Dropout"):
""" Dropout.
Outputs the input element scaled up by `1 / keep_prob`. The scaling is so
that the expected sum is unchanged.
By default, each element is kept or dropped independently. If noise_shape
is specified, it must be broadcastable to the shape of x, and only dimensions
with noise_shape[i] == shape(x)[i] will make independent decisions. For
example, if shape(x) = [k, l, m, n] and noise_shape = [k, 1, 1, n], each
batch and channel component will be kept independently and each row and column
will be kept or not kept together.
Arguments:
incoming : A `Tensor`. The incoming tensor.
keep_prob : A float representing the probability that each element
is kept.
noise_shape : A 1-D Tensor of type int32, representing the shape for
randomly generated keep/drop flags.
name : A name for this layer (optional).
"""
## Dropout解釋
**Droptout定義**
1. Dropout是TensorFlow裡面為了防止或減輕過拟合而使用的函數,它一般用在全連接配接層。
2. dropout 是訓練過程中,對于神經網絡單元,按照一定的機率将其暫時從網絡中丢棄。注意是暫時,對于随機梯度下降來說,由于是随機丢棄,故而每一個mini-batch都在訓練不同的網絡。
**Dropout特征”
解決了兩個大規模神經網絡的問題:
- 費時
- 容易過拟合
[拟合問題、優化器](https://blog.csdn.net/m0_37870649/article/details/79305205)
過拟合是很多機器學習的通病,過拟合了,得到的模型基本就廢了。而為了解決過拟合問題,一般會采用ensemble方法,即訓練多個模型做組合,此時,費時就成為一個大問題,不僅訓練起來費時,測試起來多個模型也很費時。總之,幾乎形成了一個死鎖。
Dropout的出現很好的可以解決這個問題,每次做完dropout,相當于從原始的網絡中找到一個更瘦的網絡。因而,對于一個有N個節點的神經網絡,有了dropout後,就可以看做是2n個模型的集合了,但此時要訓練的參數數目卻是不變的,這就解脫了費時的問題。這個思想可以參考染色體的減數分裂與基因重組,進而增強後代的适應能力。
使用Dropout後,模型的收斂速度變慢,準确率上升的速度慢。那麼為什麼還要使用Dropout呢?通過對比兩次的測試準确率和訓練準确率,可以看到,沒有使用Dropout的方法測試準确率和訓練準确率相差比較大,這就是過拟合的問題,使用了Dropout就可以進行優化。另外,本部分提供的例子并沒有很好的展現出Dropout的優勢,兩者的準确率的對比不明顯,如果使用大型卷積神經網絡進行樣本訓練,結果會更明顯。
參考:
[dropout防止過拟合](https://blog.csdn.net/huahuazhu/article/details/73649389)
[如何了解dropout?](https://blog.csdn.net/zeuseign/article/details/72742579)