神经网络与 Tensorflow · 技术问答
必会
重点 一个完整的神经网络学习过程是怎样的?
口述:一轮就是 前向出预测 → 算 loss → 反向出梯度 → 优化器改 W/b。多轮 epoch 重复,直到验证集不再涨或你停训。推理只走前向,不改参数。
- 准备数据 — 特征对齐输入维度,标签对齐输出。按 batch 喂,不必一次塞全集。
- 初始化参数 — 各层
W、b。用 Xavier / He,别全零(对称,隐藏单元学成一样)。 - 前向传播 — 每层
z = Wx + b,a = f(z),一直算到输出。只出预测,不改权。 - 算损失 — 预测和标签比:分类常用交叉熵,回归常用 MSE。loss 是标量,后面所有梯度从它倒回来。
- 反向传播 — 链式法则从输出往输入传
∂L/∂W、∂L/∂b。激活导数在这里乘进去;Sigmoid 连乘容易消失,ReLU 在正半轴导数为 1。 - 更新参数 —
W ← W - lr * ∇W(SGD);Adam 等是带动量/自适应学习率的变体。改的是边上的权重,不是改输入。 - 重复 — 下一个 batch;全部数据过完叫一个 epoch。看训练 loss 和验证指标,过拟合就早停、加正则。
口条:前向出答案,loss 定对错,反向算方向,优化器迈一步。 面试别漏「只推理就没有 5、6」。
重点 反向传播中的链式法则是什么?
口述:复合函数求导。loss 不直接长在 W 上,中间隔着 z、激活 a、再后面若干层。要求 ∂L/∂W,就把路上每一跳的偏导乘起来。反向传播 = 从输出往输入,一层层套这条法则。
一层里:z = Wx + b,a = f(z),后面还有 L(a)。
text
∂L/∂W = ∂L/∂a · ∂a/∂z · ∂z/∂W
= (上游传来的梯度)· f'(z) · x∂L/∂a 是后面算好传回来的;本层只乘本地的 f'(z) 和 x(或对 b 就是 1)。框架里的 autograd 干的就是把每步本地导数记下来,反向连乘。
两层连在一起就是:
text
∂L/∂W1 = ∂L/∂a2 · f'(z2) · W2 · f'(z1) · x所以会出现梯度消失 / 爆炸:一串 |f'| 和 |W| 连乘,小于 1 越乘越小,大于 1 越乘越大。Sigmoid 的 |f'| ≤ 0.25,深了浅层几乎分不到梯度。
口条:上游梯度 × 本地激活导 × 本地输入。 反向不是另搞一套,就是把前向的复合函数拆开连乘。
怎么动手写一个训练循环?
口述:先定结构,再初始化,然后循环四步——前向、loss、反向、更新。和「完整学习过程」是同一件事,这里按动手写代码的顺序讲。
课件数据(numpy.random 随机生成,用来把流程跑通,不是真实任务):
| 尺寸 | |
|---|---|
| batch / 样本数 | 64 |
| 输入维度 | 10000 |
| 隐藏层 | 100 |
| 输出维度 | 10(十分类) |
- 定义网络结构 — 输入 10000、隐藏 100、输出 10。
W1形状(10000, 100),W2(100, 10)(行向量约定)。 - 初始化参数 —
W、b随机,别全零。 - 循环(每个 batch / 每个 epoch)
- 3.1 前向:
z = x @ W + b,再激活 - 3.2 算 loss(10 类常用交叉熵)
- 3.3 反向:链式法则出
∇W、∇b - 3.4 权值更新:
W -= lr * ∇W
- 3.1 前向:
框架里 3.3 往往是 loss.backward(),3.4 是 optimizer.step()。手写 numpy 就把这四步自己写全。口条:结构 → 初始化 → 循环里前向、loss、反向、更新。
重点 梯度消失的原因?ReLU 为何能缓解?
答题要点
- 反向传播是梯度连乘。Sigmoid 导数最大约 0.25,十层连乘趋近 0,浅层几乎不更新。
- ReLU 在 x>0 时导数为 1,激活着的通路梯度不衰减。
加分句:应用岗点到链式法则即可,不必展开推导。
重点 YOLO 和 VLM,实际项目怎么选?
口述:先问节拍、要不要像素框、类别固不固定——不是「大模型更新就换掉 YOLO」。
YOLO — 专用检测:bbox + 类 + 分;GPU 约 5~15ms/张(课件 ~10ms);要标数百~数千张;可 ONNX/TensorRT 边端离线。产线实时、定位剔料、类固定、工控机 → 默认它。Ultralytics 易上手;系列约 13 版,v1 定一阶段基调。
VLM(如 Qwen-VL) — 自然语言描述 + 判断;API 常 2~5s/张;零样本改 Prompt;可写「为什么」。新产品试探、报告、复审助手、复杂关联理解 → 用它。无精确框或很粗。
落地话术: 「节拍硬约束上 YOLO 做在线检测;缺标或要解释上 VLM 辅助;常见是 YOLO 卡产线,可疑件 / 新品种丢 VLM,人再抽检——组合,不互相替代。」
口条:节拍和框位用 YOLO;解释和新类用 VLM;产线常组合。
进阶
如何进行模型并行?
口述:把模型不同层放到不同 GPU,一张卡装不下时用。tf.device("/GPU:0") 放第一层,/GPU:1 放第二层,前向按层接力。DeepSeek-R1 这类超大模型才需要。
CNN、BERT 单卡放得下 → 数据并行(每卡一份完整模型,分数据)。课件的按层切更接近流水线并行;一层矩阵切开是张量并行(--tp-size)。
口条:放得下复制模型分数据;放不下才切模型。
TensorFlow Serving 是什么?
口述:官方生产级推理服务。训好的 SavedModel 封成 REST / gRPC,业务只打 HTTP,不在应用进程里 model.predict()。
- 导出 —
tf.saved_model.save(model, "/model/1"),版本当子目录,可热加载、回滚。 - 启动 —
docker run -p 8501:8501 -v "/model:/models/my_model" -e MODEL_NAME=my_model tensorflow/serving。8501=REST,8500=gRPC。 - 调用 —
POST /v1/models/my_model:predict,body{"instances": [...]}。
场景:推荐 / CTR 在线打分;换版本做实验。端上是 TF Lite,不是 Serving。大模型生成式推理用 vLLM / SGLang。
口条:SavedModel 进目录,Serving 出 API。
TF 2.x Eager 和静态 Graph 有何差异?生产怎么配合?
答题要点
- Eager:默认,逐行执行,好调试,慢、难做图级优化。
- Graph:编译成数据流图,算子融合、可脱离 Python(SavedModel / TFLite / Serving)。
- 开发用 Eager,稳定后
@tf.function描成图再导出。
TensorFlow 和 PyTorch 怎么看?
答题要点
- PyTorch:研究、大模型、HuggingFace 生态。
- TensorFlow:TFLite / TF.js / Serving 端侧和工业推理仍熟。
- 创新实验偏 PT;多端量产可考虑 TF。
YOLO 相对两阶段检测,实时性从哪来?
答题要点
- 两阶段(Faster R-CNN):先提案再分类,步骤多,难实时。
- YOLO:一次前向,网格回归框和类别,无单独提案阶段,易到实时帧率。
- 物体中心落在哪一格,由该格负责,不必框住整个物体。
加分句:没做过检测就讲「一阶段回归」;质检选型看微调题 Q11。
NMS 怎么去掉多余框?
答题要点
- 同一物体多个框:按置信度排序,留最高,与其余算 IoU,超过阈值(如 0.5)丢掉,对剩余重复。
- IoU = 交集 / 并集。
了解
产线成像、标注、增强、Bad Case 闭环见质检课件(仓库内课程练习,不对外发布)。
多模态模型和经典 CV / VQA 有何不同?
答题要点
- 多模态:文本+图/视频/音频融合。
- YOLO 类:框、类、置信度,快,要精细标注。
- VQA:自然语言解释,零样本改 prompt 即可试新类,慢、框不如专用检测准。
IoU、mAP50、mAP50-95?
答题要点
- IoU = 交 / 并。
- mAP50:IoU=0.5 就算对,工业「找没找到」常用。
- mAP50-95:0.5 到 0.95 平均,卡定位精度,竞赛常用。