2025-4-24
其他
知道RLHF吗?讲一下训练流程
用于大模型(如ChatGPT)对齐人类价值的训练方法。
- Supervised Fine-Tuning(SFT):用高质量人类标注数据微调预训练模型
- Reward Model(RM)训练:用人类偏好数据训练打分模型
- PPO阶段:
- 使用 PPO 在 reward model 指导下优化生成策略
- 避免模型输出“看起来对但实际上错误”的结果
PPO的原理,损失函数: 优化策略时避免剧烈更新,防止性能骤降
\[ \mathbb{E} \left[\min \left( r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right] \]
bn/ln(batch norm,layer norm,RMS norm)、bn训练阶段和测试阶段区别,详细讲讲原理
RMSNorm:
- 仅使用输入的 均方根(RMS) 进行归一化,不减均值
- 更轻量、效果接近 LayerNorm
dropout原理,训练阶段和测试阶段区别,为什么
- 训练时:以概率 p 随机“丢弃”部分神经元(乘 0)
- 测试时:不丢弃,将输出乘1 - p 来保持期望一致
- 目的:防止 co-adaptation,增强泛化能力
优化器的原理
优化器 原理说明 SGD 基于当前梯度方向一步步下降 Momentum 加入“惯性”,加速收敛 RMSProp 使用梯度平方的滑动平均调节学习率 Adam Momentum + RMSProp(结合一阶+二阶信息)
残差链接的概念
形式:y = F(x) + x
作用:
- 缓解梯度消失
- 让网络更容易拟合恒等映射
- 提升深层网络可训练性(ResNet)
知识蒸馏损失函数:让 student 模仿 teacher 的“行为”。
\[ \mathcal{L}_{KD} = (1 - \alpha)\cdot CE(y, p_s) + \alpha \cdot T^2 \cdot KL(p_t^T || p_s^T) \]
- CE:真实标签交叉熵
- KL:学生和教师 softmax 输出的 KL 散度(用温度 T soften logits)
- α:两个目标的加权系数
- \(p_s^T = \text{Softmax}(z_s/T)\),\(p_t^T = \text{Softmax}(z_t/T)\)
交叉熵损失、符号以及含义、梯度下降方向是?代码
\[ \mathcal{L}_{CE} = -\sum_{i} y_i \log(p_i)\\ \frac{\partial \mathcal{L}}{\partial z_i} = p_i - y_i \]
二分类任务损失函数是?最后一层的激活函数是?Sigmoid \[ \mathcal{L}_{BCE} = -[y \log(p) + (1 - y)\log(1 - p)] \] 回归任务的损失函数可以用哪些?为什么回归使用MSE而不用交叉熵?
- 回归输出是连续实数,交叉熵是概率分布之间的距离
- 不满足 softmax 概率空间的假设,不适合做数值回归
MSE(均方误差),MAE(平均绝对误差)
对比学习?增量学习?
神经网络权重可以全部初始化为0吗、为什么?
不能。原因:如果所有权重都是 0,每个神经元的输出都一样,梯度也一样,导致所有神经元更新相同,失去了“对称性打破”
正确做法是:使用随机初始化(如 Xavier, He),打破对称性
长尾问题的解决方案?为什么长尾侧用MSE、短尾侧用MAE?
长尾问题:少数类别样本过少
解决方案:
数据层:重采样(欠采多头 / 过采尾部)
损失层:
re-weighting
label-distribution-aware margin loss
Focal Loss(RetinaNet 模型(ICCV 2017)) \[ FL=-(1-p_i)^{\gamma}\log(p_i) \]
LDAM Loss
表达层:两阶段训练 / 分支网络
为何尾部用 MSE?头部用 MAE?
- MSE 更关注大误差(方差大、长尾更敏感)
- MAE 更稳健,不被极端样本拉动
CTR问题用的什么loss?可以用MSE吗、为什么?
CTR = Click-Through Rate,是一个 二分类问题
常用损失:Binary Cross-Entropy Loss \[ \mathcal{L}_{BCE} = -[y \log(p) + (1-y)\log(1-p)] \]
MSE 理论上能用,但效果不好:输出是概率,但 MSE 对误差不敏感(如 0.01 vs 0.1)
BCE 更关注概率分布间的差异
搜广推
- 推荐链路是怎么运作的 有哪些模块
- 如何做排序模型的迭代
- MAP(最大后验概率)和似然函数有什么关系?
- 什么情况下,MAP的损失函数可以用NMSE来计算?(高斯噪声)
- 推荐算法了解哪些?
数据结构
- 跳表和二叉树的区别是什么?
- b+ 树 和 b树的区别, 为什么innodb索引用b+ 不用b
程序设计语言
cpp五种内存类型:
堆、栈、全局/静态存储区、常量区、代码区
python中可变/不可变类型
不可变类型(Immutable):
- 一旦创建,值不能更改。
- 示例:
int
、float
、str
、tuple
。 - 改变时会创建新的对象。
可变类型(Mutable):
- 可以改变其内容。
- 示例:
list
、dict
、set
。 - 改变时不需要创建新对象,直接修改原对象。
深拷贝/浅拷贝
浅拷贝(Shallow Copy):
- 只复制对象的引用,不复制对象本身。即拷贝的是引用类型的“引用”。
- 例如:使用
copy()
或copy.copy()
,复制的是最外层对象,内层对象仍然是共享的。
深拷贝(Deep Copy):
- 递归地复制对象及其嵌套对象,确保每一层都被复制。
- 例如:使用
copy.deepcopy()
。
python中的decorator
装饰器是一个函数,用于在不修改函数本身的前提下,动态地添加功能。
@decorator
智能指针?其作用?与auto区别?
智能指针(Smart Pointer):是一个包装指针的对象,自动管理内存,以避免手动
delete
带来的内存泄漏和野指针问题。auto
关键字:用于让编译器自动推导变量类型。野指针?
野指针是一个指向已经释放的内存区域的指针。
面向对象三要素:继承、多态、封装
继承(Inheritance):
- 允许新类从已有类派生,继承父类的属性和方法。
- 优点:代码复用、层次化组织代码。
多态(Polymorphism):
- 相同接口可以由不同的对象实现,方法调用的具体实现可以在运行时决定。
- 通过继承和重写(Override)实现。
- 提高灵活性。
封装(Encapsulation):
- 将对象的状态(数据)和行为(方法)封装在一起,并对外界隐藏实现细节。
- 只暴露必要的接口给外部使用,提高代码的安全性、可维护性。
软工
- 设计模式:工厂模式等等
创建型模式、结构型模式和行为型模式。
MVC,三层:表现层、业务逻辑层、数据访问层