ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

阅文机器学习笔试复盘:从逻辑回归到推荐系统的核心考点

阅文机器学习笔试复盘:从逻辑回归到推荐系统的核心考点 去年秋招的时候我投了阅文的机器学习方向笔试做完之后最大的感受是题目不算偏但覆盖面非常广从经典的机器学习理论到深度学习、NLP、推荐系统再到手推公式和代码题基本把你大学四年或者说准备校招期间积累的东西都过了一遍。更关键的是阅文作为网文平台业务场景很有特点所以笔试卷里有不少结合“用户阅读行为”“文本内容理解”的题目这跟一般的互联网公司机器学习岗还是有一些区别的。如果你正准备投阅文或者想看看网文行业机器学习方向的笔试会考什么那这份复盘应该能帮你少走不少弯路。我会把整张卷子的结构、典型考点、解题思路以及我自己踩过的坑都整理出来有些地方我会补充一些常规备考资料里不会细讲的细节希望能给你一些实在的参考。1. 整体感知阅文机器学习笔试卷到底在考什么1.1 试卷结构四个模块两个小时我拿到的2023届阅文机器学习方向笔试卷总时长120分钟题量大概在30道左右分四个模块单选/多选、简答题、手推/设计题、编程题。选择题单选多选约15题覆盖机器学习基础、深度学习基础、概率统计、数据结构等。简答题约4题要求简述概念、对比模型、解释场景中的问题。手推/设计题约2题主要考推导和系统设计比如LR的梯度推导、推荐系统的召回排序设计。编程题约2题用本地IDE写代码核心考察coding能力和机器学习算法实现。整体难度属于中上选择题里有一部分是送分题但多选容易漏选错选简答题则比较考验你对知识的深度理解不能只背结论手推题如果你平时只调包不推公式可能会卡壳编程题则偏向“用代码实现一个机器学习算法”或者“处理一个具体的业务问题”。1.2 考察方向业务与技术并重NLP和推荐是重头阅文的核心业务是网络文学平台旗下有起点读书、QQ阅读等产品用户量巨大。所以机器学习方向的技术栈很自然地集中在两块一是内容理解NLP比如章节分类、关键词抽取、内容审核、情感分析二是推荐系统比如用户兴趣建模、章节推荐、完读率预测等。从笔试卷也能看出这个倾向选择题里关于文本表示TF-IDF、Word2Vec、BERT和推荐召回协同过滤、双塔模型的题目比重不小简答题里直接出现了“如何给一部小说做标签体系”“如何预测用户完读率”这类贴合业务的问题。如果你完全没接触过NLP和推荐只复习传统机器学习可能会觉得有些题答不上来。所以我的建议是准备阅文笔试不要只看西瓜书除了经典的机器学习算法还要把NLP基础、推荐系统常见范式过一遍尤其是它们在实际业务里的落地方式。2. 选择题考点拆解基础细节决定你能不能过线2.1 机器学习基础过拟合、偏差方差、正则化选择题里最经典的一类就是考模型拟合能力。比如“下列哪种方法可以有效缓解过拟合多选”选项有增加训练数据、降低模型复杂度、L2正则化、Dropout、增加特征维度。如果你只是背过“过拟合解决方案”的清单这道题能选出前四个但“增加特征维度”是个陷阱——特征越多模型越容易记住训练集中的噪声反而加剧过拟合。这种题考察的不只是记忆而是你是否理解过拟合的本质模型在训练集上学习了过多不必要的细节和噪声导致泛化能力下降。再比如偏差方差的权衡。有一道题问“高偏差模型通常表现为训练误差高测试误差也高”这个是对的但换成“高方差模型通常表现为训练误差低测试误差高”就要仔细判断。很多人会把高偏差和高方差弄混其实你只要记住偏差高是“欠拟合”训练集都学不好方差高是“过拟合”训练集学得特别好一到新数据就崩。关于正则化我建议你额外复习一下L1和L2的区别。选择题里如果问“L2正则化为什么能防止过拟合”答案可以说“通过限制权重的大小使得模型更加平滑”。但更深入一点L2正则化对应着权重衰减在梯度下降更新时每一步都会把权重乘以一个小于1的系数所以权重不会太大。L1正则化则更容易产生稀疏解因为它在零点不可导优化过程中会让部分权重变成0。这些细节选择题不一定会考但后续简答题可能会让你对比。2.2 概率统计与特征工程容易被忽略的送分题概率统计这块阅文考了条件概率、贝叶斯公式、期望方差这些基础概念。有一道题我记得很清楚“已知P(A)0.3P(B)0.4P(A|B)0.5求P(B|A)”。这就是直接用贝叶斯公式 P(B|A) P(A|B) * P(B) / P(A) 0.5 * 0.4 / 0.3 0.667。这道题基本是送分但考场上如果紧张可能会把分母写成P(B)。我的经验是碰到贝叶斯公式先写全公式再代数不要跳步。特征工程相关选择题相对少但有一道关于标准化和归一化的题对于梯度下降优化算法特征标准化后可以加快收敛速度这是对的对于决策树特征标准化不影响模型效果这也是对的。因为决策树是基于特征取值做划分单调变换不会改变划分点顺序。这道题很多人会漏选第二个选项其实决策树根本不在乎特征缩放。这个知识点建议记住面试也常问。还有一道关于信息增益的题“在ID3决策树中选择特征的依据是什么”答案是信息增益最大。但如果你想区分ID3、C4.5和CART要记住ID3用信息增益C4.5用信息增益率CART用基尼指数。选择题不会考很细但你心里要有这个框架。2.3 深度学习与NLP基础从Word2Vec到注意力机制阅文对深度学习的考察占比不低。选择题里考了激活函数、梯度消失、注意力机制的基础概念。比如“以下哪个激活函数在输入为负时梯度为0”答案是ReLU因为ReLU在x0时输出恒为0梯度也为0。但还有一个变体LeakyReLU就是为了解决这个问题在负区间给一个很小的斜率比如0.01这样负区间的梯度不为0。如果你平时只记得ReLU没注意LeakyReLU这道题可能拿不准。NLP的考点更贴近业务。有一道题问“Word2Vec的CBOW模型是根据上下文预测中心词Skip-gram是根据中心词预测上下文。”这是基础概念。但后来有一道多选“关于BERT以下说法正确的是A. BERT是双向的B. BERT使用Transformer的编码器C. BERT适合做生成任务D. BERT的预训练任务包含掩码语言模型。”正确答案是A、B、D。BERT双向编码使用Transformer编码器预训练任务有MLM和NSP但它本质是编码器不适合做自由文本生成生成任务一般用GPT这种自回归模型。这道题只要你了解BERT的基本架构就能选对。对于NLP这块我强烈建议把文本表示的发展脉络梳理一遍词袋模型BOW→ TF-IDF → Word2Vec静态词向量→ ELMo动态但基于LSTM→ BERT动态且双向。阅文笔试不一定会直接考这个脉络但选择题里会涉及其中几个点理解演进逻辑会让你选得更稳。3. 简答题概念对比与业务场景考察你的“内功”3.1 简述L1正则化与L2正则化的区别并说明各自适用的场景这类题是机器学习岗笔试的标配。我当时的回答思路分三层数学形式L1是权重的绝对值之和L2是权重的平方和。性质差异L1正则化能产生稀疏权重矩阵让部分特征权重为0相当于特征选择L2正则化让权重尽量小但不会为0能够防止模型过拟合使模型更稳定。适用场景当特征维度很高且大部分特征无关时用L1可以自动筛选特征当特征之间相关性较强且都可能有预测能力时用L2更好因为它不强制舍弃特征而是把权重均匀地缩小。阅文这类互联网公司考察这个问题不只是想看你会不会背定义而是看你在实际建模时能不能根据特征情况选择正则化方式。网文的文本特征往往高维稀疏比如用户阅读过的书籍ID、标签ID用L1可能更合适而连续特征如阅读时长、点击率用L2更稳妥。所以你在作答时最好能结合具体业务场景举例会显得更有经验。3.2 如何评估一个机器学习模型的效果除了准确率还要看什么这题看起来简单但想拿高分需要答得全面。我从三个层面展开分类任务指标准确率Accuracy、精确率Precision、召回率Recall、F1值、AUC、LogLoss等。在正负样本不平衡时准确率没有参考价值要重点看AUC和F1。回归任务指标MAE、MSE、RMSE、R²等。模型泛化能力评估交叉验证、留出验证集、学习曲线等。我加了一句对于阅文的业务比如预测用户是否愿意读完一本小说完读率正负样本可能不平衡所以用AUC比准确率更靠谱。另外除了离线指标还要关注线上指标如点击率、阅读时长、付费转化率因为离线AUC提升不一定会带来线上业务增长这个点面试官通常很认可。3.3 在特征工程中如何处理缺失值请列举至少三种方法这题属于基础题但需要答得有条理。我列了四种方法删除缺失值较多的特征或样本注意阈值。填充用均值/中位数/众数填充或用模型预测填充如KNN、回归。特殊值填充把缺失值当成一个单独类别比如填充为-1或“Unknown”。不处理有些模型如XGBoost、LightGBM原生支持缺失值会自动学习缺失值的分裂方向。我补充了一点在网文场景中用户属性特征缺失很常见比如新用户注册信息不全。这时不建议直接填充为均值而是用“缺失标记” “填充值”两个维度来建模让模型自己学习缺失这个状态是否有预测意义。这个技巧是我在实际项目中总结出来的笔试写上会很加分。4. 手推与系统设计题阅文笔试的重头戏4.1 手推逻辑回归的梯度更新公式手推题第一道是逻辑回归。题目要求写出逻辑回归的损失函数推导参数更新的梯度公式。我把过程写一下帮助大家复习逻辑回归的预测概率为 $h_\theta(x) \frac{1}{1e^{-\theta^T x}}$样本标签为 $y \in {0, 1}$。损失函数采用交叉熵单个样本的损失为 $$ L(\theta) -[y \log h_\theta(x) (1-y) \log (1-h_\theta(x))] $$对 $\theta_j$ 求偏导 $$ \frac{\partial L}{\partial \theta_j} -\left[ y \cdot \frac{1}{h_\theta(x)} \cdot \frac{\partial h_\theta(x)}{\partial \theta_j} (1-y) \cdot \frac{1}{1-h_\theta(x)} \cdot \left(-\frac{\partial h_\theta(x)}{\partial \theta_j}\right) \right] $$先求 $\frac{\partial h_\theta(x)}{\partial \theta_j}$。令 $z \theta^T x$则 $h_\theta(x) \sigma(z)$有 $\frac{\partial h}{\partial \theta_j} h(1-h) \cdot x_j$。代入上式并化简 $$ \frac{\partial L}{\partial \theta_j} -\left[ y(1-h) - (1-y)h \right] x_j -(y - h) x_j (h - y) x_j $$所以参数的更新公式为 $$ \theta_j : \theta_j - \alpha \cdot (h_\theta(x) - y) \cdot x_j $$这里 $\alpha$ 是学习率。这个推导核心在于利用 sigmoid 函数的导数性质 $\sigma(z)\sigma(z)(1-\sigma(z))$整个化简过程非常顺。写题时要注意符号很多人会漏掉负号。我在推导时多写了一句如果要加L2正则化则梯度变为 $(h-y)x_j \lambda \theta_j$更新时还要多减一项 $\alpha \lambda \theta_j$。这算是一个扩展阅文改卷的人看到你考虑正则化会觉得你基础比较扎实。当然要注意不要画蛇添足如果题目没要求简单提一句即可。4.2 设计一个小说推荐召回系统这道系统设计题非常阅文。题目大意是在小说推荐场景中用户数量大、书籍数量也大如何设计召回阶段保证候选集的质量和效率我的回答分几步确定目标召回阶段要从百万甚至千万本书中快速筛选出几百本候选小说要求速度快、覆盖广、保证一定的相关性。多路召回基于协同过滤利用用户历史行为点击、收藏、阅读时长找到相似用户推荐他们读过的小说。基于内容计算小说之间的文本相似度关键词、分类、标签、向量推荐与用户最近阅读的小说相似的作品。基于热门热销榜、新书榜、上升榜等保证新用户也有候选。基于向量检索将用户和小说分别表示为向量如双塔模型用FAISS等向量搜索引擎进行近似最近邻搜索速度极快。融合策略多路召回的结果通过加权、去重、排序如MMR多样性算法合并成最终候选集。工程实现上离线预计算用户和物品向量用Faiss建索引线上实时对用户向量做查询一般能控制在几十毫秒内。我还提到了一个细节对于新书冷启动因为没有用户行为只能靠内容向量召回所以内容侧的特征要做得丰富一些比如简介的词向量、标签、作者的过往作品风格等。面试官想要听到的就是你能针对实际业务痛点冷启动提出解决方案。4.3 如何预测小说的完读率另一道简答/设计题是关于完读率预测的。完读率是阅文很关心的指标它代表用户是否读完了一本书。题目会给你一些特征用户历史行为阅读时长、翻页速度、收藏、评论、书籍信息分类、字数、章节数、评分、标签、用户与书籍的交互当前阅读进度等。让你设计模型。我的思路问题定义二分类是否完读或者回归完读概率。通常按二分类处理。特征工程用户维历史完读率、平均阅读时长、偏好分类、活跃时段。书籍维字数、分类、标签、平均完读率、读者评分。交叉特征用户偏好分类与书籍分类是否匹配、相似行为的用户是否都完读了这本书。模型选择先用LightGBM/XGBoost做基线因为特征工程可以做得比较充分树模型对表格数据很有效。如果特征包含文本可以再加一层文本向量比如用BERT编码书籍简介然后与树模型特征拼接输入到深度学习模型如DeepFM中。评估指标AUC、GAUC考虑用户分组同时关注校准度预测概率是否可以被解释成真实完读率。线上应用预测完读率用于推荐阶段的精排或者重排提高推荐内容的阅读完成度。我在答这道题时特意写了一下“为什么用AUC而不用准确率”因为真正完读的书和读完率高的书占比不会太高正负样本不平衡准确率容易被高占比的负样本带偏。这个点是通用的但放到实际业务里更有说服力。5. 编程题实战手写代码与场景实现5.1 用Python实现K-means聚类算法编程题第一道是实现K-means要求写出完整代码能对给定数据聚类。这道题属于经典的“手撕机器学习算法”比写快排难一些但只要思路清晰代码量不大。我写的核心思路初始化随机选择K个样本作为初始质心。迭代计算每个样本到各质心的距离归到最近的簇然后重新计算每个簇的均值作为新质心。终止条件质心不再变化或达到最大迭代次数。参考代码Python用NumPyimport numpy as np def kmeans(X, k, max_iters100, tol1e-4): # X: (n_samples, n_features) n_samples, n_features X.shape # 随机初始化质心 rng np.random.default_rng(0) idx rng.choice(n_samples, k, replaceFalse) centroids X[idx] for i in range(max_iters): # 计算距离 (n_samples, k) distances np.linalg.norm(X[:, np.newaxis, :] - centroids, axis2) labels np.argmin(distances, axis1) # 更新质心 new_centroids np.zeros_like(centroids) for j in range(k): points X[labels j] if len(points) 0: new_centroids[j] points.mean(axis0) else: new_centroids[j] centroids[j] # 空簇保持原样 # 检查收敛 if np.linalg.norm(new_centroids - centroids) tol: break centroids new_centroids return labels, centroids我在这里特别加了一个“空簇处理”如果一个簇没有任何样本就保留原来的质心。因为如果不处理下一步计算距离时会出现NaN整个程序直接崩。这种细节恰恰是笔试判分的关键点能体现你写过真实代码而不是只会背伪代码。另外要注意初始化的影响。随机选质心可能得到局部最优。如果时间充裕可以用K-means做初始化先随机选第一个质心之后每次选离已有质心最远的点作为新质心。K-means在sklearn里是默认实现笔试时可以提一句“实际用K-means初始化效果更好”但如果题目要求手动实现用随机初始化也是可以的。5.2 统计一个文本中词频并输出TopK第二道编程题比较贴近业务给一段小说文本统计所有词语出现的次数输出出现频率最高的K个词语不考虑停用词。这道题如果你是NLP方向应该秒写。我的代码Pythonfrom collections import Counter import jieba def top_k_words(text, k, stopwordsNone): # 分词 words jieba.lcut(text) # 过滤停用词和空白 if stopwords is None: stopwords set() words [w.strip() for w in words if w.strip() and w not in stopwords] # 统计词频 counter Counter(words) return counter.most_common(k)这题考的其实不是算法而是你会不会用工具同时考察你对中文分词的基本认知。如果你没用过jieba可以用正则表达式切分出连续中文字符但效果会差很多。我建议平时多练练中文文本处理尤其是jieba和pandas的用法笔试时能节省大量时间。5.3 编程题里的隐藏坑输入输出和边界条件很多同学刷LeetCode习惯了函数式输入遇到笔试平台要求自己处理输入输出就懵了。阅文笔试用的编程题平台是赛码网或者牛客网风格需要自己写input()读取数据并且要注意数据可能是多行、字段用空格或逗号分隔。我的经验是先写一个read函数把可能用到的读取方式提前准备好省得现场纠结。比如import sys def read_input(): data sys.stdin.read().strip().split() # 根据题目要求解析 return data或者直接用input()逐行读line1 list(map(int, input().split())) n, k line1[0], line1[1]边界条件也很关键比如K大于文本总词数、数组长度为0、聚类只有1个样本等。这些情况如果在代码里没处理可能只过一部分测试用例。我建议在写完代码后花一分钟检查几个典型边界空输入、单元素输入、最大K值。这种习惯在考试里能救你不少分。6. 常见问题与备考建议从这套卷子反推复习方向6.1 备考时容易踩的坑我复盘这套卷子发现有几个典型的坑提前知道能帮你避开第一只刷LeeCode不复习机器学习理论基础。我认识有同学刷了300道题结果看到“偏差方差权衡”直接愣住。笔试考察的是算法工程师不只是刷题程序员机器学习基础占的比重超过50%所以理论复习一定要排在刷题前面。第二忽视多选题。多选的评分规则通常是“全对才得分少选、错选、多选都不得分”。这很残酷你必须对知识点非常确定。我的策略是先把能确定的选项选上对不确定的选项不选保证不因多选而扣分。但如果平台规则是“少选得部分分”那就要尽量选全。考试前最好了解一下平台评分规则。第三不练手推公式。手推题在牛客/赛码上没法自动判分但人工阅卷时这是一个重要参考。建议把以下经典推导全部亲手推一遍线性回归最小二乘、逻辑回归梯度、朴素贝叶斯、SVM对偶问题至少理解思路、GBDT的负梯度拟合。不需要背但要能流畅地写出来并且知道每一步的依据。第四忽略业务场景。阅文的笔试题非常贴近内容平台业务如果你连“完读率”“章节卡点”“标签体系”是什么都不知道很难把简答题答到点子上。在笔试前可以花一点时间了解网文产品的基本概念用户怎么阅读作者怎么更新平台怎么分发。这比盲目刷题更有针对性。6.2 针对阅文机器学习岗的复习重点如果你时间有限我建议按以下优先级复习优先级知识点原因高逻辑回归、决策树、集成学习RF/GBDT/XGBoost笔试和面试最常问简答和手推都会涉及高过拟合、正则化、交叉验证选择题高频也是分析方案的基础高文本表示TF-IDF、Word2Vec、BERT业务强相关NLP必考中推荐系统召回/排序流程阅文核心业务设计题常客中概率统计基础选择题送分题不能丢中特征工程和缺失值处理简答题高频实用性强低深度学习网络结构细节如ResNetCV向内容相对少简单了解即可我自己在复习时把“机器学习算法原理手推”和“NLP基础推荐系统”两块安排了大头刷题只占两成。事实证明这个分配在阅文笔试里是合适的选择、简答、手推、设计都能覆盖到编程题也没有特别难。6.3 写在最后的个人经验复盘完这套卷子我想说阅文机器学习岗的笔试更看重“扎实基础 业务理解”。它的题目不像有些互联网大厂那么刁钻但很讲究知识的系统性。你既要能推导逻辑回归的公式也要能说出它在小说推荐里的用法既要懂Word2Vec也要知道怎么给书打标签。这种考察方式其实和实际工作蛮像的——算法工程师不是纯粹的研究员而是要用技术解决内容平台的具体问题。我印象最深的一道题是“如何给一部小说做标签体系”当时我没有只答“用NLP提取关键词”而是补充了“可以用文本分类模型预测已有标签再用规则模型做修正还结合用户行为数据进行标签投票”。这种多策略融合的思路阅文的人应该很认可因为他们做的是海量内容靠单一模型很难覆盖所有情况。最后给大家一个建议笔试前一定要自己动手推一遍几个核心公式并写一遍K-means、逻辑回归这类基础算法实现不要只在草稿纸上画。只有真正跑过代码、推过公式你才能发现很多没搞懂的小细节。希望这份复盘对你有帮助祝笔试顺利。
返回列表