PyTorch教程(十):单层感知机以及梯度更新
單層感知機模型
y=XW+by=∑xi?wi+by = XW + b \\ y = \sum x_i*w_i+ b y=XW+by=∑xi??wi?+b
單層感知機模型的每一個輸入節(jié)點xix_ixi?和對應的權重wiw_iwi?相乘累加后,與bias相加,便得到了預測值。
我們使用sigmoid函數作為激活函數,通常使用符號σ\sigmaσ表示。
對于最左邊的輸入層的上標,也就是xn0x_n^0xn0?中的0表示第0層,n表示第0層第n個元素節(jié)點。
從www到σ\sigmaσ是1層,wij1w^1_{ij}wij1?表示第1層,i表示連接的上一層xix_ixi?,j表示本層的第j個節(jié)點。因為上圖中只有一層,所以j=0 。x01x_0^1x01?中1表示第一層,0表示第一層的0號節(jié)點【這里討論單層輸出感知機,所以第一層只有一個節(jié)點】。x01x_0^1x01?經過激活函數之后,有一個輸出值O01O_0^1O01?,其中1表示第一層,0表示第0號節(jié)點。
隨后,O01O_0^1O01?與target值計算:Error(Loss)=∑(O01?target)2Error(Loss)=\sum(O_0^1-target)^2Error(Loss)=∑(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教程(十):单层感知机以及梯度更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 延禧攻略什么时候播(延禧攻略定档7月19
- 下一篇: 微信8.0.11内测版怎么升级微信8.0