日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch教程(十):单层感知机以及梯度更新

發布時間:2024/9/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch教程(十):单层感知机以及梯度更新 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單層感知機模型

y=XW+by=∑xi?wi+by = XW + b \\ y = \sum x_i*w_i+ b y=XW+by=xi??wi?+b

單層感知機模型的每一個輸入節點xix_ixi?和對應的權重wiw_iwi?相乘累加后,與bias相加,便得到了預測值。

我們使用sigmoid函數作為激活函數,通常使用符號σ\sigmaσ表示。
對于最左邊的輸入層的上標,也就是xn0x_n^0xn0?中的0表示第0層,n表示第0層第n個元素節點。

wwwσ\sigmaσ是1層,wij1w^1_{ij}wij1?表示第1層,i表示連接的上一層xix_ixi?,j表示本層的第j個節點。因為上圖中只有一層,所以j=0 。x01x_0^1x01?中1表示第一層,0表示第一層的0號節點【這里討論單層輸出感知機,所以第一層只有一個節點】。x01x_0^1x01?經過激活函數之后,有一個輸出值O01O_0^1O01?,其中1表示第一層,0表示第0號節點。

隨后,O01O_0^1O01?與target值計算:Error(Loss)=∑(O01?target)2Error(Loss)=\sum(O_0^1-target)^2ErrorLoss=(O01??target)2

梯度

Loss計算公式:
E=12(O01?t)2E = \frac{1}{2}(O_0^1 - t)^2 E=21?(O01??t)2
這里引入了一個額外的12\frac{1}{2}21?是為了與求導后的數2抵消掉。不會影響單調性的。
?E?wj0=(O0?t)?O0?wj0?E?wj0=(O0?t)σ(x01)?wj0?E?wj0=(O0?t)σ(x0)(1?σ(x0))?x01?wj0\frac {\partial E}{\partial w_{j0}} =(O_0 - t)*\frac{O_0}{\partial w_{j0}} \\ \frac {\partial E}{\partial w_{j0}} = (O_0 - t)\frac{\sigma(x_0^1)}{\partial w_{j0}} \\ \frac {\partial E}{\partial w_{j0}} = (O_0 - t) \sigma(x_0)(1-\sigma(x_0))\frac{\partial x_0^1}{\partial w_{j0}} ?wj0??E?=(O0??t)??wj0?O0???wj0??E?=(O0??t)?wj0?σ(x01?)??wj0??E?=(O0??t)σ(x0?)(1?σ(x0?))?wj0??x01??
求導之前需要先向右計算一次所有的變量值,這就是向前傳播
?x0?wj0=?∑wj0xj0?wj0=xj0\frac {\partial x_0}{\partial w_{j0}}=\frac {\partial \sum w_{j0}x_j^0}{\partial w_{j0}} = x_j^0 ?wj0??x0??=?wj0??wj0?xj0??=xj0?
因此上面的公式得到最終結果:
?E?wj0=(O0?t))O0(1?O0)xj0\frac {\partial E}{\partial w_{j0}} =(O_0 - t))O_0(1-O_0)x_j^0 ?wj0??E?=(O0??t))O0?(1?O0?)xj0?

方法實現

輸入10個特征的x

x = torch.randn(1,10) # tensor([[ 0.5817, -1.1089, -0.9756, -0.4556, -0.2144, -1.1662, 1.9232, 0.2331, # -1.2987, -0.4950]]) w = torch.randn(1,10,requires_grad = True) # tensor([[-1.0490, -1.7553, 0.1665, -0.0458, -0.8664, -0.3328, -0.1398, 1.2416, # 1.3097, -0.4996]], requires_grad=True) o = torch.sigmoid(x@w.t()) # tensor([[0.5831]], grad_fn=<SigmoidBackward>) loss = F.mse_loss(torch.ones(1,1),o) # tensor(0.1738, grad_fn=<MseLossBackward>) loss.backward() w.grad # tensor([[-0.1179, 0.2248, 0.1977, 0.0923, 0.0435, 0.2364, -0.3898, -0.0472, # 0.2632, 0.1003]])

這樣就得到了每一個www的梯度,隨后可以根據w′=w?0.001??ww' = w - 0.001 * \nabla ww=w?0.001??w來更新參數了。

總結

以上是生活随笔為你收集整理的PyTorch教程(十):单层感知机以及梯度更新的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。