單層神經(jīng)網(wǎng)絡(luò)
把一個(gè)多元一次方程(需要擬合的目標(biāo)方程)畫為神經(jīng)網(wǎng)絡(luò)
神經(jīng)元:1荆隘、x1椰拒、x2每個(gè)圈為一個(gè)神經(jīng)元
輸入層:1凰荚、x1、x2整體為輸入層,神經(jīng)網(wǎng)絡(luò)中輸入層永遠(yuǎn)只有一層憨颠,且每個(gè)神經(jīng)元只能有一個(gè)特征
輸出層:在線性回歸中輸出層起著加和的作用
正向傳播:輸入層上每個(gè)神經(jīng)元的特征與對應(yīng)連線上的權(quán)重相乘爽彤,最后由輸出層匯總結(jié)果
手動實(shí)現(xiàn)正向傳播
importtorch
X=torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]],dtype=torch.float32)
#tensor([[1.,0.,0.],
#[1.,1.,0.],
#[1.,0.,1.],
#[1.,1.,1.]])
w=torch.tensor([-0.2,0.15,0.15],dtype=torch.float32)
#tensor([-0.2000,0.1500,0.1500])
輸出層的結(jié)果為
zhat=torch.mv(X,w)
#tensor([-0.2000,-0.0500,-0.0500,0.1000])
torch.nn.Linear實(shí)現(xiàn)正向傳播
importtorch
X=torch.tensor([[0,0],[1,0],[0,1],[1,1]],dtype=torch.float32)
#tensor([[0.,0.],
#[1.,0.],
#[0.,1.],
#[1.,1.]])
torch.random.manual_seed(0)
output=torch.nn.Linear(2,1)
zhat=output(X)
對torch.nn.Linear類實(shí)例化,需要輸入兩個(gè)參數(shù)往核,上一層的神經(jīng)元個(gè)數(shù)嚷节,這一層的神經(jīng)元個(gè)數(shù)。因?yàn)檩斎雽犹卣骶仃嘪只有兩個(gè)特征衩婚,所以上一層的神經(jīng)元個(gè)數(shù)=2效斑,這一層是輸出層只有一個(gè)神經(jīng)元所以這一層的神經(jīng)元個(gè)數(shù)=1
在實(shí)例化中,會自動生成神經(jīng)連接上的權(quán)重w和截距b缓屠,但因?yàn)槭请S機(jī)生成的需要設(shè)置隨機(jī)數(shù),確保每次運(yùn)行都生成相同的權(quán)重w和截距b储耐。
但是因?yàn)閣和b是隨機(jī)生成的所以輸出層的結(jié)果zhat和手動算的不一樣蠢挡,這只是為了演示正向傳播過程。神經(jīng)網(wǎng)絡(luò)需要通過多次
感知機(jī)處理2分類問題
上邊的神經(jīng)網(wǎng)絡(luò)只能處理回歸問題禽炬,而不能給出具體的分類腹尖,因此需要在輸出層增加一個(gè)離散函數(shù),根據(jù)數(shù)值大小把zhat分為不同的分類热幔。
感知機(jī)是單層神經(jīng)網(wǎng)絡(luò)绎巨,輸出層使用sign(階躍函數(shù)、符號函數(shù))對zhat處理场勤,從而得到2分類輸出結(jié)果
與門問題
與門問題和媳,即X的第二列和第三列取邏輯and得到的結(jié)果0,0拒迅,0她倘,1,需要用感知機(jī)預(yù)測這個(gè)2分類問題
importtorch
X=torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]],dtype=torch.float32)
#tensor([[1.,0.,0.],
#[1.,1.,0.],
#[1.,0.,1.],
#[1.,1.,1.]])
w=torch.tensor([-0.2,0.15,0.15],dtype=torch.float32)
輸出層的結(jié)果為往毡,因?yàn)楦兄獧C(jī)使用的是sign函數(shù)靶溜,返回的結(jié)果是-1和1代表了兩個(gè)分類罩息,那么這里的-1就是0即False而1代表1即True
zhat=torch.mv(X,w)
#tensor([-0.2000,-0.0500,-0.0500,0.1000])
output=torch.sign(zhat)
#tensor([-1.,-1.,-1.,1.])
那么權(quán)重w是怎么得到的呢,可以使用梯度下降方法通過迭代找到損失函數(shù)最小值葱色,從而得到w