天天看點

神經網絡1.1 感覺機模型(神經元模型)

1.激活函數

1.1 Sigmoid函數

​Sigmoid​

​​ 是常用的非線性的激活函數,表達式如下:

  • 特性:它能夠把輸入的連續實值變換為和之間的輸出,特别的,如果是非常大的負數,那麼輸出就是;如果是非常大的正數,輸出就是.
  • 缺點:在深度神經網絡中梯度反向傳遞時導緻梯度爆炸和梯度消失,其中梯度爆炸發生的機率非常小,而梯度消失發生的機率比較大。

1.2 tanh函數

​tanh​

​​函數也是非線性函數,其函數解析式為:

​​

​tanh​

​​讀作​

​Hyperbolic Tangent​

​​,它解決了​

​Sigmoid​

​​函數的不是​

​zero-centered​

​​輸出問題,然而,梯度消失(​

​gradient vanishing​

​)的問題和幂運算的問題仍然存在。

1.3 Relu函數

​Relu​

​​函數實際上就是個取最大值函數,其函數解析式如下所示:

  • ​Relu​

    ​是目前最常用的激活函數,一般搭建人工神經網絡時推薦優先嘗試
  • ​Relu​

    ​​并非全區間可導,但我們可以取​

    ​sub-gradient​

  1. 解決了​

    ​gradient vanishing​

    ​問題 (在正區間)
  2. 計算速度非常快,隻需要判斷輸入是否大于
  3. 收斂速度遠快于​

    ​Sigmoid​

    ​​和​

    ​tanh​

  4. ​ReLU​

    ​​的輸出不是​

    ​zero-centered​

  5. ​Dead ReLU Problem​

    ​​,指的是某些神經元可能永遠不會被激活,導緻相應的參數永遠不能被更新。有兩個主要原因可能導緻這種情況産生: (1) 非常不幸的參數初始化,這種情況比較少見 (2)​

    ​learning rate​

    ​​太高導緻在訓練過程中參數更新太大,不幸使網絡進入這種狀态。解決方法是可以采用Xavier初始化方法,以及避免将​

    ​learning rate​

    ​​設定太大或使用​

    ​adagrad​

    ​​等自動調節​

    ​learning rate​

    ​的算法。

1.4 Leaky ReLU函數(PReLU)

函數表達式:

人們為了解決​​

​Dead ReLU Problem​

​​,提出了将ReLU的前半段設為而非,通常。另外一種直覺的想法是基于參數的方法,即,其中

可由方向傳播算法學出來。理論上來講,​​

​Leaky ReLU​

​​有​

​ReLU​

​​的所有優點,外加不會有​

​Dead ReLU​

​​問題,但是在實際操作當中,并沒有完全證明​

​Leaky ReLU​

​​總是好于​

​ReLU​

​。

1.5 ELU(Exponential Linear Units) 函數

函數表達式:

​​

​ELU​

​​不會有​

​Dead ReLU​

​​問題 輸出的均值接近,​​

​zero-centered​

​​。但計算量偏大,在目前的實際應用中并未被證明總是好于​

​ReLU​

​。

1.6 UnitStep 階躍函數

函數表達式:

傳統的階躍函數,不連續,是以難以進行數學分析。常用其它連續可導函數代替。

2.感覺機模型(神經元模型)

設輸入空間(特征空間)為,輸出空間為

輸入為執行個體的特征向量,輸出為執行個體的類别

由輸入空間到輸出空間的如下函數稱為感覺機:

其中和為模型參數,稱為權值,稱為偏置。是符号函數。

假設我們目前的任務是通過感覺機對具有維特征的向量進行分類。我們可以将該感覺機的模型視作一個神經元模型。維向量()對應的是神經元的個輸入。

神經網絡1.1 感覺機模型(神經元模型)

我們對這個輸入分别乘其對應的權值後求和,經過激活函數後得到分類結果。

但是我們注意到,當神經網絡的輸入向量為時,會産生激活失敗誤分類的情況,為了避免這種情況,我們對其加偏置項後再進入激活函數,也就是感覺機模型中的。

我們首先對輸入向量乘對應的權值加偏置項後得到,将其經過激活函數後與标簽進行比對,并根據是否與标簽相等來更新參數的值:

其中為步長,又稱學習率。以上過程對所有訓練資料執行一次後,可以得到一輪訓練後的和。

顯然,由于權值參數對應于維特征向量,是以的次元一定與輸入向量的特征維數有關。

此處給出基于​

​Python​

​實作的感覺機模型。

import numpy as np
import matplotlib.pyplot as plt 

class ActivateFunction(object):
    @staticmethod
    def Sigmoid(x):
        return (1 / (1 + np.exp(-x)))
    @staticmethod
    def ReLu(x):
        if x <= 0: return 0
        else: return x
        #return np.max(0, x)
    @staticmethod
    def Softmax(x):
        return np.exp(x) / np.sum(np.exp(x))
    @staticmethod
    def UnitStep(x):
        return 1 if x > 0 else 0
    

class Perceptron(object):
    #初始化一個具有n維特征的感覺機
    def __init__(self, input_num, activator):
        self.activator = activator
        self.size = input_num
        self.weights = [0.0 for i in range(input_num)]
        self.bias = 0.0
    #預測值
    def Predict(self, input_vec):
        return self.activator(np.dot(input_vec, self.weights) + self.bias)
    #單輪訓練
    def SingleIteration(self, input_vecs, labels, rate):
        samples = zip(input_vecs, labels)
        for (input_vec, label) in samples:
            output = self.Predict(input_vec)
            delta = label - output
            input_vec = np.array(input_vec)
            self.weights += rate * delta * input_vec
            self.bias += rate * delta
    #多輪訓練入口
    def fit(self, input_vecs, labels, iteration, rate):
        input_vecs, labels = np.array(input_vecs), np.array(labels)
        for i in range(iteration):
            self.SingleIteration(input_vecs, labels, rate)
    #擷取訓練後的得到參數
    def GetParameters(self):
        return self.weights, self.bias


if __name__ == "__main__":
    data, label = [], []
    file = open(r'.\Python\x.txt')
    for line in file.readlines():
        line_data = line.strip().split(',')
        data.append([float(line_data[0]), float(line_data[1])])
    file.close()
    file = open(r'.\Python\y.txt')
    for line in file.readlines():
        line_data = line.strip().split(',')
        label = list(map(int, line_data))
    file.close

    p = Perceptron(2, ActivateFunction.UnitStep)
    p.fit(data, label, 1000, 0.1)
    w, b = p.GetParameters()
    x1 = np.arange(-5, 10, 0.1)
    x2 = (w[0] * x1 + b) / (-w[1])

    data = np.array(data)
    label = np.array(label)
    idx_p = np.where(label == 1)
    idx_n = np.where(label != 1)
    data_p = data[idx_p]
    data_n = data[idx_n]
        
    plt.scatter(data_p[:, 0], data_p[:, 1], color='red')
    plt.scatter(data_n[:, 0], data_n[:, 1], color='blue')
    plt.plot(x1, x2)
    plt.show()      

繼續閱讀