智能计算系统复习第一二章
摘要
网上一些资料:
https://zhuanlan.zhihu.com/p/1916943773373535671 考题
https://blog.csdn.net/m0_63103606/article/details/135447143 复习
第一章 概述
Intro
课程概述
课程按照 输入 -> 输出 -> 建模 -> 实现 -> 运行 的主线组织,体现全栈视角:
- 深度学习基础(第二章):机器学习基本概念、神经网络结构、训练方法、正则化与交叉验证
- 深度学习应用(第三章):CNN、RNN、Transformer、大模型、神经网络量化
- 后续章节:编程框架、智能处理器、系统设计与优化
实验

考核内容:4567章实验(应该
人工智能技术分层
- 应用层
- 算法层
- 系统层(pytorch,TensorFlow,开发工具)
- 芯片层
底层(系统和芯片层)科技缺失——需要教育跟进
人工智能分类
- 弱人工智能:能完成某种特定任务
- 强人工智能(通用):能表现人类的所有智能行为
教育
计算机专业应该培养什么样的人才?
设计和研究计算机的人,而不是使用计算机
从算法程序到系统:需要考虑耗能、速度等
培养系统思维
现在小孩的认知:机器比人厉害?->以后不会反抗机器?
人工智能历史
流派
符号主义:基于符号逻辑的方法,用逻辑表示知识和求解问题。
难点:
- 没有逻辑能表示所有知识。
- 常识无穷无尽。
- 求解器时间复杂度太高
本质问题:只考虑了理性认识的智能。人类的智能包括感 性认识(感知)和理性认识(认知)两个方面
行为主义:基于控制论,在与环境的作用反馈中获得智能,可以模拟出类似于小脑的人工智能
问题:没法独立发展出通用人工智能
连接主义:基于大脑中神经元细胞连接的计算模型,用人工神经网络来拟合智能行为
发展:浅层学习–>深度学习–>大模型
MP神经元 输入权重 激活函数 输出 对输入加权求和 判断是否达到阈值并激活 输出 0 或 1 生物神经元 突触 胞体 + 轴丘 轴突 + 突触前末梢 调节信号强度 整合信号,产生动作电位 传导信号,释放神经递质
行为+连接–>具身智能
三次浪潮
第一次浪潮:符号主义(1950s-1970s)
- 核心思想:用符号逻辑表示知识和推理过程
- 代表性成就:逻辑推理机、定理证明、早期自然语言理解
- 局限性:难以处理不确定性、常识知识和复杂感知问题
第二次浪潮:专家系统(1980s)
- 核心思想:将领域专家的知识编码为规则系统
- 代表性系统:MYCIN(医疗诊断)、XCON(计算机配置)
- 局限性:知识获取困难(知识工程瓶颈)、规则爆炸、缺乏学习能力
第三次浪潮:深度学习(2006至今)
- 2006年:Hinton在Science发表论文,提出深度信念网络的逐层预训练方法,开启了深度学习时代
- 2012年:AlexNet在ImageNet竞赛中以巨大优势夺冠,标志着深度学习在计算机视觉领域的突破
- 2016年:AlphaGo击败李世石,展示深度学习在博弈领域的强大能力
- 2017年:Transformer架构提出(”Attention is All You Need”),彻底改变了NLP领域
- 2018年:BERT、GPT等预训练语言模型出现
- 2022年:ChatGPT发布,引爆大模型浪潮
- 2024年:OpenAI o1展示推理能力;Sora实现影视级视频生成
- 2025年:DeepSeek R1发布
智能计算系统
智能计算系统是人工智能的物质载体
CPU+智能芯片(GPU)+编程框架+编程语言
第二章 深度学习基础
机器学习
人工智能 > 机器学习 > 神经网络 > 深度学习 > 大模型
什么是机器学习:
- Alan Turing (1947):我们想要的是一台能够从经验中学习的机器
- Mitchell:机器学习是对能通过经验自动改进的计算机算法的研究
- Alpaydin:机器学习是用数据或以往的经验,以此提升计算机程序的能力
- 周志华:机器学习是研究如何通过计算的手段、利用经验来改善系统自身性能的一门学科
典型机器学习过程:

线性回归
回归(Regression):预测连续值输出的监督学习任务。
线性回归:假设输入特征与输出之间存在线性关系,找到一条直线(超平面)来拟合数据点集背后的规律。
单变量线性回归模型(一元回归)
模型公式:
$$H_{w}(x) = w_0 + w x$$
多变量线性回归模型

怎么看拟合得好不好?→损失函数

目标:求出参数 w,使得损失函数L(w)取值最小。
梯度下降法寻找最优参数
使用**迭代法(梯度下降法)**寻找参数:
- 初始先给定一个
w(零向量或随机向量) - 沿着梯度下降的方向进行迭代更新:w=w−η∇L(w)
其中 η 称为学习率(learning rate)或步长。
- 迭代至找到使损失函数最小的
w值,从而得到回归模型参数
神经网络
神经元
早期是模仿生物神经元
人工神经元是一个包含输入、输出与计算功能的模型:
- 输入可类比为生物神经元的树突
- 输出可类比为神经元的轴突
- 计算可类比为细胞体

单层感知机
一个神经元
$$z = w_1 x_1 + w_2 x_2 + b$$
$$y = \begin{cases} 1 & z \geq 0 \ -1 & \text{otherwise} \end{cases}$$
感知机模型 H(x) = sign(w^T x + b) 对应一个超平面 w^T x + b = 0,模型参数是 (w, b)。
目标:找到一个 (w, b),将线性可分的数据集T中的所有样本点正确地分为两类。
$$sign(x) = \begin{cases} +1 & x \geq 0 \ -1 & x < 0 \end{cases}$$
寻找损失函数并最小化
策略:使用误分类点到超平面的总距离作为损失函数(总距离越小越好)。
样本点 x_i 到超平面S的距离:
$$d = \frac{1}{|w|} |w^T x_i + b|$$
误分类点满足条件:-y_i(w^T x_i + b) > 0。
所有误分类点到超平面S的总距离:
$$L(w, b) = -\sum_{x_i \in M} y_i(w^T x_i + b)$$
感知机算法:问题转化为寻找(w, b)使损失函数极小化
使用**随机梯度下降法(SGD)**求解:
- 随机选取误分类点
(x_i, y_i) - 对
w, b以η为步长进行更新:w ← w + η y_i x_ib ← b + η y_i
- 迭代上述过程,使损失函数
L(w, b)不断减小,直到接近或为0
注:1969年Minsky指出单层感知机不能解决XOR(异或)问题,这导致了神经网络研究的第一次低谷。
两层神经网络——多层感知机(MLP)
将大量神经元模型进行组合,用不同的方法进行连接并作用在不同的激活函数上,就构成了人工神经网络模型。
全连接的两层神经网络模型也称为多层感知机(MLP),结构为:
1 | 输入层 → 隐层 → 输出层 |

偏置节点(增强拟合)
在神经网络中,除了输出层以外,每一层都有一个偏置单元 b,与后一层的所有节点相连接。
W 称为权重,b 为偏置,(W, b) 合称为神经网络的参数。

浅层神经网络
优点:需要数据量小、训练快。
局限性:对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到制约。
Why Not Go Deeper?
- Kurt Hornik证明了理论上两层神经网络足以拟合任意函数(通用近似定理)
- 过去也没有足够的数据和计算能力支撑更深的网络
深度学习(深层神经网络)
2006年,Hinton在Science发表论文(”Reducing the dimensionality of data with neural networks”),给多层神经网络相关的学习方法赋予了一个新名词——“深度学习”。
深度神经网络成功的ABC三个关键因素:
- A. Algorithm(算法):优化算法层出不穷(BP算法 → Pre-training → Dropout等方法)
- B. Big data(大数据):数据量不断增大(10 → 10K → 100M)
- C. Computing(算力):处理器计算能力的不断提升(晶体管 → CPU → 集群/GPU → 智能处理器)
多层神经网络

随着网络层数的增加,每一层对前一层次的抽象表示更深入:
- 第一隐层:**”边缘”**特征
- 第二隐层:**”形状”**特征
- 第三隐层:**”图案”**特征
- 第四隐层:**”目标”**特征
通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
神经网络训练方法
模型训练的目的:调整参数使得模型计算值 y_hat 尽可能与真实值 y 逼近。
正向传播与反向传播
正向传播(Forward Propagation):
根据输入,经过权重、激活函数计算出隐层,将输入的特征向量从低级特征逐步提取为抽象特征,直到得到最终输出结果的过程。
反向传播(Back Propagation):
根据正向传播的输出结果和期望值计算出损失函数,再通过链式求导,从网络后端逐步修改权重,使输出和期望值的差距变到最小的过程。
训练相关概念
| 概念 | 定义 |
|---|---|
| Batch(批) | 批梯度下降算法中,用于一次参数更新的训练数据量 |
| Iteration(迭代) | 使用一个batch的数据对模型进行一次参数更新的过程 |
| Epoch(轮次) | 整个训练数据集(N个样本)完整地通过一次训练 |
每个epoch更新 N / Batch_size 次参数。
神经网络设计基础
训练完了结果不准,可以从以下四个维度调整:
- 调整合适的网络拓扑结构
- 选择合适的激活函数
- 选择合适的损失函数
- 构造合适的训练数据
网络拓扑调节
神经网络的结构一般为:输入层 × 隐层 × 输出层
- 输入层:神经元个数 = 特征维度
- 输出层:神经元个数 = 分类类别数
给定训练样本后,输入输出就已经确定
- 隐层:需要设计的部分
- 隐层的数量?
- 隐层神经元的个数?
隐层设计原则:
- 隐层节点的作用是提取输入特征中的隐藏规律,每个节点都赋予一定权重
- 隐层节点数太少:网络从样本中获取信息的能力就差,无法反映数据集的规律
- 隐层节点数太多:网络的拟合能力过强,可能拟合数据集中的噪声部分,导致模型泛化能力变差
选择合适的激活函数
激活函数(Activation Function)的作用:
- 在神经元中,输入数据加权求和后,还被作用了一个函数
G,这个函数就是激活函数 - 激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数
激活函数需具备的性质:
- 可微性:当优化方法是基于梯度的时候,这个性质是必须的
- 输出值的范围:
- 输出值有限时,基于梯度的优化方法更加稳定(特征表示受有限权值的影响更显著)
- 输出值无限时,模型训练更加高效,但一般需要更小的学习率
Sigmoid函数
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
- 最经典的非线性激活函数
- 把输入的连续实值变换为**(0, 1)**之间的输出
- 缺点:
- 非0均值的输出
- 计算机进行指数运算速度慢
- 饱和性问题及梯度消失现象(当x很大或很小时,梯度趋于0)
tanh函数
$$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) - 1$$
- 与sigmoid相比,tanh是0均值的,解决了sigmoid非0均值输出的问题
- 缺点:在输入很大或是很小的时候,输出几乎平滑,梯度很小,梯度消失问题仍未解决
ReLU函数
$$\text{ReLU}(x) = \max(0, x)$$
- 优点:在
x > 0时保持梯度不衰减,从而缓解梯度消失问题 - 缺点:
- “ReLU死掉”:如果学习率很大,反向传播后的参数可能为负数,导致下一轮正向传播的输入为负数。当输入是负数时,ReLU完全不被激活
- 输出范围是无限的
PReLU / Leaky ReLU函数
改进ReLU在 x < 0 时完全不被激活的问题:
$$\text{Leaky ReLU}(x) = \max(ax, x), \quad a \in (0, 1)$$
- 负数区域内有一个很小的斜率,可以避免ReLU死掉的问题
- PReLU:
a为可调参数,每个通道有一个a,通过反向传播训练得到
ELU函数(Exponential Linear Unit)
$$\text{ELU}(x) = \begin{cases} x & x > 0 \ \alpha(e^x - 1) & x \leq 0 \end{cases}$$
融合了sigmoid和ReLU的特点:
α控制ELU在负值区间的饱和位置- 输出均值接近于零,收敛速度更快
- 右侧线性部分缓解梯度消失
- 左侧软饱和使ELU对输入变化或噪声更鲁棒,避免神经元死掉
GELU函数(Gaussian Error Linear Unit)
$$\text{GELU}(x) = 0.5x \cdot [1 + \text{erf}(\frac{x}{\sqrt{2}})]$$
其中 erf(x) 为标准正态分布的累积分布函数。
- 输入接近零时保持近似线性,远离零时表现出非线性
- 平滑的激活曲线,提供更好的梯度,有益于模型收敛
- 计算复杂,通常采用近似计算:
GELU ≈ 0.5x(1 + tanh[√(2/π)(x + 0.044715x^3)])GELU ≈ x · sigmoid(1.702x)
- 用于BERT、GPT系列、T5等大模型中
SiLU函数(Sigmoid Linear Unit / Swish)
$$\text{SiLU}(x) = x \cdot \text{sigmoid}(x)$$
- 也称为Swish函数
- 更加平滑,可以更好地优化和更快地收敛,减少过拟合,提高泛化能力
- 变体 SwiGLU:
SwiGLU(x,W,V,b,c) = SiLU(xW + b) · (xV + c) - 用于DeepSeek、Llama、Palm、GLM等大模型中
Transformer FFN中激活函数的演进
| 模型 | FFN激活函数 |
|---|---|
| 原始Transformer | ReLU: FFN(x,W1,W2) = ReLU(xW1)W2 |
| BERT, GPT | GELU: FFN(x,W1,W2) = GELU(xW1)W2 |
| Llama, DeepSeek | SwishGLU: FFN(x,W1,W2,W3) = (SiLU(xW1) · (xW3))W2 |
选择合适的损失函数
均方差损失函数 + Sigmoid的问题
均方差损失函数:$L = \frac{1}{2}(y - \hat{y})^2$
使用Sigmoid作为激活函数 y_hat = σ(z), z = wx + b 时:
$$\frac{\partial L}{\partial w} = (y - \hat{y}) \cdot \sigma’(z) \cdot x$$
$$\frac{\partial L}{\partial b} = (y - \hat{y}) \cdot \sigma’(z)$$
梯度中都含有 σ'(z)。当神经元输出接近1时,σ'(z) 趋于0,出现梯度消失,导致神经网络反向传播时参数更新缓慢,学习效率下降。
交叉熵损失函数
引入交叉熵损失函数,交叉熵+sigmoid,解决参数更新慢的问题。
使用二分类交叉熵 + Sigmoid激活函数时:
$$\frac{\partial L}{\partial w} = -\frac{1}{N} \sum_i (\hat{y}^{(i)} - y^{(i)}) \cdot x$$
$$\frac{\partial L}{\partial b} = -\frac{1}{N} \sum_i (\hat{y}^{(i)} - y^{(i)})$$
关键优势:Sigmoid的导数 σ'(z) = σ(z)(1-σ(z)) 被约掉,最后一层的梯度中不再含有 σ'(z),从而解决了梯度消失导致的参数更新缓慢问题。
激活、损失函数需要搭配
多分类交叉熵:
$$L = -\frac{1}{N} \sum_{i \in C} \sum_{k=1}^{K} y_k^{(i)} \ln(\hat{y}_k^{(i)})$$
其中 N 为训练样本总数,K 为分类类别数。
二分类交叉熵:
$$L = -\frac{1}{N} \sum_{i} [y^{(i)} \ln(\hat{y}^{(i)}) + (1 - y^{(i)}) \ln(1 - \hat{y}^{(i)})]$$
损失函数的特性
- 同一个算法的损失函数不是唯一的
- 损失函数是参数
(w, b)的函数 - 损失函数可以评价网络模型的好坏:越小说明模型和参数越符合训练样本
- 损失函数是一个标量
- 选择损失函数时,挑选对参数
(w, b)可微的函数(全微分存在,偏导数一定存在) - 损失函数又称为代价函数、目标函数
构造合适的训练数据
数据的重要性:
- 数据对于深度学习的训练必不可少,甚至通常是最有效的解决方案
- 大模型时代的无奈:基座模型的训练代价巨大,模型结构和算法难以改变,数据的”增量”特性使其成为最易入手的维度
- 大模型时代的机遇:巨大的参数规模赋予了大模型”数据拼接”的能力,可以通过小模型做数据验证、大模型做数据合并来完成多人对同一个大模型的”共同开发”
构造训练数据的方法
构造训练数据的过程本质上是一个对数据**”debug”**的过程:
- 观测模型结果,找到 failure case
- 分析fail原因(归纳)
- 添加/修正对应数据
关键原则:必须对测试集去重(测试机和训练集不能有重合)——不去重无法正确评估模型能力,也就无法正确归因。
构造训练数据的方法分类:
- 黄金准则:人工标注
- 自动化方法:
- 大模型合成数据
- 数据质量检测脚本
- LLM-as-a-judge辅助判断
案例1:Alpaca / Vicuna指令数据生成
主要步骤:
- 人工构建一个种子任务池,任务为
<指令,回答>形式 - 使用强模型根据种子任务生成指令,或直接使用人工指令
- 将生成的指令返回给强模型,获得指令对应的回答,得到
<指令,回答>对
Vicuna-13B达到了ChatGPT 90%的水平(GPT-4评估)。
案例2:CodeV Verilog代码生成
通过收集开源代码 + 多层次问题总结的方式生成 <问题,答案> 对,缓解强模型生成Verilog能力不足、Verilog和自然语言语义差距大的问题。
案例3:QiMeng-CodeV-R1代码-描述双向验证
流程:
- 根据代码合成自然语言功能描述
- 根据合成的自然语言功能描述生成新的代码
- 如果新的代码和原始代码等价,则自然语言功能描述和代码更加一致,数据质量也就更高
过拟合与正则化
欠拟合和过拟合
| 类型 | 表现 | 原因 |
|---|---|---|
| 欠拟合(Underfitting) | 拟合函数无法满足训练集,误差较大 | 训练考虑的维度太少 |
| 过拟合(Overfitting) | 拟合函数完美接近训练数据集,但泛化能力差,对新数据预测能力不足 | 训练考虑的维度太多 |

正则化
机器学习不仅要求模型在训练集上求得较小的误差,在测试集上也要表现好。提升模型在测试集上的预测效果叫做泛化(Generalization)。神经网络的层数增加,参数也跟着增加,表示能力大幅度增强,极容易出现过拟合现象。
正则化方法可以有效抑制过拟合:
- 参数范数惩罚(L1/L2正则化)
- 稀疏化
- Bagging集成
- Dropout
- 提前终止(Early Stopping)
- 数据扩增(Data Augmentation)
正则化思路
在损失函数中增加一个惩罚项,惩罚高阶参数,使其趋近于0(过拟合曲线会穿过所有点,让高阶项参数变小曲线会更平滑)
$$\min_{\theta} \frac{1}{2} \sum_{i=1}^{m} |y_i - \hat{y}i|^2 + \lambda \sum{i=1}^{k} w_i^2$$
L2正则化(权重衰减)
正则化项:$$Ω(w) = \frac{1}{2} |w|_2^2$$
梯度更新:w ← w - η·∇L - ηα·w
通过每次更新都额外减去 ηα·w,使所有权重等比例缩小(weight decay),网络复杂度降低。
L1正则化
$$\Omega(w) = |w|_1 = \sum_i |w_i|$$
梯度更新:w ← w - η·∇L - ηα·sign(w)
通过符号函数 sign(w),当 w 为正时使其变小、为负时使其变大——效果是让 w 趋近于 0,产生稀疏权重。L1 比 L2更容易产生大量零权重(稀疏性更强)。
稀疏化
- 训练时让网络中的很多权重或神经元为0(如**90%**的权重或神经元为0)
- 降低正向传播时的计算量
四种稀疏方式:

Bagging集成方法
- 训练不同的模型来共同决策测试样例的输出
- 不同模型即使在同一个训练数据集上也会产生不同的误差
- 可以多次重复使用同一个模型、训练算法和目标函数进行训练
- 数据集从原始数据集中重复采样获取,大小保持一致
- 模型平均是减小泛化误差的一种可靠方法
Dropout正则化
思路:在训练过程中随机地”删除”一些隐层单元,在计算时无视这些连接(从基础网络中丢弃不同的单元子集形成子网络,本质上是一种子网络集成)。
乘零的Dropout算法:
- 随机对掩码
μ进行采样 - 输入单元的采样概率为0.8,隐藏单元的采样概率为0.5
- 网络中的每个单元乘以相应的掩码后沿着网络的其余部分继续向前传播
提前终止(Early Stopping)
当训练较大的网络模型时,训练误差会随着时间推移降低,但测试集的误差会再次上升。因此,在训练过程中返回预定迭代次数内测试误差达最低的参数设置。
数据增强(Data Augmentation)
使用更多的数据进行训练,可对原数据集进行变换(如旋转、翻转、裁剪、颜色变换等)形成新数据集添加到训练数据中。
批归一化(Batch Normalization, BN)
- 问题:内部协变量偏移(Internal Covariate Shift)——训练过程中每一层的输入分布随前一层参数变化而变化,导致梯度消失或梯度爆炸
- 方法:对一个batch内的数据在某个特征维度上做归一化,将激活层的输入调整为标准正态分布(均值为0,方差为1)
- 应用:BN通常应用于CV领域的CNN中
层归一化(Layer Normalization, LN)
- BN的不适用场景:序列处理问题(如RNN和Transformer),因为序列长度不固定,最长的序列部分样本数变少,不能反映全局统计规律
- LN方法:分样本归一化,同一个样本内所有特征维度计算均值方差
- 应用:LN通常应用于NLP领域的RNN和Transformer中
其他正则化方法
- 多任务学习:通过多个相关任务的同时学习来减少神经网络的泛化误差
- 参数共享:强迫两个模型(监督和无监督)的某些参数相等,使其共享唯一的一组参数
交叉验证
交叉验证概念
在传统机器学习中,需要将数据集划分为训练集和测试集:
- 利用训练集进行训练
- 利用测试集评估算法效果
划分测试集的目的:
- 避免过拟合
- 评判各模型的鲁棒性
深度学习的数据集划分
| 数据集 | 用途 |
|---|---|
| 训练集(Training Set) | 训练模型参数(权重和偏置) |
| 验证集(Validation Set) | 确定神经网络超参数(网络结构、学习率、训练迭代次数等) |
| 测试集(Test Set) | 评估模型效果 |
最简单的验证方式
将数据集分成训练集S1和测试集S2。
缺点:
- 不同划分方式下,得到的MSE变动较大
- 最终模型与参数的选取极大程度依赖于对训练集和测试集的划分方法
- 只有部分数据参与了模型的训练
6.3 Leave-one-out交叉验证(留一法)
- 每次取出一个数据作为测试集的唯一元素,其他
n-1个数据都作为训练集 - 最终训练出
n个模型,得到n个MSE,取平均得到最终的test MSE - 缺点:计算量过大,耗费时间长
6.4 K-折交叉验证(K-fold Cross Validation)
- 将数据集分成K份
- 不重复地每次取其中一份做测试集,用其他K-1份做训练集训练模型
- 计算该模型在测试集上的
MSE_i - 将K次的
MSE_i取平均得到最终MSE:
$$MSE = \frac{1}{K} \sum_{i=1}^{K} MSE_i$$
Leave-one-out是K-fold当 K = n 时的特例。
优点:所有样本都被作为了训练集和测试集,每个样本都被验证一次;相比Leave-one-out,计算成本降低,耗时减少。
6.5 Stratified K-Fold交叉验证
分层K-折交叉验证:每一份的分布与原始分布一致,确保各类别比例在各折中保持不变。
6.6 Rolling Window交叉验证
用于时间序列交叉验证(如金融、气象等):
- 每次选择固定大小窗口内的数据作为测试集
- 其之前的数据作为训练集(不使用未来信息)