news 2026/10/1 2:00:10

线性回归:从房价建模到单层神经网络的深度学习第一课

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性回归:从房价建模到单层神经网络的深度学习第一课
  • 人工智能
  • 深度学习
  • 机器学习
  • 教程

【免费下载链接】d2l-zh

《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。

项目地址:https://gitcode.com/GitHub_Trending/d2/d2l-zh
点击查看免费下载

导读

线性回归是《动手学深度学习》(d2l-zh)中第一个完整的机器学习模型,它以"房屋面积与房龄预测房价"这一贯穿全书的示例,系统讲清了训练数据、模型、损失函数与优化算法这四大要素,并最终把线性模型等价地表述为一个单层神经网络,为后续全部深度网络知识奠定起点。读完本篇,你将掌握线性回归的数学原理(仿射变换、平方损失、解析解与小批量随机梯度下降)、矢量化加速的实践价值,以及从概率视角理解"最小化均方误差等价于极大似然估计"的关键结论,并能够在 d2l-zh 仓库提供的 PyTorch / MXNet / TensorFlow / Paddle 多框架环境中复现全部实验。

线性回归的基本元素

回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法,在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。在机器学习的大多数任务中,我们关心的是预测(prediction):当想预测一个数值时,就涉及回归问题。常见例子包括预测价格(房屋、股票等)、预测住院时间、预测需求(零售销量等)。但并非所有预测都是回归问题——后续章节将要介绍的分类问题,目标是预测数据属于一组类别中的哪一个,二者需要区分。

线性回归(linear regression)可以追溯到 19 世纪初,是回归各种标准工具中最简单也最流行的一种。它建立在两个简单假设之上:其一,假设自变量 $\mathbf{x}$ 和因变量 $y$ 之间的关系是线性的,即 $y$ 可以表示为 $\mathbf{x}$ 中元素的加权和(通常允许包含观测噪声);其二,假设噪声比较"正常",如遵循正态分布。

为了解释线性回归,原文档举了一个贯穿全书示例:希望根据房屋的面积(平方英尺)和房龄(年)来估算房屋价格(美元)。为了开发模型,需要收集一个包含销售价格、面积和房龄的真实数据集。在机器学习的术语中:

  • 该数据集称为训练数据集(training data set)或训练集(training set);
  • 每行数据(如一次房屋交易)称为样本(sample),也称数据点(data point)或数据样本(data instance);
  • 试图预测的目标(如房屋价格)称为标签(label)或目标(target);
  • 预测所依据的自变量(面积和房龄)称为特征(feature)或协变量(covariate)。

通常用 $n$ 表示数据集中的样本数。对索引为 $i$ 的样本,输入表示为 $\mathbf{x}^{(i)} = [x_1^{(i)}, x_2^{(i)}]^\top$,其对应标签是 $y^{(i)}$。

线性模型

线性假设指目标(房屋价格)可以表示为特征(面积和房龄)的加权和:

$$\mathrm{price} = w_{\mathrm{area}} \cdot \mathrm{area} + w_{\mathrm{age}} \cdot \mathrm{age} + b.$$

其中的 $w_{\mathrm{area}}$ 和 $w_{\mathrm{age}}$ 称为权重(weight),决定每个特征对预测值的影响;$b$ 称为偏置(bias)、偏移量(offset)或截距(intercept),表示当所有特征都取 0 时预测值应为多少。即使现实中不会有任何房子面积为 0 或房龄恰好为 0 年,我们仍然需要偏置项——没有它,模型的表达能力将受到限制。严格来说,上式是输入特征的一个仿射变换(affine transformation):通过加权和对特征做线性变换(linear transformation),再通过偏置项进行平移(translation)。

在机器学习领域,我们通常处理高维数据集,用线性代数表示法会更方便。当输入包含 $d$ 个特征时,将预测结果 $\hat{y}$(通常用"尖角"符号表示 $y$ 的估计值)表示为:

$$\hat{y} = w_1 x_1 + \dots + w_d x_d + b.$$

把所有特征放入向量 $\mathbf{x} \in \mathbb{R}^d$、所有权重放入向量 $\mathbf{w} \in \mathbb{R}^d$,可以用点积形式简洁表达模型:

$$\hat{y} = \mathbf{w}^\top \mathbf{x} + b.$$

其中向量 $\mathbf{x}$ 对应单个数据样本的特征;用符号矩阵 $\mathbf{X} \in \mathbb{R}^{n \times d}$ 可以方便地引用整个数据集的 $n$ 个样本——$\mathbf{X}$ 的每一行是一个样本,每一列是一种特征。对于特征集合 $\mathbf{X}$,预测值 $\hat{\mathbf{y}} \in \mathbb{R}^n$ 可以通过矩阵-向量乘法表示为:

$${\hat{\mathbf{y}}} = \mathbf{X} \mathbf{w} + b$$

这个过程会用到广播机制(详见 chapter_preliminaries/ndarray.md 中subsec_broadcasting一节的介绍)。给定训练数据特征 $\mathbf{X}$ 和已知标签 $\mathbf{y}$,线性回归的目标是找到一组权重向量 $\mathbf{w}$ 和偏置 $b$,使得从 $\mathbf{X}$ 同分布中取样得到的新样本预测标签误差尽可能小。

即使我们相信给定 $\mathbf{x}$ 预测 $y$ 的最佳模型是线性的,也很难找到 $n$ 个样本的真实数据集,使得对所有 $1 \leq i \leq n$ 都严格满足 $y^{(i)} = \mathbf{w}^\top \mathbf{x}^{(i)} + b$——无论用什么手段观测特征 $\mathbf{X}$ 和标签 $\mathbf{y}$,都可能出现少量观测误差。因此,即使确信特征与标签的潜在关系是线性的,我们也会加入一个噪声项来考虑观测误差。在寻找最优模型参数(model parameters)$\mathbf{w}$ 和 $b$ 之前,还需要两样东西:(1)一种模型质量的度量方式;(2)一种能够更新模型以提高预测质量的方法。

损失函数

在考虑如何用模型拟合(fit)数据之前,需要确定拟合程度的度量。损失函数(loss function)能够量化目标的实际值与预测值之间的差距。通常选择非负数作为损失,数值越小表示损失越小,完美预测时损失为 0。回归问题中最常用的损失函数是平方误差函数:当样本 $i$ 的预测值为 $\hat{y}^{(i)}$、真实标签为 $y^{(i)}$ 时,平方误差定义为:

$$l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2.$$

常数 $\frac{1}{2}$ 不会带来本质差别,但求导后常数系数为 1,形式上更简单。由于训练数据集不受我们控制,经验误差只是关于模型参数的函数。下图展示了一维情况下用线性模型拟合数据的直观效果:

由于平方误差函数中的二次方项,估计值 $\hat{y}^{(i)}$ 和观测值 $y^{(i)}$ 之间较大的差异将导致更大的损失。为度量模型在整个数据集上的质量,需要计算训练集 $n$ 个样本上的损失均值(等价于求和):

$$L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2.$$

训练模型时,我们希望寻找一组参数 $(\mathbf{w}^, b^)$,使其最小化所有训练样本上的总损失:

$$\mathbf{w}^, b^= \operatorname*{argmin}_{\mathbf{w}, b}\ L(\mathbf{w}, b).$$

解析解

线性回归是一个很简单的优化问题:与其他大部分模型不同,它的解可以用一个公式直接表达,这类解叫作解析解(analytical solution)。首先把偏置 $b$ 合并到参数 $\mathbf{w}$ 中(在包含所有参数的矩阵中附加一列),预测问题变成最小化 $|\mathbf{y} - \mathbf{X}\mathbf{w}|^2$。这在损失平面上只有一个临界点,对应整个区域的损失极小点。将损失关于 $\mathbf{w}$ 的导数设为 0,得到解析解:

$$\mathbf{w}^* = (\mathbf X^\top \mathbf X)^{-1}\mathbf X^\top \mathbf{y}.$$

像线性回归这样的简单问题存在解析解,但并非所有问题都有解析解。解析解便于进行数学分析,但对问题的限制很严格,因而无法广泛应用在深度学习里——这正是需要引入数值优化方法的原因。

随机梯度下降

即使在无法得到解析解的情况下,我们仍然可以有效地训练模型。在许多任务上,那些难以优化的模型效果反而更好,因此弄清楚如何训练它们是至关重要的。本书使用一种名为梯度下降(gradient descent)的方法,它几乎可以优化所有深度学习模型:通过不断在损失函数递减的方向上更新参数来降低误差。

梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(梯度)。但实际执行可能非常慢:因为每次更新参数前必须遍历整个数据集。因此通常每次计算更新时随机抽取一小批样本,这种变体叫小批量随机梯度下降(minibatch stochastic gradient descent):

  1. 初始化模型参数的值,如随机初始化;
  2. 从数据集中随机抽取小批量样本,在负梯度方向上更新参数,并不断迭代。

每次迭代中,首先随机抽样一个小批量 $\mathcal{B}$(由固定数量的训练样本组成);然后计算小批量平均损失关于模型参数的导数(梯度);最后将梯度乘以预先确定的正数 $\eta$,并从当前参数值中减掉。数学上可表示为($\partial$ 表示偏导数):

$$(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b).$$

对于平方损失和仿射变换,可以明确写成:

$$\begin{aligned} \mathbf{w} &\leftarrow \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right),\ b &\leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right). \end{aligned}$$

其中 $\mathbf{w}$ 和 $\mathbf{x}$ 都是向量,向量表示法比系数表示法(如 $w_1, w_2, \ldots, w_d$)更具可读性。$|\mathcal{B}|$ 表示每个小批量中的样本数,也称批量大小(batch size);$\eta$ 表示学习率(learning rate)。批量大小和学习率通常是手动预先指定的,而非训练得到;这些可调整但不在训练过程中更新的参数称为超参数(hyperparameter),调参(hyperparameter tuning)就是选择超参数的过程。超参数通常根据训练迭代结果调整,而训练迭代结果在独立的验证数据集(validation dataset)上评估。

在训练了预先确定的若干迭代次数后(或满足其他停止条件),我们记录下模型参数的估计值 $\hat{\mathbf{w}}, \hat{b}$。但即使函数确实是线性的且无噪声,这些估计值也不会让损失函数真正达到最小值——算法只会让损失缓慢收敛,无法在有限步数内精确达到最小值。线性回归恰好是一个在整个域中只有一个最小值的学习问题;而像深度神经网络这样复杂的模型,损失平面上通常包含多个最小值。深度学习实践者很少会费力寻找在训练集上损失最小的参数,更难做到的是找到一组参数,使它们在我们从未见过的数据上实现较低损失,这一挑战被称为泛化(generalization)。

用模型进行预测

给定"已学习"的线性回归模型 $\hat{\mathbf{w}}^\top \mathbf{x} + \hat{b}$,现在可以通过房屋面积 $x_1$ 和房龄 $x_2$ 估计一个未包含在训练数据中的新房屋价格。给定特征估计目标的过程通常称为预测(prediction)或推断(inference)。本书坚持使用预测一词:虽然推断已成为深度学习的标准术语,但它其实有些用词不当——在统计学中,推断更多表示基于数据集估计参数,深度学习从业者与统计学家交谈时常因术语误用产生误解。

矢量化加速

在训练模型时,我们经常希望同时处理整个小批量的样本。为此需要对计算进行矢量化(vectorization),利用线性代数库而非在 Python 中编写开销高昂的 for 循环。原文档的实验代码如下(d2l-zh 支持 mxnet、pytorch、tensorflow、paddle 四种后端,通过from d2l import torch as d2l等写法切换,见 d2l/init.py):

#@tab pytorch %matplotlib inline from d2l import torch as d2l import math import torch import numpy as np import time

为了说明矢量化为何重要,我们考虑向量相加的两种方法:实例化两个全为 1 的 10000 维向量,一种方法用 Python for 循环遍历,另一种依赖对+的调用:

#@tab all n = 10000 a = d2l.ones([n]) b = d2l.ones([n])

由于本书会频繁进行运行时间基准测试,所以定义了一个计时器。该Timer类在仓库的 d2l/torch.py(以及其他框架实现中)中完整保存:

#@tab all class Timer: #@save """记录多次运行时间""" def __init__(self): self.times = [] self.start() def start(self): """启动计时器""" self.tik = time.time() def stop(self): """停止计时器并将时间记录在列表中""" self.times.append(time.time() - self.tik) return self.times[-1] def avg(self): """返回平均时间""" return sum(self.times) / len(self.times) def sum(self): """返回时间总和""" return sum(self.times) def cumsum(self): """返回累计时间""" return np.array(self.times).cumsum().tolist()

现在可以对工作负载进行基准测试。首先用 for 循环,每次执行一位的加法:

#@tab mxnet, pytorch c = d2l.zeros(n) timer = Timer() for i in range(n): c[i] = a[i] + b[i] f'{timer.stop():.5f} sec'

在 TensorFlow 后端中需要借助tf.Variable与assign完成逐位写入,Paddle 后端则与 MXNet/PyTorch 写法一致。或者使用重载的+运算符计算按元素的和:

#@tab all timer.start() d = a + b f'{timer.stop():.5f} sec'

结果很明显:第二种方法比第一种快得多,矢量化代码通常会带来数量级的加速。另外,把更多数学运算放进库中,无须自己编写大量计算,也减少了出错的可能性。

正态分布与平方损失

正态分布和线性回归之间的关系很密切。正态分布(normal distribution),也称高斯分布(Gaussian distribution),最早由德国数学家高斯(Gauss)应用于天文学研究。若随机变量 $x$ 具有均值 $\mu$ 和方差 $\sigma^2$(标准差 $\sigma$),其正态分布概率密度函数如下:

$$p(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (x - \mu)^2\right).$$

下面定义一个 Python 函数来计算正态分布,并在仓库中随 d2l/torch.py 等模块一起保存(本文代码的normal、plot等辅助函数与库中实现一致):

#@tab all 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)

可视化正态分布时,改变均值会产生沿 $x$ 轴的偏移,增加方差会分散分布、降低其峰值:

#@tab pytorch, tensorflow, paddle # 再次使用numpy进行可视化 x = np.arange(-7, 7, 0.01) # 均值和标准差对 params = [(0, 1), (0, 2), (3, 1)] d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x', ylabel='p(x)', figsize=(4.5, 2.5), legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])

均方误差损失函数(简称均方损失)可用于线性回归的一个原因正是:我们假设观测中包含噪声,且噪声服从正态分布。即:

$$y = \mathbf{w}^\top \mathbf{x} + b + \epsilon,$$

其中 $\epsilon \sim \mathcal{N}(0, \sigma^2)$。因此,通过给定的 $\mathbf{x}$ 观测到特定 $y$ 的似然(likelihood)为:

$$P(y \mid \mathbf{x}) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (y - \mathbf{w}^\top \mathbf{x} - b)^2\right).$$

根据极大似然估计法,参数 $\mathbf{w}$ 和 $b$ 的最优值是使整个数据集的似然最大的值:

$$P(\mathbf y \mid \mathbf X) = \prod_{i=1}^{n} p(y^{(i)}|\mathbf{x}^{(i)}).$$

极大似然估计法选择的估计量称为极大似然估计量。虽然使许多指数函数的乘积最大化看起来很困难,但可以在不改变目标的前提下,通过最大化似然对数来简化。由于历史原因,优化通常说"最小化"而非"最大化",因此可以改为最小化负对数似然$-\log P(\mathbf y \mid \mathbf X)$:

$$-\log P(\mathbf y \mid \mathbf X) = \sum_{i=1}^n \frac{1}{2} \log(2 \pi \sigma^2) + \frac{1}{2 \sigma^2} \left(y^{(i)} - \mathbf{w}^\top \mathbf{x}^{(i)} - b\right)^2.$$

假设 $\sigma$ 是某个固定常数,就可以忽略第一项(它不依赖 $\mathbf{w}$ 和 $b$);第二项除常数 $\frac{1}{\sigma^2}$ 外,其余部分与均方误差完全一致,且解并不依赖于 $\sigma$。因此可以得出结论:在高斯噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计。

从线性回归到深度网络

到目前为止我们只谈论了线性模型。尽管神经网络涵盖更丰富的模型,我们依然可以用描述神经网络的方式来描述线性模型,从而把线性模型看作一个神经网络。

神经网络图

深度学习从业者喜欢绘制图表来可视化模型。下面把线性回归模型描述为一个神经网络——注意该图只显示连接模式(每个输入如何连接到输出),隐去了权重和偏置的值:

在该神经网络中,输入为 $x_1, \ldots, x_d$,因此输入层中的输入数(或称特征维度,feature dimensionality)为 $d$;网络的输出为 $o_1$,输出层的输出数是 1。输入值都是已经给定的,并且只有一个计算神经元;由于模型的重点在发生计算的地方,通常计算层数时不考虑输入层——因此这个神经网络的层数为 1。我们可以将线性回归模型视为仅由单个人工神经元组成的神经网络,即单层神经网络。对于线性回归,每个输入都与每个输出(本例中只有一个输出)相连,这种变换称为全连接层(fully-connected layer)或稠密层(dense layer),下一章将详细讨论由这些层组成的网络。

在 d2l-zh 仓库中,这一"线性回归即神经网络"的视角直接体现在实践章节的实现上:零实现版本(chapter_linear-networks/linear-regression-scratch.md)用d2l.matmul(X, w) + b实现linreg模型,用(y_hat - d2l.reshape(y, y_hat.shape)) ** 2 / 2实现squared_loss均方损失,并用param[:] = param - lr * param.grad / batch_size实现小批量随机梯度下降sgd;而简洁实现版本(chapter_linear-networks/linear-regression-concise.md)则直接用net = nn.Sequential(nn.Linear(2, 1))构造一个单层全连接网络,配合loss = nn.MSELoss()与优化器完成训练,二者完美呼应"线性回归 = 单层神经网络"这一结论。

生物学

线性回归发明的时间(1795 年)早于计算神经科学,所以将线性回归描述为神经网络似乎不太合适。但当控制学家、神经生物学家沃伦·麦库洛奇和沃尔特·皮茨开始开发人工神经元模型时,他们为什么把线性模型作为起点?下图是一张由树突(dendrites,输入终端)、细胞核(nucleus,CPU)组成的生物神经元图片,轴突(axon,输出线)和轴突端子(axon terminal,输出端子)通过突触(synapse)与其他神经元连接:

树突中接收到来自其他神经元(或视网膜等环境传感器)的信息 $x_i$,该信息通过突触权重$w_i$ 加权,以确定输入的影响(即通过 $x_i w_i$ 相乘来激活或抑制)。来自多个源的加权输入以加权和 $y = \sum_i x_i w_i + b$ 的形式汇聚在细胞核中,然后发送到轴突 $y$ 中进一步处理,通常会通过 $\sigma(y)$ 进行一些非线性处理,之后到达目的地(如肌肉)或通过树突进入另一个神经元。许多这样的单元可以通过正确连接和正确的学习算法拼凑在一起,产生比单独一个神经元更有趣、更复杂的行为——这种想法归功于我们对真实生物神经系统的研究。

当然,当今大多数深度学习的研究几乎没有直接从神经科学中获得灵感。本书援引斯图尔特·罗素和彼得·诺维格在经典人工智能教科书Artificial Intelligence: A Modern Approach中的比喻:虽然飞机可能受到鸟类的启发,但几个世纪以来,鸟类学并不是航空创新的主要驱动力。同样地,如今深度学习中的灵感同样或更多地来自数学、统计学和计算机科学。

小结

  • 机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。
  • 矢量化使数学表达更简洁,同时运行得更快。
  • 最小化目标函数和执行极大似然估计等价。
  • 线性回归模型也是一个简单的神经网络。

练习

  1. 假设我们有一些数据 $x_1, \ldots, x_n \in \mathbb{R}$,目标是找到一个常数 $b$,使得最小化 $\sum_i (x_i - b)^2$。
    1. 找到最优值 $b$ 的解析解。
    2. 这个问题及其解与正态分布有什么关系?
  2. 推导使用平方误差的线性回归优化问题的解析解。为简化问题可以忽略偏置 $b$(可以通过向 $\mathbf X$ 添加所有值为 1 的一列做到这一点)。
    1. 用矩阵和向量表示法写出优化问题(将所有数据视为单个矩阵,将所有目标值视为单个向量)。
    2. 计算损失对 $w$ 的梯度。
    3. 通过将梯度设为 0、求解矩阵方程来找到解析解。
    4. 什么时候可能比使用随机梯度下降更好?这种方法何时会失效?
  3. 假定控制附加噪声 $\epsilon$ 的噪声模型是指数分布,即 $p(\epsilon) = \frac{1}{2} \exp(-|\epsilon|)$。
    1. 写出模型 $-\log P(\mathbf y \mid \mathbf X)$ 下数据的负对数似然。
    2. 请试着写出解析解。
    3. 提出一种随机梯度下降算法来解决这个问题。哪里可能出错?(提示:当我们不断更新参数时,在驻点附近会发生什么情况)请尝试解决这个问题。
  • 人工智能
  • 深度学习
  • 机器学习
  • 教程

【免费下载链接】d2l-zh

《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。

项目地址:https://gitcode.com/GitHub_Trending/d2/d2l-zh
点击查看免费下载

相关推荐

上一篇:libtorrent多协议支持终极指南:从IPv4到IPv6的平滑过渡实战教程
下一篇:GitHub_Trending/aig/ai-guide 开源项目:10 个值得学习的 AI 应用案例

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 1:59:57

企业微信外部群机器人消息分类:规则引擎与机器学习协同实现

1. 外部群机器人消息流的真实形态:先搞清我们拿到了什么做企业微信外部群机器人,很多团队的起步姿势都一样:先在群里拉一个自建应用机器人,配上回调地址,然后写一段"收到消息自动回复"的逻辑。听起来很简单&…

作者头像 李华
网站建设 2026/10/1 1:58:36

马德拉群岛徒步全攻略:火山海岛路线、装备与行程规划

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 1:57:32

【Linux】常用命令速查

Linux 常用命令速查表查看进程内存映射pmap -x <pid> # 查看进程的内存映射信息查看系统架构uname -m # 查看操作系统架构&#xff08;x86_64 / arm64 等&#xff09;find 查找当前目录及其子目录指定文件find . -name "libt2sdk.so" …

作者头像 李华
网站建设 2026/10/1 1:57:31

性能优化——首屏优化

1. 构建优化&#xff0c;减少资源体积 Webpack / Vite 配置压缩&#xff1a;使用 terser 压缩 JS&#xff0c;cssnano 压缩 CSS。 Tree Shaking&#xff1a;在 Vue/React 项目中确保使用 ESM&#xff0c;剔除无用代码。 代码分割&#xff08;按需加载&#xff09;&#xff1a…

作者头像 李华