十八、梯度下降与反向传播
生活随笔
收集整理的這篇文章主要介紹了
十八、梯度下降与反向传播
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 損失函數和梯度
1.1 損失函數的概念
- 對于給定的輸入xxx,由f(x)f(x)f(x)給出相應的輸出,這個實際輸出值和原先預期值Y可能不一致,所以需要定義一個損失函數(LossFunction),也有稱之為代價函數(CostFunction)來度量這二者之間的“差異”程度。
- 損失函數是用來度量預測值和實際值之間的差異的。
1.2 常見損失函數:均方誤差
- 均方誤差(Meansquare error)損失函數。均方誤差是回歸問題常用的損失函數,它是預測值與目標值之間差值的平方和,其公式和圖像如下所示:
- 交叉熵:交叉熵是Shannon信息論中一個重要概念,主要用于度量兩個概率分布間的差異性信息,在機器學習中用來作為分類問題的損失函數。假設有兩個概率分布,tk與yk ,其交叉熵函數公式及圖形如下所示:
1.3 梯度的概念
- 梯度(gradient)是一個向量(矢量,有方向),表示某一函數在該點處的方向導數沿著該方向取得最大值,即函數在該點處沿著該方向(此梯度的方向)變化最快,變化率最大。
- 損失函數沿梯度相反方向收斂最快(即能最快找到極值點)。
2. 反向傳播計算
2.1 反向傳播過程
- 考慮函數$y = f(x) $*, 輸出為E,反向傳播的計算順序是,將信號E乘以節點的局部導數(偏導數),傳遞給前面的節點。
2.2 符合函數的反向傳播過程
- 考慮復合函數:
- zzz對于x的導數(xxx變化對zzz的影響率)可以表示為:
- 復合函數zzz的反向傳播過程
3. 線性回歸實現
步驟一:準備數據y=wx+b?y=wx+b?y=wx+b?
x = torch.rand([50]) y = 3 * x + 0.8w = torch.rand(1, requires_grad=True) b = torch.rand(1, requires_grad=True)步驟二:構造損失函數
def loss_fn(y, y_predict):loss = (y_predict - y).pow(2).mean()for i in [w, b]:# 每次反向傳播前把梯度置為0if i.grad is not None:i.grad.data.zero_()# [i.grad.data.zero_() for i in [w,b] if i.grad is not None]loss.backward()return loss.data步驟三: 更新參數
def optimize(learning_rate):# print(w.grad.data,w.data,b.data)w.data -= learning_rate * w.grad.datab.data -= learning_rate * b.grad.data步驟四:訓練參數,計算預測值
for i in range(3000):# 2. 計算預測值y_predict = x * w + b# 3.計算損失,把參數的梯度置為0,進行反向傳播loss = loss_fn(y, y_predict)if i % 500 == 0:print(i, loss)# 4. 更新參數w和boptimize(0.01)步驟五:繪制圖形,觀察訓練結束的預測之和真實值
# 繪制圖形,觀察訓練結束的預測值和真實值 predict = x * w + b # 使用訓練后的w和b計算預測值plt.scatter(x.data.numpy(), y.data.numpy(), c="r") plt.plot(x.data.numpy(), predict.data.numpy()) plt.show()print("w", w) print("b", b)總結
以上是生活随笔為你收集整理的十八、梯度下降与反向传播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十七、Pytorch的安装和使用
- 下一篇: 十九、Pytorch中的数据加载