银行的下一最佳产品(Next-Best-Product,NBP)推荐,不能只追求点击率或转化率。模型需要同时处理客户画像、账户行为、产品属性和交互上下文,并且能对每一条推荐说明理由。基于 Amazon SageMaker AI、PyTorch、多塔神经网络和学习式注意力机制,可以把准确性与监管所需的可解释性放进同一条推荐链路。
多塔模型如何拆解银行客户与产品
传统推荐模型常把所有特征拼接后送入一个网络,但银行数据的来源、更新频率和语义差异很大。客户年龄、风险偏好、现金流变化、贷款状态、现有产品组合,以及候选产品的费率、适用资格和风险等级,并不适合用同一组特征处理逻辑。
多塔神经网络将它们拆开建模:
- 客户塔:编码客户静态属性、风险等级、已有产品和近期行为。
- 产品塔:编码信用卡、储蓄、贷款或投资产品的属性与准入规则。
- 上下文塔:编码触发时机,例如发薪日、余额变化、渠道或近期服务事件。
- 融合层:将多个塔的表征组合,输出候选产品的排序分数。
这种设计的工程价值不只是模型结构更清晰。产品塔可以离线预计算候选产品向量,在线请求只需计算客户和上下文表征,再进行匹配与重排。对于产品频繁调整、客户数量很大的场景,这能降低在线推理成本和延迟。
注意力权重为什么适合解释推荐
多塔模型解决了特征分工,但还需要回答一个业务问题:某位客户为什么得到这条推荐?学习式注意力机制可以为不同信息组分配动态权重。例如,对一位有稳定工资入账、较高活期余额且尚未持有高息储蓄产品的客户,模型可能更关注现金流和余额特征;对一位贷款即将到期的客户,贷款状态可能占更高权重。
注意力权重可以形成面向业务人员的解释素材,例如:
推荐高息储蓄账户,主要因为客户近期保持较高可用余额、存在稳定入账记录,并且当前产品组合中没有同类储蓄产品。
不过,需要明确边界:注意力权重不是天然的因果证明,也不能单独视为完整的模型解释。在受监管场景中,建议将注意力结果与准入规则、特征贡献分析、反事实测试和人工审核结合。尤其要避免把受保护属性或其强代理变量作为不恰当的推荐依据。
可以这样实践:一个可运行的 PyTorch 原型
下面的示例演示了一个简化的客户塔、产品塔和特征组注意力层。它不代表生产级银行模型;假设数值特征已完成脱敏、标准化和合规筛选。运行前安装 PyTorch:
python -m pip install torch
python nbp_demo.py
将以下内容保存为 nbp_demo.py:
import torch
from torch import nn
torch.manual_seed(7)
class ExplainableNBP(nn.Module):
def __init__(self, customer_dim, product_dim, context_dim, hidden_dim=16):
super().__init__()
self.customer_tower = nn.Sequential(
nn.Linear(customer_dim, hidden_dim), nn.ReLU()
)
self.product_tower = nn.Sequential(
nn.Linear(product_dim, hidden_dim), nn.ReLU()
)
self.context_tower = nn.Sequential(
nn.Linear(context_dim, hidden_dim), nn.ReLU()
)
self.attention = nn.Sequential(
nn.Linear(hidden_dim * 3, 16), nn.Tanh(), nn.Linear(16, 3)
)
self.rank_head = nn.Linear(hidden_dim, 1)
def forward(self, customer, product, context):
customer_vec = self.customer_tower(customer)
product_vec = self.product_tower(product)
context_vec = self.context_tower(context)
towers = torch.stack([customer_vec, product_vec, context_vec], dim=1)
attention_input = torch.cat(
[customer_vec, product_vec, context_vec], dim=1
)
weights = torch.softmax(self.attention(attention_input), dim=1)
fused = (towers * weights.unsqueeze(-1)).sum(dim=1)
score = torch.sigmoid(self.rank_head(fused)).squeeze(1)
return score, weights
model = ExplainableNBP(customer_dim=4, product_dim=3, context_dim=2)
# 客户: [标准化余额, 入账稳定性, 风险适配度, 是否已有同类产品]
customer = torch.tensor([[1.4, 0.9, 0.8, 0.0]])
# 产品: [预期收益, 风险等级, 准入匹配度]
product = torch.tensor([[0.7, 0.2, 0.9]])
# 上下文: [近期余额增长, 当前渠道活跃度]
context = torch.tensor([[0.6, 0.5]])
score, weights = model(customer, product, context)
labels = ["客户画像", "产品匹配", "当前上下文"]
print(f"推荐分数: {score.item():.3f}")
for label, weight in zip(labels, weights[0].tolist()):
print(f"{label}: 注意力权重 {weight:.3f}")
这个脚本展示了输出接口,而非有效的业务评分。实际训练时,应使用历史上合规展示过的产品、客户是否接受产品以及后续质量指标构造训练样本。对于每次线上推荐,应保存模型版本、输入特征版本、候选集、准入规则结果、推荐分数和解释结果,确保能够回溯。
在 SageMaker AI 中组织训练与推理
在 AWS 上,SageMaker AI 可以承载训练作业、模型注册、批量推理和实时端点。一个常见的流程是:数据在受控环境中完成抽取与特征处理,PyTorch 训练作业产出模型工件,经过评估和审批后注册模型版本,最后部署到批量或实时推理路径。
下面是一个可改造的 SageMaker PyTorch 训练作业配置示例。将镜像 URI、S3 路径、实例规格和 train.py 参数替换为实际环境值:
TrainingJobName: nbp-multitower-training
AlgorithmSpecification:
TrainingImage: <account-id>.dkr.ecr.<region>.amazonaws.com/nbp-pytorch:latest
TrainingInputMode: File
RoleArn: arn:aws:iam::<account-id>:role/SageMakerNBPTrainingRole
InputDataConfig:
- ChannelName: training
DataSource:
S3DataSource:
S3DataType: S3Prefix
S3Uri: s3://<bucket>/nbp/training/
S3DataDistributionType: FullyReplicated
OutputDataConfig:
S3OutputPath: s3://<bucket>/nbp/model-artifacts/
ResourceConfig:
InstanceType: ml.m5.xlarge
InstanceCount: 1
VolumeSizeInGB: 50
StoppingCondition:
MaxRuntimeInSeconds: 7200
HyperParameters:
epochs: "10"
learning-rate: "0.001"
hidden-dim: "64"
生产环境还应在模型分数之外设置明确的规则层。比如,未通过适当性检查的产品不进入候选集;已持有互斥产品的客户不展示重复推荐;某些高影响产品必须经人工复核。规则层不是对模型的否定,而是把业务政策、风险控制和模型排序职责分开。
上线前应检查什么
一个可解释的 NBP 系统应把“推荐得准”和“推荐得明白”作为两个独立验收项:
- 验证离线排序指标,也按客户群体、产品类型和渠道切分结果,识别性能落差。
- 检查训练数据、特征和线上输入的一致性,监控数据漂移与推荐分布变化。
- 对每条推荐保留可读理由,但不要将注意力权重包装成因果结论。
- 在候选生成和最终排序前后执行资格、适当性、排除和人工审核规则。
- 建立模型版本、特征版本、审批记录和预测日志之间的可追溯链路。
银行推荐系统的难点不在于生成一个分数,而在于让这个分数在准确性、效率、客户体验和审计要求之间经得起检查。多塔网络提供可扩展的表征结构,注意力机制提供逐客户解释线索,而 SageMaker AI 则可以将训练、部署和版本治理纳入可操作的工程流程。