人工智能學習Pytorch梯度下降優化示例詳解
一、激活函數
1.Sigmoid函數
函數圖像以及表達式如下:
通過該函數,可以將輸入的負無窮到正無窮的輸入壓縮到0-1之間。在x=0的時候,輸出0.5
通過PyTorch實現方式如下:
2.Tanh函數
在RNN中比較常用,由sigmoid函數變化而來。表達式以及圖像如下圖所示:
該函數的取值是-1到1,導數是:1-Tanh**2。
通過PyTorch的實現方式如下:
3.ReLU函數
該函數可以將輸入小於0的值截斷為0,大於0的值保持不變。因此在小於0的地方導數為0,大於0的地方導數為1,因此求導計算非常方便。
通過PyTorch的實現方式如下:
二、損失函數及求導
通常,我們使用mean squared error也就是均方誤差來作為損失函數。
1.autograd.grad
torch.autograd.grad(loss, [w1,w2,…])
輸入的第一個是損失函數,第二個是參數的列表,即使隻有一個,也需要加上中括號。
我們可以直接通過mse_loss的方法,來直接創建損失函數。
在torch.autograd.grad中輸入損失函數mse,以及希望求導的對象[w],可以直接求導。
註意:我們需要在創建w的時候,需要添加requires_grad=True,我們才能對它求導。
也可以通過w.requires_grad_()的方法,為其添加可以求導的屬性。
2.loss.backward()
該方法是直接在損失函數上面調用的
這個方法不會返回梯度信息,而是將梯度信息保存到瞭參數中,直接用w.grad就可以查看。
3.softmax及其求導
該函數將差距較大的輸入,轉換成處於0-1之間的概率,並且所有概率和為1。
對softmax函數的求導:
設輸入是a,通過瞭softmax輸出的是p
註意:當i=j時,偏導是正的,i != j時,偏導是負的。
通過PyTorch實現方式如下:
三、鏈式法則
1.單層感知機梯度
單層感知機其實就是隻有一個節點,數據*權重,輸入這個節點,經過sigmoid函數轉換,得到輸出值。根據鏈式法則可以求得梯度。
通過PyTorch可以輕松實現函數轉換以及求導。
2. 多輸出感知機梯度
輸出值變多瞭,因此節點變多瞭。但求導方式其實是一樣的。
通過PyTorch實現求導的方式如下:
3. 中間有隱藏層的求導
中間加瞭隱藏層,隻是調節瞭輸出節點的輸入內容。原本是數據直接輸給輸出節點,現在是中間層的輸出作為輸入,給瞭輸出節點。使用PyTorch實現方式如下:
4.多層感知機的反向傳播
依舊是通過鏈式法則,每一個結點的輸出sigmoid(x)都是下一個結點的輸入,因此我們通過前向傳播得到每一個結點的sigmoid函數,以及最終的輸出結果,算出損失函數後,即可通過後向傳播依次推算出每一個結點每一個參數的梯度。
下面的DELTA(k)隻是將一部分內容統一寫作一個字母來表示,具體推導不再詳述。
四、優化舉例
通過以下函數進行優化。
優化流程:初始化參數→前向傳播算出預測值→得到損失函數→反向傳播得到梯度→對參數更新→再次前向傳播→……
在此案例中,優化流程有一些不同:
優化之前先選擇優化器,並直接把參數,以及梯度輸入進去。
①pred = f(x)根據函數給出預測值,用以後面計算梯度。
②optimizer.zero_grad()梯度歸零。因為反向傳播之後,梯度會自動帶到參數上去(上面有展示,可以調用查看)。
③pred.backward()用預測值計算梯度。
④pred.step()更新參數。
以上步驟循環即可。
以上就是人工智能學習Pytorch梯度下降優化示例詳解的詳細內容,更多關於Pytorch梯度下降優化的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python機器學習多層感知機原理解析
- PyTorch 如何自動計算梯度
- pytorch損失反向傳播後梯度為none的問題
- Pytorch中的backward()多個loss函數用法
- 使用Pytorch實現two-head(多輸出)模型的操作