# 三种实验方法原理详解(Baseline / Contrastive / Preference-Weighted) 本文档说明对比实验中三种配置对应的**设计目标、数学形式、配置项与代码路径**,便于论文撰写与复现。 --- ## 一、共同前提(三种方法共享) 三种方法使用**同一套数据**(如 `data/beijing_poi.json`)、**同一套挖掘设置**(参与率、模式阶数、默认按置信度排序等),并均可启用: | 模块 | 作用 | |------|------| | **Stage0** | LLM 意图理解,生成意图向量 `u_llm`,缓解冷启动 | | **Stage3** | 用户偏好学习与结果重排序(具体打分方式因方法而异) | | **Stage4** | 多轮迭代会话(实验脚本中通过 `start_iteration` / `next_iteration` 驱动) | 差异集中在 **`stage3` 的配置**:是否使用对比学习模型、是否启用**特征级偏好加权**。 --- ## 二、方法 1:Baseline(基线) ### 2.1 配置文件 - 路径:`config/config_baseline.yaml` - 关键项: - `stage3.enabled: true` - `stage3.use_contrastive: false` — **不加载、不训练** `PreferenceEncoder` 对比学习分支用于打分 - 未设置 `use_preference_weighted`(默认为 `false`)— **不做特征级 liked/disliked 乘性加权** ### 2.2 原理说明 在「用户向量 + 模式向量」框架下,基线将**偏好分数**定义为模式嵌入与用户向量的**余弦相似度**(或等价地,经 `preference.scorer` 中的 `score_with_baseline`),再与挖掘阶段得到的**置信度**做线性融合: \[ \text{final\_score} = \alpha \cdot \text{preference\_score} + (1-\alpha) \cdot \text{confidence} \] 其中 \(\alpha\) 来自配置 `stage3.alpha`(默认 **0.7**),即更偏重「与用户向量一致」的语义相似度,少量保留模式本身的统计置信度。 **用户向量**来源(与 Stage0/反馈一致): - 优先使用融合向量(若启用 Stage0 且有反馈): \(u_t = e^{-\lambda t}\, u_{\text{llm}} + (1-e^{-\lambda t})\, u_{\text{feedback}}\)(由 `PreferenceLearner.get_user_vector` 实现,\(t\) 为交互轮次) - 若无融合信息,可由 `memory` 中正/负反馈向量构造 `build_user_vector`(正样本均值 − 负样本均值) ### 2.3 特点小结 | 项目 | 说明 | |------|------| | 可学习投影 | **无**(不打分路径上不使用 `PreferenceEncoder`) | | 训练 Triplet | 配置为关闭;实验中与排序相关的核心对比是「向量余弦 + 置信度融合」 | | 特征级显式偏好 | **无**(不按 POI 类型集合 liked/disliked 再乘权重) | ### 2.4 代码锚点 - 融合与打分封装:`src/preference/scorer.py` → `score_patterns(..., model=None, alpha=...)` - 流水线中当不走 `learner` 融合分支时:`src/controller/manager.py` 调用 `score_with_preference`(即 `scorer.score_patterns`) --- ## 三、方法 2:Contrastive(对比学习) ### 3.1 配置文件 - 路径:`config/config_contrastive.yaml` - 关键项: - `stage3.use_contrastive: true` — 启用 **PreferenceEncoder**,用 **Triplet / Cosine Triplet** 等损失在反馈上训练 - `stage3.model_save_path` 指向独立权重文件,例如 `./models/preference_encoder_contrastive.pth` ### 3.2 原理说明 在基线同样的「用户向量 + 模式嵌入」之上,将模式向量与用户向量先通过 **可学习的 `PreferenceEncoder`**(`src/embedding/encoder.py` 中与训练器绑定)做投影,再计算**投影后向量之间的余弦相似度**作为 `preference_score`(见 `scorer.score_with_model`),最后仍与 `confidence` 按同一 \(\alpha\) 融合: \[ \text{final\_score} = \alpha \cdot \text{sim}\bigl(f_\theta(p), f_\theta(u)\bigr) + (1-\alpha) \cdot \text{confidence} \] 其中 \(f_\theta\) 为 `PreferenceEncoder`,\(\theta\) 由用户反馈构造的 triplet 数据训练(`src/learning/trainer.py`、`dataset.py`)。 直观上:对比学习把「用户觉得好/不好」的反馈信号编码进投影空间,使**与用户偏好一致的模式**在空间中更近,从而比纯余弦基线更有**判别力**。 ### 3.3 特点小结 | 项目 | 说明 | |------|------| | 可学习投影 | **有**(`PreferenceEncoder`) | | 训练 | 需反馈样本;实验迭代中随 `next_iteration` 等更新记忆后可触发训练逻辑(以实际 `PipelineManager` / trainer 状态为准) | | 特征级显式偏好 | **无**(与基线相同,不显式乘 liked/disliked 特征权重) | ### 3.4 代码锚点 - 打分:`src/preference/scorer.py` → `score_with_model`、`score_patterns(..., model=self.manager.trainer.model, ...)` - 实验评估:`src/experiment/evaluator.py` → `_score_patterns_with_manager` 在 `stage3_use_contrastive` 且 `trainer.model` 可用时使用对比模型 --- ## 四、方法 3:Preference-Weighted(偏好加权,`config_preference_weighted.yaml`) ### 4.1 配置文件 - 路径:`config/config_preference_weighted.yaml` - 关键项: - `stage3.use_contrastive: false` — **不使用**对比学习投影网络参与上述 `score_patterns` 主路径(与基线一致,仍为余弦类偏好分 + 置信度融合) - `stage3.use_preference_weighted: true` — 在 **`PreferenceLearner`** 打分路径上启用**特征级乘性权重** 配置注释中将其归为「2025 风格」:**在语义相似度之外,用显式的喜欢/不喜欢 POI 类型集合对分数做自适应缩放**,与「多维用户偏好自适应融合」的叙事一致(实现上简化为相似度 × 特征权重)。 ### 4.2 原理说明(核心公式) 对模式 \(P\),其特征列表为 \(\text{plist}\)(共现模式中出现的 POI 类型)。设用户显式偏好来自 `memory` 中的 `preference_features`: - `like`:喜欢的类型集合 \(L\) - `dislike`:不喜欢的类型集合 \(D\) 先得到与基线**相同含义**的基础相似度分数 \(s\)(融合用户向量与模式嵌入的余弦相似度,或 Stage0/反馈融合路径下的 `learner` 打分中间量),再计算: \[ n_{\text{liked}} = \bigl|\{f \in \text{plist} : f \in L\}\bigr|,\quad n_{\text{disliked}} = \bigl|\{f \in \text{plist} : f \in D\}\bigr| \] \[ n = \max(|\text{plist}|,\, 1),\quad w = 1 + \frac{n_{\text{liked}} - n_{\text{disliked}}}{n} \times 0.5 \] 将 \(w\) **裁剪到 \([0.5,\,1.5]\)**,最终: \[ s_{\text{final}} = s \times w \] 含义简述: - 模式中命中更多「喜欢」类型、更少「不喜欢」类型 → \(w\) 偏大 → 分数上调; - 反之 → \(w\) 偏小 → 分数下调。 实验脚本在评估开始时会把模拟用户的 `liked` / `disliked` 写入记忆:`InteractionEvaluator.run()` 中调用 `memory.save_preference_features(user_id, ...)`,供上述权重使用。 ### 4.3 特点小结 | 项目 | 说明 | |------|------| | 可学习投影 | **无**(本配置关闭 `use_contrastive`) | | 特征级显式偏好 | **有**(liked/disliked 集合 × 模式内类型计数) | | 与基线关系 | 在**同一相似度 \(s\)** 上多乘 \(w\);若未设置偏好特征或 `use_preference_weighted` 为 false,则不退化时与基线一致 | ### 4.4 代码锚点 - 权重实现:`src/learning/learner.py` → `_apply_preference_weights` - 开关传入:`PipelineManager` 构造 `PreferenceLearner(..., use_preference_weighted=...)` - 实验写入特征:`src/experiment/evaluator.py` → `save_preference_features` ### 4.5 实现路径说明(实验评估 vs 交互流水线) - **`PreferenceLearner.score_patterns`**:在得到每条模式的相似度列表后,若 `use_preference_weighted` 为真且存在 `preference_features`,会调用 `_apply_preference_weights` 做 **\(s \times w\)**。该路径用于 **`PipelineManager` / `IterationManager` 等走 `learner` 打分的流程**。 - **`src/experiment/evaluator.py` 中的 `_score_patterns_with_manager`**:在**已存在融合用户向量**时,当前实现直接调用 `preference.scorer.score_patterns`(余弦 + \(\alpha\)·置信度),**不经过** `_apply_preference_weights`。因此若希望「第三种方法」在**数值评估循环**中与「特征加权」定义严格一致,需要在评估器侧显式对齐(例如在打分后对列表乘以 \(w\),或改为统一调用 `learner.score_patterns`)。论文中描述第三种方法时,建议以 **`PreferenceLearner` + `_apply_preference_weights` 的公式**为准,并说明评估脚本是否已与之对齐。 --- ## 五、三种方法对照表 | 维度 | Baseline | Contrastive | Preference-Weighted | |------|----------|-------------|---------------------| | 配置文件 | `config_baseline.yaml` | `config_contrastive.yaml` | `config_preference_weighted.yaml` | | `use_contrastive` | `false` | `true` | `false` | | `use_preference_weighted` | `false`(默认) | `false`(默认) | `true` | | 偏好分主要形式 | 余弦 + 与 confidence 融合 | 经 `PreferenceEncoder` 投影后余弦 + 与 confidence 融合 | 与基线相同的相似度定义下,**再 × 特征权重 \(w\)**(在 `learner` 路径) | | 是否训练 `PreferenceEncoder` | 否(本对比意义下) | 是 | 否 | | 显式 liked/disliked 特征 | 否 | 否 | 是(实验里由模拟器写入) | --- ## 六、与置信度融合参数 \(\alpha\) 三种配置的 `stage3.alpha` 在对比实验中通常一致(如 **0.7**),含义均为: \[ \text{final} = \alpha \cdot \text{preference\_score} + (1-\alpha) \cdot \text{confidence} \] (见 `src/preference/scorer.py` 中 `score_patterns`。) **Preference-Weighted** 若在 `learner` 路径先得到 \(s\) 再乘 \(w\),则参与上式的是加权后的分数(具体以调用链是否先融合 confidence 为准;当前 `scorer.score_patterns` 是对 preference 与 confidence 融合,而 `learner._apply_preference_weights` 作用于 `learner` 内部的相似度列表——两套入口略有不同,撰写论文时建议固定「一种入口」并引用对应代码。) --- ## 七、如何运行与绘图(备忘) ```bash # 三路对比(项目根目录) python run_experiment.py \ --baseline-config config/config_baseline.yaml \ --contrastive-config config/config_contrastive.yaml \ --preference-weighted-config config/config_preference_weighted.yaml \ --output-dir results # 绘图(含第三条曲线) python run_plotter.py \ --preference-weighted results/metrics_preference_weighted.json \ --output results/learning_curve.png ``` 更简说明见同目录:`对比算法说明.md`。 --- ## 八、参考文献(配置注释中的 2025 工作) - *Personalized region of interest recommendation through adaptive fusion of multi-dimensional user preferences* — 项目内将「多维偏好自适应融合」简化为 **语义相似度 + 特征级 liked/disliked 权重**,用于共现模式排序的第三种对比设置。 --- *文档版本:与仓库 `config/*.yaml`、`src/preference/scorer.py`、`src/learning/learner.py`、`src/experiment/evaluator.py` 实现一致;若后续修改评估器打分路径,请同步更新第四节 4.5。*