再談什么是神經網絡,透過現象看本質 原創
“ 神經網絡是一種獨立的技術,只不過它與不同的領域結合之后就有了不同的神經網絡模型。”
面對著網絡上各種各樣關于神經網絡的內容,很多想學習神經網絡的人都無從下手,包括作者自己;面對各種亂七八糟的概念,名詞,很多人都被這些東西蒙住了眼睛。
所以,今天我們就拋開各種高大上的概念,從本質出發來學習什么網絡;我們今天不討論CNN,RNN,Transformer,LSTM等各種神經網絡架構;只討論什么是神經網絡。
神經網絡
對神經網絡有過了解的人應該都知道,神經網絡就是仿生學的一種實現,使用的是數學模型模擬人類的大腦神經系統;具體的可以看一下上一篇文章——??從一個簡單的神經網絡模型開始??。
所以,什么是神經網絡?
由簡單神經元構成的系統就是神經網絡;可以說一個神經元就是一個最簡單的神經網絡模型,只不過這個神經網絡僅僅只有一層,且只有一個神經元;而由多個神經元組成的多層神經網絡系統就是一個復雜的神經網絡模型。
雖然從實際出發,一個神經元的神經網絡沒什么實際意義;但其卻是理解神經網絡的基礎。
神經網絡最基礎的形態就是單層神經網絡,也被叫做感知器;而二層以上的神經網絡叫做多層感知器或深層神經網絡。
多層神經網絡的形態基本如下所示,根據不同的任務類型可以適當增加更多的中間層。
當然這些只是神經網絡的理論基礎,那么要想實現一個能運行的神經網絡,需要哪些必要功能點呢?
事實上,實現一個神經網絡大概需要以下幾個功能點:
- 數據集準備
- 神經網絡設計
- 損失計算
- 優化函數
- 反向傳播(BP)算法
數據集準備
不論是自然語言處理(NLP)還是計算機視覺(CV)處理,都離不開訓練數據;而由于神經網絡中的主要數據類型是向量(矩陣),因此不論是圖像,視頻,還是文字都需要把數據轉化為神經網絡能夠處理的格式,也就是向量類型。
由此也誕生了一些數據向量化的技術,比如文字處理的詞袋模型,one-hot編碼等;以及圖像向量化的技術。
神經網絡設計
以pytorch為例,實現一個神經網絡只需要繼承nn.Module類即可;而根據不同的任務類型,開發人員可以自己根據需要實現能夠完成具體任務的神經網絡模型;基礎代碼如下所示:
import torch.nn
# 自定義神經網絡
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
# 用來完成一些初始化功能
def __forward(self, x):
"""
神經網絡實現
:param x:
:return:
"""
# 比如實現一個全鏈接層
x = nn.Linear(x)
# pass
損失計算
簡單來說損失計算是神經網絡自主學習的基礎,損失計算的目的就是計算神經網絡的輸出(預測值)和真實值之間的差值,損失差越大說明神經網絡的效果越差。
因此,在神經網絡訓練中,需要根據損失差來對神經網絡的參數進行優化,這也是神經網絡訓練的本質。
常見的損失計算函數有交叉熵計算,均方誤差等。
優化函數
優化函數簡單理解就是用來優化神經網絡參數的一種方式,由于未經過訓練的神經網絡參數都是隨機的;因此在對神經網絡訓練時,需要根據損失結果調整神經網絡的參數值,以使神經網絡達到最好的效果。
模型訓練的本質就是不斷優化模型參數的過程。
而常見的優化算是就是梯度下降,簡單來說就如下圖所示,優化算法的最優解就是圖中藍色標識的部分;但對神經網絡來說,它并不知道哪里是最優解,因此就需要一個點一個點的試,以求把損失降到最小,而這個過程就叫做梯度下降。
舉例來說,假設x的初始值為2,這時它的損失值也就是y=4;這時誤差就比較大,因此優化函數就優化一下讓x=3,這時損失值y=3;這就說明神經網絡的優化函數是有用的。
所以,對梯度下降不了解的可以看之前的文章——??神經網絡之損失函數與優化函數——梯度下降??;簡單理解梯度下降就是高中數學中的求導,求變化率最小的點(極值),當然實際應用中的梯度下降要復雜的多。
反向傳播
反向傳播算法也叫做BP算法,目的是根據結果去調整神經網絡的參數值;而具體方式就是通過損失計算和優化函數來實現;通過反向傳播來調整模型參數,通過優化函數來優化神經網絡的梯度。
如下代碼所示就是神經網絡的訓練基本流程,通過不斷循環來使神經網絡達到最優。
for idx, (input, target) in enumerate(data_loader):
# 梯度歸零 optimizer就是優化函數
optimizer.zero_grad()
output = model(input) # 調用模型 獲取預測值
loss = F.nll_loss(output, target) # 得到損失
loss.backward() # 反向傳播
optimizer.step() # 更新梯度
而由于神經網絡的基礎數據格式是向量,而表現形式是矩陣;因此神經網絡中涉及大量的矩陣運算。以及,神經網絡本質上就是一個數學模型,因此,神經網絡中也涉及到大量的數學運算,如求和,平方,求導等等。
而這就是實現一個基礎神經網絡所需要的基本步驟,而哪些類似于RNN,CNN,Transformer等神經網絡架構的神經網絡模型;只是在基礎神經網絡的基礎之上,為解決具體問題以及和具體的應用領域相結合,而專門設計和優化的模型。
簡單理解RNN,CNN,Transformer模型就是在神經網絡的基礎之上,如損失計算,優化等;做了一些騷操作,這些操作能夠更好的處理自然語言,圖像等問題。
從哲學的角度來說就是,一般和特殊的關系;普通的神經網絡就是一般的神經網絡,而RNN,CNN等就是特殊的神經網絡。比如,Transformer神經網絡架構就是用來處理序列到序列到任務。
本文轉載自公眾號AI探索時代 作者:DFires
