天天看點

TFLearn初探之Activation與Dropout

# 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,通俗的說一階導數就是上圖中的斜率,函數越來越水準。

TFLearn初探之Activation與Dropout
TFLearn初探之Activation與Dropout

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的函數就可以很好的去掉這種誤差帶來的影響。

TFLearn初探之Activation與Dropout

***tanh***

雙曲正切函數,它将整個實數區間映射到了(-1,1),tanh函數也具有軟飽和性。它的輸出是以0為中心,tanh的收斂速度比sigmoid要快,由于存在軟飽和性,是以tanh也存在梯度消失的問題。

TFLearn初探之Activation與Dropout

***relu激活函數***

現在是最受歡迎的激活函數,經常被使用在神經網絡中。relu函數的定義:f(x)=max(x,0)

在TensorFlow中還包括了relu函數的擴充函數如:relu6和crelu,除此之外還有leaky relu、PRelu、RRelu等。

  • relu6激活函數:定義min(max(features,0),6),也就是說它的取值區間被限定在了[0,6]之間。
TFLearn初探之Activation與Dropout

***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 那各自的機率究竟是多少呢,我們下面就來具體看一下,

TFLearn初探之Activation與Dropout

也就是說,是該元素的指數,與所有元素指數和的比值

這個定義可以說非常的直覺,當然除了直覺樸素好了解以外,它還有更多的優點

***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都在訓練不同的網絡。

TFLearn初探之Activation與Dropout

**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)

繼續閱讀