一、评价函数概述:到底什么是评价函数?
说实话,我刚开始接触推荐系统时,对「评价函数」这个词挺懵的。总觉得它是个高大上的数学概念,离实际工程很远。后来踩了不少坑才明白——评价函数就是一把尺子,用来量你的模型到底好不好。
你想想看,我们做推荐、做搜索,最终目的是什么?是把最合适的内容推给用户。但「合适」这个词太模糊了。评价函数就是把这个模糊概念,变成一个个可计算的数字。
核心定义:评价函数(Evaluation Function / Scoring Function)是一个从输入特征空间到实数空间的映射。它给每个候选物品打一个分,分数越高,代表越应该被推荐或排在前面。
1.1 评价函数在推荐系统中的作用
我在做电商推荐项目时,遇到过这样一个场景:用户搜索「运动鞋」,后台有 10 万双鞋。怎么决定先展示哪双?
评价函数就是干这个的。它把每双鞋的特征(价格、销量、用户历史行为、品牌偏好等)揉在一起,算出一个分。然后系统按分数排序,把 Top N 展示给用户。
具体来说,评价函数在推荐/搜索系统中承担三个角色:
| 角色 | 说明 | 我见过的坑 |
|---|---|---|
| 排序依据 | 决定候选物品的展示顺序 | 曾经只靠 CTR 排序,忽略了转化率,结果曝光高但 GMV 没涨 |
| 模型训练目标 | 作为损失函数的反向传播依据 | 评价函数和损失函数不一致,模型学偏了 |
| 业务指标对齐 | 把商业目标(GMV、留存)翻译成可优化分数 | 纯技术指标好看,业务方不买账 |
我的经验:评价函数的设计,本质上是在做「目标对齐」。你希望系统优化什么,评价函数就该反映什么。别指望一个万能公式解决所有问题。
1.2 评价函数的数学本质
说白了,评价函数就是一个数学表达式。我习惯把它写成这样:
score = f(user_features, item_features, context_features)
其中:
- user_features:用户画像、历史行为、实时意图
- item_features:物品属性、统计指标、内容特征
- context_features:时间、地点、设备、网络状态
从数学角度看,评价函数可以分成三类:
| 类型 | 数学形式 | 典型例子 |
|---|---|---|
| 线性函数 | score = w₁x₁ + w₂x₂ + ... + wₙxₙ + b | LR、FM 的一阶部分 |
| 非线性函数 | score = σ( W·x + b ) 或更复杂的神经网络 | DNN、DeepFM |
| 组合函数 | score = 线性部分 + 交叉部分 + 高阶部分 | Wide & Deep、xDeepFM |
注意:我曾经犯过一个错误——把评价函数设计得过于复杂。特征交叉层叠了 5 层,线上延迟暴涨,收益却只提升了 0.1%。简单有效,才是评价函数的第一原则。
1.3 评价函数 vs 损失函数:别搞混了
很多新手会把这两个概念混为一谈。我刚开始也这样,直到有一次模型训出来,离线指标漂亮,线上效果一塌糊涂。
它们的区别其实很清楚:
| 维度 | 评价函数 | 损失函数 |
|---|---|---|
| 使用阶段 | 推理/排序时使用 | 训练时使用 |
| 目标 | 给候选物品打分排序 | 衡量预测值与真实值的差距 |
| 可微性 | 不一定可微 | 必须可微(用于梯度下降) |
| 例子 | CTR预估分、GMV预估分 | 交叉熵、均方误差 |
嗯,这里要注意:评价函数可以包含不可微的操作,比如排序、截断、业务规则加权。但损失函数必须光滑可导。所以实践中,我们往往用损失函数来「模拟」评价函数的优化方向。
1.4 评价函数体系全景图
为了让你对整个体系有个直观认识,我画了张图。这张图也是我们这门课的整体框架:
1.5 一个简单的评价函数例子
光说理论太干。我给你看个实际项目中用过的评价函数:
# 一个简单的混合评价函数
def evaluate_score(user, item, context):
# 基础相关性分
relevance = compute_relevance(user, item)
# 时效性加分(新品加权)
freshness = get_freshness_bonus(item, context['current_time'])
# 个性化加权
personal_bias = user.get_preference_bias(item.category)
# 业务规则:高毛利商品加权
margin_bonus = item.profit_margin * 0.1 if item.profit_margin > 0.3 else 0
# 最终分数
score = 0.6 * relevance + 0.2 * freshness + 0.15 * personal_bias + 0.05 * margin_bonus
return score
这个函数看起来简单,但我在实际项目中迭代了 6 个版本才稳定下来。一开始权重拍脑袋设的,线上 A/B 测试直接翻车。后来通过数据回放 + 人工标注,才慢慢调出合理的系数。
一个小建议:评价函数的权重不要靠直觉。用网格搜索或贝叶斯优化去调,比你拍脑袋靠谱 10 倍。
1.6 本章小结
评价函数是整个推荐/搜索系统的「指挥棒」。它决定了模型往哪个方向优化,也决定了用户最终看到什么。
记住三个要点:
- 评价函数 = 打分器,把特征映射成排序分数
- 评价函数 ≠ 损失函数,前者用于推理,后者用于训练
- 设计评价函数 = 对齐业务目标,别为了技术指标牺牲商业价值
嗯,这一章就到这里。评价函数的概念其实不复杂,但它是后面所有章节的基石。后面的内容会越来越深,从线性模型一路讲到多目标优化、自动搜索评价函数。准备好了吗?