想象商场里新来了一位叫阿芒的AI导购。她每天站在柜台前,通过成百上千次“推荐→顾客反应”的互动来学习“看人下菜碟”。师傅们很快发现:阿芒学东西很快,但有个怪毛病——她会把几位老熟客的偏好背得滚瓜烂熟,一见新顾客却频频推荐失手;训练素材再大,她也学得慢;同样的考核,换套评分标准,她的成绩就忽高忽低。本篇文章要讲的正则、采样、损失函数,恰好就是给这位导购定规矩、选教材、换考卷的三堂课。规矩管住她别死记硬背(正则),教材决定她看哪些案例(采样),考卷决定她往哪个方向进步(损失函数)。三者配合好了,阿芒才能从“背题机器”变成真正的金牌导购——这正是深度推荐模型训练的全部秘密。在DeepFM、DIN这类深度推荐模型里,模型结构决定了天花板,而正则、采样、损失函数的配置,决定了你实际能摸到多高。
对AI从业者而言,这三件事直接决定模型在真实流量上的表现:会调正则、懂采样、选对损失,是让DeepFM/DIN从“跑得动”走向“跑得稳、跑得准”的核心手艺,也是推荐系统面试中最高频的实战考点。
目录
可视化演示
展示正则化技术(L2/Dropout/早停)、采样策略(负采样/困难样本)、损失函数(CE/Focal/BPR)和训练稳定性技巧,含流动波形背景和发光动画。
本节配有交互动效(进入视口后自动加载,约 3KB)。
1. L2正则:给导购立规矩
阿芒刚上岗时,最喜欢把几位老熟客的尺码、品牌偏好、口头禅背得滚瓜烂熟。可一碰到新面孔,她就按照背过的“老剧本”硬套,推荐十次能错七次。这就像深度学习里的过拟合:模型把训练样本中的噪声细节也记住了,参数变得又大又拧巴,换一批数据立刻露馅。店长给阿芒定的第一条规矩是:“记忆别太夸张,话术别太极端。”每条经验都要被轻微压缩,越极端的判断越要往回收——这就是L2正则的工作方式。
在推荐模型的语境里,L2正则通过给每个参数加一项平方惩罚,让“过于自信”的大权重付出代价。DeepFM和DIN这类深度模型参数以百万计,若不限制,深层网络会肆无忌惮地去拟合稀疏特征里的偶然共现。实践中,L2通常加在深层MLP的权重上,而嵌入层的向量常常被豁免,否则稠密向量会被压缩得失去表达能力。λ就是这条规矩的严格程度。
规矩立得太松,阿芒继续背题;立得太严,她一上来就吓得什么都不敢推荐——这就是λ过大导致的欠拟合。L2的妙处在于:不是不让她记,而是让她记住通用规律,别把个别客人的怪癖当成世界真理。
- 基准损失\(L_0(\theta)\) 是任务本身的原始损失,比如点击预测的交叉熵,先保证模型在正事上不掉链子。
- 平方惩罚\(\sum_{k=1}^{K}\theta_k^2\) 把模型每个参数的平方加起来,大权重会被放大成很大的惩罚项,逼模型收敛到更小的权重。
- 强度系数\(\lambda\) 控制惩罚力度,λ越大,模型越不敢把权重做大,拟合能力越弱;λ太小则形同虚设。
- 更新形态对 \(\theta\) 求梯度后,每一步更新都会多减一项 \(2\lambda\theta\),相当于权重每轮被“削”去一小截,所以也叫权重衰减。
2. Dropout:轮岗与断联
商场里有位最靠谱的老员工小林,阿芒很快学会了“抄作业”——一碰到难缠顾客,她就依赖小林的脸色行事,自己完全不思考。问题是,小林一休假,阿芒立刻不会干活了。店长于是实行“轮岗制”:每天随机安排一位同事缺席配合,阿芒没法依赖固定搭档,只能强迫自己独立观察、独立判断。这听起来像在捣乱,却极大地锻炼了她的应变能力。
深度神经网络里的“共适应”与此如出一辙:某些神经元会互相配合,掩盖彼此的缺陷,整体看起来很强,一旦换了数据分布就崩盘。Dropout的做法是:训练时按概率 p 随机把一部分神经元的输出置零,“切断”它们之间的固定配合;测试时所有神经元回归,整体权重按比例缩放。DIN在建模用户行为序列时,注意力层很容易过拟合到个别历史商品,Dropout往往是最有效的止损手段之一。
轮岗制听起来浪费人力,实际却让团队里每个人都变得不可或缺。Dropout同理,它逼着网络学会冗余而稳健的表征,而不是把宝押在某一两个神经元的“默契配合”上。
- 随机掩码\(\mathbf{m}\) 是一个和 \(\mathbf{h}\) 同样长度的向量,每个元素独立按概率 p 取 1,按 1-p 取 0,负责决定哪些神经元“请假”。
- 逐元素相乘\(\mathbf{h}\odot\mathbf{m}\) 把神经元输出与掩码逐位相乘,被置 0 的神经元在本次更新中完全不参与。
- 缩放保期望除以 \(p\) 是为了让训练时的整体输出期望与测试时一致,否则测试阶段所有神经元输出会凭空变大。
- 训练测试差异训练阶段随机失活,测试阶段不再失活、也不再缩放,这是Dropout部署时最容易踩错的地方。
3. 负采样:抽样看数据
阿芒每天复盘时,没成交的顾客少说也有几百位。要是每一位路人的“没买理由”都掰开揉碎研究,她一天也复不了几个盘,还容易在“根本不会买”的路人身上浪费大量精力。店长规定:每天随机抽取一小部分未成交录像来看,隔天换另一批,保证见多识广;至于商场里最受欢迎的那几位常客,则适当压低他们在复盘中的出现频率,免得阿芒只会围着热门转。
推荐训练里的负样本正是“曝光但未点击”的商品,数量是正样本的几十倍上百倍。全量放进损失函数,既算不动,又会把模型带偏到“全都预测为负”。于是大家只抽取一部分负样本做反向学习,典型的负采样比例是 1:5 到 1:20;对物品出现频率做截断,即频控采样,防止头部热门商品垄断负例。DeepFM/DIN 在亿级样本上训练时,这一步直接决定单轮迭代的速度。
抽查不是偷懒,而是用有限的精力看最有代表性的反面教材。采样比例太小,阿芒会觉得“所有人都会买”;比例太大,噪声和算力开销同时上涨,反而不如老老实实看一批中等难度的案例。
- 正样本项\(\log\sigma(s_{ui})\) 鼓励用户对正物品的打分尽量高,\(s_{ui}\) 是模型对“用户u买物品i”的偏好分数。
- 负样本项\(\log(1-\sigma(s_{uj}))\) 鼓励用户对采样到的负物品打分尽量低,形成“买它、不买它”的对立信号。
- 采样分布\(j\sim P_{\text{neg}}\) 表示负物品从某个分布中抽取,均匀采样或按频控分布采样都可行,但分布决定了信号的偏向。
- 批量归一对所有样本取平均,保证损失尺度不随批量大小和负采样数量剧烈波动。
4. 困难样本挖掘:专攻难题
阿芒总在一位特别挑剔的顾客面前翻车。师傅没让她天天见这位顾客,而是把她的失败案例单独整理出来,每周五下午集中反复演练。更讲究的是节奏:前两周只挑中等难度的案例,等基本功扎实了,再上最难的。如果第一天就让阿芒被最刁钻的顾客骂哭,她很快就会变得畏手畏脚,见到谁都不敢推荐。
困难样本,指的是当前模型最有把握推荐、但用户实际没有点击的负样本——也就是模型“错得最自信”的那些例子。TopK策略每次从一批候选负样本里挑出打分最高的 K 个,当作本轮学习的重点;在此基础上,课程式引入让模型先随机采样,再逐渐过渡到困难样本,避免一开始梯度就剧烈震荡。DeepFM/DIN 训练中,这种策略能显著提升模型在长尾商品上的区分度。
难题练太多会打击信心,练太少则永远突破不了瓶颈。课程式引入的本质,是把“难度曲线”这个超参数也纳入训练计划,让模型在最舒适与最痛苦的边界上稳步前进。
- 候选池\(C_u\) 是用户 u 的候选负样本集合,可以从全部物品里抽一小部分作为“备选难题”。
- 指数加权\(e^{\alpha s_{uj}}\) 把打分高的负样本权重放大,打分越接近正样本的负例,被选中的机会越大。
- 温度系数\(\alpha\) 控制取样的“锋利程度”,\(\alpha=0\) 退化为均匀采样,\(\alpha\) 越大,系统越偏向最难的样本。
- 归一化概率除以分母的求和,保证所有候选负样本的被选概率加起来等于1,是一个合法的概率分布。
5. BPR与CE:两种裁判
考核阿芒有两条路。第一条是“排名卷”:把几个候选商品摆一起,只要阿芒把用户真正买的排在其他商品前面,就算加分——这叫BPR,它不关心你猜得准不准,只关心相对次序。第二条是“对错卷”:每推荐一个商品,必须判断买或不买,判断错了就扣分——这叫交叉熵(CE),它关心的是绝对置信度。同样是考一上午,两张卷子练出来的导购风格完全不同。
在推荐系统里,CE Loss 用于点击率预估阶段,把“用户是否点击”看作二分类问题,DeepFM 的标准训练方式就是接一个 sigmoid 后的交叉熵。BPR Loss 则直接面向排序:它从数据中构造“正物品 > 负物品”的比较对,优化目标是让正物品的打分尽量高于负物品。CTR 阶段用 CE 保证基础准确率,精排/重排阶段补 BPR 或 Listwise 损失,是业界常见的组合打法。
而 CE Loss 的公式则是:
选裁判就是选目标。想让阿芒“排得对”,用BPR;想让她“猜得准”,用CE。最聪明的团队两份卷子都用:先拿 CE 摸底打基础,再拿 BPR 冲刺排序效果,正好对应线上“粗排→精排”的两级漏斗。
- 真实标签\(y_n\in\{0,1\}\) 表示第 n 个样本是否被点击,1 是点击,0 是未点击。
- 预测概率\(\hat{y}_n\) 是模型输出的点击概率,通常由最后一层 sigmoid 产生。
- 两项钳制\(y_n\ln\hat{y}_n\) 惩罚“该点没点得出”,\((1-y_n)\ln(1-\hat{y}_n)\) 惩罚“不该点却点了”,再取平均保证尺度稳定。
6. 超参调优:调配课程表
店长每周都要调培训表:今天上课两小时还是四小时?实战考核每周一次还是每天一次?奖励系数定多少?这些单看都不起眼,合在一起却决定阿芒进步的快慢与稳定。深度学习训练也一样——学习率、批量大小、嵌入维度、正则强度,就是一张张“培训表”,必须联动着调,而不能孤立地逐项拍脑袋。
学习率决定每次更新走多远:太大直接震荡甚至发散,太小则龟速收敛,于是有了预热(warmup)和衰减(decay)的调度。批量大小影响梯度估计的稳定性,小批量噪声大但逃离局部极小值的能力强;嵌入维度决定表征容量,太小装不下用户多样的兴趣,太大则容易过拟合。实际调参经验是:先粗搜 λ、lr、Dropout 三个关键旋钮,锁定量级后再做小范围精搜;同时盯住“训练损失与验证损失是否同步下降”这一核心信号。
每张表单独调容易顾此失彼——正则加太猛,BPR 的排序优势发挥不出来;负采样比例、难度曲线、损失函数其实是一套互相咬合的培训体系。只有把规矩、素材、考卷统筹调配,阿芒才能成为真正的金牌导购,深度推荐模型也才能在真实流量里既稳又准。
- 初始学习率\(\eta_{\max}\) 是学习率的上限,通常取 \(10^{-3}\) 到 \(10^{-2}\),太大的话第一步就会把参数“震飞”。
- 当前轮数\(t\) 表示已训练轮数,从 0 开始递增,衰减项随 t 增大而减小学习率。
- 衰减系数\(\beta\) 控制衰减速度,\(\beta\) 越大,学习率掉得越快,训练后期越精细。
- 先大后小整个调度保证模型早期快速探索,后期稳定收敛,与课程式困难样本挖掘的思路完全同构。
AI 应用场景
场景一:电商首页推荐模型上线前的过拟合治理
阶段:模型训练与调优阶段
解决的问题:电商CTR预估模型(DeepFM)在训练集上AUC高达0.85,线上AUC却只有0.72,典型的过拟合。传统做法是反复调结构增加数据,但浪费算力且见效慢;通过给深层网络加L2正则、在特征交叉层加Dropout,验证集AUC稳定提升到0.80。
具体案例:某电商团队在大促前优化首页推荐模型:先粗搜λ(1e-5到1e-3),再固定Dropout=0.2,配合早停策略。上线后CTR相对提升4.6%,且训练与验证损失曲线基本贴合,不再出现“红线上扬”。
场景二:短视频信息流中的负采样与困难样本挖掘
阶段:样本构建与数据增强阶段
解决的问题:短视频场景中,用户每天看到的视频上百个,点击的只有几个,负样本压倒性占优。全量负样本训练DIN不仅慢,还会让模型偏向热门视频;采用负采样(1:10)加频控采样后,训练速度提升5倍;再叠加困难样本挖掘,长尾视频曝光率提升12%。
具体案例:某视频平台用“曝光未点击”作为候选负样本池,按物品热度做频率截断采样,每轮再挑打分最高的4个负样本作为困难样本重点学习。人工评估发现,模型对冷门兴趣的捕捉明显增强。
场景三:招聘平台候选人排序的BPR损失
阶段:模型训练与损失函数设计阶段
解决的问题:招聘场景中,HR看到合适候选人会点击,但“不点击”不代表“不合适”,只是排得太靠后。传统CE Loss把所有未点击都当硬负样本,会误伤优质候选人;改用BPR Loss后,模型直接优化“合适候选人排在前面”,投递率显著改善。
具体案例:某招聘平台将排序模型从CE切换为BPR,并保留少量CE做辅助监督,HR的简历点击率提升8%,候选人发起沟通的意愿度同步上升,说明排序位置确实改善了曝光质量。
Python 演示
# -*- coding: utf-8 -*-"""简化版BPR训练: 负采样 + 困难样本挖掘 + 矩阵分解"""import mathimport random class MF: def __init__(self, n_users, n_items, dim=8, lr=0.05, reg=0.01): self.n_users = n_users self.n_items = n_items self.dim = dim self.lr = lr self.reg = reg self.U = [[0.1 * random.gauss(0, 1) for _ in range(dim)] for _ in range(n_users)] self.V = [[0.1 * random.gauss(0, 1) for _ in range(dim)] for _ in range(n_items)] def dot(self, a, b): return sum(x * y for x, y in zip(a, b)) def score(self, u, i): return self.dot(self.U[u], self.V[i]) def update(self, u, i, j): x_ui = self.score(u, i) x_uj = self.score(u, j) sig = 1.0 / (1.0 + math.exp(x_uj - x_ui)) for k in range(self.dim): grad_u = sig * (self.V[i][k] - self.V[j][k]) - self.reg * self.U[u][k] grad_i = sig * self.U[u][k] - self.reg * self.V[i][k] grad_j = -sig * self.U[u][k] - self.reg * self.V[j][k] self.U[u][k] += self.lr * grad_u self.V[i][k] += self.lr * grad_i self.V[j][k] += self.lr * grad_j def sample_negative(model, u, positive_items, hard=True): """先随机抽20个候选负样本, 再挑当前模型打分最高的那个(最困难)""" cands = [] for _ in range(20): j = random.randrange(model.n_items) if j in positive_items: continue cands.append(j) if not hard: return random.choice(cands) return max(cands, key=lambda j: model.score(u, j)) def main(): random.seed(0) n_users, n_items, epochs = 30, 40, 20 model = MF(n_users, n_items) pos = {u: set(random.sample(range(n_items), 5)) for u in range(n_users)} for epoch in range(epochs): total = 0.0 for u in range(n_users): for i in pos[u]: j = sample_negative(model, u, pos[u], hard=(epoch > 5)) model.update(u, i, j) r = model.score(u, i) - model.score(u, j) total += math.log(1.0 + math.exp(-r)) print("epoch", epoch, "loss", round(total, 3)) if __name__ == "__main__": main()
sig = 1.0 / (1.0 + math.exp(x_uj - x_ui))这是 BPR 的核心:正负样本打分差越大,这个值越接近 0,梯度越小,说明排序已经学对。grad_u = sig * (self.V[i][k] - self.V[j][k]) - self.reg * self.U[u][k]梯度里同时包含 BPR 的排序信号和 L2 正则的“权重衰减”项,这正是正文讲的“规矩 + 考卷”合体。j = sample_negative(model, u, pos[u], hard=(epoch > 5))前 5 轮用随机负采样热身,之后启动困难样本挖掘,对应“课程式引入”。cands.append(j); if j in positive_items: continue采样时跳过正样本,保证构造出合法的负样本对。return max(cands, key=lambda j: model.score(u, j))从候选集中挑模型当前打分最高的负样本,即“错得最自信”的困难样本。
常见误区
误区我把 Dropout 加进模型后,训练和测试都保留 0.5 的失活率,结果线上效果一直不如离线指标,是不是模型过拟合了?
正解测试阶段必须关闭 Dropout,也就是所有神经元全量参与,并按训练时的保留概率 p 缩放权重。类比轮岗制:训练时随机“缺人”是为了逼大家独立,真到了营业现场,当然要全员到齐。若测试时仍随机失活,预测结果会出现随机抖动,离线指标自然失真。
为何常见:Dropout 在推理时其实要做一步隐式的权重缩放(除以 p),很多初学者只记得“随机丢神经”这个动作,忽略了训练与测试的差异。
误区负样本越多,模型见过的反例就越全,我把负采样比例从 1:1 一路加到 1:100,训练却越来越差,且每轮耗时翻倍。
正解负样本比例过大会引入大量“简单负样本”,模型很快就能把它们全部分对,梯度信号趋近于零,反而稀释了正样本的学习信号;同时算力开销直线上升。常规经验是 1:5 到 1:20 之间,配合频控采样更有效。
为何常见:人们直觉上觉得“数据越多越好”,却忽略了训练是一个有限算力下的信号分配问题,冗余负样本并不会带来新信息。
误区我把打分最高的负样本全部挑出来,loss 确实涨得快,但训练开始震荡,模型甚至不收敛了,是不是代码写错了?
正解困难样本要“课程式”引入:先随机采样让模型建立基本判断,再逐步提高困难样本比例。一上来全是地狱难度,梯度就会被极端样本绑架,出现震荡甚至发散。这和教新人先练中等题、再上压轴题是同一个道理。
为何常见:只看到“困难样本能让 loss 降得更快”这一点,忽略了优化稳定性同样重要,而过难的样本会放大梯度的方差。
误区模型过拟合了,我把 L2 的 λ 直接从 1e-4 加到 0.1,验证损失确实不涨了,但线上点击率反而下降,模型是不是坏了?
正解λ 过大会把所有权重压到接近零,模型退化成“几乎不学习”的状态,即欠拟合。L2 的定位是“轻微压缩”,而不是“彻底清零”。更稳妥的做法是同时启用 Dropout 并配合早停,让多个正则手段分摊压力。
为何常见:把“正则能够抑制过拟合”简单理解成“越强越好”,忽略了正则本身就是偏差与方差的权衡,压得过头,偏差会反向成为主要矛盾。
面试题
Q1. L2 正则通常加在 DeepFM 的哪个部分最稳妥?
- A.只加在嵌入层向量上
- B.深层网络的权重上← 正确答案
- C.高层线性部分之上
- D.全部参数统一加强
答案:B。L2 加在深层网络权重上最稳妥,嵌入层通常被豁免以免压扁稠密向量。A 错在嵌入层加 L2 会限制表征能力;C 的线性部分已天然受控;D 无差别加强会让嵌入层和 MLP 一起失衡。就像给导购立规矩,不能连“察言观色”的本能也一起限制。
Q2. Dropout 在训练与测试时的正确姿势是?
- A.训练随机关闭测试按比例缩放← 正确答案
- B.训练全开测试也保持全开
- C.训练随机关闭测试也随机失活
- D.训练全开测试再随机失活
答案:A。训练时随机失活神经元,测试时全量参与并按保留概率 p 缩放权重,以保持期望一致。C 错在测试时随机失活会让预测结果抖动;B 等于没用 Dropout;D 把顺序颠倒了。这就像轮岗制只在培训期生效,正式营业时必须全员到岗。
Q3. 负采样比例过大可能导致什么后果?
- A.训练更慢且噪声增加← 正确答案
- B.正样本数量也随之增加
- C.模型表达能力显著提升
- D.验证损失必然持续下降
答案:A。过大的负采样比例意味着大量简单负样本被反复训练,梯度信号稀疏,算力开销却成倍上涨;正样本不会因此变多,模型表达能力不受影响,验证损失也不会必然下降。阿芒如果把每个路人都复盘一遍,只会累垮自己还学不到新东西。
Q4. 困难样本挖掘中,样本“过难”的主要风险是?
- A.模型训练出现震荡← 正确答案
- B.负采样效率大幅提升
- C.正样本被自动修正
- D.验证曲线一定更平稳
答案:A。极端困难样本会放大梯度方差,导致训练震荡甚至不收敛。困难样本的价值在于“有挑战性”,而不是“不可学习”;所以要用课程式引入、逐步提高难度。就像让新人一上来就应付最刁钻的顾客,只会打击信心。
Q5. BPR Loss 优化的核心目标是什么?
- A.正样本打分超过负样本← 正确答案
- B.预测概率逼近全局阈值
- C.所有样本方差最小化
- D.模型参数尽量趋近零
答案:A。BPR 从数据中构造“用户买了 i 没买 j”的比较对,直接优化 \(s_{ui}>s_{uj}\) 的排序正确性。它不是二分类问题,不关心绝对阈值;参数趋近零是 L2 正则的目标而非 BPR 的目标。这就像“排名卷”只关心阿芒把对的商品排前面。
Q6. 用 CE Loss 训练点击模型时,最后一层需要用什么操作输出概率?
- A.拼接归一化层
- B.Sigmoid 激活函数← 正确答案
- C.全连接展平操作
- D.随机失活网络层
答案:B。二分类交叉熵要求模型输出一个 (0,1) 之间的点击概率,sigmoid 是最标准的选择。softmax 用于多分类互斥场景,多层感知机结构只改变特征交互,不负责概率化。跟 CE 这个“对错卷”配套的,是 sigmoid 这个“评分尺”。
Q7. 在排序阶段,BPR 相比 CE 的核心优势在于?
- A.直接优化候选相对次序← 正确答案
- B.完全不需要负样本采样
- C.训练速度必然更快更稳
- D.可避免一切过拟合风险
答案:A。BPR 通过比较正负样本对的分数差来优化排序,天然贴近“把对的排前面”这一目标。它仍然需要负采样;训练速度和稳定性取决于数据与超参;过拟合风险依然存在。BPR 是“排名裁判”,CE 是“及格裁判”,二者的裁判逻辑不同。
Q8. 以下哪些方法能有效缓解深度推荐模型的过拟合?
- A.加入 Dropout 随机失活层← 正确答案
- B.对深层权重施加 L2 正则← 正确答案
- C.提高嵌入向量维度上限
- D.增加训练集负采样比例
答案:AB。Dropout 切断神经元共适应,L2 惩罚大权重,都是标准正则手段。C 增大嵌入维度会提升模型容量、加剧过拟合;D 增大负采样比例主要影响学习信号与效率,并不能直接缓解过拟合。正则的目的不是加数据,而是给模型“立规矩”。
Q9. 负采样时选择负样本的合理策略有哪些?
- A.按均匀分布随机抽取← 正确答案
- B.按物品热度做频控采样← 正确答案
- C.只挑选热门正样本
- D.按模型难度加权采样← 正确答案
答案:ABD。均匀随机采样是基线;频控采样防止头部热门商品垄断负例;难度加权(困难样本)提高学习效率。C 把“负样本”和“热门正样本”混为一谈,负样本必须是用户未交互过的物品。三种采样策略分别对应“广撒网、控偏科、抓重点”。
Q10. 关于“学习率预热”与训练稳定性的关系,哪些描述正确?
- A.早期嵌入参数未稳定时大步长易崩← 正确答案
- B.预热可以减少梯度爆炸的风险← 正确答案
- C.预热必然让验证损失降为零
- D.预热后配合衰减可先探索后收敛← 正确答案
答案:ABD。嵌入层在早期还是随机噪声,大步长更新容易把表征“震乱”,预热用小学习率先稳住参数,从根本上降低梯度爆炸概率。C 说“必然归零”显然不成立,损失不可能为零且过拟合仍在。预热再加衰减,正是“先大步探索、后小步精修”的课程表思路。