浏览器扩展 UnBlur 的目标很直接:为每篇新闻文章打三个分——点击诱饵指数、政治倾向偏向和情绪倾向。同一件事在不同媒体上可能被包装得截然不同,这个扩展要做的就是把光谱两端的报道方式都亮出来,让你一眼看清。 按照最直观的思路,这个任务可以拆成三个独立的小模型:训练一个识别点击诱饵的,一个判断政治倾向的,再加一个分析情绪的。三个模型各训各的,逻辑上并没有什么大错。可一旦真正部署到一台只用 CPU 推理的免费层机器上,两个绕不开的成本就立刻浮出水面。 第一个成本是内存占用。加载模型本身就不轻巧。一个 ModernBERT 量级的主干网络从磁盘读到内存里要花好几秒,并且在整个进程生命周期里一直占据着那块内存。如果搞出三个互相独立的模型,就意味着每个请求到来时,三个一模一样的主干副本需要在内存里同时待命。在一个没有 GPU、纯靠 CPU 推理的小盒子上,这种重复占用会迅速蚕食所有空闲内存,带来的不仅是响应变慢,还有系统崩溃的风险。 第二个成本藏得更深,也更反直觉:三个任务其实根本不是真正独立的。点击诱饵和政治倾向怎么表达出来的?它们都长在标题的遣词造句里,而不是单纯由话题本身决定。一个只盯着点击诱饵标签训练的模型,没有任何动力去学会识别跟政治倾向有关的线索,哪怕那些线索和点击诱饵用的是同一套字面上的招数。但一个真人读者在看同一个新闻标题时,会自然而然地把这两层信息一起吸收。把它们拆成三个模型分别训练,相当于白白扔掉了一大块本来能提升准确率的共有信号——三个模型各学各的,那些横跨任务的关联特征就被硬生生切断了。 既然分开训练有这么多麻烦,不如反过来,让一个模型同时处理三种分类。 方案的核心是一个共享的主干网络,外加三个轻量级的分类头。主干部分选的是 answerdotai 团队放出的 ModernBERT-base,上面分别挂着三个结构一模一样的头:每个头走的是 Dropout → Linear(768 到 256) → ReLU → Dropout → Linear(256 到类别数) 这条小流水线。多加两个头几乎不增加参数总量,因为真正吃资源的部分——那个主干——是被三个任务一起复用的。 选 ModernBERT 而不是随便一个标准 BERT,这个决定是算过总账的。它的注意力机制是交替切换的:一部分层做局部注意力,只在相邻 token 之间跳;另一部分层做全局注意力,跨整条序列拉远距离依赖。这种设计让它在只用 CPU 推理的时候,比同尺寸的标准 BERT 明显快一截。再加上 RoPE 旋转位置编码带来的 512 个 token 高效窗口,每当你调用 /analyze 接口,它都得实时跑一次前向计算,而不是离线批量打分,这种推理速度的差异直接决定了扩展的可用性——用户当然不愿意点一下按钮等上好几秒才看到结果。 但把三个任务的损失信号一股脑甩给同一个主干,从零开始一起训,有一个典型的翻车方式:哪个任务的数据量最大、噪声最多,它就很容易在训练早期抢走梯度的方向盘,把共享表征拉偏,拖垮其他两个任务的表现。为了避免这种互相踩脚的情况,训练被拆成了两个严格按顺序执行的阶段。 第一阶段叫独立阶段。每个分类头都带上主干一起,单独拿自己的任务数据训一遍。也就是说,先用点击诱饵的数据让整个模型学会辨认新闻标题里的夸张套路;再用政治倾向数据让同一个模型去抓取左右光谱上的措辞特征;最后用情绪数据进一步打磨它对文本语气变化的敏感度。一个个任务轮流过,确保主干网络在这些分类信号一股脑涌上来之前,已经对新闻文本的整体结构有了扎实的适应性。 第二阶段才是联合微调。三个头全部接到骨架上,同时接收来自三个任务的损失信号,但学习率砍掉一半。这样共享主干的参数就能从三路梯度里均匀地吸收信息,而不是被某一单方面的梯度牵着鼻子走。独立阶段已经为每个任务打好了专属的底子,联合阶段就是让它们在这块共享地基上互相借力——点击诱饵识别帮忙强化政治倾向分类对标题措辞的注意力,反过来,倾向分析学到的结构化表达也在帮点击诱饵模型排除掉那些纯属话题热度而非真正诱饵的噪音。 这套“先独立再联合”的策略,最终让一个模型同时输出三个维度的判断,既省下了宝贵的内存,又把本应共享的语言信号重新聚合在了一起。在一个运行在免费层的小型推理服务上,这可能是最务实的做法了。
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.