深度學習煉丹術 —— Taoye不講碼德,又水文了,居然寫感知器這麼簡單的內容

手撕機器學習系列文章就暫時更新到此吧,目前已經完成了支援向量機SVM、決策樹、KNN、貝葉斯、線性回歸、Logistic回歸,其他演算法還請允許Taoye在這裡先賒個賬,後期有機會有時間再給大家補上。

更新至此,也是收到了部分讀者的好評。雖然不多,但還是非常感謝大家的支援,希望每一位閱讀過的讀者都能夠有所收穫。

該系列文章的全部內容都是Taoye純手打,也是參考了不少書籍以及公開資源,系列總字數在15W左右(含源碼),總頁數為138,後期會再慢慢填補,更多的技術文章可以來訪Taoye的公眾號:玩世不恭的Coder。文檔可以隨意傳播,但注意不可修改其中的內容。

如果文章中有任何不懂的問題,都可以直接提出,Taoye看見後會第一時間回復,同時歡迎大家來此私密地向Taoye催更:玩世不恭的Coder,公眾號也有Taoye的私人聯繫方式。有些話,Taoye只能在那裡和你偷偷地說 (#`O′)

為了提高大家的閱讀體驗,手撕機器學習系列文章Taoye已經整理成PDF和和HTML,閱讀效果都很不錯,在公眾號【玩世不恭的Coder】下回復【666】即可免費獲取,相信大家看完後一定會有所收穫

前言

後期的計劃就是更新深度學習相關的內容,關於深度學習,Taoye認為最好的學習方式(入門)就是自己手動實現,包括其原理以及程式碼部分(能實現就儘可能的實現)。在實現的同時中要不斷思考其過程,這樣非常有助於正確理解深度學習。

所以,該系列文章前期會儘可能從零開始來肝深度學習,而非一上來就搬出像Tensorflow、Keras、Caffe等這種「黑盒子」。

本篇文章主要是講解感知器,同時也是為後面神經網路的內容打好基礎,該文主要包括以下三個部分的內容:

  • 到底什麼是感知器啊
  • 如何基於感知器實現邏輯電路以及異或問題的拋出
  • 基於兩層感知器完美解決異或問題

一、到底什麼是感知器啊

我們不妨先從其表面來初步理解一下感知器吧。

「感知器,感知器」,既然它是帶有一個「器」字,那麼我們不妨將其看做一個「機器」?

既然是個機器,那麼它能必然能代替人工來實現一些我們所需要的功能,且我們能夠人為的提交某些「東西」給它,而它同時也能根據我們所提供的「東西」給我們一些回饋。

是這樣的嘛???

沒毛病,兄dei,就是這樣的。

感知器它能接收多個輸入訊號,並且根據這多個訊號輸出一個訊號。這裡的輸入訊號可以理解成我們給感知器提供的一些「東西」,或者說是數據(相信有閱讀過Taoye的手撕機器學習系列文章的讀者都能輕鬆明白吧),而輸出訊號則可以理解成經過感知器這個「機器」處理過後所得到的結果。

在上圖感知器中,其接收了兩個輸入訊號\(x_1, x_2\),並通過\(w_1,w_2\)處理過後輸出一個訊號\(y\)。其中\(w_1,w_2\)表示權重,權重越高,體現的是訊號的重要性就越高,而每個圓圈代表一個「節點」或者說是「神經元」。輸入訊號\(x_1,x_2\)被輸入到神經元之後,會分別乘以對應的權重\(w_1,w_2\),並求和得到\(w_1x_1+w_2x_2\),假如這個總和超過某個界限\(\theta\)的時候,此時輸出訊號\(y=1\),否則輸出訊號\(y=0\),這裡的界限\(\theta\)我們也可以理解成閾值或是門檻,體現的是神經元被激活的難易程度。

用數學表達上述過程如下:

\[ y =
\begin{cases}
0, & w_1x_1+w_2x_2 \leq \theta\\
1, & w_1x_1+w_2x_2 > \theta \\
\end{cases}
\]

為了方便表示,我們一般將閾值\(\theta\)拿到左邊,並替換成\(b\),此時表示的就是偏置,且\(b=-\theta\)。我們可以發現,無論我們的感知器怎麼對輸入訊號進行處理,此時的偏置前的係數都等於1。

所以,我們可以在提供輸入訊號\(x_1,x_2\)的同時,另外添加一個恆定不變的訊號1,該訊號用於處理偏置\(b\),且並不會對整個感知器的處理造成任何的影響,處理結果如下:

\[ y =
\begin{cases}
0, & w_1x_1+w_2x_2+b \leq 0\\
1, & w_1x_1+w_2x_2+b > 0 \\
\end{cases}
\]

通過比較\(w_1x_1+w_2x_2+b\)和0的大小,我們可以來決定輸出訊號\(y\)的值。

感知器能實現的功能有很多,不僅可以實現簡單的邏輯電路(布爾運算),還可以擬合出任何的線性函數,任何線性分類或是線性回歸問題都可以通過感知器來解決。

前面我們在手撕機器學習的過程中,詳細講解了線性回歸和邏輯回歸,其大致過程和原理其實就相當於一個感知器,只不過那個時候我們並沒有把感知器的概念直接拋出來而已。

下面我們可以通過感知器來實現一下基本的邏輯電路問題

二、如何基於感知器實現邏輯電路以及異或問題的拋出

我們不妨先看看與門的實現。

與門是有兩個輸入和一個輸出的閘電路,由排列組合的相關知識我們不難知道,兩個輸入訊號說明總共有四種輸入情況,且對於閘電路來講,只有當兩個輸入\(x_1,x_2\)都等於1的時候,此時的輸出訊號\(y\)才能等於1,其他輸入情況的\(y\)值都等於0。

與閘電路的「真值表」如下所示:

為了更直觀的了解該數據的分布,我們不妨先對這四個數據進行可視化:

可以發現,此時的四個數據完全分隔兩邊,我們可以用一條直線來將其進行分類。據上述感知器的判別過程,我們可以知道,主要是要決定\(w_1,w_2,b\)具體的值來構建一個線性模型,根據這個線性模型計算出來的值\(w_1x_1+w_2x_2+b\)來最終判別數據的分類。

我們可以知道,實際上,滿足這樣條件的\(w_1,w_2,b\)參數的選擇有無數多個。比如,我們令\((w_1,w_2,b) = (0.6,0.6,-0.9)\),此時的分類模型為:

\[ y =
\begin{cases}
0, & 0.6x_1+0.6x_2-0.9 \leq 0\\
1, & 0.6x_1+0.6x_2-0.9 > 0 \\
\end{cases}
\]

隨之,我們將與門的四組數據x_data = [[0, 0], [1, 0], [0, 1], [1, 1]]y_label = [0, 0, 0, 1]代入到上述模型中,可以發現模型得到的結果與其對應的標籤值完全一致,即分類完全正確。相關實現程式碼和分類結果如下:

我們可以發現,該模型的分類完全正確。

不過需要注意一點的是:該感知器模型的目的僅僅是將數據分類正確,並沒有像SVM那樣實現間隔最大化的需求。

為了方便讀者自行運行程式,這裡給出上述過程的完整的程式碼:

import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 與門數據的可視化
Parameters:
    x_data:數據的屬性特徵
    y_label:數據屬性特徵所對應的標籤
    w_1,w_2:權重
    b:偏執
"""
def show_result(x_data, y_label, w_1, w_2, b):
    plt.scatter(x_data[:, 0], x_data[:, 1], c = y_label, cmap = plt.cm.copper, linewidths = 10)
    line_x_1 = np.linspace(0, 1.2, 100)
    line_x_2 = (-b - w_1 * line_x_1) / w_2
    plt.plot(line_x_1, line_x_2)
    plt.show()

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 階躍函數
"""
def out(in_data):
    return 0 if in_data < 0 else 1

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 模型計算結果
"""
def model(x_1, x_2, w_1, w_2, b):
    return w_1 * x_1 + w_2 * x_2 + b

if __name__ == "__main__":
    x_data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
    y_label = np.array([0, 0, 0, 1])
    for item in x_data:
        model_result = model(item[0], item[1], 0.6, 0.6, -1.1)
        out_result = out(model_result)
        print('%d and %d = %d' % (item[0], item[1], out_result))
    show_result(x_data, y_label, 0.6, 0.6, -1.1)

上述就是一個解決與門問題感知器的全部過程。

不過,細心的讀者應該會發現,我們上述感知器的\((w_1,w_2,b)\)參數是自己人為定義的,從而強行達到對數據進行分類的目的,而非通過數據訓練而來。

為此,我們有必要講解一下感知器模型的訓練過程。

哎,其實這個可以說是老話長談了,之前我們在手撕機器學習演算法的時候,都有n次接觸過這個問題了,無非就是得到目標優化函數,然後通過梯度下降演算法或者其他優化演算法來更新模型參數,最後通過訓練出來的參數來檢驗模型的效果。

大體上就是這樣,為了照顧下新來的讀者,我們再來回顧下這個過程(熟悉的讀者可直接跳過這個部分的內容)

對於單個數據樣本來講,前面我們不是得到了感知器模型的計算結果了嘛,即:

\[ \hat{y} =
\begin{cases}
0, & w_1x_1+w_2x_2+b \leq 0\\
1, & w_1x_1+w_2x_2+b > 0 \\
\end{cases}
\]

注意:上述的\({w_1,w_2,b}\)參數並非是最終結果,而是在一開始我們需要對它們進行初始化,然後通過不斷的迭代更新,最終獲得滿足我們需求的參數值。

這裡,我們用\(\hat{y}\)表示模型的計算結果,\(y\)表示數據的真實標籤,為了通過數學化來衡量這兩者之間的差距,我們可以使用兩者差的平方的\(\frac{1}{2}\)來表示兩者之間差距,即:

\[\begin{aligned}
e& = \frac{1}{2}(\hat{y}-y)^2 \\
& = \frac{1}{2}(w_1x_1+w_2x_2+b-y)^2 \\
& = \frac{1}{2}(w^Tx+b-y)^2
\end{aligned}
\]

以上是單個樣本的誤差,而我們知道,在訓練數據中,樣本是有多個的,為此我們需要綜合所有樣本的誤差來體現模型對整體的分類效果,我們不妨令整體誤差為\(E\),則:

\[\begin{aligned}
E & = e_1+e_2+e_3+…+e_N \\
& = \sum_{i=1}^Ne_i \\
& = \frac{1}{2}\sum_{i=1}^N(w^Tx_i+b-y_i)^2
\end{aligned}
\]

以上就是我們最終待優化的目標函數,我們現在目的就是得到\(w_1,w_2,b\)參數的值,使得該目標函數的誤差值達到最小。為此,我們需要分別對\(w\)\(b\)求偏導,求解過程如下:

\[\begin{aligned}
\frac{\partial E}{\partial w} & =\frac{1}{2}\sum_{i=1}^N\frac{\partial}{\partial w}(w^Tx_i+b-y_i)^2 \\
& = \sum_{i=1}^N(w^Tx_i+b-y_i)x_i
\end{aligned}
\]

同理,我們對\(b\)求偏導,得到如下結果:

\[\begin{aligned}
\frac{\partial E}{\partial b} & =\frac{1}{2}\sum_{i=1}^N\frac{\partial}{\partial b}(w^Tx_i+b-y_i)^2 \\
& = \sum_{i=1}^N(w^Tx_i+b-y_i)
\end{aligned}
\]

求得偏導結果之後,我們需要利用梯度下降演算法對\(w_1,w_2,b\)參數進行更新迭代,具體更新過程如下:

\[\begin{aligned}
& w^{new}=w^{old}-\eta\frac{\partial E}{\partial w}\ \\
& b^{new} = b^{old}-\eta\frac{\partial E}{\partial b}
\end{aligned}
\]

至於為什麼以這種方式更新參數,這裡Taoye就不再贅述了,不解的讀者可以看看前面寫過的手撕機器學習系列文章。

了解了參數的更新方式之後,我們就可以編寫程式來對數據進行迭代了,從而得到一個滿足實際需求的最終參數,首先定義out_result方法用於輸出模型的計算結果,這裡用到了一個小技巧:y = result > 0用於判斷每個樣本通過感知機處理後的布爾值,大於0返回true,小於0返回false;此後,y.astype(np.int)用於將布爾值重新轉化為int類型,且true將轉換成1,而false轉化成0,讀者可自行實現該過程,out_result的具體程式碼如下:

隨後,定義train方法用於訓練\(w_1,w_2,b\)參數,訓練過程如上數學表達所示,即通過梯度下降法來不斷迭代更新參數,從而使得損失函數達到最小,該train方法的具體程式碼如下所示:

運行分類結果如下:

可以發現,總共迭代了10次,最終訓練出的參數值為\((w_1,w_2,b)=(0.6, 0.6, -0.8)\),即得到的模型為:

\[ \hat{y} =
\begin{cases}
0, & 0.6x_1+0.6x_2-0.8 \leq 0\\
1, & 0.6x_1+0.6x_2-0.8 > 0 \\
\end{cases}
\]

將與門的四種數據代入到上述感知器模型中,並與真實標籤比較可以發現分類完全正確,即模型訓練成功。這裡還是需要注意一點:該感知器模型的目的僅僅是將數據分類正確,並沒有像SVM那樣實現間隔最大化的需求。

與門實現的完整程式碼如下:

import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 與門數據的可視化
Parameters:
    x_data:數據的屬性特徵
    y_label:數據屬性特徵所對應的標籤
    w_1,w_2:權重
    b:偏執
"""
def show_result(x_data, y_label, w_1, w_2, b):
    plt.scatter(x_data[:, 0], x_data[:, 1], c = y_label, cmap = plt.cm.copper, linewidths = 10)
    line_x_1 = np.linspace(0, 1.2, 100)
    line_x_2 = (-b - w_1 * line_x_1) / w_2
    plt.plot(line_x_1, line_x_2)
    plt.show()

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 感知器處理數據
Parameters:
    x_data:數據的屬性特徵
    w:權重向量
    b:偏執
Return:感知器處理之後的結果,為一個向量形式
"""
def out_result(x_data, w, b):
    result = np.matmul(x_data, np.mat(w).T) + b
    y = result > 0
    return y.astype(np.int)

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 更新迭代w、b參數
Parameters:
    x_data:數據的屬性特徵
    y_label: 數據標籤
    max_iter: 最大迭代次數
    learning_rate: 學習率
    w: 權重參數
    b:偏置參數
Return:訓練完成之後最終的w,b參數
"""
def train(x_data, y_label, max_iter, learning_rate, w, b):
    for i in range(max_iter):
        result = out_result(x_data, w, b)
        delta = np.mat(y_label).T - result
        w = (w + (learning_rate * np.matmul(x_data.T, delta)).T)
        b += (learning_rate * delta).sum()
    return w, b

if __name__ == "__main__":
    x_data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
    y_label = np.array([0, 0, 0, 1])
    w, b = train(x_data, y_label, 10, 0.1, np.array([1, 1]), 0)
    print(w, b)
    show_result(x_data, y_label, w[0, 0], w[0, 1], b)

以上就是感知器實現與門的全部過程了,讀者可根據上述的思路過程自己嘗試實現一下。

同理,我們可以實現邏輯電路中的與非門和或門,實現原理同上,模型訓練過程也和與門一模一樣,只不過給模型傳遞的數據有所不同,也就是說只需要更換數據即可實現與非門和或門,這裡就不再過多佔篇幅講解了,具體結果如下:

可以發現,感知器訓練之後同樣可以實現與非門和或門。

至此,我們已經知道使用感知器可以表示與門、與非門、或門的邏輯電路。這裡重要的一點是:與門、與非門、或門的感知器構造是一樣的。實際上,3個閘電路只有參數的值(權重和閾值)不同。也就是說,相同構造的感知機,只需通過適當地調整參數的值,就可以像「變色龍演員」表演不同的角色一樣,變身為與門、與非門、或門。——摘自《深度學習入門:基於Python的理論與實現》

既然與門、與非門、或門的邏輯電路,感知器都能夠實現,那麼我們接下來考慮一下異或門。

異或門也被稱作邏輯亦或電路,其兩個輸入訊號只有一方為1,另一方為0的時候,輸出訊號才能為1,亦或門所對應的真值表如下:

我們不妨對亦或門的數據進行可視化,來觀察其分布情況,可視化程式碼和結果如下:

通過觀察可以發現,無論怎麼操作,我們都無法通過一條直線將兩類數據分割開來。也就是說,我們無法通過上述所分析得到的感知器模型直接運用在異或門上。

感知機的局限性就在於它只能表示由一條直線分割的空間,由直線分割而形成的空間我們稱之為線性空間。但如果我們把「線性」這個限制條件去掉,我們就可以完美對異或門進行分類了,比如下面這種分類方法:

通過這種曲線分割而形成的空間我們稱之為非線性空間,線性和非線性可以說是機器學習領域中的老熟人了。以上這種方式解決線性不可分問題是非常常見的,不過既然我們已經進入了深度學習領域,我們需要儘可能用「准深度學習」的方式來解決這個問題。

對此,我們進入本篇文章的第三節:基於兩層感知器完美解決異或問題

三、基於兩層感知器完美解決異或問題

雖然說,上面所介紹的感知器並不能解決異或問題,但是我們也無需多麼失望。

感知器的強大之處在於能夠實現感知器之間的疊加,也就是多層感知器,這一點對於很多問題來講是非常有幫助的。

至於什麼是感知器之間的疊加,我們暫且不要去思考這個問題,我們先以邏輯電路的角度去思考異或問題。

思路參考於:《深度學習入門:基於Python的理論與實現》

以上是與門、與非門、或門、異或門的真值表,而且我們已經講解了如何通過感知器完美解決前三者的問題,並用程式碼加以實現了,然而亦或問題我們依然無法按照上述方式解決。

我們不妨換個思路來解決下亦或問題,能不能通過與門、與非門、或門中的兩者甚至三者的組合形式來解決亦或問題呢???即我們現在想要實現的需求是這樣的:

上圖中,左子圖表示的是與門、與非門、或門的符號形式,右圖則表示的是目標實現的異或問題。我們能不能將左圖的「三門」填入到右圖中的「?」框內,從而使得最終的輸出滿足亦或門的結果呢???

讀者思考分界線=

OK,讀者短暫的思考過後,想必都已經有了答案。再不濟,通過排列組合也就只有六種填入情況,總能得到滿足上述題目的要求。

其實,我們可以通過如下方式來實現異或問題,即從上至下,從左至右,「?」中依次填入與非門、或門、與門即可。具體如下:

保險起見,我們不妨來確認一下如此一來是否真的就能解決異或問題。假設\(x_1、x_2\)表示的是初始輸入訊號,則:

  • \(s_1\)表示的是基於與非門\(x_1、x_2\)的輸出
  • \(s_2\)表示的是基於或門\(x_1、x_2\)的輸出
  • \(y\)表示的是基於與門\(s_1,s_2\)的輸出,也就是異或門最終的輸出

通過輸入\(x_1,x_2\)的四組訊號,我們可以得到如下結果:

事實證明,我們上述模型的最終輸出和異或門的輸出結果如出一轍,也就是說,我們完全是可以通過與門、與非門、或門三者的組合來實現異或門的。

而且我們上面都已經實現了與門、與非門、或門,基於此,我們就能很簡單實現異或門,其實現過程如下:

  1. 輸入與門的四組訊號,訓練出滿足與門的參數集\(w_{11}、w_{12}、b_{1}\)
  2. 輸入與非門的四組訊號,訓練出滿足與非門的參數集\(w_{21}、w_{22}、b_{2}\)
  3. 輸入或門的四組訊號,訓練出滿足或門的參數集\(w_{31}、w_{32}、b_{3}\)
  4. 基於上述訓練出的三組參數集,按照上面的模型結構來最終得到異或門的輸出

上述過程中亦或門的演示結果如下:

異或門問題解決的完整程式碼:

import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 數據的可視化
Parameters:
    x_data:數據的屬性特徵
    y_label:數據屬性特徵所對應的標籤
    w_1,w_2:權重
    b:偏執
"""
def show_result(x_data, y_label, w_1, w_2, b):
    plt.scatter(x_data[:, 0], x_data[:, 1], c = y_label, cmap = plt.cm.copper, linewidths = 10)
    line_x_1 = np.linspace(0, 1.2, 100)
    line_x_2 = (-b - w_1 * line_x_1) / w_2
    plt.plot(line_x_1, line_x_2)
    plt.show()

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 感知器處理數據
Parameters:
    x_data:數據的屬性特徵
    w:權重向量
    b:偏執
Return:感知器處理之後的結果,為一個向量形式
"""
def out_result(x_data, w, b):
    result = np.matmul(x_data, np.mat(w).T) + b
    y = result > 0
    return y.astype(np.int)

"""
Author: Taoye
微信公眾號: 玩世不恭的Coder
Explain: 更新迭代w、b參數
Parameters:
    x_data:數據的屬性特徵
    y_label: 數據標籤
    max_iter: 最大迭代次數
    learning_rate: 學習率
    w: 權重參數
    b:偏置參數
Return:訓練完成之後最終的w,b參數
"""
def train(x_data, y_label, max_iter, learning_rate, w, b):
    for i in range(max_iter):
        result = out_result(x_data, w, b)
        delta = np.mat(y_label).T - result
        w = (w + (learning_rate * np.matmul(x_data.T, delta)).T)
        b += (learning_rate * delta).sum()
    return w, b

if __name__ == "__main__":
    x_data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
    and_label = np.array([0, 0, 0, 1])    # 與門的輸出訊號
    no_and_label = np.array([1, 1, 1, 0])    # 與非門的輸出訊號
    or_label = np.array([0, 1, 1, 1])    # 或門的輸出訊號
    
    w_1, b_1 = train(x_data, and_label, 10, 0.1, np.array([0, 0]), 0)    # 感知器訓練出與門的參數集
    w_2, b_2 = train(x_data, no_and_label, 10, 0.1, np.array([0, 0]), 0)    # 感知器訓練出與非門的參數集
    w_3, b_3 = train(x_data, or_label, 10, 0.1, np.array([0, 0]), 0)    # 感知器訓練出或門的參數集
    
    no_and_predict = out_result(x_data, w_2, b_2)    # 與非門感知器模型的結果
    or_predict = out_result(x_data, w_3, b_3)    # 或門感知器模型的結果
    xor_predict = out_result(np.concatenate((no_and_predict, or_predict), axis = 1), w_1, b_1)    # 異或門感知器模型的結果
    
    xor_label = np.array([0, 1, 1, 0])
    for index in range(xor_label.size):    # 多層感知器解決亦或問題的驗證
        print("%d 亦或 %d = %d, " % (x_data[index, 0], x_data[index, 1], xor_predict[index]),
             "%d == %d?, " % (xor_label[index], xor_predict[index]),
             xor_label[index] == xor_predict[index])

感知器算是一種非常簡單的演算法了,相信閱讀至此的讀者都能很快深入理解它的構造。雖然簡單,但它卻是我們步入「神經網路殿堂」的階梯,或者說是基礎,這也是為什麼Taoye將感知器作為深度學習開門篇的原因。

對這篇文章做個簡短的總結吧:

我們首先介紹了什麼是感知器,直觀上看到了感知器的基本結構以及能做些什麼。其次,通過感知器詳細講解了與門的實現原理,並通過數學公式化(梯度下降演算法)來剖析了參數的訓練過程,之後以程式碼形式實現了與門的邏輯電路,最終同理得到與非門和或門的實現結果。此外,在第二節的最後,我們還拋出了單層感知器無法解決亦或門的問題,從而為第三節提供「引子」。最後,我們發現其實可以通過邏輯電路組合的形式來實現異或門,在模型結構中,也就是以一種多層感知器來解決的亦或問題,最終通過程式碼來驗證了模型的真實有效性。

以上就是本篇文章的全部內容了。

還是挺愧疚的,最近在忙其他事情,文章托更有十天了吧 (ノへ ̄、)

不過嘛,Taoye還算是挺良心的吧???

還算是講碼德的吧???給大家把感知器安排的明明白白。

後面就要正式接觸到神經網路了,神經網路大體上和上述詳解的感知器差不多,只不過激活函數有所不同,上述感知器用到的激活函數是階躍函數,而在神經網路中使用到的激活函數則需要根據實際問題來進行不同的定義。此外,在神經網路中還做了一些其他的拓展。

詳細內容,請見的下篇分解。

我是Taoye,愛專研,愛分享,熱衷於各種技術,學習之餘喜歡下象棋、聽音樂、聊動漫,希望藉此一畝三分地記錄自己的成長過程以及生活點滴,也希望能結實更多志同道合的圈內朋友,更多內容歡迎來訪微信公主號:玩世不恭的Coder。

馬上就要與2021年交接了,年終總結也是時候開始準備起來了。

我們下期再見,拜拜~~

參考資料:

[1] 《深度學習入門:基於Python的理論與實現》:齋藤康毅 人民郵電出版社
[2] 零基礎入門深度學習- 感知器://www.zybuluo.com/hanbingtao/note/433855

推薦閱讀

《Machine Learning in Action》—— Taoye給你講講Logistic回歸是咋回事
《Machine Learning in Action》—— 淺談線性回歸的那些事
《Machine Learning in Action》—— 白話貝葉斯,「恰瓜群眾」應該恰好瓜還是恰壞瓜
《Machine Learning in Action》—— 女同學問Taoye,KNN應該怎麼玩才能通關
《Machine Learning in Action》—— 懂的都懂,不懂的也能懂。非線性支援向量機
《Machine Learning in Action》—— hao朋友,快來玩啊,決策樹呦
《Machine Learning in Action》—— Taoye給你講講決策樹到底是支什麼「鬼」
《Machine Learning in Action》—— 剖析支援向量機,優化SMO
《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM