randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数
單層感知機
最簡單的神經網絡單元,感知機模擬生物神經元而來,有輸入、輸出,信號從輸入流向輸出。
每一個感知機都有一個輸入
,一個輸出,和三個參數構成,它們分別是:- 權重(weight)
- 偏置(bias)
- 激活函數(activation function)
可以這么說權重和偏差是從數據中學習的,激活函數是根據網絡設計者對網絡及其目標輸出的直覺而精心選擇的。
數學上可以表示為:
一般而言,輸入可能很多,我們可以用矩陣來表示這種情況,即
和是向量,乘積為點積。激活函數是一個非線性函數,本質上,感知器是線性和非線性函數的組合。
下面我們使用pytorch(1.01)實現一個簡單的感知機:
import torch import torch.nn as nn#單層感知機,數學形式為y=f(w*x+b),w稱為權重,b稱為偏置,f稱為激活函數(activation function), # 其中,x和w是向量,兩參數為點積形式. class Perceptron(nn.Module):#一個單層感知機,只有一個線性層def __init__(self,input_dim):# input_dim:輸入特征的大小super(Perceptron,self).__init__()self.fc1=nn.Linear(input_dim,1)def forward(self, x_in):#感知機的前向傳遞#x_in(torch.Tensor):輸入的數據張量,符合(batch, num_features)#Returns:結果張量,符合(batch,).return torch.sigmoid(self.fc1(x_in)).squeeze_()激活函數介紹
Sigmoid
Sigmoid是神經網絡歷史上最早使用的激活函數之一。它接受任何實際值,并將其壓縮到0到1之間的范圍內。其數學表達式為:
Pytorch代碼如下:
import torch import matplotlib.pyplot as plt x=torch.range(-5.,5.,0.1) y=torch.sigmoid(x) plt.plot(x.numpy(),y.numpy()) plt.title("Sigmoid activation") plt.show()對于對于大多數輸入,Sigmoid函數飽和非常快,這可能導致梯度變為零,或者發散到溢出,這種現象亦稱為梯度消失,替補爆炸。因此,我們很少在神經網絡中使用Sigmoid單元,除了在輸出端使用可以利用其擠壓特性解釋為概率。
Tanh
Tanh函數類似Sigmoid但是數學形式上存在極大不同。
數學表達式為:
tanh和sigmoid一樣,也是一個“擠壓”函數,只是它將一組實數值從
映射到范圍。Pytorch代碼如下:
import torch import matplotlib.pyplot as plt x=torch.range(-5.,5.,0.1) y=torch.tanh(x) plt.plot(x.numpy(),y.numpy()) plt.title("tanh activation") plt.show()ReLu
ReLU(發音為ray-luh)代表整流線性單元。這可以說是最重要的激活函數。它的數學形式為:
ReLU單元所做的只是將負值削波為零。
import torch import matplotlib.pyplot as plt import torch.nn as nn relu=nn.ReLU() x=torch.range(-5.,5.,0.1) y=relu(x) plt.plot(x.numpy(),y.numpy()) plt.title("ReLu activation") plt.show()ReLU的削波效應有助于解決梯度消失問題,但是也帶來了一個問題,隨著時間的推移,網絡中的某些輸出可能會變為零,并且永遠不會恢復。為了解決這個問題,目前提出了Leaky ReLU(泄露ReLu)和Parametric ReLU (PReLU),其中泄漏系數a是學習的參數。
數學形式為:
Pytorch代碼為:
import torch import matplotlib.pyplot as plt import torch.nn as nn prelu=nn.PReLU(num_parameters=1) x=torch.range(-5.,5.,0.1) y=prelu(x) plt.plot(x.detach().numpy(),y.detach().numpy()) plt.title("PReLU activation") plt.show()SoftMax
SoftMax函數將每個單元的輸出壓縮到0到1之間,SoftMax操作還將每個輸出除以所有輸出的總和,從而得出k個可能類別的離散概率分布:
結果概率加起來都是1。這對于解釋分類任務的輸出非常有用,因此這種轉換通常與概率訓練目標配對,例如分類交叉熵。
Pytorch代碼如下:
import torch import torch.nn as nn softmax=nn.Softmax(dim=1) x=torch.rand(1,3) y=softmax(x)print(x) print(y) print(torch.sum(y,dim=1))# tensor([[0.2850, 0.5766, 0.5145]]) # tensor([[0.2781, 0.3722, 0.3498]]) # tensor([1.])損失函數
MSELoss() 均方差損失函數
對于網絡輸出
和目標是連續值的回歸問題,一個常見的損失函數是均方誤差(MSE),均方誤差只是預測值和目標值之間差值的平方的平均值。Pytorch代碼:
import torch import torch.nn as nnmse_loss=nn.MSELoss() outputs=torch.randn(3,5,requires_grad=True) targets=torch.randn(3,5) loss=mse_loss(outputs,targets) print( loss )# tensor(1.1535, grad_fn=<MseLossBackward>)CrossEntropyLoss() 分類交叉熵損失函數
Categorical Cross-Entropy Loss,分類交叉熵損失函數,分類交叉熵損失通常用于多類分類設置,其中輸出被解釋為類成員概率的預測。
其中目標
是一個由n個元素組成的向量,代表著在所有類的概率分布,當,只有一種類是正確的話,這個向量將會變成One-hot向量。網絡的輸出
也是n個元素的向量,但代表網絡對多項式分布的預測。分類交叉熵將比較這兩個向量來測量損失。Pytorch代碼如下:
import torch import torch.nn as nnce_loss=nn.CrossEntropyLoss() outputs=torch.randn(3,5,requires_grad=True) targets=torch.tensor([1,0,3],dtype=torch.int64) loss=ce_loss(outputs,targets) print(loss)#tensor(1.1253, grad_fn=<NllLossBackward>)BCELoss() 二元交叉熵損失函數
在我們有多個類的分類問題時候,分類交叉熵損失函數非常有用。但是有時,我們的任務僅僅包括區分兩個類別——也稱為二元分類。對于這種情況,使用二元交叉熵損失是有效的。
Pytorch代碼:
import torch import torch.nn as nnbce_loss=nn.BCELoss() probabilities=torch.sigmoid(torch.randn(4,1,requires_grad=True)) targets=torch.tensor([1,0,1,0],dtype=torch.float32).view(4,1) loss=bce_loss(probabilities,targets) print(loss)#tensor(1.6178, grad_fn=<BinaryCrossEntropyBackward>)由此第一節我們便介紹到這里。
總結
以上是生活随笔為你收集整理的randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python散点图图例只显示一个标记点_
- 下一篇: 博文收藏