線性回歸神經網絡從0到1

1.線性方程和向量乘法

深度學習的基礎就是從線性回歸方程的理論進入的。簡單的線性回歸方程為

y=Xw+b+\epsilon

比如大家日常中買房子,價格受到哪些因素影響呢?

比如房齡、交通、是否是學區、有無配套超市、公園,這些基本是外部條件,內部條件諸如幾梯幾戶、層高、容積率、面積、朝向等這些,這樣一看如果使用上面的模型構建一個房屋價格預測的神經網絡模型,參數非常多w_1,w_2,...w_i,...w_n這么多個參數影響了房屋的價格。所謂線性回歸(regression)是能為一個或者多個自變量與因變量之間關系建模的一類方法。回歸在數學中經常用來表示輸入和輸出之間的關系。

所以上面的房屋價格如果只考慮面積和房齡的話,預測模型就變成了

f_{house-price}=w_{area}*x_{area} + w_{age}*w_{age} + b

b稱為偏執,或者截距;預測值所依據的自變量稱為特征或者協變量,把試圖預測的目標稱為標簽或者目標。。所以整體的預測值就可以描述為

\hat{y} = w_1x_1+w_2x_2+...+w_dx_d + b

我們用矩陣表示出來就是

\hat{y} =w^tx + b

向量x是對于單個數據樣本特征。使用符號表示的矩陣就是X \in R^ {n*d}。就可以很方便的引用整個數據集的n個樣本。其中X的每一行就是一個樣本,每一列就是一種特征。對于特征集合X,預測值通過矩陣-向量乘法表示為

\hat{y} =Xw + b

2.正態分布和平方損失

正態分布和線性回歸之間的關系很密切。 正態分布(normal distribution),也稱為高斯分布(Gaussian distribution), 最早由德國數學家高斯(Gauss)應用于天文學研究。 我們定義正態分布的時候,就是有一個隨機變量x具有均值\mu和方差\sigma^2(標準差\sigma),其正態分布概率密度函數如下

p(x|\mu,\sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}

在后面的方程中我們假設噪聲服從正態分布。

如果使用函數來實現

def normal(x, mu, sigma):p = 1/ math.sqrt(2 * math.pi * sigma**2)return p* np.exp(-0.5 / sigma**2 * (x-mu)**2)# 注意torch.normal定義中
torch.normal(mean: _float, std: _float, size: Sequence[Union[_int, SymInt]]...)
mean: 正態分布的均值,可以是一個數值也可以是一個張量
std: 正態分布的標準差,可以是一個數值也可以是一個張量
size:輸出隨機數的形狀,可以是一個整數用于生成size大小的一維張量;也可以是一個元組,用于生成相應形狀的多維張量

3.樣本刷選

現在我們從市場上獲取了一批輸入數據,即有一批特征值。因為我們最終是尋找w,b參數。所以雖然開始不知道最終具體的w,b是多少,但是可以根據經驗值填寫一個?

w=\begin{bmatrix} 2\\ -3.4\end{bmatrix}, b=4.2

所以使用參數模型w,b,\epsilon.其中?\epsilon作為噪聲項,服從均值為0的正態分布。這就是我們第一章節中的

y=Xw+b+\epsilon

import random  # 導入random,用于需要隨機化初始的權重,以及隨機梯度下降
import torch
from d2l import torch as d2ldef synthetic_data(w, b, num_examples):"""生成y=xW +b+噪聲:param w::param b::param num_examples: 指定生成樣本的數量:return:"""X = torch.normal(0, 1, (num_examples, len(w)))  # 生成均值為0,方差為1的,是num個樣本,列數是wy = torch.matmul(X, w) + b  # Matrix Multiplication 兩個相乘y += torch.normal(0, 0.01, y.shape)  # 加入一個隨機噪音,均值為0方差為1return X, y.reshape((-1, 1))  # 做成一個列向量返回

📢注意:features中的每一行都包含一個二維數據樣本,?labels中的每一行都包含一維標簽值(一個標量)?

    x = torch.arange(12).reshape(2,6)print(x)y = x.reshape((-1,1))print(y)

?這里還有一個就是,之前很多時候我們使用的時候都是

torch.arange(24).reshape(2,3,4)

reshape的參數都是整數,但是上面的y.reshape((-1,1))是什么意思呢?

-1作為一個維度參數時,表示該維度的大小由數組的實際大小和其它維度決定。換句話說NumPy會自動計算這個維度的大小以保持數組元素總數不變。1表示新形狀中的另一個維度大小為1。因此,當你對一個數組或矩陣調用.reshape((-1, 1))時,你實際上是在告訴NumPy將原數組重塑為一個列向量(即每列只有一個元素的二維數組)。也就是說,無論輸入數組有多少個元素,結果都將是一個兩維數組,其中每個原始元素占據一行,且僅有一列。參考

    x = torch.arange(12).reshape(2,6)print(x)y = x.reshape((-1,1))print(y)

輸出如下所示:

?我們調用上面的函數

    true_w = torch.tensor([2, -3.4])true_b = 4.2features, labels = synthetic_data(true_w, true_b, 1000)print('output features:', features)print(f'output labels: {labels}')

輸出如下所示,和上面的理解是一致的

即features特征值是一個每一行都包含一個二維數組的樣本,labels即預測值每一行都包含一個一維標簽值?。

我們看看特征值和標簽之間的散點分布圖。

    d2l.set_figsize()# 這里的detach是從pytorch detach出來之后才能轉到numpy中d2l.plt.scatter(features[:, 0].detach().numpy(), labels.detach().numpy(), 1);d2l.plt.show()

?現在我們的基礎數據已經構造完成。接下來一個重要的事情需要定義個函數,每次讀取一個小批量。

4.小批量數據構造

為什么要使用小批量,而不是使用全部的樣本呢,因為每次計算梯度需要對損失函數求導,損失函數是對我們樣本平均損失,所以求解一次梯度函數需要把所有樣本重新計算一遍,這個訓練過程太貴了,所以在神經網絡實際訓練幾乎不用全部的樣本。同樣一個神經網絡模型的訓練過程可能需要數分鐘數個小時,甚至更久。因為要計算幾百步,甚至幾千步才能求解出最終的結果。所以我們定義損失函數之后,只要能求解得到一個“差不多”的解就可以,而且在多維復雜的模型中,很少能得到準確解。所以我們損失函數就是多個采樣數據各自損失最后求平均得到最終的損失函數。所以我們采樣b個樣本i_1,i_2...i_b來求解近似。

\frac{1}{b} \sum_{i \in I_b} \ell(\mathbf{x}_i, y_i, \mathbf{w})

所以這里的采樣的b個樣本,如果?b很大,則計算出的結果相對比較精確但是計算復雜度很高;如果b比較小,計算比較容易但是精確度可能會很差。畢竟梯度的計算復雜度是和樣本的個數線性相關的。

def data_iter(batch_size, features, labels):""":param batch_size::param features::param labels::return:"""num_examples = len(features)indices = list(range(num_examples))# shuffle這些樣本是隨機讀取的,沒有特定的順序random.shuffle(indices)  # 把indices列表中的元素隨機打亂,這樣就可以隨機訪問for i in range(0, num_examples, batch_size):batch_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])yield features[batch_indices], labels[batch_indices]

測試下這個函數

    batch_size = 10for X, y in data_iter(batch_size, features, labels):print('小批量數據:', X, '\n', y)break

?

5.定義模型

def linreg(X, w, b):"""線性規劃模型:param X::param w::param b::return:"""return torch.matmul(X, w) + b
w = torch.normal(0, 0.01, size=(2, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

這是一個均值為零,方差為0.01的正太分布函數。我們需要計算梯度requires_grad=True.對于偏差\epsilon來說。我們直接給出一個0,當然也需要不斷地調整,所以需要計算梯度。

6.定義損失函數

def squared_loss(y_hat, y):"""定義損失函數,就是均方誤差:param y_hat: 預測值:param y: 真實值:return:"""# y.reshape(y_hat.shape) 確保兩者大小一樣return (y_hat - y.reshape(y_hat.shape)) **2 / 2

其中\hat{y}是預測值,y是我們的真實值。原則上兩個個數是一樣的,但是計算中可能是一個行向量,一個是列向量。所以使用.shape函數統一下。

7.定義優化算法

def sgd(params, lr, batch_size):"""小批量隨機梯度下降:param params: params 包含了w和b:param lr:學習率:param batch_size::return:"""with torch.no_grad(): # 更新的時候不要更新梯度for param in params:param -= lr * param.grad / batch_sizeparam.grad.zero_() # 把梯度設置為0,下次計算梯度的時候就和上次不會相關了

with*作用:torch.no_grad() 是一個上下文管理器(context manager),它告訴 PyTorch 在這個塊內不需要計算梯度。這意味著任何在此塊內的操作都不會被加入到自動求導圖中(即不會跟蹤這些操作以進行反向傳播),從而節省內存和計算資源。
原因:當確定某些操作(如參數更新)不需要參與梯度計算時,使用 torch.no_grad() 可以提高效率。特別是在推理階段或手動更新參數時,我們通常不需要追蹤這些操作的梯度。

將param.grad.zero_()的原因主要有:

  • 將當前參數的梯度設置為零。這是因為在默認情況下,PyTorch 的反向傳播會累加梯度而不是覆蓋它們。如果不重置梯度,那么在下一次反向傳播時,新計算出的梯度會被加到舊的梯度上,導致不正確的更新。
  • 為什么需要這樣做:每次參數更新后,我們應該清除之前的梯度信息,以便于下一輪迭代中正確地計算新的梯度并進行更新。

8.訓練

?現在結合上面的過程進行訓練

if __name__ == '__main__':true_w = torch.tensor([2, -3.4])true_b = 4.2features, labels = synthetic_data(true_w, true_b, 1000)# print('output features:', features)# print(f'output labels: {labels}')## d2l.set_figsize()# # 這里的detach是從pytorch detach出來之后才能轉到numpy中# d2l.plt.scatter(features[:, 0].detach().numpy(), labels.detach().numpy(), 1);## # d2l.plt.show()## # features就是自變量,輸入值;labels是標簽,這個就是因變量,輸出值batch_size = 10# for X, y in data_iter(batch_size, features, labels):#     print('小批量數據:', X, '\n', y)#     break# #w = torch.normal(0, 0.01, size=(2, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)# 訓練的過程lr  = 0.03  # 學習率num_epochs = 3 # 把數據掃3遍net = linreg # 模型,就是我們linreg,之所以這樣寫,就是后續可以快速替換為其他模型loss = squared_loss # 均方損失for epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y)l.sum().backward()  # 求和之后計算梯度sgd([w,b], lr, batch_size)with torch.no_grad():train_l = loss(net(features, w, b), labels)print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')print(f'w的估計誤差: {true_w - w.reshape(true_w.shape)}')print(f'b的估計誤差: {true_b - b}')

輸出如下所示:

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

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

相關文章

11|省下錢買顯卡,如何利用開源模型節約成本?

不知道課程上到這里,你賬戶里免費的5美元的額度還剩下多少了?如果你嘗試著完成我給的幾個數據集里的思考題,相信這個額度應該是不太夠用的。而ChatCompletion的接口,又需要傳入大量的上下文信息,實際消耗的Token數量其…

文章代碼|皮層/表皮特異性轉錄因子 bZIP89 的自然變異決定了玉米側根發育和抗旱能力

數據和材料可用性:評估本文結論所需的所有數據都包含在論文和/或補充材料中。本研究中的大量 RNA-seq 讀數存放在 NCBI 序列讀取檔案 (www.ncbi.nlm.nih.gov/sra) 中,登錄代碼為 SRP446501/PRJNA980895。scRNA-seq、DAP-seq 和 DN…

鎧大師:讓用戶暢享多元應用,助力鴻蒙生態發展

在全球信息技術產業格局加速重構的背景下,中國科技力量正以開放包容的姿態重塑操作系統生態范式。 5月19日,華為在成都舉辦的nova14系列及鴻蒙電腦新品發布會上,正式對外發布搭載了鴻蒙系統的筆記本電腦HUAWEI MateBook Pro與HUAWEI MateBoo…

初學Transformer架構和注意力機制

文章目錄 說明一 LLM 簡介二 Transformer 架構2.1 Transformer的架構組成2.1.1 輸入嵌入 (Input Embedding)2.1.2 編碼器 (Encoder) 的結構解碼器 (Decoder) 的結構2.1.3 輸出層 (Output Layer)結構 2.2 編碼和解碼器的獨立輸入理解 三 注意力機制 說明 本文適合初學者&#x…

基于PySide6與pycatia的CATIA幾何陣列生成器開發實踐

引言:參數化設計的工業價值 在航空航天、汽車制造等領域,復雜幾何圖案的批量生成是模具設計與機械加工的核心需求。傳統手動建模方式存在效率低下、參數調整困難等問題。本文基于PySide6+pycatia技術棧,實現了一套支持??動態參數配置??、??智能幾何陣列生成??的自動…

PDF 編輯批量拆分合并OCR 識別

各位辦公小能手們!你們有沒有過被PDF文件折磨得死去活來的經歷?反正我是有,每次要編輯PDF,那叫一個費勁啊!不過呢,今天我要給大家介紹一款神器——WPS PDF to Word,有了它,PDF編輯那…

棒球比賽暗號百科·棒球1號位

關于棒球比賽暗號百科介紹,涵蓋基本概念、歷史演變、常見類型及經典案例: 棒球比賽暗號百科 一、定義與作用 棒球暗號是球員、教練團隊通過手勢、動作、語言或道具傳遞戰術指令的密碼系統,旨在隱蔽溝通攻防策略,避免對手破解。其…

Python實現基于線性回歸的空氣質量預測系統并達到目標指標

為了實現基于線性回歸的空氣質量預測系統并達到目標指標,以下是完整的Python代碼實現: import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScal…

236.二叉樹的最近公共祖先

在樹結構中,祖先指的是一個節點的父節點或更高層級的父節點。公共祖先是指同時為節點p和q的祖先的節點。最近公共祖先(LCA)則是指在所有公共祖先中,距離p和q最近的那個節點。尋找LCA的方法可以按以下情況進行分析: 當…

面試題總結一

第一天 1. 快速排序 public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (low < high) {// 分區操作&#xff0c;獲取基準元素的最終位置int pivotIndex partition(arr, low, high);// 遞歸排序基準元素左邊的部分quickSort(arr, …

Stable Diffusion底模對應的VAE推薦

以下是主流Stable Diffusion底模對應的VAE推薦表格&#xff1a; 底模版本推薦VAE類型說明SD1.5SD1.5專用VAE通常使用vae-ft-mse-840000-ema-pruned.safetensorsSD2.0SD1.5兼容VAE或SD2專用VAE部分SD2模型需配套512-ema-only.vae.ptSD3內置VAESD3系列模型通常自帶集成VAE無需額…

北斗導航 | 基于matlab的多波束技術的衛星通信系統性能仿真

基于多波束技術的低軌(LEO)衛星通信系統 **1. 仿真場景建模**1.1 LEO衛星軌道參數設置1.2 地面終端分布**2. 多波束天線模型**2.1 波束方向圖生成2.2 頻率復用方案**3. 鏈路預算與干擾分析**3.1 自由空間路徑損耗3.2 信噪比(SNR)計算**4. 動態資源調度算法**4.1 基于流量需…

uni-app學習筆記十--vu3 computed的運用(一)

vue官方推薦使用計算屬性來描述依賴響應式狀態的復雜邏輯&#xff0c;computed具有緩存的作用&#xff0c;一個計算屬性僅會在其響應式依賴更新時才重新計算&#xff0c;這意味著只要 相關值 不改變&#xff0c;無論多少次訪問 都會立即返回先前的計算結果&#xff0c;從而在一…

多模態大模型詳解

首先&#xff0c;得明確多模態大模型的定義和核心能力&#xff0c;比如處理文本、圖像、音頻、視頻等多種數據模態。 其次是技術架構&#xff0c;可能需要分模塊描述&#xff0c;比如感知層、特征提取、融合策略等&#xff0c;還有技術趨勢如模型輕量化、開源生態。 應用場景…

如何通過UI設計提高用戶留存率?

在競爭激烈的移動應用市場中&#xff0c;提高用戶留存率是開發者的關鍵目標。UI 設計在實現這一目標中起著舉足輕重的作用。精心設計的 UI 不僅能夠吸引新用戶&#xff0c;還能促使現有用戶持續使用。以下是通過 UI 設計提升用戶留存率的幾種關鍵方法。 優化用戶體驗 用戶體驗…

Linux(6)——第一個小程序(進度條)

目錄 一、行緩沖區的概念 二、\r與\n 三、進度條代碼書寫與展示 1.如何表示進度條是在加載的 2.整體框架 3.書寫 3.1makefile: 3.2process.h: 3.3process.c: 3.4main.c&#xff1a; 3.5美化 一、行緩沖區的概念 首先&#xff0c;我們來見一見行緩沖區&#xff0c;…

51頁 @《人工智能生命體 新啟點》中國龍 原創連載

《 人工智能生命體 新啟點 》一書&#xff0c;以建立意識來建立起生命體&#xff0c;讓其成為獨立、自主的活動個體&#xff1b;也就可以理解為建立生命體的思想指導。 讓我們能夠賦予他靈魂&#xff01;

微軟全新開源命令行文本編輯器:Edit — 致敬經典,擁抱現代

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、引言:命令行的新利器二、Edit:致敬經典,擁抱現代1. 命令行的“新升級”2. 為什么要有 Edit?三、核心功能與特性一覽1. 完全開源、MIT 許可證…

使用MybatisPlus實現sql日志打印優化

背景&#xff1a; 在排查無憂行后臺服務日志時&#xff0c;一個請求可能會包含多個執行的sql&#xff0c;經常會遇到SQL語句與對應參數不連續顯示&#xff0c;或者參數較多需要逐個匹配的情況。這種情況下&#xff0c;如果需要還原完整SQL語句就會比較耗時。因此&#xff0c;我…

go多線程壓測監控

實現了 go多協程壓力測試實現了Monitor&#xff0c;異步統計qps、時延、cpu(client端)等指標&#xff0c;周期printStat。只需要把單條執行func傳給Monitor即可命令行傳參ctrlc之后正常退出(mock cpu 占用) 代碼見 https://gitee.com/bbjg001/golearning/tree/master/others/…