Skip to content

神经网络与 Tensorflow · 技术问答

必会

重点 一个完整的神经网络学习过程是怎样的?

口述:一轮就是 前向出预测 → 算 loss → 反向出梯度 → 优化器改 W/b。多轮 epoch 重复,直到验证集不再涨或你停训。推理只走前向,不改参数。

  1. 准备数据 — 特征对齐输入维度,标签对齐输出。按 batch 喂,不必一次塞全集。
  2. 初始化参数 — 各层 Wb。用 Xavier / He,别全零(对称,隐藏单元学成一样)。
  3. 前向传播 — 每层 z = Wx + ba = f(z),一直算到输出。只出预测,不改权。
  4. 算损失 — 预测和标签比:分类常用交叉熵,回归常用 MSE。loss 是标量,后面所有梯度从它倒回来。
  5. 反向传播 — 链式法则从输出往输入传 ∂L/∂W∂L/∂b。激活导数在这里乘进去;Sigmoid 连乘容易消失,ReLU 在正半轴导数为 1。
  6. 更新参数W ← W - lr * ∇W(SGD);Adam 等是带动量/自适应学习率的变体。改的是边上的权重,不是改输入。
  7. 重复 — 下一个 batch;全部数据过完叫一个 epoch。看训练 loss 和验证指标,过拟合就早停、加正则。

口条:前向出答案,loss 定对错,反向算方向,优化器迈一步。 面试别漏「只推理就没有 5、6」。

重点 反向传播中的链式法则是什么?

口述:复合函数求导。loss 不直接长在 W 上,中间隔着 z、激活 a、再后面若干层。要求 ∂L/∂W,就把路上每一跳的偏导乘起来。反向传播 = 从输出往输入,一层层套这条法则。

一层里:z = Wx + ba = 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(十分类)
  1. 定义网络结构 — 输入 10000、隐藏 100、输出 10。W1 形状 (10000, 100)W2 (100, 10)(行向量约定)。
  2. 初始化参数Wb 随机,别全零。
  3. 循环(每个 batch / 每个 epoch)
    • 3.1 前向:z = x @ W + b,再激活
    • 3.2 算 loss(10 类常用交叉熵)
    • 3.3 反向:链式法则出 ∇W∇b
    • 3.4 权值更新:W -= lr * ∇W

框架里 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()

  1. 导出tf.saved_model.save(model, "/model/1"),版本当子目录,可热加载、回滚。
  2. 启动docker run -p 8501:8501 -v "/model:/models/my_model" -e MODEL_NAME=my_model tensorflow/serving。8501=REST,8500=gRPC。
  3. 调用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 平均,卡定位精度,竞赛常用。