現(xiàn)感知器算法:線性分類與神經(jīng)網(wǎng)絡(luò)基礎(chǔ))
1. 從“神經(jīng)元”到“決策線”感知器算法的核心思想如果你剛開始接觸機(jī)器學(xué)習(xí)可能會(huì)被各種復(fù)雜的模型和數(shù)學(xué)公式嚇到。但我想告訴你有一個(gè)算法它簡單、直觀卻奠定了整個(gè)神經(jīng)網(wǎng)絡(luò)乃至深度學(xué)習(xí)的基礎(chǔ)它就是感知器算法。我第一次接觸它時(shí)感覺就像在迷霧中看到了一盞燈——原來復(fù)雜的分類問題可以用如此優(yōu)雅的方式解決。感知器本質(zhì)上是一個(gè)線性二分類器它的目標(biāo)很簡單給定一堆帶有標(biāo)簽的數(shù)據(jù)點(diǎn)比如“貓”和“狗”的圖片特征它試圖找到一條直線在二維空間或一個(gè)超平面在高維空間把這兩類點(diǎn)完美地分開。你可以把它想象成一個(gè)非常初級、但邏輯清晰的“大腦神經(jīng)元”接收輸入信號進(jìn)行加權(quán)求和然后根據(jù)結(jié)果“興奮”或“抑制”做出一個(gè)非此即彼的決策。這個(gè)算法由Frank Rosenblatt在1957年提出其歷史意義遠(yuǎn)大于其當(dāng)下的實(shí)用價(jià)值。在今天我們很少會(huì)直接用基礎(chǔ)的感知器去解決實(shí)際問題因?yàn)樗兄旅木窒扌晕覀兒竺鏁?huì)詳細(xì)說。但是理解感知器是理解現(xiàn)代神經(jīng)網(wǎng)絡(luò)不可或缺的一步。它清晰地展示了“權(quán)重”、“偏置”、“激活函數(shù)”、“損失函數(shù)”和“梯度下降”這些核心概念的雛形。通過手動(dòng)實(shí)現(xiàn)一個(gè)感知器你能透徹地明白機(jī)器學(xué)習(xí)模型是如何從數(shù)據(jù)中“學(xué)習(xí)”的。它適合所有對AI感興趣的新手作為你旅程中堅(jiān)實(shí)的第一塊基石。接下來我會(huì)帶你從零開始拆解它的每一個(gè)部件并親手實(shí)現(xiàn)它同時(shí)深入探討它的能力邊界以及如何演化成更強(qiáng)大的模型。2. 感知器的數(shù)學(xué)骨架與工作原理拆解感知器的結(jié)構(gòu)極其簡潔我們可以用一個(gè)清晰的流程圖來描述其前向傳播過程輸入數(shù)據(jù) - 加權(quán)求和 - 加上偏置 - 通過激活函數(shù) - 輸出預(yù)測。但在這之前我們必須先理解它的數(shù)學(xué)描述。2.1 核心組件解析權(quán)重、偏置與激活函數(shù)假設(shè)我們有一個(gè)樣本它用特征向量x [x?, x?, ..., x?] 表示。感知器會(huì)對這個(gè)樣本做如下計(jì)算加權(quán)求和Linear Combination感知器為每個(gè)輸入特征都分配了一個(gè)“重要性”系數(shù)我們稱之為權(quán)重Weight。權(quán)重向量w [w?, w?, ..., w?] 與輸入特征向量x進(jìn)行點(diǎn)積運(yùn)算。z w?*x? w?*x? ... w?*x?這個(gè)z可以理解為所有輸入信號的“總強(qiáng)度”。加上偏置Bias偏置b是一個(gè)常數(shù)項(xiàng)你可以把它理解為判斷門檻的“調(diào)節(jié)器”。即使所有輸入特征都為0偏置也能影響最終結(jié)果。加上偏置后我們得到凈輸入z w·x b從幾何角度看w·x b 0這個(gè)方程定義的正是我們想要尋找的那條分類直線或超平面。激活函數(shù)Activation Function這是感知器的“決策器”。它接收凈輸入z并輸出最終的分類結(jié)果。感知器使用最經(jīng)典的階躍函數(shù)Step Function或稱為符號函數(shù)Sign Function。y_pred 1, if z 0y_pred 0 (或 -1), if z 0這個(gè)非黑即白的輸出正是感知器作為二分類器的本質(zhì)。這里有一個(gè)重要細(xì)節(jié)在最初的感知器論文和很多實(shí)現(xiàn)中類別標(biāo)簽通常設(shè)為1和-1而不是1和0。這主要是為了在權(quán)重更新公式中數(shù)學(xué)表達(dá)更優(yōu)雅。我們后續(xù)的推導(dǎo)會(huì)采用1/-1的設(shè)定。注意這里的“激活函數(shù)”是神經(jīng)網(wǎng)絡(luò)中的核心概念。感知器的階躍函數(shù)是其最原始的形式它不可導(dǎo)的特性直接導(dǎo)致了感知器的局限性也催生了后續(xù)使用Sigmoid、ReLU等平滑激活函數(shù)的神經(jīng)網(wǎng)絡(luò)。2.2 學(xué)習(xí)規(guī)則感知器如何從錯(cuò)誤中成長模型有了初始的權(quán)重w和偏置b通常是隨機(jī)設(shè)置的小數(shù)它一開始肯定會(huì)犯很多錯(cuò)誤。感知器的魅力在于它有一個(gè)非常直觀且有效的學(xué)習(xí)規(guī)則。核心思想如果模型對某個(gè)樣本的預(yù)測錯(cuò)了我們就微調(diào)權(quán)重和偏置讓模型下次遇到類似樣本時(shí)更有可能做出正確判斷。權(quán)重更新規(guī)則Perceptron Learning Rule 對于每一個(gè)訓(xùn)練樣本(x, y)其中y是真實(shí)標(biāo)簽 (1或-1)y_pred是模型預(yù)測值。計(jì)算預(yù)測值y_pred sign(w·x b)如果預(yù)測正確 (y_pred y)皆大歡喜權(quán)重和偏置保持不變。如果預(yù)測錯(cuò)誤則按以下規(guī)則更新w_new w_old η * y * xb_new b_old η * y其中η(讀作Eta) 是一個(gè)非常重要的超參數(shù)叫做學(xué)習(xí)率Learning Rate它控制著每次更新的步長。為什么這個(gè)規(guī)則有效讓我們直觀理解一下。假設(shè)真實(shí)標(biāo)簽y 1但模型預(yù)測成了-1。這意味著w·x b 0。根據(jù)更新規(guī)則w_new w_old η * (1) * x。因?yàn)棣呛蛓都是正數(shù)這相當(dāng)于把權(quán)重向量w向輸入向量x的方向“推”了一小步。由于點(diǎn)積w·x增加了下次再計(jì)算w_new·x b時(shí)結(jié)果就更有可能大于0從而預(yù)測為1。同時(shí)偏置b也增加了η這直接提高了凈輸入的門檻也有助于使結(jié)果為正。 反之如果真實(shí)標(biāo)簽是-1卻預(yù)測成了1更新規(guī)則會(huì)把w向-x方向推同時(shí)降低b從而使凈輸入更可能為負(fù)。這個(gè)規(guī)則的美妙之處在于它只關(guān)注分錯(cuò)的樣本。分對的樣本不參與更新這符合直覺既然已經(jīng)對了就別瞎改了。3. 從零開始實(shí)現(xiàn)一個(gè)感知器分類器理論說再多不如親手寫一遍代碼。我們將用Python和NumPy來實(shí)現(xiàn)一個(gè)完整的感知器并在一個(gè)經(jīng)典數(shù)據(jù)集上進(jìn)行訓(xùn)練和可視化。我選擇鳶尾花數(shù)據(jù)集Iris中“山鳶尾”和“變色鳶尾”兩類數(shù)據(jù)只使用“花瓣長度”和“花瓣寬度”兩個(gè)特征這樣我們可以在二維平面上直觀地看到分類線的變化。3.1 環(huán)境準(zhǔn)備與數(shù)據(jù)預(yù)處理首先確保你有Python環(huán)境并安裝NumPy和Matplotlib。數(shù)據(jù)我們從sklearn中直接加載但我們的感知器實(shí)現(xiàn)絕不依賴任何機(jī)器學(xué)習(xí)庫。import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split # 1. 加載數(shù)據(jù) iris datasets.load_iris() # 只取前兩類Setosa 和 Versicolor對應(yīng)標(biāo)簽0和1 # 只取兩個(gè)特征花瓣長度和花瓣寬度特征索引2和3 X iris.data[0:100, [2, 3]] y iris.target[0:100] # 2. 將標(biāo)簽從{0, 1}轉(zhuǎn)換為感知器常用的{-1, 1} # 這里我們設(shè)定Setosa (原標(biāo)簽0) 為 -1 Versicolor (原標(biāo)簽1) 為 1 y np.where(y 0, -1, 1) # 3. 劃分訓(xùn)練集和測試集8:2 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) print(f訓(xùn)練集樣本數(shù): {X_train.shape[0]}) print(f測試集樣本數(shù): {X_test.shape[0]})3.2 感知器類的完整實(shí)現(xiàn)下面是我們感知器類的核心代碼。我添加了大量注釋并特別強(qiáng)調(diào)了幾個(gè)容易出錯(cuò)的細(xì)節(jié)。class Perceptron: 感知器分類器實(shí)現(xiàn)。 參數(shù): ---------- learning_rate : float, 默認(rèn)0.01 學(xué)習(xí)率控制權(quán)重更新的步長0 η 1。 n_iter : int, 默認(rèn)50 遍歷訓(xùn)練集的次數(shù)迭代次數(shù)。 random_state : int, 默認(rèn)1 隨機(jī)種子用于初始化權(quán)重確保結(jié)果可復(fù)現(xiàn)。 屬性: ---------- w_ : 1d-array 擬合后的權(quán)重向量不包括偏置。 b_ : scalar 擬合后的偏置項(xiàng)。 errors_ : list 每次迭代中分類錯(cuò)誤的樣本數(shù)。 def __init__(self, learning_rate0.01, n_iter50, random_state1): self.learning_rate learning_rate self.n_iter n_iter self.random_state random_state def fit(self, X, y): 根據(jù)訓(xùn)練數(shù)據(jù)擬合感知器模型。 參數(shù): ---------- X : {array-like}, shape [n_samples, n_features] 訓(xùn)練樣本特征矩陣。 y : array-like, shape [n_samples] 目標(biāo)類別標(biāo)簽應(yīng)為 {-1, 1}。 返回: ---------- self : object # 初始化隨機(jī)數(shù)生成器保證每次運(yùn)行初始化相同 rgen np.random.RandomState(self.random_state) # 初始化權(quán)重均值為0標(biāo)準(zhǔn)差為0.01的小隨機(jī)數(shù) # 權(quán)重?cái)?shù)量等于特征數(shù) self.w_ rgen.normal(loc0.0, scale0.01, sizeX.shape[1]) # 初始化偏置為0 self.b_ 0.0 # 用于記錄每次迭代的錯(cuò)誤數(shù) self.errors_ [] # 開始迭代訓(xùn)練 for _ in range(self.n_iter): errors 0 # 遍歷訓(xùn)練集中的每一個(gè)樣本這種逐個(gè)樣本更新的方式稱為“隨機(jī)梯度下降”的雛形 for xi, target in zip(X, y): # 計(jì)算預(yù)測值sign(w·x b) # 注意這里使用np.dot進(jìn)行向量點(diǎn)積 activation np.dot(xi, self.w_) self.b_ prediction np.where(activation 0.0, 1, -1) # 感知器學(xué)習(xí)規(guī)則僅當(dāng)預(yù)測錯(cuò)誤時(shí)更新 update self.learning_rate * (target - prediction) if update ! 0: # 即 prediction ! target # 更新權(quán)重 w w η * (y_true - y_pred) * x # 注意當(dāng)標(biāo)簽為{-1, 1}且使用階躍函數(shù)時(shí)(target - prediction)的值可能是2或-2。 # 這等價(jià)于我們之前推導(dǎo)的 w w η * y_true * x (當(dāng)y_pred錯(cuò)誤時(shí))。 # 這里的寫法更通用也更容易理解。 self.w_ update * xi self.b_ update errors 1 # 記錄本輪迭代的錯(cuò)誤數(shù) self.errors_.append(errors) # 如果本輪沒有錯(cuò)誤提前終止感知器收斂 if errors 0: print(f模型在第 {_1} 次迭代后已完全收斂訓(xùn)練誤差為0。) break return self def net_input(self, X): 計(jì)算凈輸入 w·X b。支持單個(gè)樣本或批量樣本。 return np.dot(X, self.w_) self.b_ def predict(self, X): 預(yù)測樣本X的類別標(biāo)簽。 # 利用net_input計(jì)算然后通過階躍函數(shù)輸出 return np.where(self.net_input(X) 0.0, 1, -1) def score(self, X, y): 計(jì)算模型在給定數(shù)據(jù)集上的分類準(zhǔn)確率。 y_pred self.predict(X) accuracy np.mean(y_pred y) return accuracy實(shí)操心得在fit方法中我使用了update self.learning_rate * (target - prediction)來計(jì)算更新量。當(dāng)標(biāo)簽為{-1, 1}且預(yù)測錯(cuò)誤時(shí)(target - prediction)的值要么是2要么是-2。這和我們之前推導(dǎo)的公式η * y * x在本質(zhì)上是一致的只是差了一個(gè)常數(shù)因子2這個(gè)因子可以被吸收到學(xué)習(xí)率η中。這種寫法邏輯更清晰更新量正比于“預(yù)測誤差”。此外注意權(quán)重初始化的尺度不宜過大小的隨機(jī)數(shù)有助于穩(wěn)定訓(xùn)練初期。3.3 訓(xùn)練過程可視化與決策邊界繪制現(xiàn)在讓我們訓(xùn)練模型并觀察它的學(xué)習(xí)過程。# 1. 初始化并訓(xùn)練感知器 ppn Perceptron(learning_rate0.1, n_iter20, random_state42) ppn.fit(X_train, y_train) # 2. 繪制迭代次數(shù)與錯(cuò)誤數(shù)的關(guān)系圖學(xué)習(xí)曲線 plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.plot(range(1, len(ppn.errors_) 1), ppn.errors_, markero) plt.xlabel(迭代次數(shù)) plt.ylabel(分類錯(cuò)誤數(shù)) plt.title(感知器學(xué)習(xí)曲線) plt.grid(True) # 3. 繪制決策邊界 def plot_decision_regions(X, y, classifier, resolution0.02): 繪制分類器的決策區(qū)域。 # 設(shè)置圖形邊界 x1_min, x1_max X[:, 0].min() - 1, X[:, 0].max() 1 x2_min, x2_max X[:, 1].min() - 1, X[:, 1].max() 1 # 生成網(wǎng)格點(diǎn)坐標(biāo)矩陣 xx1, xx2 np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) # 將網(wǎng)格點(diǎn)展平并預(yù)測 Z classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z Z.reshape(xx1.shape) # 繪制決策區(qū)域輪廓和填充 from matplotlib.colors import ListedColormap cmap ListedColormap([#FFAAAA, #AAAAFF]) plt.contourf(xx1, xx2, Z, alpha0.3, cmapcmap) # 繪制散點(diǎn)圖 for idx, cl in enumerate(np.unique(y)): plt.scatter(xX[y cl, 0], yX[y cl, 1], alpha0.8, edgecolorblack, labelfClass {cl}) plt.xlabel(花瓣長度 (標(biāo)準(zhǔn)化)) plt.ylabel(花瓣寬度 (標(biāo)準(zhǔn)化)) plt.legend(locupper left) plt.title(感知器決策邊界) plt.subplot(1, 2, 2) # 為了繪圖美觀我們可以對特征進(jìn)行簡單的標(biāo)準(zhǔn)化并非必須但能改善可視化 from sklearn.preprocessing import StandardScaler sc StandardScaler() X_train_std sc.fit_transform(X_train) X_test_std sc.transform(X_test) # 用標(biāo)準(zhǔn)化后的數(shù)據(jù)重新訓(xùn)練一個(gè)感知器用于繪圖 ppn_for_plot Perceptron(learning_rate0.1, n_iter20, random_state42) ppn_for_plot.fit(X_train_std, y_train) plot_decision_regions(X_train_std, y_train, classifierppn_for_plot) plt.tight_layout() plt.show() # 4. 評估模型性能 train_accuracy ppn.score(X_train, y_train) test_accuracy ppn.score(X_test, y_test) print(f訓(xùn)練集準(zhǔn)確率: {train_accuracy:.2%}) print(f測試集準(zhǔn)確率: {test_accuracy:.2%})運(yùn)行這段代碼你會(huì)看到兩張圖。左圖展示了模型在訓(xùn)練過程中分類錯(cuò)誤的數(shù)量隨著迭代次數(shù)的增加而下降最終可能降至0如果數(shù)據(jù)線性可分。右圖則直觀地展示了感知器學(xué)習(xí)到的那條決策邊界——一條直線成功地將兩類鳶尾花樣本分開。4. 感知器的局限性、收斂性與現(xiàn)代意義感知器簡單強(qiáng)大但它并非萬能。理解它的局限性才能明白為什么我們需要更復(fù)雜的模型。4.1 致命缺陷無法解決線性不可分問題這是感知器最著名的短板。感知器收斂定理保證如果一個(gè)訓(xùn)練數(shù)據(jù)集是線性可分的那么感知器學(xué)習(xí)算法可以在有限次迭代內(nèi)找到一個(gè)解即權(quán)重向量使得所有訓(xùn)練樣本被正確分類。但現(xiàn)實(shí)世界的數(shù)據(jù)往往沒那么“友好”。經(jīng)典的“異或XOR”問題就是一擊致命的例子。異或問題的輸入輸出如下(0,0) - 0(0,1) - 1(1,0) - 1(1,1) - 0 你無法在二維平面上畫一條直線把輸出為0的點(diǎn)(0,0)和(1,1)和輸出為1的點(diǎn)(0,1)和(1,0)分開。對于這樣的數(shù)據(jù)感知器會(huì)陷入無限循環(huán)永遠(yuǎn)無法收斂到一個(gè)零錯(cuò)誤的解。問題類型感知器能否解決原因線性可分問題(如與、或)能存在一條直線/超平面可以完美分割兩類數(shù)據(jù)。線性不可分問題(如異或)不能不存在一條直線可以完美分割需要更復(fù)雜的決策邊界。這個(gè)局限性在1969年被Minsky和Papert在《Perceptrons》一書中深刻剖析直接導(dǎo)致了第一次AI寒冬。要解決線性不可分問題必須引入多層網(wǎng)絡(luò)和非線性激活函數(shù)。4.2 從單層感知器到多層感知器MLP與神經(jīng)網(wǎng)絡(luò)為了克服單層感知器的局限一個(gè)自然的想法是堆疊多層感知器。這就是多層感知器Multilayer Perceptron, MLP也是最基礎(chǔ)的前饋神經(jīng)網(wǎng)絡(luò)。結(jié)構(gòu)升級MLP包含輸入層、一個(gè)或多個(gè)隱藏層和輸出層。隱藏層的神經(jīng)元使用平滑的、可導(dǎo)的激活函數(shù)如Sigmoid, Tanh, ReLU而不是階躍函數(shù)。能力飛躍理論上僅含一個(gè)隱藏層的MLP只要隱藏層神經(jīng)元足夠多就可以以任意精度逼近任何連續(xù)函數(shù)通用近似定理。這意味著它可以學(xué)習(xí)極其復(fù)雜的非線性決策邊界輕松解決異或問題。學(xué)習(xí)算法訓(xùn)練MLP不再使用感知器學(xué)習(xí)規(guī)則而是使用反向傳播算法Backpropagation。該算法通過鏈?zhǔn)椒▌t將輸出層的誤差逐層反向傳播到每一層計(jì)算每個(gè)權(quán)重對總誤差的“貢獻(xiàn)”梯度然后使用梯度下降法更新所有權(quán)重。所以你可以這樣理解單層感知器是神經(jīng)網(wǎng)絡(luò)的“原子”它定義了神經(jīng)元的基本計(jì)算單元加權(quán)求和激活。而多層感知器神經(jīng)網(wǎng)絡(luò)是由這些“原子”通過特定結(jié)構(gòu)連接起來的“分子”獲得了遠(yuǎn)超前者的表達(dá)能力。我們今天所說的“深度學(xué)習(xí)”其基礎(chǔ)模型就是這種具有多個(gè)隱藏層的MLP的延伸和擴(kuò)展。4.3 學(xué)習(xí)率與初始化訓(xùn)練中的關(guān)鍵技巧即使對于簡單的感知器訓(xùn)練過程也有講究。學(xué)習(xí)率η的選擇η太大更新步長過大可能導(dǎo)致權(quán)重在最優(yōu)解兩側(cè)劇烈震蕩甚至無法收斂。η太小更新步長過小收斂速度會(huì)非常慢需要更多迭代次數(shù)。實(shí)踐建議通常從一個(gè)較小的值開始嘗試如0.01, 0.1觀察學(xué)習(xí)曲線。如果錯(cuò)誤數(shù)下降很慢可以適當(dāng)增大如果曲線劇烈震蕩則需減小。更高級的策略是使用學(xué)習(xí)率衰減隨著迭代進(jìn)行逐步減小η。權(quán)重初始化不能將所有權(quán)重初始化為0。如果所有權(quán)重和偏置初始為0那么所有神經(jīng)元在第一次計(jì)算時(shí)都會(huì)得到相同的輸出并且在梯度更新時(shí)也會(huì)得到相同的更新這破壞了網(wǎng)絡(luò)的對稱性不利于學(xué)習(xí)。我們代碼中使用的是從正態(tài)分布N(0, 0.01)中抽取的小隨機(jī)數(shù)。這是一種簡單有效的方法。在更深的網(wǎng)絡(luò)中會(huì)使用Xavier初始化、He初始化等更精細(xì)的策略。5. 常見問題、調(diào)試技巧與實(shí)戰(zhàn)建議在實(shí)際手寫感知器的過程中你可能會(huì)遇到一些典型問題。這里我總結(jié)了一份排查清單和心得。5.1 問題排查速查表現(xiàn)象可能原因解決方案錯(cuò)誤數(shù)不下降準(zhǔn)確率始終為50%1. 學(xué)習(xí)率η設(shè)置過大或過小。2. 數(shù)據(jù)本身不是線性可分的。3. 權(quán)重初始化值太大導(dǎo)致激活值飽和。1. 調(diào)整學(xué)習(xí)率如0.001, 0.01, 0.1, 1.0嘗試。2. 可視化數(shù)據(jù)檢查是否線性可分。嘗試更復(fù)雜的模型如邏輯回歸、SVM帶核函數(shù)。3. 使用更小的標(biāo)準(zhǔn)差初始化權(quán)重如 scale0.01。訓(xùn)練誤差為0但測試誤差很高過擬合。在簡單數(shù)據(jù)集上感知器不易過擬合但如果特征很多或數(shù)據(jù)有噪聲可能發(fā)生。1. 收集更多訓(xùn)練數(shù)據(jù)。2. 簡化模型感知器本身已很簡單。3. 考慮使用正則化但基礎(chǔ)感知器不直接支持需升級到邏輯回歸等模型。每次運(yùn)行結(jié)果都不一樣權(quán)重初始化是隨機(jī)的且訓(xùn)練數(shù)據(jù)順序可能影響結(jié)果如果實(shí)現(xiàn)的是在線學(xué)習(xí)。設(shè)置固定的隨機(jī)種子random_state確保實(shí)驗(yàn)可復(fù)現(xiàn)。收斂速度非常慢學(xué)習(xí)率太小或者數(shù)據(jù)特征尺度差異巨大。1. 增大學(xué)習(xí)率。2.對特征進(jìn)行標(biāo)準(zhǔn)化如我們可視化時(shí)所做的。這是機(jī)器學(xué)習(xí)中極其重要的一步能確保所有特征在更新時(shí)具有同等的重要性加速收斂。5.2 特征標(biāo)準(zhǔn)化一個(gè)被忽視的關(guān)鍵步驟在上面的可視化代碼中我對數(shù)據(jù)進(jìn)行了標(biāo)準(zhǔn)化StandardScaler。這不僅僅是出于繪圖美觀。對于基于梯度或類似更新規(guī)則的算法如果特征A的范圍是[0, 1000]而特征B的范圍是[0, 1]那么權(quán)重w?的更新將主要被特征A支配導(dǎo)致收斂路徑曲折緩慢。標(biāo)準(zhǔn)化使每個(gè)特征均值為0方差為1能解決這個(gè)問題。即使對于感知器進(jìn)行特征標(biāo)準(zhǔn)化也能顯著提升訓(xùn)練效率和穩(wěn)定性。5.3 感知器 vs. 邏輯回歸理解本質(zhì)區(qū)別很多人會(huì)混淆感知器和邏輯回歸因?yàn)樗鼈兌际蔷€性二分類模型。但核心區(qū)別在于感知器使用階躍函數(shù)作為激活函數(shù)直接輸出硬分類結(jié)果-1或1。其學(xué)習(xí)規(guī)則基于誤分類樣本。邏輯回歸使用Sigmoid函數(shù)作為激活函數(shù)輸出的是樣本屬于正類的概率一個(gè)0到1之間的連續(xù)值。其訓(xùn)練目標(biāo)是最大化似然函數(shù)或最小化交叉熵?fù)p失使用梯度下降求解。這個(gè)區(qū)別導(dǎo)致了邏輯回歸沒有“數(shù)據(jù)必須線性可分”的限制并且能給出分類的置信度概率因此在實(shí)踐中比原始感知器應(yīng)用廣泛得多??梢哉f邏輯回歸是感知器的一個(gè)“概率化”升級版。親手實(shí)現(xiàn)并調(diào)試完一個(gè)感知器后我最大的體會(huì)是最基礎(chǔ)的往往是最重要的。感知器算法就像學(xué)習(xí)騎自行車時(shí)用的輔助輪它讓你在不摔倒的情況下徹底理解“平衡”和“前進(jìn)”的核心原理。當(dāng)你拿下輔助輪感知器騎上真正的自行車神經(jīng)網(wǎng)絡(luò)時(shí)你之前的每一次搖晃和調(diào)整都化為了對復(fù)雜運(yùn)動(dòng)更深刻的理解。今天雖然我們不會(huì)直接用感知器做項(xiàng)目但每一次當(dāng)你調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重、設(shè)置學(xué)習(xí)率、選擇優(yōu)化器時(shí)你都在運(yùn)用從感知器中學(xué)到的最樸素的智慧根據(jù)錯(cuò)誤不斷微調(diào)直至成功。