反向传播:从手算梯度,到手写框架,最后拿去预测房价

预测房价--基于python的线性回归模型 线性回归-机器学习(预测房价) 影响房价最大的因素就是房屋的面积和地段,本文章中针对房屋的面积作为主要影响因素,分析房屋面积对房价的影响 1. 阅读详情

反向传播:从手算梯度,到手写框架,最后拿去预测房价

一句话版:这篇文章用一个带真实数字的小网络,把"梯度到底怎么算出来"讲透;再把这份理解重构成一个 5 层分明的迷你深度学习框架 minidnn,并拿它做了个房价预测 demo。全程只需要高中导数和最基础的矩阵知识。

配套代码:backprop_lab.py(4 步递进实验)、minidnn/(迷你框架)、demo_house_price.py(房价预测应用)。


写在前面:为什么你要自己手写一遍

loss.backward() 只有一行,但"会用"和"懂"是两回事。你大概经历过这样的时刻:模型 train 起来了,loss 降了,准确率 99%——可一旦问"它到底在做什么?",就卡住了:

  • 梯度是什么?凭什么是它来决定权重往哪改?
  • 链式法则为什么要"连乘"?
  • .backward() 凭什么能自动算出所有参数的梯度?

这篇博客的目标只有一个:把这三个问题,从"背结论"变成"亲眼算一遍"。而且做完你会发现,PyTorch 在你眼里会变成一个透明盒子。

适合读者:学过导数、知道矩阵乘法(哪怕已经忘得差不多)、想真正理解深度学习训练的人。
你将收获:一张计算图、一个 60 行的 autograd 内核、一个能预测房价的迷你框架、以及"以后再也不用怕算没算对"的信心。


1. 训练到底在干嘛:在"损失曲面"上找最低点

模型参数 WWW 定义了一个损失 L(W)L(W)L(W)。训练 = 沿着 LLL 下降最快的方向(负梯度 −∇L-\nabla L−∇L)反复迈步:

W←W−η ∇L(W)W \leftarrow W - \eta\,\nabla L(W)W←W−η∇L(W)

直观上就是:站在一座"损失山"上,每次都朝最陡的下坡方向走一小步,走很多次,直到走到山谷(损失最低点)。

而全篇文章最大的悬念只有一个:∇L\nabla L∇L 怎么算? —— 这就是反向传播存在的全部理由。下面我们用一组真实数字把它算出来。


2. 链式法则:拿一组真实数字,从零算到底

先花 30 秒补两个高数概念,后面全靠它俩:

  • 导数 = 局部斜率:f′(x)=lim⁡h→0f(x+h)−f(x)hf'(x)=\lim_{h\to0}\frac{f(x+h)-f(x)}{h}f′(x)=limh→0​hf(x+h)−f(x)​。直觉就是"输入动一点点,输出动多少"。
  • 链式法则 = 各层斜率相乘:复合函数一层套一层,总变化率 = 各层变化率之积。类比工厂流水线:原料涨 1 元 → 中间件涨 0.8 元 → 成品涨 0.8×3=2.40.8\times3=2.40.8×3=2.4 元。乘法就是在算"传导放大"的总效果。

∂\partial∂ 读作"偏导",和普通导数 ddd 意思一样,只是提醒你"这函数有好几个变量,我们只看其中一个"。

2.1 一个带真实数字的小网络

设网络是 out=w2⋅tanh⁡(w1x+b1)+b2out = w_2\cdot\tanh(w_1 x+b_1)+b_2out=w2​⋅tanh(w1​x+b1​)+b2​,目标 y=0.9y=0.9y=0.9,损失 L=(out−y)2L=(out-y)^2L=(out−y)2。参数挑好算的:x=0.5, w1=1.5, b1=−0.5, w2=0.8, b2=0.1x=0.5,\ w_1=1.5,\ b_1=-0.5,\ w_2=0.8,\ b_2=0.1x=0.5, w1​=1.5, b1​=−0.5, w2​=0.8, b2​=0.1。

① 前向传播:从 xxx 一路算到 LLL。

步骤公式代入数值结果
线性 1z=w1x+b1z=w_1x+b_1z=w1​x+b1​1.5×0.5+(−0.5)1.5\times0.5+(-0.5)1.5×0.5+(−0.5)z=0.25z=0.25z=0.25
激活a=tanh⁡(z)a=\tanh(z)a=tanh(z)tanh⁡(0.25)\tanh(0.25)tanh(0.25)a≈0.2449a\approx0.2449a≈0.2449
线性 2out=w2a+b2out=w_2a+b_2out=w2​a+b2​0.8×0.2449+0.10.8\times0.2449+0.10.8×0.2449+0.1out≈0.2959out\approx0.2959out≈0.2959
损失L=(out−y)2L=(out-y)^2L=(out−y)2(0.2959−0.9)2(0.2959-0.9)^2(0.2959−0.9)2L≈0.3649L\approx0.3649L≈0.3649

② 反向传播:从 LLL 往回,每步只算"局部斜率"。

层局部斜率公式代入数值结果
输出∂L∂out=2(out−y)\frac{\partial L}{\partial out}=2(out-y)∂out∂L​=2(out−y)2×(0.2959−0.9)2\times(0.2959-0.9)2×(0.2959−0.9)−1.2081-1.2081−1.2081
线性 2∂out∂a=w2\frac{\partial out}{\partial a}=w_2∂a∂out​=w2​0.80.80.80.80.80.8
激活∂a∂z=1−a2\frac{\partial a}{\partial z}=1-a^2∂z∂a​=1−a21−0.244921-0.2449^21−0.244920.94000.94000.9400
线性 1∂z∂w1=x\frac{\partial z}{\partial w_1}=x∂w1​∂z​=x0.50.50.50.50.50.5

③ 链式法则 = 四段局部斜率连乘:

∂L∂w1=(−1.2081)×0.8×0.9400×0.5≈−0.4543\frac{\partial L}{\partial w_1}=(-1.2081)\times0.8\times0.9400\times0.5\approx-0.4543∂w1​∂L​=(−1.2081)×0.8×0.9400×0.5≈−0.4543

含义:w1w_1w1​ 每增大 1,LLL 大约下降 0.45(负号 = 方向相反)。

④ 数值梯度验证:不靠公式,用"导数定义"硬算。w1=1.5001w_1=1.5001w1​=1.5001 时 L≈0.3648492L\approx0.3648492L≈0.3648492,w1=1.4999w_1=1.4999w1​=1.4999 时 L≈0.3649400L\approx0.3649400L≈0.3649400,于是

0.3648492−0.36494002×10−4≈−0.4543\frac{0.3648492-0.3649400}{2\times10^{-4}}\approx-0.45432×10−40.3648492−0.3649400​≈−0.4543

两条完全独立的路径算出同一个答案 → 链式法则没算错。这就是代码里"数值梯度验证(差 ~1e-11)"的原理:以后再也不怕算没算对。

⑤ 梯度下降一步:梯度是负的,说明 w1w_1w1​ 应该变大。取 η=0.1\eta=0.1η=0.1:

w1: 1.5→1.5−0.1×(−0.4543)=1.5454w_1:\ 1.5\to1.5-0.1\times(-0.4543)=1.5454w1​: 1.5→1.5−0.1×(−0.4543)=1.5454

重跑前向,LLL 从 0.36490.36490.3649 降到 ≈0.3447\approx0.3447≈0.3447——损失确实变小了。训练 = 把 ②③⑤ 重复几千次。

顺带看一眼 tanh 长什么样、以及那个 1−a21-a^21−a2 的斜率是怎么来的:
在这里插入图片描述

关于"谁是谁的导数":导数永远问的是谁影响谁。反向传播只关心相邻两层——LLL 依赖 outoutout、outoutout 依赖 aaa、aaa 依赖 zzz、zzz 依赖 w1w_1w1​,像拆积木一样从后往前拆,每段当成单变量求导即可。记住三块积木(线性层 y=wx+by=wx+by=wx+b、激活层 a=tanh⁡(z)a=\tanh(z)a=tanh(z)、损失 L=(out−y)2L=(out-y)^2L=(out−y)2 的局部导数),任何网络都能拼。


3. autograd:把链式法则自动化(60 行)

第 2 节的手算有个明显问题:网络一大就手算不动了。怎么办?把"沿计算图反向"这件事自动化:

  1. 前向时,每个运算记成一个节点(值 + 输入 + 反向函数),自动织成一张计算图;
  2. 反向时,按拓扑序从输出倒着遍历,逐个调用每个节点存好的反向函数,累积梯度。

这就是 Step 2 里那个 Value 类(约 60 行)做的事——PyTorch .backward() 的最小内核。跑出来和手算完全一致:

自动求导梯度(应与 Step 1 手算一致):
  w1.grad=+0.400000 b1.grad=+0.800000 w2.grad=+0.000000 b2.grad=+1.000000

3.1 计算图到底长什么样

拿第 2 节那个网络 out=w2⋅tanh⁡(w1x+b1)+b2out = w_2\cdot\tanh(w_1 x + b_1) + b_2out=w2​⋅tanh(w1​x+b1​)+b2​,把每个运算拆成一个节点,数据流向就是一张图:

x

n1 = w1·x

w1

z = n1 + b1

b1

a = tanh(z)

m = w2·a

w2

out = m + b2

b2

每个节点"记账"记三样东西(对应 Value 类的三个字段):

节点记的对应代码干嘛用
① 前向算出的值self.data反向算局部导数要用(如 tanh 的 1−a21-a^21−a2 要用 aaa)
② 输入是谁self._prev反向时知道该往哪些节点传梯度
③ 反向函数self._backward这个运算的局部导数(查表可得)

前向:从左往右,每个节点算一个数并存下来(代入第 2 节数字):

节点计算结果
n1(−1.0)×0.5(-1.0)\times 0.5(−1.0)×0.5-0.5
z−0.5+0.5-0.5 + 0.5−0.5+0.50.0
atanh⁡(0)\tanh(0)tanh(0)0.0
m0.8×00.8\times 00.8×00.0
out0+0.20 + 0.20+0.20.2

反向:从右往左(逆着箭头),每到一个节点调用它的反向函数、把梯度往下传:

反向节点局部导数梯度
out = m+b2dm=1, db2=1dm=1,\ db_2=1dm=1, db2​=1dm=1, db2=1dm=1,\ db_2=1dm=1, db2​=1
m = w2·ada=1×w2=0.8, dw2=1×a=0da=1\times w_2=0.8,\ dw_2=1\times a=0da=1×w2​=0.8, dw2​=1×a=0da=0.8, dw2=0da=0.8,\ dw_2=0da=0.8, dw2​=0
a = tanh(z)dz=0.8×(1−02)=0.8dz=0.8\times(1-0^2)=0.8dz=0.8×(1−02)=0.8dz=0.8dz=0.8dz=0.8
z = n1+b1dn1=0.8, db1=0.8dn_1=0.8,\ db_1=0.8dn1​=0.8, db1​=0.8dn1=0.8, db1=0.8dn_1=0.8,\ db_1=0.8dn1​=0.8, db1​=0.8
n1 = w1·xdw1=0.8×0.5=0.4dw_1=0.8\times 0.5=0.4dw1​=0.8×0.5=0.4dw1=0.4dw_1=0.4dw1​=0.4

最后梯度落在参数上:dw1=0.4, db1=0.8, dw2=0, db2=1dw_1=0.4,\ db_1=0.8,\ dw_2=0,\ db_2=1dw1​=0.4, db1​=0.8, dw2​=0, db2​=1——和手算、和 Value.backward() 完全一致。

一句话:计算图 = 前向时把每个运算记成一个节点(值 + 输入 + 反向函数);反向时照着图从后往前遍历,每步只算局部导数。图建好了,梯度自动就有——attention 也只是一张更大的图而已。

从此记住一句:任何深度学习框架的 .backward(),本质都是这张计算图上的链式法则。规模从 1 个神经元到 175B 参数,机制完全一样。


4. 向量化:从标量到矩阵(GEMM)

真实训练一次要算一批数据。Step 1 的标量公式变成矩阵版,但导数是同一套链式法则:

dW2 = h.T @ d_out      # 输出层梯度
dz  = dh * (1 - h*h)   # tanh 的导数,和手算的 1-a² 一模一样

这也解释了那个你很熟悉的硬件现象:前向/反向的本质都是矩阵乘,所以 AI 加速器(GPU/NPU/TPU)的核心就是 GEMM(通用矩阵乘)阵列。


5. PyTorch 对照:你刚手写的东西就是它

同样的模型用 torch 写,对比 API:

你手写的PyTorch
Value.backward() 反向遍历loss.backward()
p.data -= lr * p.grad 更新opt.step()
W1, b1, W2, b2 手动管理nn.Linear 自动封装

唯一差别:框架把"构图 + 求导"全自动了。你手写的 4 步实验,跑出来的准确率和 PyTorch 完全一致(都是 99.5%)——这大概是最有说服力的"我懂了"证据。


6. 动手前,先记住两个坑

写代码时我踩过两个很有意思的坑,都是干货:

  • 发散(NaN):一批数据的梯度求和后,lr 过大 + 输出层初始化过大 → 权重正反馈爆炸。教训:输出层初始化要小、lr 要配平。
  • 准确率假 50%:(out>0) == y 拿布尔值和浮点标签比,False == -1.0 恒为 False,负类永远算错。教训:评估指标本身也可能有 bug,用 (out*y)>0 比符号才正确。

这两条说明:调参和写评估指标,都是训练里绕不开的工程必修课。


7. 重构成一个分层清晰的迷你框架:minidnn

原实验代码什么都好,就是所有东西揉在一起。我把它重构成 5 个文件 = 5 个层,每层只做一件事,并且和 PyTorch 一一对应:

minidnn 文件对应 PyTorch职责
minidnn/engine.pytorch.Tensor张量 + 自动求导(计算图)
minidnn/nn.pytorch.nnModule / Linear / Tanh / Sequential
minidnn/loss.pytorch.nn.MSELoss损失函数
minidnn/optim.pytorch.optim.SGD优化器(更新参数)
minidnn/train.py手写训练循环前向 → 损失 → 反向 → 更新

核心洞察:整个框架真正"算导数"的地方只有 4 处(@ 矩阵乘 / + 加法 / tanh / **2 平方),其余全是沿计算图把局部导数连乘——和第二节手算的完全同一件事。

7.1 一个 Linear 层的一生:矩阵公式 + 具体数字演算

关键认知:一个 Linear 层就是第 2 节那个标量神经元的"复制 + 批量"版——Linear(3,1) 是 z=w1x1+w2x2+w3x3+bz=w_1x_1+w_2x_2+w_3x_3+bz=w1​x1​+w2​x2​+w3​x3​+b(3 输入 1 输出),Linear(3,8) 就是把它复制 8 份,WWW 是 (3,8)(3,8)(3,8) 矩阵,每一列 = 一个第 2 节式的权重向量。

(0) 建层:

self.W = Tensor(np.random.randn(3, 8) * 0.5)   # W: (3,8) 随机初始化
self.b = Tensor(np.zeros((1, 8)))              # b: (1,8) 初始 0

(1) 前向:核心就一行 x @ self.W + self.b,数学上是一次矩阵运算:

Z=X W+b,X:(N,3), W:(3,8), b:(1,8), Z:(N,8)Z = X\,W + b,\qquad X:(N,3),\ W:(3,8),\ b:(1,8),\ Z:(N,8)Z=XW+b,X:(N,3), W:(3,8), b:(1,8), Z:(N,8)

用具体数字走一遍(为好算取 Linear(3,1),2 套房):

X=[123456],W=[0.5−1.00.2],b=[0.1]X=\begin{bmatrix}1&2&3\\4&5&6\end{bmatrix},\quad W=\begin{bmatrix}0.5\\-1.0\\0.2\end{bmatrix},\quad b=\begin{bmatrix}0.1\end{bmatrix}X=[14​25​36​],W=​0.5−1.00.2​​,b=[0.1​]

Z=XW+b=[1⋅0.5+2⋅(−1)+3⋅0.24⋅0.5+5⋅(−1)+6⋅0.2]+[0.1]=[−0.8−1.7]Z=XW+b=\begin{bmatrix}1\cdot0.5+2\cdot(-1)+3\cdot0.2\\4\cdot0.5+5\cdot(-1)+6\cdot0.2\end{bmatrix}+\begin{bmatrix}0.1\end{bmatrix}=\begin{bmatrix}-0.8\\-1.7\end{bmatrix}Z=XW+b=[1⋅0.5+2⋅(−1)+3⋅0.24⋅0.5+5⋅(−1)+6⋅0.2​]+[0.1​]=[−0.8−1.7​]

即第 1 套房:0.5−2+0.6+0.1=−0.80.5-2+0.6+0.1=-0.80.5−2+0.6+0.1=−0.8;第 2 套房:2−5+1.2+0.1=−1.72-5+1.2+0.1=-1.72−5+1.2+0.1=−1.7。每行是一个样本、每列是一个神经元——这就是"批处理"。

(2) 自动构图(在 engine.py 里):x @ self.W 触发 __matmul__,它只写了两行局部导数公式:

def __matmul__(self, other):                 # self = x(N,3), other = W(3,8)
    out = Tensor(self.data @ other.data, (self, other), "@")
    def _bw():
        self.grad += out.grad @ other.data.T     # dX = dZ·Wᵀ       (N,3)
        other.grad += self.data.T @ out.grad     # dW = Xᵀ·dZ       (3,8)
    out._backward = _bw

(3) 反向:下一层传回 dZ=∂L/∂ZdZ=\partial L/\partial ZdZ=∂L/∂Z 后,链式法则的向量版是一套三连:

dW=X⊤dZ,db=∑n=1NdZn,:,dX=dZ W⊤dW = X^\top dZ,\qquad db = \sum_{n=1}^{N} dZ_{n,:},\qquad dX = dZ\,W^\topdW=X⊤dZ,db=n=1∑N​dZn,:​,dX=dZW⊤

用上面的数字验证(设 dZ=[11]dZ=\begin{bmatrix}1\\1\end{bmatrix}dZ=[11​]):

dW=X⊤dZ=[142536][11]=[579],db=[2],dX=dZ W⊤=[0.5−10.20.5−10.2]dW=X^\top dZ=\begin{bmatrix}1&4\\2&5\\3&6\end{bmatrix}\begin{bmatrix}1\\1\end{bmatrix}=\begin{bmatrix}5\\7\\9\end{bmatrix},\qquad db=\begin{bmatrix}2\end{bmatrix},\qquad dX=dZ\,W^\top=\begin{bmatrix}0.5&-1&0.2\\0.5&-1&0.2\end{bmatrix}dW=X⊤dZ=​123​456​​[11​]=​579​​,db=[2​],dX=dZW⊤=[0.50.5​−1−1​0.20.2​]

这三条分别对应第 2 节积木表的 ∂y/∂w=x\partial y/\partial w=x∂y/∂w=x、∂y/∂b=1\partial y/\partial b=1∂y/∂b=1、∂y/∂x=w\partial y/\partial x=w∂y/∂x=w——标量手算和矩阵批量,是同一套链式法则的两副面孔。

(4) 更新:每个参数朝负梯度挪一步,第 2 节的 w1: 1.5 → 1.5454 变成对整个矩阵做:

W←W−lr⋅dW,b←b−lr⋅dbW \leftarrow W - lr\cdot dW,\qquad b \leftarrow b - lr\cdot dbW←W−lr⋅dW,b←b−lr⋅db

对应代码 p.data -= self.lr * p.grad(一次更新整个 (3,8) 矩阵)。生命周期串起来:建层(随机 W,b)→ 前向 x@W+b(顺带构图)→ backward() 填梯度 → step() 挪一步 → 循环 4000 次,113 个参数一起被"修正",WWW 从随机乱码变成会看房的好权重。


8. 用框架做一个直观应用:预测房价

空谈框架没意思,拿它做个生活里看得懂的应用:根据面积、卧室数、房龄预测房价(万元)。

  • 数据:400 套模拟房,规律 房价 ≈ 20 + 1.2·面积 + 8·卧室 − 1.5·房龄 + 噪声
  • 模型:3 层 MLP Linear(3,8) - Tanh - Linear(8,8) - Tanh - Linear(8,1),113 个参数
  • 训练:4000 轮,lr=0.3,loss 从 0.95 → 0.024
  • 结果:测试集 80 套 R²=0.963、MAE=7.5 万元

训练完直接问模型"新房子多少钱":

90㎡  3 室  5 年  ->  ≈148 万元   (真实规律 ≈145 万)
140㎡ 4 室  2 年  ->  ≈220 万元   (真实规律 ≈217 万)

在这里插入图片描述

左边是 loss 下降曲线(前几百轮陡降、后面趋平 = 收敛),右边是预测 vs 真实散点(贴近对角线 = 预测准)。

8.1 训练中,权重是怎么一点点变的(实测快照)

光说"权重被修正"不够直观。我在训练时打了几个"快照",看第一层 Linear(3,8) 的权重(8 个神经元按特征取平均)怎么变:

epochloss面积权重均值卧室权重均值房龄权重均值偏置均值
00.8795+0.121+0.008−0.081+0.000
500.0340+0.110+0.064−0.105+0.003
5000.0274+0.094+0.062−0.068−0.004
20000.0287+0.178+0.105−0.044−0.002
39990.0255+0.210+0.148−0.038−0.016

三个现象,每一条都能对上理论:

  1. loss 前 50 轮从 0.88 猛降到 0.034——一开始"错得离谱"、梯度大、修得快;后面 0.027→0.026 几乎不动——梯度趋近 0,这就是收敛(对应左图曲线形态)。
  2. 面积权重一路往正走(终值 +0.210)、卧室权重也转正(+0.148)——模型"学会"了"面积越大、房间越多 → 越贵"。
  3. 房龄权重始终为负(终值 −0.038)——模型"学会"了"房龄越大 → 越便宜"。

注意这些权重是标准化后的量,绝对值不大,但正负方向就是模型对每个特征的态度——这正是 5.2 说的"权重 = 神经元对每个输入的关注"。

复现:demo_weight_snapshots.py(python3 demo_weight_snapshots.py)。

关于 lr / epochs / loss 这三个容易混的概念:epochs 决定"练多久"(4000 轮),lr 决定"每步多大"(0.3,不是损失!),loss 是训练中算出来的"当前有多差"(0.95 → 0.024)。lr 太大 → 步子太大直接爆掉;太小 → 4000 轮还下不来。


9. 一张图看懂训练时序

train() 里其实就那 5 步在循环:

SGDTensormodel (Sequential)train()mainSGDTensormodel (Sequential)train()mainloop[每个 epoch(共 4000 次)]train(model, X_s, y_s, epochs=4000, lr=0.3)把 X, y 包装成 TensorSGD(model.parameters(), lr)pred = model(X) 【1. 前向】Linear: x@W+b → Tanh → … → Linear(8,1)返回 pred,同时自动记下计算图loss = mse_loss(pred, y) 【2. 算损失】opt.zero_grad() 【3. 清零上次梯度】loss.backward() 【4. 反向】拓扑序从后往前,逐个 _backward 累积梯度所有参数 .grad 就绪opt.step() 【5. 更新参数】每个参数 p.data -= lr·p.grad返回 loss 历史(用于画曲线)

一条消息一个箭头 = 一次函数调用。训练的本质就是这 5 步循环——前向算值、反向算梯度、更新参数、再来一次。


10. 下一步:接上 Transformer

跑通这套之后,把 MLP 的 WWW 换成 attention 里的 Q/K/V 投影,把 h@Wh@Wh@W 换成 softmax(QK⊤/d)V\text{softmax}(QK^\top/\sqrt{d})Vsoftmax(QK⊤/d​)V——你会发现 attention 也只是计算图里的几个节点,反向传播完全一样自动。Transformer 里最核心的 Q/K/V,本质上就是一个 nn.Linear。

从"手算 1 个神经元"到"理解 .backward()“到"能预测房价”,再到"看懂 attention 只是计算图上的几个节点"——这条线走完,你就站在"会看架构"到"真懂训练"的临界点上了。


写在最后

这篇文章帮你建立了什么

  1. 梯度 = 每层的局部斜率,反向传播 = 沿计算图把斜率连乘(有真实数字验证过,不是背的)。
  2. .backward() 不神秘:就是"构图 + 拓扑序反向遍历",60 行代码能复刻。
  3. 框架分层有章法:Tensor / nn / loss / optim / train 五层,和 PyTorch 一一对应。
  4. 这套东西真的能用:113 个参数、4000 轮,R²=0.963 的房价预测——规模再大,机制不变。

文件清单

文件作用怎么跑
backprop_lab.py4 步递进实验(手算→autograd→向量化→PyTorch)python3 backprop_lab.py
minidnn/5 层迷你深度学习框架被 demo 引用
demo_house_price.py房价预测应用python3 demo_house_price.py
demo_weight_snapshots.py打印训练中权重快照(8.1 表格的数据来源)python3 demo_weight_snapshots.py
tanh_curve.py生成 tanh 曲线图python3 tanh_curve.py
backprop_network.drawio链式法则示意图(draw.io 打开)—

如果你也从"会用框架但心里没底"的状态出发,希望这篇能帮你把那一层窗户纸捅破。下次再看到 .backward(),你看到的不再是一行魔法,而是一张你亲手画过的图。

【人工智能】保姆级波士顿房价预测 波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。和大家对房价的普遍认知相同,波士顿地区的房价是由诸多因素影响的。该数据集统计了13种可能影响房价的因素和该类型房屋的均价,期望构建一个基于13个因素进行房价预测的模型,如所示。对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。因为房价是一个连续值,所以房价预测显然是一个回归任务。下面我们尝试用最简单的线性回归模型解决这个问题,并用神经网络来实现这个模型。 阅读详情

相关推荐

神经网络反向传播算法原理与Python实现:从梯度下降到房价预测实战

在机器学习领域,梯度下降是优化模型参数的核心算法,它通过迭代调整参数以最小化损失函数。其原理基于计算损失函数相对于每个参数的梯度,指示参数更新的方向和幅度。这一技术价值在于使复杂模型能够从数据中自动学习规律,广泛应用于图像识别、自然语言处理和预测分析等场景。反向传播算法作为高效计算梯度的方法,是训练深度神经网络的关键。本文结合房价预测实例,深入解析反向传播的链式法则实现,并探讨激活函数选择、参数初始化等工程实践要点,帮助读者从理论到代码全面掌握这一神经网络的核心引擎。

android_mylove的专栏 723

Numpy_房价预测

本文采用仅采用numpy进行房价预测,不包含任何深度学习框架,波士顿房价预测问题作为机器学习领域的“hello world”。本文有利于读者更好地理解并入门,为以后更深程度的学习打下良好的基础。 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本文主要以数据预处理,损失函数,梯度计算,反向传播更新参数, 总结 提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pan...

qq_49392169的博客 2413

pytorch-梯度消失、梯度爆炸以及Kaggle房价预测

梯度消失、梯度爆炸以及Kaggle房价预测 梯度消失和梯度爆炸 考虑到环境因素的其他问题 Kaggle房价预测 梯度消失和梯度爆炸 深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。 当神经网络的层数较多时,模型的数值稳定性容易变差。 假设一个层数为LLL的多层感知机的第lll层H(l)\boldsymbol{H}^{(l)}H(l)的权重参数为W(l)...

weixin_42479155的博客 631

【深度学习入门案例】波士顿房价预测

人工智能,机器学习,深度学习 参考文献: 做个简单介绍:三者的关系如 图1 所示,即:人工智能 > 机器学习 > 深度学习。 深度学习设计框架: 环境查看 import paddle import numpy as np import os import matplotlib import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import warnings warnings.filterwarn

全栈川川 4394

深度学习之基于Matlab NN的伦敦房价预测

一、项目背景房价预测是房地产领域的一个重要问题,对于投资者、开发商以及政策制定者等都具有重要的指导意义。随着深度学习技术的不断发展,其在房价预测领域的应用也越来越广泛。本项目旨在利用Matlab神经网络(NN)工具箱,构建一个基于深度学习的伦敦房价预测模型,以实现对伦敦地区房价的准确预测。二、项目目标数据收集与预处理:收集伦敦地区的房价数据,包括房屋类型、面积、地理位置、周边环境等信息,并进行数据清洗、去噪、标准化等预处理操作,以提高数据质量。

Q1744828575的博客 1058

神经网络学习过程的数学本质与反向传播手算详解

神经网络的学习本质是高维非线性函数的参数优化问题,其核心原理基于微积分中的链式法则与梯度下降——通过计算损失函数对各层权重的偏导数,实现误差信号从输出端逐层回传。这一确定性数学过程不依赖玄学或黑箱,而是可推演、可复现、可手动验证的数值计算工程。技术价值在于将抽象‘训练’转化为具体梯度更新:如ReLU激活保障梯度流动性,交叉熵损失提升分类任务的梯度敏感性。典型应用场景涵盖图像识别、推荐系统与工业缺陷检测等需鲁棒特征学习的领域。本文聚焦反向传播的完整计算链条,以手算示例和NumPy实操还原梯度如何精准抵达每一层

weixin_30588381的博客 319

AI之梯度消失、梯度爆炸以及Kaggle房价预测

梯度消失、梯度爆炸以及Kaggle房价预测梯度消失和梯度爆炸随机初始化模型参数PyTorch的默认随机初始化Xavier随机初始化考虑环境因素协变量偏移标签偏移概念偏移Kaggle 房价预测实战获取和读取数据集预处理数据训练模型对数均方根误差实现K折交叉验证模型选择预测并在Kaggle中提交结果 梯度消失和梯度爆炸   深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explo...

zhangbin_0719的博客 495

使用飞桨构建波士顿房价预测模型

使用飞桨构建波士顿房价预测模型(笔记) 动态图模式 飞桨支持两种深度学习建模编写方式,更方便调试的动态图模式和性能更好并便于部署的静态图模式。 静态图模式(声明式编程范式,类比C++):先编译后执行的方式。用户需预先定义完整的网络结构,再对网络结构进行编译优化后,才能执行获得计算结果。 动态图模式(命令式编程范式,类比Python):解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果。 dygraph:动态图的类库。 import paddle import pad

witherda的博客 1006

Paddle_房价预测

本文采用paddle深度学习框架进行房价预测,包含一些其他第三方库,波士顿房价预测问题作为机器学习领域的“hello world”。本文有利于读者更好地理解并入门,为以后更深程度的学习打下良好的基础。 前言: 波士顿房价数据集源于美国某经济学杂志上,分析研究波士顿 房价的数据集。该数据集中的每一行数据都是对波士顿周边或者城镇 的房价情况的概述,统计的是房价的中位数和 13 个指标,试图能够 分析出这些指标和房价之间的关系。本文主要以数据预处理,损失函数,梯度计算,...

qq_49392169的博客 977

深度学习(波士顿房价预测)

本程序采用百度paddlepaddle深度学习框架 目录 1实验背景 2 实验过程 2.1 数据处理 2.1.1数据集导入并按规定形状保存 2.1.2数据集的划分(分为训练集和测试集) 2.1.3 数据归一化处理 2.1.4 数据集乱序分成批次(每次读入一个批次) 2.1.5 封装 load_data 函数 2.2 神经网络的设计 2.2.1神经网络的结构 2.2.2 神经网络的初始化 2.2.3 神经网络的前向计算和反向传播 2.2.4 优化算法 3 测试结果 4 完整

weixin_65089713的博客 2万+

深度学习之多层感知机(MLP)在房价预测中的应用全解析

摘要:本文深入探讨多层感知机(MLP)在房价预测中的应用。开篇点明房价预测对日常生活决策影响重大,MLP 作为强大工具登场。简要介绍 MLP 含输入、隐藏、输出层架构,神经元运算机制。重点聚焦实操:获取房价数据后,详细演示清洗、标准化,用常见深度学习库搭建 MLP 模型,合理配置学习率等参数训练,依均方误差评估,最终实现房价精准预测。文末总结回顾,为新手清晰梳理步骤,助其快速上手实操。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1436

Task03 梯度消失、梯度爆炸、Kaggle房价预测

梯度消失、梯度爆炸以及Kaggle房价预测 深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。 当神经网络的层数较多时,模型的数值稳定性容易变差。 假设一个层数为 L 的多层感知机的第 l 层 H(l) 的权重参数为 W(l) ,输出层 H(L) 的权重参数为 W(L) 。为了便于讨论,不考虑偏差参数,且设所有隐藏层的激活函数为恒等映射(identity m...

l_yiyu的博客 271

【房价预测】基于matlab遗传算法优化BP神经网络GA-BP房价预测【含Matlab源码 592期】

遗传算法优化BP神经网络GA-BP房价预测 完整代码和数据,数据可直接替换,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 4041

《零基础实践深度学习》波士顿房价预测任务1.3.3.5 总结

《零基础实践深度学习》(第1版)2020年正式上线,深受开发者和高校师生追捧,累积学习人数超过9万人。本课程是它的升级版,结合深度学习技术的发展、学员反馈,并结合近两年AI产业应用经验,进行了全面更新和优化。如: • 模型算法方面 :新增CV、NLP和推荐领域经典模型和算法介绍,以及相应的代码实现,如Transformer、BERT等。 • 产业应用方面 :新增AI产业应用方法论和使用工具介绍,如芯片选型原则、AI推理部署套件FastDeploy、飞桨产业范例库等。 • 学员反馈方面 :课程第1章增加P

我亦无他,唯手熟尔 1956

BP神经网络房价预测Python实战:归一化、反向传播与避坑指南

深度学习入门常从回归任务开始,房价预测因其数据量小、特征明确,成为理解神经网络原理的经典场景。BP神经网络通过前向传播与反向传播迭代优化权重,本质是在拟合输入特征与连续标签之间的非线性映射。要让模型真正收敛,特征归一化、随机种子固定、训练集测试集划分等细节往往比网络结构更关键。该技术广泛应用于房地产估价、金融风控、城市数据分析等领域。本文围绕一套Python源码包,逐步拆解从MinMaxScaler数据预处理、三层网络结构设计到MSE损失与梯度下降的完整实现,并重点剖析数据泄漏、输出层激活函数误用及反归一化

weixin_29057065的博客 130

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7274

Pytorch总结七之 深度学习的正向、反向传播原理+参数初始化+实战房价预测

Pytorch总结七之深度学习的正向、反向传播原理+参数初始化+实战房价预测

yohnyang的博客 1221

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 388

房价预测-paddle 实现

课程>我的课程>百度架构师手把手教深度学习>1-4 使用飞桨重写【房价预测】模型>1-4 使用飞桨重写【房价预测】模型paddle初级教程第一章 第四节王然(学生)Notebook教育初级深度学习Python32019-12-23 14:36:28启动环境停 止部署版本内容数据集在线服务请选择版本草稿 2019-12-23 14:36:28查看教师发布的版本当读者习惯使用飞...

kyle1314608的博客 817

给STM32 LWIP做一次‘性能体检’:手把手教你用Wireshark和iperf诊断网络瓶颈

本文详细介绍了如何使用Wireshark和iperf工具对STM32 LWIP网络性能进行全面诊断,帮助开发者精准定位网络瓶颈问题。通过搭建测试环境、集成iperf测试框架、深度报文分析和LWIP配置优化,实现从9KB/s到80MB/s的性能飞跃,特别适用于解决TCP发送速率和卡死问题。

weixin_29631169的博客 288

智能手环心率检测不准?用STM32+MAX30102教你实现医疗级精度(含算法优化)

本文详细解析了如何利用STM32微控制器和MAX30102光学传感器实现医疗级精度的心率检测方案。通过硬件参数调校、ADC采集优化、运动伪影消除及深度学习算法改进,显著提升智能手环在静态和运动状态下的检测精度,误差可控制在±1.5bpm以内,满足医疗电子标准。

weixin_28335283的博客 526

深度学习连续剧——手搓梯度下降法

摘要:本教案系统讲解梯度下降法及其在深度学习中的应用,分为六章循序渐进。从线性回归问题引入,分析正规方程的局限性,引出梯度下降的必要性。详细推导梯度下降的数学原理,包括偏导数计算和参数更新规则,并配合手算示例演示迭代过程。随后介绍多层感知机(MLP)和反向传播算法,最后通过Python实现完整训练流程,并讨论梯度下降的局限性及改进方法(如Adam优化器)。教案结合理论推导与代码实践,适合深度学习初学者系统掌握这一核心优化算法。

m0_37755875的博客 472

Meta新开源多语种语音基座Omnilingual ASR

Meta FAIR 团队最近祭出了,这不仅仅是对 MMS (Massively Multilingual Speech) 的简单升级,而是一次从“多任务学习”向“上下文学习(In-Context Learning)”的范式跃迁。通过将 Wav2Vec 2.0 编码器扩展至 70 亿参数,并引入 LLM 风格的 Decoder,Omnilingual ASR 不仅原生支持 1600+ 种语言,更具备了类似 GPT 的“零样本”扩展能力——只需给出几个音频-文本对,即可解锁从未见过的语言。

kakaZhui的博客 146
上一篇: PCIe / UCIe / CXL / CCIX 深度对比:物理状态机 · 软件配置流程 · 通信协议核心
下一篇: 从反向传播看 QKV:注意力只是计算图里的几个节点
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值