简介:文生图模型生成中文字时常“轮廓对、细节崩”,症结之一在于以OCR为核心的评测方式把汉字当成不可拆分的黑箱,只能给出非对即错的稀疏信号。本文剖析三类“裁判”的失灵模式,并给出基于部件拆解与构型建模的结构化奖励设计,帮助读者理解如何让模型在训练中明确“错在哪、该怎么改”。
让文生图模型生成一张带中文标语的海报,结果往往“乍一看挺像,凑近全崩”:多一撇、少一横、偏旁错位、部件挤压变形,整体轮廓正确而细节全面失守。这不是某一家模型的偶发缺陷,而是当前文生图技术在汉字渲染上的普遍短板。
原因可以从两个层面理解:
在基于强化学习的后训练流程(如RLHF类方法)中,需要一个奖励信号告诉模型生成得好不好。文本渲染场景常见的三类裁判,恰好暴露了三种不同方向的失灵。
OCR(光学字符识别)是让机器“认字”的通用技术,把图片中的文字转换为可计算的文本。用它做裁判的逻辑很直接:裁出文字区域识别一遍,与目标文本比对,一致给1分,不一致给0分。
问题在于,汉字的错误是一条连续谱:
这就像批改一份100道选择题的试卷,错1题和错90题得分完全相同。奖励信号极度稀疏,策略梯度几乎无从计算,模型学不到“往哪个方向优化”。
把裁判换成多模态大模型,会出现反方向的失灵。这类模型具备强语境推理能力,即便字形错误,也能结合海报上下文“猜”出本该是什么字,给出高分。这是典型的假阳性:图上字形明明是错的,裁判只是靠语言能力蒙对了。用这种信号训练,等于变相鼓励模型保留错误字形。
第三类方案是字形异常检测:判断图中文字是否为合法汉字。这类工具能可靠发现“这个字结构有问题”,且不会被语言模型的脑补欺骗,但输出方式是把整个字符标记为异常符号,仍然是整字级别的非黑即白——判得出错,说不出错在哪。
| 裁判类型 | 优点 | 缺陷 |
|---|---|---|
| OCR识别 | 判定结果客观 | 二值打分,信号稀疏 |
| 多模态大模型 | 理解上下文 | 语境脑补,假阳性 |
| 错字检测 | 不受脑补欺骗 | 只报异常,无法归因 |
三者的共同盲区:都把汉字当作不可拆分的整体,而汉字恰恰是最需要“拆开看”的文字系统。
与拼音文字的线性排列不同,汉字由部件按空间关系组合而成:
这种由偏旁部首按左右、上下、包围等空间关系组合而成的结构,术语称为构型。构型为评测提供了天然的分解路径:整字对不对,可以分解为“每个部件对不对 + 部件之间的空间关系对不对”。
沿着这条路径,可以构建一个由粗到细的分层评分体系:
示意性的评分逻辑如下:
def structure_aware_reward(glyph_img, target_char):# 1. 整字级:OCR识别,全局合法性底线ocr_score = 1.0 if ocr(glyph_img) == target_char else 0.0# 2. 部件级:拆解为部件并比对pred_parts = component_parser(glyph_img) # 生成字的部件集合gold_parts = decompose(target_char) # 目标字的标准部件集合part_score = jaccard(pred_parts, gold_parts)# 3. 结构级:部件空间关系比对pred_layout = layout_parser(glyph_img) # 结构类型 + 部件位置框gold_layout = layout_of(target_char)layout_score = layout_similarity(pred_layout, gold_layout)# 4. 加权融合,得到稠密奖励return 0.3 * ocr_score + 0.4 * part_score + 0.3 * layout_score
在这个设计下,奖励从两极离散值变成了随错误程度连续变化的信号:
稀疏奖励重新变得稠密,策略梯度得以有效回传,模型终于能“感知到进步的方向”。
结构化评测的另一个核心价值是归因能力。奖励不再只是一个分数,而是一份诊断报告:哪个部件缺失、哪个部件形态扭曲、部件间距是否失衡。把这些信息接入训练管线,例如用于构造更精细的优势估计、或筛选针对性难例做数据增广,模型就能“哪里不会练哪里”,而不是盲目重试。
汉字渲染的失败,表面看是生成能力问题,深层看是评测粒度问题。当裁判只会说“对”或“错”,模型就只能盲人摸象;把汉字按构型拆开,让每一笔、每一个部件的错误都能被看见、被量化,训练才有明确的航向。对任何涉及“图像中精确渲染结构化内容”的场景,这种“拆开看”的评测思维都值得借鉴。