Prompt - 1 二、在大标注集上寻参 我以前经过过一轮调参,是基于54个评测样本(queries.txt),过程中发现的最优的参数是这一组: 0.641241 {'es_bias': '7.214', 'es_exponent': '0.2025', 'text_bias': '4.0', 'text_exponent': '1.584', 'text_translation_weight': '1.4441', 'knn_text_weight': '0.1', 'knn_image_weight': '5.6232', 'knn_tie_breaker': '0.021', 'knn_bias': '0.0019', 'knn_exponent': '11.8477', 'knn_text_bias': '2.3125', 'knn_text_exponent': '1.1547', 'knn_image_bias': '0.9641', 'knn_image_exponent': '5.8671'} 这一组参数分布比较极端,text_bias太大(文本项得分事0~1的,加上4被稀释的很大),图片的exponent太大,不过在这个数据集上面确实是最好的,我觉得有过拟合的可能,因此要扩大数据集,先扩展标注集,然后使用扩展的标注集,继续进行寻参。 因此新建了一个标注集合,标注任务也已经完成:Clothing Filtered 771。请启动寻参任务,把任务跑起来,以后等程序跑完了应该能拿到寻参结果,下次你可以结合程序执行的结果进行结论分析。 至于调参方式,请参考以前的一轮调参: 我当时的调参需求: 请对coarse_rank fusion公式进行调参: 目前的baseline是这一组,Primary_Metric_Score: 0.637642: coarse_rank: ... fusion: es_bias: 10.0 es_exponent: 0.05 text_bias: 0.1 text_exponent: 0.35 text_translation_weight: 1.0 knn_text_weight: 1.0 knn_image_weight: 2.0 knn_tie_breaker: 0.3 knn_bias: 0.2 knn_exponent: 5.6 knn_text_bias: 0.2 knn_text_exponent: 0.0 knn_image_bias: 0.2 knn_image_exponent: 0.0 评估指标在/data/saas-search/artifacts/search_evaluation/batch_reports/batch_20260415T150754Z_00b6a8aa3d.md 请以这个为基准,发散思维,进行宽一点的范围调参。因为每次重启、评测都需要几分钟,请写一个调参的框架,基于框架、设定好多组参数、写好脚本,每轮收集效果自动的调整参数分布(因为笛卡尔积、多种参数调参成本太高,因此考虑贝叶斯调参等方法通 过多轮迭代通过脚本自动收敛) 每次调整参数后需要重启backend (有时候重启backend后eval-web好像也挂了,如果有可以追查原因并修复) ./restart.sh backend 注意:请你调试脚本、进行一轮分析,最终要沉淀一套调参脚本,我下次可以重新跑(还是针对这组参数调参),能自动迭代(调整参数分布)、收集每组参数的指标、调优到最优的参数组合。 你当时给出的调参脚本( “种子实验 + 随机探索 + 基于历史最优分布的自适应采样”反复迭代。搜索范围已经放宽,新增了多组偏离 baseline 很远的 seed,也保留了 baseline 附近抖动,适合长时间慢慢收敛。): 长时间自动调参脚本已经配好,核心文件是: - 调参主程序:scripts/evaluation/tune_fusion.py - 宽范围搜索空间:scripts/evaluation/tuning/coarse_rank_fusion_space.yaml - 后台长跑启动脚本:scripts/evaluation/start_coarse_fusion_tuning_long.sh - 续跑脚本:scripts/evaluation/resume_coarse_fusion_tuning_long.sh - 使用说明:scripts/evaluation/tuning/README.md 直接启动一轮: ./scripts/evaluation/start_coarse_fusion_tuning_long.sh 如果想跑更久一点: MAX_EVALS=48 BATCH_SIZE=3 CANDIDATE_POOL_SIZE=512 RUN_NAME=coarse_fusion_long_001 \ ./scripts/evaluation/start_coarse_fusion_tuning_long.sh 看日志: tail -f artifacts/search_evaluation/tuning_launches/.log 看结果目录: ls artifacts/search_evaluation/tuning_runs// 续跑: ./scripts/evaluation/resume_coarse_fusion_tuning_long.sh 每轮会自动做这些事: - 生成一批候选 coarse_rank.fusion 参数 - 写入配置并重启 backend - 检查 eval-web,必要时自愈拉起 - 跑评测并收集 Primary_Metric_Score - 更新 trials.jsonl、leaderboard.csv、summary.md - 基于历史结果调整下一轮采样分布 上面只是历史的寻参任务的参考。现在请你使用新的数据集来进行寻参。 要注意的是这个数据集比较大,因此每一轮行参任务耗时会比较长,进行大范围的精细的搜索不太可取。考虑仔细分析上次寻参的结果,在已有成果上,进行精细搜索,如果已有成果还不太够,可以在小数据集上进行粗搜,然后再到大数据集上寻参。 Response - 1 跑完了,这个 `run_dir` 已经完成,没有在继续运行的调参进程。 结果目录: - [summary.md](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/summary.md) - [leaderboard.csv](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/leaderboard.csv) - [trials.jsonl](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/trials.jsonl) **结论** 1. 这轮 18 个 live eval 全部跑满了。 见 [summary.md](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/summary.md:11) 2. 大集 `clothing_top771` 上,最优仍然是 fusion-only baseline,`Primary_Metric_Score=0.487476`。 见 [summary.md](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/summary.md:17) 3. 这轮优化器已经很接近 baseline,但没有超过。 最接近的是: - `bo_012 = 0.485027` - `bo_018 = 0.484691` - `bo_013 = 0.483849` 与 baseline 的差距分别是 `-0.002449`、`-0.002785`、`-0.003627` 4. 小集上那种“极端参数”没有迁移成功。 典型例子: - `seed_low_knn_global = 0.447485` - `seed_legacy_bo340 = 0.477537` - `seed_bigset_text_stable = 0.449802` 说明大集不支持此前那类明显更激进的形态。 **怎么解读这轮** 这轮最重要的收获不是“找到新最优”,而是把大集上的有效区间摸清了。 大集上表现较好的候选,虽然具体值不同,但有几个共同点: 1. `text_bias` 普遍很低。 排名前几的候选大多在 `0.02 ~ 0.10` 附近,baseline 的 `0.1` 并不吃亏。 这和小集里 `text_bias=4.0` 的方向明显相反。 2. `es_exponent` 往往比 baseline 更高。 baseline 是 `0.05`,而靠前候选很多在 `0.15 ~ 0.28`。 这说明大集上 lexical 这一路适度增强是有价值的,但提升幅度还不足以抵消其它项的副作用。 3. `text_translation_weight` 往往高于 baseline。 靠前候选多数在 `1.3 ~ 1.7`,比 baseline 的 `1.0` 明显更高。 这是这轮最值得保留的信号之一。 4. `knn_image_weight` 可以比 baseline 更高,但不能只靠“强图像+极端非线性”硬推。 很多接近最优的点把 `knn_image_weight` 提到了 `4+`,但最终仍没超过 baseline。 说明 image 通路能帮忙,但必须和其它项配平。 5. `knn_bias` 低值是一个信号,但不是充分条件。 不少高分候选把 `knn_bias` 压得很低,甚至接近 `0`。 但单独走“低 knn_bias + 低 knn_exponent”的路线并不好,`seed_low_knn_global` 已经证伪了这一点。 6. `knn_text_exponent` 和 `knn_image_exponent` 从 `0` 放开后,能接近 baseline,但还没形成稳定优势。 靠前候选里这两个参数经常被拉高,说明它们不是完全无用;但从结果看,它们更像是“补偿项”,不是决定性增益项。 **对上次担心的过拟合,这轮能下什么判断** 可以比较明确地说: - 小集 54 条上得到的极端解,确实存在明显过拟合迹象。 - 到 771 条大集后,最稳的仍是原 baseline 一类的“温和融合”方案。 - 但是 baseline 也不是绝对最优形态,至少有两类方向值得继续缩圈: - 更高的 `es_exponent` - 更高的 `text_translation_weight` **下一轮缩圈建议** 我建议不要再做同样宽度的 14 维长跑了,信息已经够了。下一轮可以做“baseline 附近精修”。 建议缩圈到这组范围: - `es_bias: 7.5 ~ 11.5` - `es_exponent: 0.12 ~ 0.28` - `text_bias: 0.01 ~ 0.15` - `text_exponent: 0.20 ~ 0.55` - `text_translation_weight: 1.20 ~ 1.75` - `knn_text_weight: 0.75 ~ 1.35` - `knn_image_weight: 1.2 ~ 4.8` - `knn_tie_breaker: 0.18 ~ 0.32` - `knn_bias: 0.001 ~ 0.25` - `knn_exponent: 3.5 ~ 8.0` - `knn_text_bias: 0.001 ~ 0.3` - `knn_text_exponent: 0.4 ~ 1.3` - `knn_image_bias: 0.001 ~ 0.35` - `knn_image_exponent: 2.0 ~ 5.8` 如果要更激进地降成本,我建议直接冻结这几个: - `text_bias=0.1` - `knn_tie_breaker=0.24~0.30` 小范围 - `knn_text_bias` 缩很小 - `knn_image_bias` 缩很小 然后重点打这 6 个: - `es_exponent` - `text_translation_weight` - `knn_image_weight` - `knn_bias` - `knn_exponent` - `knn_text_exponent` **额外发现** 流程上还有一个问题,这轮后半段 `bo_018` 在成功前重复失败了很多次,主要是: - `build_annotation_set.py batch` 非零退出 - 少量 `restart.sh backend` 非零退出 不过守护逻辑最终还是把任务跑完了。这个从 [summary.md](/data/saas-search/artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/summary.md:30) 的 failures 和 daemon log 都能看到。说明“自动续跑”已起作用,但评测链路本身还不够干净。 如果你愿意,我下一步可以直接继续两件事里的一个: 1. 按这轮结论,给你生成一个 `clothing_top771_v2` 缩圈搜索空间并启动下一轮 2. 先处理 `build_annotation_set.py batch` 偶发失败的问题,减少下一轮长跑中的无效重试 **参数列表(4 套)** - `baseline`(top771 最优,`seed_baseline`) - `es_bias: 10.0`, `es_exponent: 0.05` - `text_bias: 0.1`, `text_exponent: 0.35`, `text_translation_weight: 1.0` - `knn_text_weight: 1.0`, `knn_image_weight: 2.0`, `knn_tie_breaker: 0.3` - `knn_bias: 0.2`, `knn_exponent: 5.6` - `knn_text_bias: 0.2`, `knn_text_exponent: 0.0` - `knn_image_bias: 0.2`, `knn_image_exponent: 0.0` - `54 条上得到的极端解`(`seed_legacy_bo234`) - `es_bias: 7.214`, `es_exponent: 0.2025` - `text_bias: 4.0`, `text_exponent: 1.584`, `text_translation_weight: 1.4441` - `knn_text_weight: 0.1`, `knn_image_weight: 5.6232`, `knn_tie_breaker: 0.021` - `knn_bias: 0.0019`, `knn_exponent: 11.8477` - `knn_text_bias: 2.3125`, `knn_text_exponent: 1.1547` - `knn_image_bias: 0.9641`, `knn_image_exponent: 5.8671` - `bo_012`(`Primary_Metric_Score=0.485027`) - `es_bias: 6.6233`, `es_exponent: 0.2377` - `text_bias: 0.049`, `text_exponent: 0.4446`, `text_translation_weight: 1.6236` - `knn_text_weight: 1.0344`, `knn_image_weight: 1.3565`, `knn_tie_breaker: 0.212` - `knn_bias: 0.0052`, `knn_exponent: 4.4639` - `knn_text_bias: 0.1148`, `knn_text_exponent: 1.0926` - `knn_image_bias: 0.0114`, `knn_image_exponent: 5.2496` - `bo_018`(`Primary_Metric_Score=0.484691`) - `es_bias: 8.8861`, `es_exponent: 0.2794` - `text_bias: 0.0189`, `text_exponent: 0.2`, `text_translation_weight: 1.7178` - `knn_text_weight: 1.7459`, `knn_image_weight: 4.2658`, `knn_tie_breaker: 0.2814` - `knn_bias: 0.001`, `knn_exponent: 1.4923` - `knn_text_bias: 4.0`, `knn_text_exponent: 0.9309` - `knn_image_bias: 0.01`, `knn_image_exponent: 5.8289` **怎么找(可复现)** - 从 `leaderboard.csv` 找(含分数+参数一行全):`artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/leaderboard.csv` - 例:`rg '^2,bo_012,' artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/leaderboard.csv` - 从 `trials.jsonl` 找(最权威,调参器实际写入的 params):`artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/trials.jsonl` - 例:`rg '\"name\": \"bo_012\"' artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/trials.jsonl` - 例:`rg '\"name\": \"seed_legacy_bo234\"' artifacts/search_evaluation/tuning_runs/coarse_fusion_clothing_top771_resilient_20260422T091650Z/trials.jsonl` **已补到 `config.yaml`** - 我已把这 4 套参数作为“注释 presets”补在 `coarse_rank.fusion` 旁边:`config/config.yaml:236` - 注意:你当前 `config/config.yaml` 里 `coarse_rank.fusion` 的生效值是 `knn_bias=0.6 / knn_exponent=0.4`,更像 `seed_low_knn_global`,不是本次大集最优的 baseline。 # request 2 固定这些参数(不再参与寻参): es_bias: 6.62, es_exponent: 0.24 text_bias: 0.05 text_exponent: 0.445, text_translation_weight: 1.0 knn_text_weight: 1.0, knn_image_weight: 1.35, knn_tie_breaker: 0.212 knn_bias: 0.0052, 然后对以下参数进行寻参: knn_exponent(0.3-6.0) knn_text_bias (0.0~0.3) knn_text_exponent (0.2 ~ 3.0) knn_image_bias (0.0~0.3) knn_image_exponent (1.0~7.0) 设计好搜参脚本后跑起来,注意程序启动起来之后要检测是否运行稳定了,确保可以长时间运行直到全部跑完