想象商场里新来了一位叫阿芒的AI导购。她每天站在柜台前,通过成百上千次“推荐→顾客反应”的互动来学习“看人下菜碟”。师傅们很快发现:阿芒学东西很快,但有个怪毛病——她会把几位老熟客的偏好背得滚瓜烂熟,一见新顾客却频频推荐失手;训练素材再大,她也学得慢;同样的考核,换套评分标准,她的成绩就忽高忽低。本篇文章要讲的正则、采样、损失函数,恰好就是给这位导购定规矩、选教材、换考卷的三堂课。规矩管住她别死记硬背(正则),教材决定她看哪些案例(采样),考卷决定她往哪个方向进步(损失函数)。三者配合好了,阿芒才能从“背题机器”变成真正的金牌导购——这正是深度推荐模型训练的全部秘密。在DeepFM、DIN这类深度推荐模型里,模型结构决定了天花板,而正则、采样、损失函数的配置,决定了你实际能摸到多高。

岗位关联

对AI从业者而言,这三件事直接决定模型在真实流量上的表现:会调正则、懂采样、选对损失,是让DeepFM/DIN从“跑得动”走向“跑得稳、跑得准”的核心手艺,也是推荐系统面试中最高频的实战考点。

目录
  1. 可视化演示
  2. 1. L2正则:给导购立规矩
  3. 2. Dropout:轮岗与断联
  4. 3. 负采样:抽样看数据
  5. 4. 困难样本挖掘:专攻难题
  6. 5. BPR与CE:两种裁判
  7. 6. 超参调优:调配课程表
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示正则化技术(L2/Dropout/早停)、采样策略(负采样/困难样本)、损失函数(CE/Focal/BPR)和训练稳定性技巧,含流动波形背景和发光动画。

本节配有交互动效(进入视口后自动加载,约 3KB)。

1. L2正则:给导购立规矩

阿芒刚上岗时,最喜欢把几位老熟客的尺码、品牌偏好、口头禅背得滚瓜烂熟。可一碰到新面孔,她就按照背过的“老剧本”硬套,推荐十次能错七次。这就像深度学习里的过拟合:模型把训练样本中的噪声细节也记住了,参数变得又大又拧巴,换一批数据立刻露馅。店长给阿芒定的第一条规矩是:“记忆别太夸张,话术别太极端。”每条经验都要被轻微压缩,越极端的判断越要往回收——这就是L2正则的工作方式。

在推荐模型的语境里,L2正则通过给每个参数加一项平方惩罚,让“过于自信”的大权重付出代价。DeepFM和DIN这类深度模型参数以百万计,若不限制,深层网络会肆无忌惮地去拟合稀疏特征里的偶然共现。实践中,L2通常加在深层MLP的权重上,而嵌入层的向量常常被豁免,否则稠密向量会被压缩得失去表达能力。λ就是这条规矩的严格程度。

规矩立得太松,阿芒继续背题;立得太严,她一上来就吓得什么都不敢推荐——这就是λ过大导致的欠拟合。L2的妙处在于:不是不让她记,而是让她记住通用规律,别把个别客人的怪癖当成世界真理。

L(θ)=L0(θ)+λ∑k=1Kθk2\displaystyle L(\theta)=L_0(\theta)+\lambda\sum_{k=1}^{K}\theta_k^2
通俗理解:原始任务损失先管“推荐对不对”,第二项“平方和”管“参数别太夸张”,λ决定谁说了算。
  1. 基准损失\(L_0(\theta)\) 是任务本身的原始损失,比如点击预测的交叉熵,先保证模型在正事上不掉链子。
    L0(θ)=−1N∑n=1N[ynln⁡y^n+(1−yn)ln⁡(1−y^n)]\displaystyle L_0(\theta)=-\frac{1}{N}\sum_{n=1}^{N}\Big[y_n\ln\hat{y}_n+(1-y_n)\ln(1-\hat{y}_n)\Big]
  2. 平方惩罚\(\sum_{k=1}^{K}\theta_k^2\) 把模型每个参数的平方加起来,大权重会被放大成很大的惩罚项,逼模型收敛到更小的权重。
    ∑k=1Kθk2=∥θ∥22\displaystyle \sum_{k=1}^{K}\theta_k^2=\|\theta\|_2^2
  3. 强度系数\(\lambda\) 控制惩罚力度,λ越大,模型越不敢把权重做大,拟合能力越弱;λ太小则形同虚设。
    λ∈(0,1),通常取 10−5∼10−3\displaystyle \lambda\in(0,1),\quad \text{通常取 } 10^{-5}\sim10^{-3}
  4. 更新形态对 \(\theta\) 求梯度后,每一步更新都会多减一项 \(2\lambda\theta\),相当于权重每轮被“削”去一小截,所以也叫权重衰减。
    θ←θ−η(∇L0+2λθ)\displaystyle \theta\leftarrow\theta-\eta\big(\nabla L_0+2\lambda\theta\big)

2. Dropout:轮岗与断联

商场里有位最靠谱的老员工小林,阿芒很快学会了“抄作业”——一碰到难缠顾客,她就依赖小林的脸色行事,自己完全不思考。问题是,小林一休假,阿芒立刻不会干活了。店长于是实行“轮岗制”:每天随机安排一位同事缺席配合,阿芒没法依赖固定搭档,只能强迫自己独立观察、独立判断。这听起来像在捣乱,却极大地锻炼了她的应变能力。

深度神经网络里的“共适应”与此如出一辙:某些神经元会互相配合,掩盖彼此的缺陷,整体看起来很强,一旦换了数据分布就崩盘。Dropout的做法是:训练时按概率 p 随机把一部分神经元的输出置零,“切断”它们之间的固定配合;测试时所有神经元回归,整体权重按比例缩放。DIN在建模用户行为序列时,注意力层很容易过拟合到个别历史商品,Dropout往往是最有效的止损手段之一。

轮岗制听起来浪费人力,实际却让团队里每个人都变得不可或缺。Dropout同理,它逼着网络学会冗余而稳健的表征,而不是把宝押在某一两个神经元的“默契配合”上。

h~=1p h⊙m,mk∼Bernoulli(p)\displaystyle \tilde{\mathbf{h}}=\frac{1}{p}\,\mathbf{h}\odot\mathbf{m},\qquad m_k\sim\text{Bernoulli}(p)
通俗理解:训练时随机“裁员”,让每个人独立扛事;测试时全员到齐,但要按缺席概率打个折,保持整体出力不变。
  1. 随机掩码\(\mathbf{m}\) 是一个和 \(\mathbf{h}\) 同样长度的向量,每个元素独立按概率 p 取 1,按 1-p 取 0,负责决定哪些神经元“请假”。
    mk∼Bernoulli(p)\displaystyle m_k\sim\text{Bernoulli}(p)
  2. 逐元素相乘\(\mathbf{h}\odot\mathbf{m}\) 把神经元输出与掩码逐位相乘,被置 0 的神经元在本次更新中完全不参与。
    (h⊙m)k=hk⋅mk\displaystyle (\mathbf{h}\odot\mathbf{m})_k=h_k\cdot m_k
  3. 缩放保期望除以 \(p\) 是为了让训练时的整体输出期望与测试时一致,否则测试阶段所有神经元输出会凭空变大。
    E[h~k]=hk\displaystyle \mathbb{E}[\tilde{h}_k]=h_k
  4. 训练测试差异训练阶段随机失活,测试阶段不再失活、也不再缩放,这是Dropout部署时最容易踩错的地方。
    推理时:htest=h\displaystyle \text{推理时:}\quad \mathbf{h}_{\text{test}}=\mathbf{h}

3. 负采样:抽样看数据

阿芒每天复盘时,没成交的顾客少说也有几百位。要是每一位路人的“没买理由”都掰开揉碎研究,她一天也复不了几个盘,还容易在“根本不会买”的路人身上浪费大量精力。店长规定:每天随机抽取一小部分未成交录像来看,隔天换另一批,保证见多识广;至于商场里最受欢迎的那几位常客,则适当压低他们在复盘中的出现频率,免得阿芒只会围着热门转。

推荐训练里的负样本正是“曝光但未点击”的商品,数量是正样本的几十倍上百倍。全量放进损失函数,既算不动,又会把模型带偏到“全都预测为负”。于是大家只抽取一部分负样本做反向学习,典型的负采样比例是 1:5 到 1:20;对物品出现频率做截断,即频控采样,防止头部热门商品垄断负例。DeepFM/DIN 在亿级样本上训练时,这一步直接决定单轮迭代的速度。

抽查不是偷懒,而是用有限的精力看最有代表性的反面教材。采样比例太小,阿芒会觉得“所有人都会买”;比例太大,噪声和算力开销同时上涨,反而不如老老实实看一批中等难度的案例。

Lneg≈−1∣B∣∑(u,i)∈B[log⁡σ(sui)+∑j∼Pneglog⁡(1−σ(suj))]\displaystyle L_{\text{neg}}\approx-\frac{1}{|B|}\sum_{(u,i)\in B}\Big[\log\sigma(s_{ui})+\sum_{j\sim P_{\text{neg}}}\log\big(1-\sigma(s_{uj})\big)\Big]
通俗理解:正样本是“顾客买了什么”,负样本是“顾客没买什么”,但没买的人太多,只抽查最有代表性的那批。
  1. 正样本项\(\log\sigma(s_{ui})\) 鼓励用户对正物品的打分尽量高,\(s_{ui}\) 是模型对“用户u买物品i”的偏好分数。
    σ(sui)=11+e−sui∈(0,1)\displaystyle \sigma(s_{ui})=\frac{1}{1+e^{-s_{ui}}}\in(0,1)
  2. 负样本项\(\log(1-\sigma(s_{uj}))\) 鼓励用户对采样到的负物品打分尽量低,形成“买它、不买它”的对立信号。
    log⁡(1−σ(suj))=log⁡σ(−suj)\displaystyle \log(1-\sigma(s_{uj}))=\log\sigma(-s_{uj})
  3. 采样分布\(j\sim P_{\text{neg}}\) 表示负物品从某个分布中抽取,均匀采样或按频控分布采样都可行,但分布决定了信号的偏向。
    Pneg(j)∝min⁡(fjα, c)\displaystyle P_{\text{neg}}(j)\propto \min\big(f_j^\alpha,\,c\big)
  4. 批量归一对所有样本取平均,保证损失尺度不随批量大小和负采样数量剧烈波动。
    1∣B∣∑(u,i)∈B[⋅]\displaystyle \frac{1}{|B|}\sum_{(u,i)\in B}[\cdot]

4. 困难样本挖掘:专攻难题

阿芒总在一位特别挑剔的顾客面前翻车。师傅没让她天天见这位顾客,而是把她的失败案例单独整理出来,每周五下午集中反复演练。更讲究的是节奏:前两周只挑中等难度的案例,等基本功扎实了,再上最难的。如果第一天就让阿芒被最刁钻的顾客骂哭,她很快就会变得畏手畏脚,见到谁都不敢推荐。

困难样本,指的是当前模型最有把握推荐、但用户实际没有点击的负样本——也就是模型“错得最自信”的那些例子。TopK策略每次从一批候选负样本里挑出打分最高的 K 个,当作本轮学习的重点;在此基础上,课程式引入让模型先随机采样,再逐渐过渡到困难样本,避免一开始梯度就剧烈震荡。DeepFM/DIN 训练中,这种策略能显著提升模型在长尾商品上的区分度。

难题练太多会打击信心,练太少则永远突破不了瓶颈。课程式引入的本质,是把“难度曲线”这个超参数也纳入训练计划,让模型在最舒适与最痛苦的边界上稳步前进。

Phard(j∣u)=eα suj∑j′∈Cueα suj′\displaystyle P_{\text{hard}}(j\mid u)=\frac{e^{\alpha\, s_{uj}}}{\sum_{j'\in C_u}e^{\alpha\, s_{uj'}}}
通俗理解:给“模型自认为最难”的负样本发更多排练机会,但用温度系数控制难度升级的节奏。
  1. 候选池\(C_u\) 是用户 u 的候选负样本集合,可以从全部物品里抽一小部分作为“备选难题”。
    Cu={j1,j2,…,jM}\displaystyle C_u=\{j_1,j_2,\dots,j_M\}
  2. 指数加权\(e^{\alpha s_{uj}}\) 把打分高的负样本权重放大,打分越接近正样本的负例,被选中的机会越大。
    eαsuj∝suj\displaystyle e^{\alpha s_{uj}}\propto s_{uj}
  3. 温度系数\(\alpha\) 控制取样的“锋利程度”,\(\alpha=0\) 退化为均匀采样,\(\alpha\) 越大,系统越偏向最难的样本。
    α∈[0,+∞),α=0⇒Phard=1M\displaystyle \alpha\in[0,+\infty),\quad \alpha=0\Rightarrow P_{\text{hard}}=\frac{1}{M}
  4. 归一化概率除以分母的求和,保证所有候选负样本的被选概率加起来等于1,是一个合法的概率分布。
    ∑j∈CuPhard(j∣u)=1\displaystyle \sum_{j\in C_u}P_{\text{hard}}(j\mid u)=1

5. BPR与CE:两种裁判

考核阿芒有两条路。第一条是“排名卷”:把几个候选商品摆一起,只要阿芒把用户真正买的排在其他商品前面,就算加分——这叫BPR,它不关心你猜得准不准,只关心相对次序。第二条是“对错卷”:每推荐一个商品,必须判断买或不买,判断错了就扣分——这叫交叉熵(CE),它关心的是绝对置信度。同样是考一上午,两张卷子练出来的导购风格完全不同。

在推荐系统里,CE Loss 用于点击率预估阶段,把“用户是否点击”看作二分类问题,DeepFM 的标准训练方式就是接一个 sigmoid 后的交叉熵。BPR Loss 则直接面向排序:它从数据中构造“正物品 > 负物品”的比较对,优化目标是让正物品的打分尽量高于负物品。CTR 阶段用 CE 保证基础准确率,精排/重排阶段补 BPR 或 Listwise 损失,是业界常见的组合打法。

而 CE Loss 的公式则是:

选裁判就是选目标。想让阿芒“排得对”,用BPR;想让她“猜得准”,用CE。最聪明的团队两份卷子都用:先拿 CE 摸底打基础,再拿 BPR 冲刺排序效果,正好对应线上“粗排→精排”的两级漏斗。

LBPR=−1∣D∣∑(u,i,j)∈Dln⁡σ(sui−suj)\displaystyle L_{\text{BPR}}=-\frac{1}{|\mathcal{D}|}\sum_{(u,i,j)\in\mathcal{D}}\ln\sigma\big(s_{ui}-s_{uj}\big)
通俗理解:BPR是“排对了就给糖”,不管绝对分打多少,只要正样本排在负样本前面就行。
  1. 真实标签\(y_n\in\{0,1\}\) 表示第 n 个样本是否被点击,1 是点击,0 是未点击。
    yn=1[样本n被点击]\displaystyle y_n=\mathbb{1}[\text{样本}n\text{被点击}]
  2. 预测概率\(\hat{y}_n\) 是模型输出的点击概率,通常由最后一层 sigmoid 产生。
    y^n=σ(sn)\displaystyle \hat{y}_n=\sigma(s_n)
  3. 两项钳制\(y_n\ln\hat{y}_n\) 惩罚“该点没点得出”,\((1-y_n)\ln(1-\hat{y}_n)\) 惩罚“不该点却点了”,再取平均保证尺度稳定。
    LCE→0 ⇔ y^n→yn\displaystyle L_{\text{CE}}\to 0\ \Leftrightarrow\ \hat{y}_n\to y_n

6. 超参调优:调配课程表

店长每周都要调培训表:今天上课两小时还是四小时?实战考核每周一次还是每天一次?奖励系数定多少?这些单看都不起眼,合在一起却决定阿芒进步的快慢与稳定。深度学习训练也一样——学习率、批量大小、嵌入维度、正则强度,就是一张张“培训表”,必须联动着调,而不能孤立地逐项拍脑袋。

学习率决定每次更新走多远:太大直接震荡甚至发散,太小则龟速收敛,于是有了预热(warmup)和衰减(decay)的调度。批量大小影响梯度估计的稳定性,小批量噪声大但逃离局部极小值的能力强;嵌入维度决定表征容量,太小装不下用户多样的兴趣,太大则容易过拟合。实际调参经验是:先粗搜 λ、lr、Dropout 三个关键旋钮,锁定量级后再做小范围精搜;同时盯住“训练损失与验证损失是否同步下降”这一核心信号。

每张表单独调容易顾此失彼——正则加太猛,BPR 的排序优势发挥不出来;负采样比例、难度曲线、损失函数其实是一套互相咬合的培训体系。只有把规矩、素材、考卷统筹调配,阿芒才能成为真正的金牌导购,深度推荐模型也才能在真实流量里既稳又准。

ηt=ηmax⁡⋅11+βt\displaystyle \eta_t=\eta_{\max}\cdot\frac{1}{1+\beta t}
通俗理解:学习率像培训节奏——早期大步快跑建立直觉,后期小步慢走精雕细琢。
  1. 初始学习率\(\eta_{\max}\) 是学习率的上限,通常取 \(10^{-3}\) 到 \(10^{-2}\),太大的话第一步就会把参数“震飞”。
    ηmax⁡∈[10−3,10−2]\displaystyle \eta_{\max}\in[10^{-3},10^{-2}]
  2. 当前轮数\(t\) 表示已训练轮数,从 0 开始递增,衰减项随 t 增大而减小学习率。
    t=0,1,2,…,T\displaystyle t=0,1,2,\ldots,T
  3. 衰减系数\(\beta\) 控制衰减速度,\(\beta\) 越大,学习率掉得越快,训练后期越精细。
    β∈[0,0.1]\displaystyle \beta\in[0,0.1]
  4. 先大后小整个调度保证模型早期快速探索,后期稳定收敛,与课程式困难样本挖掘的思路完全同构。
    η0>η1>η2>⋯>ηT\displaystyle \eta_0>\eta_1>\eta_2>\cdots>\eta_T

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 演示

python68 行
# -*- 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()
目的:用纯 Python 实现一个微型 BPR 推荐训练器,演示“负采样 + 困难样本挖掘 + L2 正则”如何协同工作;前 5 轮先随机采样打基础,之后切换为困难样本挖掘,可观察到 loss 稳步下降。
  1. sig = 1.0 / (1.0 + math.exp(x_uj - x_ui))这是 BPR 的核心:正负样本打分差越大,这个值越接近 0,梯度越小,说明排序已经学对。
  2. grad_u = sig * (self.V[i][k] - self.V[j][k]) - self.reg * self.U[u][k]梯度里同时包含 BPR 的排序信号和 L2 正则的“权重衰减”项,这正是正文讲的“规矩 + 考卷”合体。
  3. j = sample_negative(model, u, pos[u], hard=(epoch > 5))前 5 轮用随机负采样热身,之后启动困难样本挖掘,对应“课程式引入”。
  4. cands.append(j); if j in positive_items: continue采样时跳过正样本,保证构造出合法的负样本对。
  5. 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 的哪个部分最稳妥?

单选题 · easy

  • A.只加在嵌入层向量上
  • B.深层网络的权重上← 正确答案
  • C.高层线性部分之上
  • D.全部参数统一加强

答案:B。L2 加在深层网络权重上最稳妥,嵌入层通常被豁免以免压扁稠密向量。A 错在嵌入层加 L2 会限制表征能力;C 的线性部分已天然受控;D 无差别加强会让嵌入层和 MLP 一起失衡。就像给导购立规矩,不能连“察言观色”的本能也一起限制。

Q2. Dropout 在训练与测试时的正确姿势是?

单选题 · mid

  • A.训练随机关闭测试按比例缩放← 正确答案
  • B.训练全开测试也保持全开
  • C.训练随机关闭测试也随机失活
  • D.训练全开测试再随机失活

答案:A。训练时随机失活神经元,测试时全量参与并按保留概率 p 缩放权重,以保持期望一致。C 错在测试时随机失活会让预测结果抖动;B 等于没用 Dropout;D 把顺序颠倒了。这就像轮岗制只在培训期生效,正式营业时必须全员到岗。

Q3. 负采样比例过大可能导致什么后果?

单选题 · easy

  • A.训练更慢且噪声增加← 正确答案
  • B.正样本数量也随之增加
  • C.模型表达能力显著提升
  • D.验证损失必然持续下降

答案:A。过大的负采样比例意味着大量简单负样本被反复训练,梯度信号稀疏,算力开销却成倍上涨;正样本不会因此变多,模型表达能力不受影响,验证损失也不会必然下降。阿芒如果把每个路人都复盘一遍,只会累垮自己还学不到新东西。

Q4. 困难样本挖掘中,样本“过难”的主要风险是?

单选题 · mid

  • A.模型训练出现震荡← 正确答案
  • B.负采样效率大幅提升
  • C.正样本被自动修正
  • D.验证曲线一定更平稳

答案:A。极端困难样本会放大梯度方差,导致训练震荡甚至不收敛。困难样本的价值在于“有挑战性”,而不是“不可学习”;所以要用课程式引入、逐步提高难度。就像让新人一上来就应付最刁钻的顾客,只会打击信心。

Q5. BPR Loss 优化的核心目标是什么?

单选题 · mid

  • A.正样本打分超过负样本← 正确答案
  • B.预测概率逼近全局阈值
  • C.所有样本方差最小化
  • D.模型参数尽量趋近零

答案:A。BPR 从数据中构造“用户买了 i 没买 j”的比较对,直接优化 \(s_{ui}>s_{uj}\) 的排序正确性。它不是二分类问题,不关心绝对阈值;参数趋近零是 L2 正则的目标而非 BPR 的目标。这就像“排名卷”只关心阿芒把对的商品排前面。

Q6. 用 CE Loss 训练点击模型时,最后一层需要用什么操作输出概率?

单选题 · hard

  • A.拼接归一化层
  • B.Sigmoid 激活函数← 正确答案
  • C.全连接展平操作
  • D.随机失活网络层

答案:B。二分类交叉熵要求模型输出一个 (0,1) 之间的点击概率,sigmoid 是最标准的选择。softmax 用于多分类互斥场景,多层感知机结构只改变特征交互,不负责概率化。跟 CE 这个“对错卷”配套的,是 sigmoid 这个“评分尺”。

Q7. 在排序阶段,BPR 相比 CE 的核心优势在于?

单选题 · hard

  • A.直接优化候选相对次序← 正确答案
  • B.完全不需要负样本采样
  • C.训练速度必然更快更稳
  • D.可避免一切过拟合风险

答案:A。BPR 通过比较正负样本对的分数差来优化排序,天然贴近“把对的排前面”这一目标。它仍然需要负采样;训练速度和稳定性取决于数据与超参;过拟合风险依然存在。BPR 是“排名裁判”,CE 是“及格裁判”,二者的裁判逻辑不同。

Q8. 以下哪些方法能有效缓解深度推荐模型的过拟合?

多选题 · mid

  • A.加入 Dropout 随机失活层← 正确答案
  • B.对深层权重施加 L2 正则← 正确答案
  • C.提高嵌入向量维度上限
  • D.增加训练集负采样比例

答案:AB。Dropout 切断神经元共适应,L2 惩罚大权重,都是标准正则手段。C 增大嵌入维度会提升模型容量、加剧过拟合;D 增大负采样比例主要影响学习信号与效率,并不能直接缓解过拟合。正则的目的不是加数据,而是给模型“立规矩”。

Q9. 负采样时选择负样本的合理策略有哪些?

多选题 · mid

  • A.按均匀分布随机抽取← 正确答案
  • B.按物品热度做频控采样← 正确答案
  • C.只挑选热门正样本
  • D.按模型难度加权采样← 正确答案

答案:ABD。均匀随机采样是基线;频控采样防止头部热门商品垄断负例;难度加权(困难样本)提高学习效率。C 把“负样本”和“热门正样本”混为一谈,负样本必须是用户未交互过的物品。三种采样策略分别对应“广撒网、控偏科、抓重点”。

Q10. 关于“学习率预热”与训练稳定性的关系,哪些描述正确?

多选题 · hard

  • A.早期嵌入参数未稳定时大步长易崩← 正确答案
  • B.预热可以减少梯度爆炸的风险← 正确答案
  • C.预热必然让验证损失降为零
  • D.预热后配合衰减可先探索后收敛← 正确答案

答案:ABD。嵌入层在早期还是随机噪声,大步长更新容易把表征“震乱”,预热用小学习率先稳住参数,从根本上降低梯度爆炸概率。C 说“必然归零”显然不成立,损失不可能为零且过拟合仍在。预热再加衰减,正是“先大步探索、后小步精修”的课程表思路。