Pytorch反向傳播算法(Back Propagation)

一:revise

我們在最開始提出一個線性模型。

x為我們的輸入,w為權重。相乘的結果是我們對y的預測值。

那我們在訓練時就是對這個權重w進行更新,就需要用到上一章提到的梯度下降算法,不斷更新w。但是此時注意不是用y的預測值對w進行求導,應該是使用loss損失值對w權重進行求導,因為我們需要得到最小的loss。

對于簡單的模型我們可以使用解析式去解決,但是對于復雜的模型的w會很難算。

最左邊的5個?代表的是5個輸入,右邊的5個?代表的是5個輸出,中間的每個?都是隱藏的值設為H。中間的4列我們如果用向量表示,分別都是一個六維的向量,而我們想用輸入的五維向量得到六維向量,就需要使用輸入的五維向量乘上6x5的矩陣才能得到這個六維的向量,這就意味著我們需要30個不同的w,其實也就對應著我們圖片上的線,每條線都代表需要一個w。

所以此時如果要是寫解析式就是一件非常復雜的事情,因此我們希望做一種算法把我們的網絡看成一個圖,在圖上進行傳播,根據鏈式法則把梯度求出來。這個就是我們想要完成的bp(back propagation)

二:forward

先來一個簡單的兩層神經網絡:

我們現在一層一層分析,其實可以看出兩層的操作都是一樣的。首先第一層計算的是w1*x+b1,假如說我們的輸入x是一個n維的列向量,結果是一個m維的列向量,MM是矩陣相乘,那我們需要的w1是一個m*n的矩陣,相乘得到的結果是一個m維的列向量,需要b1也是一個m維的列向量,ADD表示相加,得到的結果可以看成這個層的輸出,但其實這個值還需要放入到下一層進行第二層的運算,而兩個的運算過程都差不多,大家可以自己看一下。

ok,現在知道每一層的運算了,但是有一個問題出現了。

大家看,在一個線性的運算中,其中不管有多少層,w1,w2都是可以通過計算放在一起的,那最后得到的結果也可以看出來,又是一個新的線性運算。這樣就意味著,無論我們經過多少層的運算,最后得到的還是一個線性的運算。

為什么說這樣不行,因為我們不希望化簡,這樣會導致我們的那些增加的權重沒有意義,所以我們需要對每一層最終的輸出加上一個非線性的變化函數。如下圖所示:

三:BP

3.1 鏈式法則

鏈式求導第一步就是需要創建計算圖。

接下來就是一個前饋forword,其實就是先有x,w通過f函數計算出z,最后得到loss的值。

現在我們如果想知道loss對于x或者w進行求導數,就是需要我們的鏈式法則,這個過程也就是bp(back propagation)。過程就是如下圖

?ok,現在舉一個具體的例子1:設x=2,w=3,f(x,w)=x*w。求z的值和求z對w和x求導的結果。大家可以自己計算一下,結果看文末。

3.2整體流程

現在大家目光向下:整體的過一遍流程,先前饋forward,后backward。

這個例子中給出的y_head的計算公式,就類似于我們上面提到的f(x,w)函數,和loss的計算公式。給出了w=1,x=1,y=2,其中r為y_head 減去y。首先計算出y_head為1,隨后計算出r為-1,最后算出loss為1,以上為forward過程。接下來就是backforward,通過鏈式法則的知識,先通過loss和r的函數關系,用loss對r進行求導,接著r對y_head求導,最后y_head對w求導,幾個結果相乘最終得到的就是loss對w求導的結果。

上面的計算大家也學會了,現在加上一個偏置量,大家計算一下loss值,loss對b和w的導數。此為例2,結果在文末。

3.3 tensor

在pytorch里最重要的數據成員就是tensor,存我們上面提到的一些數值,數據可以是標量,矩陣或者高階的tensor,其中有兩個比較重要的成員,一個是data(用于存放w本身的值),一個是grad(用于存放loss對于w的梯度值)。在鏈式法則部分我們提到,鏈式求導第一步就是需要創建計算圖,這個就是使用tensor創建的。

第一部分代碼,輸入的相關參數:

import torch#為舉例子,自己設置的值
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]w = torch.tensor([1.0])
w.requires_grad = True  #默認是不進行梯度計算的,我們讓他為true就是進行梯度計算

第二部分代碼,確定計算的一些步驟:

def forward(x):return x * wdef loss(x,y):y_pred = forward(x)return (y_pred - y)**2

?此時有一個需要注意的點,我們在第一步的時候設置的w是一個tensor值,當它遇到*時間,,此時的*已經被重載了,現在進行的是tensor于tensor的數乘。但是此時x并不是一個tensor類型,會自動轉化為tensor。此時就構建出類似于這樣的計算圖

?并且由于我們最后需要對w計算梯度,所以求出的z也需要計算梯度。

同理定義的loss函數也會建立出一個計算圖。

第三步就是計算過程。

print('predict (before training)',4,forward(4).item())for epoch in range(100):for x,y in zip (x_data,y_data):l = loss(x,y) #這一步是前饋的過程l.backward() #這一步是bp的過程,注意bp完會消除所有的計算圖print('\tgrad:',x,y,w.grad.item())w.data = w.data - 0.01 *w.grad.data #此時注意一定要.data 因為w是一個tensor,而我們需要的是tensor里面的dataw.grad.data.zero_() #在上一步的更新完,導數還存在,所以我們需要將其清零。print('progress',epoch,l.item())print('predict(after training)',4,forward(4).item)

現在大家應該知道整體的流程和代碼了,現在大家可以自己嘗試去寫一下下面這個流程。關于x_data于y_data的值與上面的值相同,大家可以嘗試一下。

四:answer

例子1:z的結果為6,z對w和x求導的結果分別為10和15。

例子2:z的結果是1,z對w和x求導結果分別為2和2。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19512.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux centos nfs掛載兩臺服務器掛載統一磁盤目錄權限問題

查看用戶id id 用戶名另一臺為 修改uid和gid為相同id,添加附加組 usermod -u500 -Gwheel epms groupmod -g500 epms

網絡協議。

一、流程案例 接下來揭秘我要說的大事情,“雙十一”。這和我們要講的網絡協議有什么關系呢? 在經濟學領域,有個倫納德里德(Leonard E. Read)創作的《鉛筆的故事》。這個故事通過一個鉛筆的誕生過程,來講述…

[代碼復現]Self-Attentive Sequential Recommendation(ing)

參考代碼:SASRec.pytorch 可參考資料:SASRec代碼解析 前言:文中有疑問的地方用?表示了。可以通過ctrlF搜索’?。 環境 conda create -n SASRec python3.9 pip install torch torchvision因為我是mac運行的,所以device是mps 下面…

算法(七)插入排序

文章目錄 插入排序簡介代碼實現 插入排序簡介 插入排序(insertion sort)是從第一個元素開始,該元素就認為已經被排序過了。然后取出下一個元素,從該元素的前一個索引下標開始往前掃描,比該值大的元素往后移動。直到遇到比它小的元…

Caliburn.Micro框架學習筆記——Action的參數傳遞機制

據此篇文章,我們繼續來談談Caliburn.Mirco的Action參數傳遞機制。因此程序結構都是默認MVVM的形式。 基本機制 它的機制是—— Caliburn.Micro 的智能對象參數綁定機制通過約定和反射使得視圖和視圖模型之間的交互變得更加直觀和簡潔。通過 cal:Message.Attach 語…

【C語言】探索文件讀寫函數的全貌

🌈個人主頁:是店小二呀 🌈C語言筆記專欄:C語言筆記 🌈C筆記專欄: C筆記 🌈喜歡的詩句:無人扶我青云志 我自踏雪至山巔 🔥引言 本章將介紹文件讀取函數的相關知識和展示使用場景&am…

vue中如何進行Markdown文檔展示與解析

vue中如何進行Markdown文檔展示與解析 一、安裝插件二、如何使用 需求&#xff1a;接口返回了一個政策詳情頁面&#xff0c;里面有圖片&#xff0c;用v-html展示的是url&#xff0c;所以改用vue-markdown 一、安裝插件 npm install vue-markdown --save二、如何使用 <vue-…

RabbitMQ 如何保證消息不丟失

開啟消息確認機制&#xff1a; 在發布消息時&#xff0c;可以設置deliveryMode為2&#xff08;持久化&#xff09;&#xff0c;以確保消息不會因為RabbitMQ的崩潰而丟失。 使隊列持久化&#xff1a; 通過設置durable為true&#xff0c;可以確保隊列在RabbitMQ重啟后依然存在。…

Python 實戰:打造智能進銷存系統

想象一下&#xff0c;在繁忙的商店里&#xff0c;每天都有數以百計的商品進進出出&#xff0c;庫存在不斷變化&#xff0c;銷售數據涌入&#xff0c;而你卻能輕松應對一切。是的&#xff0c;Python 可以幫你實現這一切。本文將教你如何使用 Python 構建一個智能的進銷存系統&am…

學習記錄-5.30

學習記錄-5.30 同步在我的博客可以來看看 http://www.zhihuigou.top/ ### Golang為什么比別的語言跟擅長并發: 首先是因為Goroutine&#xff0c;算是go的一個最大的特色 是輕量級的線程,創建一個goroutine的開銷非常小,大約幾KB,且調度開銷很低 并且goroutine的調度,并不…

React組件通信——兄弟組件

兄弟組件通信 方法一&#xff1a;狀態提升 子組件先將數據傳遞到父組件&#xff0c;父組件再把數據傳到另一個子組件中。 import { useState } from "react"; // 定義A組件&#xff0c;向B組件發送數據 function A({ onGetMsg }) {const name "this is A na…

fyne apptab布局

fyne apptab布局 AppTabs 容器允許用戶在不同的內容面板之間切換。標簽要么只是文本&#xff0c;要么是文本和一個圖標。建議不要混合一些有圖標的標簽和一些沒有圖標的標簽。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…

PolarDB分布式架構學習筆記

PolarDB分布式是什么&#xff1f; 業務場景有哪些&#xff1f; 分布式焦點問題&#xff1f; 技術架構 CN DN介紹 CDC組件介紹 Columnar組件介紹 視頻學習&#xff1a;PolarDB 實操課 第一講&#xff1a;PolarDB分布式版架構介紹_嗶哩嗶哩_bilibili

都在說的跨網文件共享系統是什么?企業該怎么甄選?

跨網文件共享系統成為越來越受關注的產品焦點&#xff0c;那么跨網文件共享系統是什么呢&#xff1f;跨網文件共享是指在不同網絡之間共享文件的過程&#xff0c;使得不同網絡中的用戶可以訪問和使用共享的文件。 原則上而言&#xff0c;不同網絡間的文件是無法共享的&#xff…

在SpringBoot中使用redis中的zset實現延遲任務

為什么使用zset實現延遲任務 ZSET&#xff08;有序集合&#xff09;適合實現延遲任務的原因主要有以下幾點&#xff1a; 排序特性&#xff1a;ZSET根據分數&#xff08;score&#xff09;自動排序&#xff0c;這使得我們可以將任務的執行時間作為分數&#xff0c;從而能夠輕松…

OAK相機如何將 YOLOv9 模型轉換成 blob 格式?

編輯&#xff1a;OAK中國 首發&#xff1a;oakchina.cn 喜歡的話&#xff0c;請多多&#x1f44d;??? 內容可能會不定期更新&#xff0c;官網內容都是最新的&#xff0c;請查看首發地址鏈接。 Hello&#xff0c;大家好&#xff0c;這里是OAK中國&#xff0c;我是Ashely。 專…

最新消息:騰訊大模型App“騰訊元寶“上線了

&#x1f9d9;?♂? 諸位好&#xff0c;吾乃斜杠君&#xff0c;編程界之翹楚&#xff0c;代碼之大師。算法如流水&#xff0c;邏輯如棋局。 &#x1f4dc; 吾之筆記&#xff0c;內含諸般技術之秘訣。吾欲以此筆記&#xff0c;傳授編程之道&#xff0c;助汝解技術難題。 &#…

Python代碼:二十八、密碼游戲

1、題目 牛牛和牛妹一起玩密碼游戲&#xff0c;牛牛作為發送方會發送一個4位數的整數給牛妹&#xff0c;牛妹接收后將對密碼進行破解。 破解方案如下&#xff1a;每位數字都要加上3再除以9的余數代替該位數字&#xff0c;然后將第1位和第3位數字交換&#xff0c;第2位和第4位…

2024年藝術鑒賞與科學教育國際會議(ICAASE 2024)

2024年藝術鑒賞與科學教育國際會議 2024 International Conference on Art Appreciation and Science Education 【1】會議簡介 2024年藝術鑒賞與科學教育國際會議是一場集藝術、科學和教育于一體的國際性學術盛會。本次會議旨在推動藝術鑒賞與科學教育領域的深入交流與合作&am…

C語言(字符函數和字符串函數)1

Hi~&#xff01;這里是奮斗的小羊&#xff0c;很榮幸各位能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;關注收藏&#xff0c;歡迎歡迎~~ &#x1f4a5;個人主頁&#xff1a;小羊在奮斗 &#x1f4a5;所屬專欄&#xff1a;C語言 本系列文章為個人學習筆記&#x…