【Pytorch 深度學習筆記】何謂人工神經元(Artificial Neurons)
【Pytorch 深度學習筆記】何謂人工神經元(Artificial Neurons)
哈囉大家好我是 LukeTseng,感謝您點進本篇筆記,該篇筆記主要配合讀本 《Deep Learning with pytorch》 進行學習,另外透過網路資料作為輔助。本系列筆記是我本人奠基深度學習基礎知識的開始,若文章有誤煩請各位指正,謝謝!
本篇為 《Deep Learning with pytorch》 這本書 6.1 Artificial neurons 章節內容的相關筆記。
6.1 Artificial neurons
深度學習的核心為神經網路(Neural Networks, NN),是一種能夠透過組合多個簡單函數來表示複雜函數的數學實體。
白話上來說,讓電腦模仿人類大腦的學習方式,從大量資料中自己找規律,然後用這些規律做判斷或預測,就是神經網路在做的事情。
在數學上,神經網路最基本的組成是神經元(neuron),其核心的運作流程可拆解為兩步:線性轉換(linear transformation)加上一個固定的非線性函數(nonlinear function)。
用數學公式可表示為:$$o = f(w * x + b)$$
- 為輸出。
- 表示輸入資料。
- 表示權重(Weights)或縮放因子(scaling factor),會與輸入相乘。
- 代表偏差值(bias)或偏移量(offset),作為常數相加。
- 代表非線性函數,被稱為啟動函數(activation function)(例如雙曲正切函數 )。
當推廣到包含許多神經元的層(layer)時, 和 可以是包含多個數值的向量,而 會變成矩陣, 則是純量或向量。

An artificial neuron: a linear transformation enclosed in a nonlinear function. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.2, Manning Publications, 2020.
這張圖的上半部分標示出前面的公式(這邊將函數替換成 tanh 函數)當中,哪些是 Linear transformation,哪個部分是 Nonlinear function。
而下半部分則是在做一次 forward propagation / inference(前向傳播、推論)。
目前已經學習到的參數是 w = 2、b = 6,接著圖中拿不同的 x 去做測試(),各做一次線性轉換:
做完線性轉換後,再把先前線性轉換的結果值丟進啟動函數 當中運算:
註: 的值域落在 。
以上就是神經元完整的運作流程。
6.1.1 Composing a multilayer network
單一個神經元的表達能力有限,因此需要構建多層神經網路(multilayer neural network)才能做到更複雜的表達。
多層網路是將上述的神經元函數進行組合(composition),將上一層神經元的輸出作為下一層神經元的輸入,這種結構的數學串聯表示式如下:
- 第一層:
- 第二層:
- 接著以此類推,組合直到最後的輸出層即可:

A neural network with three layers. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.3, Manning Publications, 2020.
這張圖在說明 NN(神經網路)如何把一個輸入 ,經過多層神經元的運算,最後得到輸出 ,該圖的主要核心概念就是:「NN 就是反覆做加權計算 + 偏移 + 啟動函數,讓模型學會把輸入轉成想要的輸出。」
最上方有一條式子 ,意思是:
- 每層都做線性轉換
- 做完後丟進 tanh(x),就跟之前神經元在做的運算一樣,只是變成批次運算。
而中間的流程圖大意上是這樣的:
- 輸入 進去。
- 神經元用 weights 跟 bias 做線性轉換。
- 接著經過啟動函數(activation function)。
- 得到新的輸出,丟給下一層。
最後是最下方的圖,這是在說明多層神經網路的結構,共有三層神經網路:
- 輸入層(Input Layer)
- 隱藏層(Hidden Layers)
- 輸出層(Output Layer)
每一個小圓圈就是一個神經元,而每條線代表一個權重()。
6.1.2 Understanding the error function
這裡的 error function 可以把它理解成模型目前的參數造成多少預測錯誤,也就是前面第 5 章講過的 loss function / cost function。
:::info
回顧:loss function 會把模型輸出與正確答案之間的差距變成一個數值,訓練的目標就是讓這個數值越小越好。常見做法是用平方誤差,例如:
- 為模型預測值。
- 為真實答案。
- 為誤差或損失(loss)。
這是只針對單筆資料的,如果有很多筆資料,通常會寫成: $$L(w, b) = \frac{1}{N}\sum^N_{i=1}(\hat{y}_i - y_i)^2$$
:::
線性模型的誤差函數是一種凸函數(Convex function)
線性模型如 搭配平方誤差時,loss 對參數 跟 來說通常會形成一個 convex error curve / convex error surface,也就是凸函數形狀。
這種形狀有一個很好的特性,也就是只有唯一的最低點,即最小值。
最低點代表 達到最小,也代表該組 讓模型預測最接近資料,由於最低點是唯一的,因此該組 也會是唯一的一組正確答案。
因此線性模型的訓練很簡單,只要找到那個唯一、清楚、最好的參數組合即可。線性模型加上平方誤差時,誤差函數是凸的,因此可以用很有效率的方法找到最小值。
神經網路的誤差函數是非凸函數(Non-convex Function)
NN 的模型不再只是單純的線性模型了,而是變成 weight()、bias()、activation function 這些變數組合起來的複雜函數。
然而,NN 並不具備這種凸誤差表面(Convex Error Surface)的特性,即使 NN 同樣用平方誤差,其誤差表面也是非凸的(non-convex),即表示 NN 可能充滿了多個局部極小值或複雜的地形。
因此在 NN 當中並沒有唯一的正確答案,因為 NN 的參數是共同產生輸出的,也就是模型輸出不像先前線性模型由某一個參數單獨決定,而是由全部參數共同決定。
這也說明一件事情:只要最後輸出差不多,裡面的參數組合可以有很多種。
為什麼 activation function 會讓誤差函數變複雜?
書中指出,神經網路 error surface 非凸的一大原因是 activation function。
一個神經元是 ,如果沒有 activation function,多層線性模型其實還是線性的。例如: $$y = W_2(W_1x+b_1)+b_2$$
展開後仍然可以整理成 ,也就是說,多層線性層堆在一起,本質上仍然只是另一個線性模型,但加入 activation function 之後就不一樣了: $$y = f_2(W_2f_1(W_1x+b_1)+b_2)$$
模型就能產生彎曲、轉折、分段變化的行為,這讓神經網路可逼近非常複雜的函數,但代價就是 error function 也會變得更崎嶇、更難最佳化。
6.1.3 All we need is activation
該節主要探討為什麼 NN 僅靠線性運算不夠,以及在 NN 中 activation function 扮演的兩個最核心的角色。
賦予模型逼近任意函數的能力(非線性特質)
如果只有線性運算,無論模型疊加了多少隱藏層(Hidden Layer),最終輸出結果還是一個簡單的線性函數,這也說明線性運算的特徵,也就是斜率固定。
但在這個世界上很多東西都不是簡單、固定的,像是:
- 溫度和冰淇淋銷量的關係可能不是完全線性。
- 圖片中「像不像狗、貓等等」的程度,不會隨像素值直線變化。
- 房價和地點、坪數、屋齡、交通條件之間的關係非常複雜。
這就是為何 activation function 相當重要,因為它打破純線性的限制,讓模型可以學到彎曲、轉折、分段變化等複雜關係,如同小標上所說的,activation function 賦予模型逼近任意函數的能力(非線性特質)。
Activation function 的第一個功能:讓模型有不同斜率
activation function 在模型內部可以讓輸出函數在不同輸入值上有不同斜率,這是線性函數做不到的事情。
Activation function 的第二個功能:限制輸出範圍
在網路的最後一層,activation function 的任務是將前一層線性運算的無界輸出,集中並限制到一個特定的實用範圍內。
然後書中接著用一個例子來做說明:假設給圖片一個 good doggo score,也就是這張圖片有多像好狗狗。

Dogs, bears, and garbage trucks being mapped to how dog-like they are
via the tanh activation function. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.4, Manning Publications, 2020.
假設給出幾張圖片如下:
- 黃金獵犬、可卡犬:應該分數高。
- 飛機、垃圾車:應該分數低。
- 熊:應該偏低,但可能比垃圾車高一點。
若做純粹的線性運算,他只會做加權、加總、偏移,本身則不會自動限制輸出範圍。因此如果跟模型說分數 0 到 10 分,模型仍然可能輸出 11、-1000 這種超出範圍的值或極端值。
因此最後一層的 activation function 可作為範圍限制的角色,把輸出限制在合理範圍。
為了解決輸出範圍無限擴張的問題,在此小節提出兩種方式:
1. 直接截斷輸出範圍(Capping the output range)Hardtanh
書中提到第一種做法是 capping the output range,也就是直接把輸出設定在某個範圍內。
如果我們想要分數是 0 到 10 分,則直接寫一個函數就好,如下:
這個意思就是說當 的數值直接設定成 0, 的數值直接設定成 10。
這種概念即為 Hardtanh,在 PyTorch 的函數為 torch.nn.Hardtanh,其預設的範圍是 -1 到 1。
此方法的優點是簡單明確,而缺點是超過範圍後,輸出幾乎不再反映輸入差異。例如輸入 100 和 1000,經過 Hardtanh 後可能都只是 1。
2. 壓縮輸出範圍(Compressing the output range)Sigmoid / Tanh
另一種做法為 Compressing the output range,透過使用 torch.nn.Sigmoid、torch.tanh 等函數來壓縮數值。
Sigmoid 函數為:$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
其輸出範圍為 ,因此該函數常用在機率或二分法的問題上。
而另一個函數 Tanh 的輸出範圍為 ,長得像下面那樣:

A collection of common and not-so-common activation functions. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.5, Manning Publications, 2020.
- 當輸入很小時,輸出接近 -1。
- 當輸入很大時,輸出接近 1。
- 當輸入接近 0 時,輸出變化最明顯。
回到先前狗狗的例子,書中的 Figure 6.4 用 tanh activation function 來解釋像不像狗的分數,然後書中給了三個數值,並寫了一些簡單的 PyTorch 程式:
1 | import math |
| 輸入 | tanh 輸出 | 對應意義 |
|---|---|---|
| -2.2 | 約 -0.976 | 垃圾車,幾乎完全不像狗 |
| 0.1 | 約 0.100 | 熊,介於中間 |
| 2.5 | 約 0.987 | 好狗狗,很像狗 |
垃圾車會被標成不是狗,好狗狗會被標成明顯是狗,熊則落在中間。此例的重點不在狗本身,而在於 activation function 如何把原本無限制的線性輸出縮限到一個範圍內。
何謂 sensitive range?
一樣是剛剛的例子,書中特別強調中間區域,也就是 sensitive range(敏感區)。
以 tanh 來說,當輸入接近 0 時 ,在附近的斜率較大,所以輸入稍微變動,輸出也會明顯變動。
像是熊的輸入是 ,落在 sensitive range,代表若圖片從灰熊換成北極熊,模型可能覺得北極熊更像狗一點,輸出就會往上升;如果換成無尾熊,可能更不像狗,輸出就會下降。
正如其名,在 sensitive range 中,模型對細節比較敏感。
何謂 saturated range?
相對而言,如果輸入已經很大或很小,tanh 的輸出會接近 1 或 -1,稱為 saturated range(飽和區)。
例如垃圾車的輸入是 ,輸出為 ,非常接近 -1,這時候即使稍微改變輸入,輸出可能還是接近 -1,即模型已非常確定垃圾車非常不像狗,再怎麼小改變也不太會影響判斷。
對垃圾車來說,即使做一些劇烈變化,可能也只是從 -0.97 變成 -0.8 左右,不會突然變得很像狗。
6.1.4 More activation functions
該節主要說明,除了前面說過的 activation functions 以外,還有哪些常見及不常見的 activation functions,這些函數分為平滑(smooth)與硬性(hard)兩大類。

A collection of common and not-so-common activation functions. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.5, Manning Publications, 2020.
Tanh 跟 Sigmoid 以及 Hardtanh 前面都談到了,所以這邊不再贅述。而這張表的上半部分的橫排屬於平滑函數,下半部分的橫排屬於硬性函數。
Softplus:ReLU 的平滑版本
輸出特性:
- 當 x 很小時輸出趨近於 0。
- 當 x 很大時輸出趨近於 1。
- 中間轉折處是平滑的。
Softplus 和 ReLU 很像,但 ReLU 在 0 的位置有一個尖角,而 Softplus 則是一個平滑的曲線彎過去。
ReLU:目前最常用的基本 activation function 之一
ReLU 全名為 Rectified Linear Unit(修正線性單元)。
公式:$$\text{ReLU}(x) = max(0, x)$$
也可寫成如下形式: $$\text{ReLU}(x) = \begin{cases}
0, & x < 0 \
x, & x \ge 0
\end{cases}$$
輸出特性:
- 輸入小於 0,輸出 0。
- 輸入大於 0,原樣輸出。
書中特別強調 ReLU,因為他是目前被公認表現很好的通用 activation function 之一,許多 state-of-the-art results 都曾用過。
ReLU 受歡迎的原因主要有三個:
- 計算非常簡單。
- 正數區域梯度穩定。當 時,ReLU 的斜率是 ,因此梯度比較不容易像 Sigmoid 或 Tanh 那樣快速消失。
- 會產生稀疏啟動。也就是很多神經元在某些輸入下會輸出 0,這有點像讓神經網路只啟用一部分神經元。
ReLU 的問題:負數區域完全沒有反應
ReLU 雖然好用,但有一個缺點,就是當 的時候,永遠輸出 ,在負數區域,梯度也是 0。
若某個神經元長期落在負數區域,可能就幾乎不再更新,常被稱為 dead ReLU(死亡 ReLU) 問題。
LeakyReLU:ReLu 的改良版
LeakyReLU 修改標準 ReLU,使其在負數輸入時不完全等於 0,保留一個很小的正斜率,通常這個斜率是 0.01,但在 Figure 6.5 的地方為了看得清楚,畫成 0.1。
公式:$$\text{LeakyReLU}(x) = max(0, x) + \alpha min(0, x)$$
或寫成:$$\text{LeakyReLU}(x) = \begin{cases}
x, & x \ge 0 \
\alpha x, & x < 0
\end{cases}$$
其中 是很小的正數,例如 。
LeakyReLU 不讓神經元在負數區域完全死掉,至少留一點梯度讓它還能學習,解決了 dead ReLU 的問題。
6.1.5 Choosing the best activation function
此節作者主要說明沒有什麼絕對最好的 activation function,而重要的是我們要理解 activation function 為什麼能讓神經網路學習,以及什麼特性會影響訓練效果。
激勵函數的兩個必備基本條件
如果不具備以下兩個特性,神經網路要麼會退化回簡單的線性模型,要麼則會變得極難訓練:
- activation function 必須是非線性的
- activation function 通常可微分
1. activation function 必須是非線性的
activation function 基本上需要具備 nonlinear(非線性)這個特性,原因很簡單:如果沒有 activation function,只是不斷重複在做 這種線性運算而已,最後整個模型仍然只是 affine linear function(仿射線性函數)。
沒有 activation function 的多次線性轉換,結果仍然會是同樣的線性形式;非線性才能讓整個網路能近似更複雜的函數。
2. activation function 通常可微分
activation function 要能讓我們計算 gradient,即 activation function 是必須要可微分的(differentiable),因為 NN 訓練依賴 backpropagation(反向傳播)與 gradient descent(梯度下降)。
如果 activation function 無法傳遞梯度,模型就很難知道參數該往哪裡調整。
另外像 Hardtanh 或 ReLU 這種函數,在某些點有不連續或尖角,仍然可接受。因此 activation function 不一定要在每個點都完美、平滑,只要大部分區域能提供可用的梯度,訓練仍然可以進行。
Sensitive range:模型真正容易學習的區域
所謂 sensitive range,是指輸入有明顯改變時,輸出也會跟著有明顯改變的區域。
一個 activation function 至少會有一個 sensitive range,這對訓練來說是必要的。
在之前 的例子中就說明過此區域,當 x 接近 0 時,其函數變化最明顯:
- 輸入稍微變大,輸出也明顯變大。
- 輸入稍微變小,輸出也明顯變小。
在這個區域中,gradient 比較明顯,backpropagation 能比較有效的告訴前面的參數該怎麼改。
Saturated range:模型比較不容易學習的區域
相對於 sensitive range,書中也提到很多 activation function 有 insensitive range 或 saturated range(飽和區),意思是輸入就算改變,輸出也幾乎不變的區域。
例如 的數值若是 100、1000 則直接限縮到 1,在此時輸入雖然差很多,但輸出幾乎沒差。
這會造成訓練上的問題,因為輸出變化很小,gradient 也會很小。
當 neuron 的輸入落在 saturated range 時,由於輸出附近很平,gradient 接近 0,因此誤差對這些神經元的影響會很小。
對反向傳播與學習機制的影響
在此節最有價值的地方在於它把 activation function 和 backpropagation 連結起來。
神經網路訓練時,loss 的錯誤訊號會從輸出層一路往前傳,對某個神經元來說,如果它的 activation 正好落在 sensitive range,誤差就較容易通過此 activation function 傳回去。
上述過程即為反向傳播,也就是在做偏微分的動作 ,如果梯度可有效的被算出來,參數就能更新。
但如果 activation 已進入 saturated range,gradient 接近 0,錯誤訊號傳回去時就會被削弱。
神經元的分工合作
把 linear + activation units 組成網路後,會出現一個很強大的機制:
- 對同一個輸入,不同神經元會在不同範圍內產生反應。
- 和該輸入相關的 error,主要會影響那些正處於 sensitive range 的神經元,而其他已經飽和或不敏感的神經元受到的影響較小。
這是 NN 能學到複雜函數的重要原因。
用白話解釋的話,就是不同神經元會自動分工。有些神經元負責處理某一類輸入,有些神經元負責處理另一類輸入,當某個輸入造成錯誤時,主要被修正的是那些當下真正有反應的神經元。
為什麼 sensitive range 讓訓練像線性模型一樣比較好學?
很多 activation function 在 sensitive range 中,對輸入的導數(即斜率)通常接近 1。因此對於那些正處在 sensitive range 的神經元,用 gradient descent 估計線性轉換的參數時,行為會有點像此書前面第 5 章的線性模型擬合(fit)。
一個神經元可看成 ,如果目前 落在 sensitive range,並且 的話,從局部來看 就會像是直接用 來算。
所以在此區域內,參數更新會相對穩定、容易理解,這也是為什麼神經網路雖然整體是高度非線性的,但仍然可以用 gradient descent 訓練,可在很多局部區域中,讓許多神經元各自做類似線性擬合的調整。
所以如何選 activation function?
這個問題沒有固定的標準答案,但可以根據情況整理出選擇原則。
- 隱藏層(Hidden Layer)通常先選 ReLU 或其變體,在一般深度學習實務中,ReLU 是很常見的起始點,原因是 ReLU 簡單、計算快,而且正數區域梯度穩定。
- 如果擔心發生 Dead ReLU,可以用 LeakyReLU。
- 如果輸出要是 0 到 1,可以考慮 Sigmoid。
- 如果輸出要是 -1 到 1,可以考慮 Tanh。
6.1.6 What learning means for a neural network
該節主要回答一個問題:「神經網路所謂的『學習』,到底是在學什麼?」答案:神經網路的學習,就是透過訓練資料與梯度下降,找出一組合適的 weights(權重)與 biases(偏差值),讓大量線性轉換 + activation function 組合起來後,能夠近似資料背後的真實關係。
在該節也強調:如果把很多個神經元並排,再一層一層堆疊,就可以形成一個能近似高度非線性過程的模型。用線性轉換 + 可微分 activation function 堆疊出來的模型,可以以近似高度非線性的過程,且即使模型有數百萬個參數,仍然可以透過 gradient descent 估計這些參數。
簡單來說神經網路 NN 就是一堆神經元共同合作,來讓他能夠逼近任何複雜的非線性關係,進而從龐雜的資料中學到隱藏的規律與特徵。
為什麼神經網路很吸引人?
傳統建模時,常常要先猜資料背後的函數形式,例如會問:
- 這是線性關係嗎?
- 還是二次函數?
- 還是分段函數?
但神經網路的好處是,不必一開始就精準的知道資料背後到底是哪一種函數。
書中說,deep neural network(深度神經網路)之所以有吸引力,是因為它讓我們不需要太擔心資料背後的精確函數形式,NN 可以作為一種 universal approximator(通用近似器),並且我們有方法估計它的參數。
用白話來說的話,上述這些意思就是在說傳統建模上,以前是人類先猜資料應該長什麼樣子,但現在不一樣了,給 NN 足夠多的神經元,它就能在任意指定的精度下,近似任何連續函數(即資料的長相)。
Universal approximator 是什麼意思?
Universal approximator(通用近似器)是指一個在數學上能夠模擬或逼近任何複雜函數的系統。
可以把它想像成一個萬能黑盒子,不論你給它輸入什麼規則(如將貓的圖片轉換為字串「貓」、將明天的氣溫預測出來),只要這個系統的規模足夠大,它都能找到一組參數來精準複製這個規則。
這個概念源於機器學習中的通用近似定理(Universal Approximation Theorem)。
如同前面所說,只要給 NN 足夠多的神經元,它就能在任意指定的精度下,近似任何連續函數,因此可以把 NN 看作成是一種 Universal approximator。
Model capacity 模型容量是什麼?
書中提到,universal approximator 可以依照需求客製化,例如調整 model capacity(模型容量),讓它能處理更複雜的 input/output relationship。
Model capacity 可以理解成模型能表達多複雜函數的能力:
- 容量小的模型,就像只有一支筆、一把直尺,能畫的形狀有限。
- 容量大的模型,就像有很多筆、很多曲線工具,可以畫出更複雜的圖案。
但容量不是越大越好,
- 容量太小會 underfitting(欠擬合),學不出資料規律
- 容量太大則可能 overfitting(過擬合),把訓練資料記得太死,對新資料表現反而變差。
四個神經元如何組合出複雜形狀

Composing multiple linear units and tanh activation functions to produce nonlinear outputs. Reproduced from Eli Stevens, Luca Antiga, and Thomas Viehmann, Deep Learning with PyTorch, Fig. 6.6, Manning Publications, 2020.
這一節最重要的圖是 Figure 6.6。書中用四個神經元 A、B、C、D 來說明,即便只有少量神經元,只要它們的 weight 和 bias 不同,組合起來就能產生比單一神經元複雜得多的函數。
這四個神經元都使用 Tanh activation function,它們各自呈現出平滑的 S 型曲線,只是中心點與斜率因為 weight 和 bias 不同而有所差異。
Weight 和 bias 分別控制什麼?
對一個神經元 來說,weight 主要控制斜率與變化速度。
- 如果 很大, 會很快從 跳到 ,曲線比較陡。
- 如果 很小,轉換會比較平緩。
weight 會影響神經元對輸入變化有多敏感。
而 Bias 主要控制左右平移,即 會影響 的中心位置。例如 就表示中心在 x=0 附近, 的中心會往右移,就跟之前學的函數平移是一樣的概念。
所以 bias 可以控制神經元主要在哪個輸入範圍開始反應。
第一層組合:A + B 跟 C + D
Figure 6.6 先把神經元兩兩相加(A + B 及 C + D)。
- A+B 開始出現比單一 Tanh 更有趣的形狀,它有一點 S 型,但中間還會出現正向凸起與負向凸起。
- C+D 則產生一個較大的正向凸起,甚至峰值可以超過單一神經元原本的最大值 1。
這裡重點是說單一神經元輸出範圍有限,但多個神經元相加後,可以產生新的形狀與更大的變化,代表 NN 開始有能力做局部凸起、局部凹陷、轉折等形狀。
第二層組合:C(A+B) 跟 D(A+B)
接著書中進一步把神經元組合成像兩層網路的形式( 及 ),這裡的意思是要在概念上表示前一層的輸出 A+B,被送進下一層的神經元 C 或 D 中處理。
就像前面在做合成函數(composition of functions)的概念一樣:
這就是多層神經網路的本質,前一層先把輸入轉成某種特徵,下一層再基於這些特徵繼續轉換。
在 Figure 6.6 中,到了第三列,組合後的圖形仍保留 的正負凸起特徵,但正峰變得比較微妙。
接著再把 和 相加,會出現新的性質,例如兩個明顯的負向凸起,以及可能非常細微的第二個正向峰值,重點是這些複雜形狀只用了四個神經元、兩層結構就能產生。
神經網路「訓練」與「學習」的真正含義
在上述的視覺化例子中,神經元的參數(weight 跟 bias)只是為了展示而隨意挑選的。
而在實際應用中,訓練(Training)的過程,就是去找出這些 weight 和 bias 的可接受數值,使得最後組合出來的網路能夠正確地執行我們交付的任務。
當一個網路成功訓練後,會透過這些 weight 與 bias 的數值組合,捕捉到數據背後的內在結構(inherent structure),並將其轉化為有意義的數值表示,從而在面對未曾見過的新數據時也能給出正確的輸出。
因此,所謂的學習(Learning),指的是我們不再為特定任務去預先編碼(encode)敘述該任務運作的規則。反而我們要給予一個未經訓練的通用模型大量的範例,讓模型透過這些範例自動特化(specialize)於該特定任務。
總整理
神經網路的基礎運作
神經網路(NN, Neural Network)的核心概念是讓電腦模仿人腦,從資料中找出規律,最小的運作單元是神經元(Neuron),而網路則是多個神經元的層層疊加。
- 神經元數學的本質:線性轉換加上固定的非線性啟動函數,公式表示為:$$o = f(w * x + b)$$
- 參數意義:
- (權重, weight)控制縮放斜率。
- (偏差值, bias)控制平移偏移量。
- (啟動函數, activation function)提供非線性特徵。
- 參數意義:
- 多層神經網路架構:將上一層的輸出作為下一層的輸入,透過包含輸入層(Input Layer)、隱藏層(Hidden Layer)與輸出層(Output Layer)的結構,反覆進行「加權(weight)、平移(bias)、啟動(activation)」,讓模型學會將輸入轉換為期望的輸出。
誤差函數 / 損失函數(Error / Loss Function)
損失函數用於衡量模型預測值與真實答案的差距,訓練的目標是透過尋找合適的參數讓誤差最小化。
| 模型種類 | 誤差表面形狀 | 最佳化特性說明 |
|---|---|---|
| 線性模型 | 凸函數(Convex) | 只有唯一的最低點,必定能輕易找到唯一最佳解。 |
| 神經網路 | 非凸函數(Non-convex) | 因加入啟動函數,表面充滿多個局部極小值與崎嶇地形,解法不唯一,由所有參數共同決定。 |
啟動函數(Activation Functions)的核心作用
如果沒有 Activation Function,多層神經網路的疊加最終仍只是一個純線性模型,Activation Function 是賦予神經網路強大表達能力的關鍵,必須具備非線性且通常需可微分。
兩大主要功能:
- 賦予非線性特質:讓模型能在不同輸入值產生不同的斜率,打破直線限制,藉此逼近任何複雜的彎曲或轉折函數。
- 限制輸出範圍:將無限的線性計算結果,壓縮(Compressing)或截斷(Capping)至特定實用的範圍(如 0 到 10 分)。
神經元的運作區間:
- 敏感區(Sensitive range):Activation Function 斜率變化明顯的區域,輸入微調會導致輸出明顯改變,此時梯度明顯,誤差能有效透過反向傳播傳遞,是模型真正容易學習的區域。
- 飽和區(Saturated range):輸出幾乎不變的區域,梯度接近 0,會導致錯誤訊號被削弱,參數難以更新。
常見 Activation Functions 比較
實務上沒有絕對最好的啟動函數,需依任務或神經網路層級來決定:
| 函數名稱 | 特性與輸出範圍 | 優缺點與適用場景 |
|---|---|---|
| Hardtanh | 直接截斷在 -1 到 1 之間 | 優點:簡單明確。 缺點:超出範圍後完全無梯度反應。 |
| Sigmoid | 壓縮在 0 到 1 之間 | 適用:機率或二分法預測問題。 缺點:兩端容易落入飽和區導致梯度消失。 |
| Tanh | 壓縮在 -1 到 1 之間 | 特性:輸入近 0 時處於敏感區,變化最明顯。 適用: 期望輸出包含正負值的場景。 |
| ReLU | 小於 0 輸出 0;大於等於 0 原樣輸出 | 優點:計算極快、正數區梯度穩定,目前最常用於隱藏層。 缺點:負數區無反應,會引發 Dead ReLU(神經元死亡)問題。 |
| LeakyReLU | 負數區保留極小正斜率(如 0.01) | 優點:成功解決 Dead ReLU 問題,讓負數區的神經元仍能微幅學習與更新。 |
神經網路「學習」的真正含義
- 通用近似器(Universal Approximator):只要神經元數量足夠(模型容量適當,避免欠擬合 Underfitting 或過擬合 Overfitting),神經網路就能以任意精度逼近任何連續的真實規律,我們不再需要事先猜測資料的精確數學函數形式。
- 參數的分工合作: 決定神經元對輸入的敏感度與變化速度, 決定神經元開始反應的觸發中心。透過不同神經元的疊加組合,能輕易產生極度複雜的幾何特徵。
- 學習的本質:「學習」意味著我們不再靠人工寫死任務規則,而是給予這個通用模型大量的範例資料,讓模型透過梯度下降自動特化,找出正確的權重與偏差組合,進而捕捉並內化資料背後的隱藏結構。

