简介:文生图模型绘制汉字时常“轮廓对、细节崩”,症结往往不在生成能力,而在奖励评价的颗粒度过粗。本文剖析OCR式裁判“非黑即白”的打分缺陷与多模态裁判的假阳性风险,系统介绍基于“字—部件—笔画”层级与空间构型的结构化奖励设计思路,并给出训练流程、评估指标与工程落地建议,帮助构建真正能写对中文的图像生成方案。
如果让当前主流的文生图模型画一张带中文的海报,结果往往令人哭笑不得:乍一看版式漂亮、氛围到位,凑近一看,“某”字多了一撇,“留”字的下半部分被挤成一团,偏旁部首比例失调、空间关系错乱。整体轮廓对了,细节全崩。
这不是个别模型的偶发问题,而是文生图技术在汉字场景下的系统性短板。原因可以从三个层面理解:
要让生成质量持续提升,业界通行做法是在预训练之后引入强化学习式的后期训练:模型生成图像,由一个“裁判”打分,分数作为奖励信号驱动策略优化。在文字生成任务中,这个裁判通常由OCR(光学字符识别)模型担任。
OCR裁判的逻辑非常直接:从生成图中截取文字区域,识别一遍,与目标文本比对,认对了给高分,认错了给零分。问题恰恰出在这种“非黑即白”的打分方式上。
缺陷一:奖励信号过于稀疏。 汉字的错误天然有程度和位置之分——少写一笔、部件变形、结构错位,严重性完全不同。但在OCR裁判眼里,只要最终认不出,一律零分。这就像批改一份一百道选择题的试卷,错一道和错九十道都得零分,学生永远不知道该往哪个方向改进,模型的策略梯度也因此失去了细粒度的指引。
缺陷二:裁判自身能力不匹配。 通用OCR模型多在印刷体上训练,对生成图像中轻微的笔画扰动极其敏感,常常把略有小瑕的字直接判成“不认识”或猜成形近字,大量本应获得部分肯定的正样本被误杀。
缺陷三:换更聪明的裁判会引入假阳性。 用多模态大模型做裁判时,它会调用强大的语言先验“脑补”:看到上下文是“尴尬”,即便图中“尬”的字形明显画错了,它也会结合语境猜出正确答案并给满分。这种奖励是危险的——它等于告诉模型“字形错了没关系,只要语境能猜出来就行”,方向完全跑偏。
缺陷四:专门的错字检测工具也只是“半个解”。 还有一类技术方案能敏锐地发现图中存在异常字形,但它的输出方式是把整个字标记成一个异常符号,依旧是“对或错”的二元判断,无法给出“错在哪、错多少”的连续信号。
归纳起来:现有评价体系把汉字当成一个不可分割的整体来“看”,而汉字的本质恰恰是可分解、可组合的二维结构。评价的颗粒度,决定了生成质量的上限。
汉字构型学早已给出答案。一个汉字可以自顶向下分解为三个层级:
部件之间存在明确的空间关系约束:相对位置、大小比例、包围关系、穿插避让。所谓“写对”,就是每个部件画对了形状、摆对了位置、配对了比例。
因此,奖励函数的设计应当从“这个字认不认得出”转变为“每个部件画对没有、空间构型合理与否”。这正是结构化奖励的核心思想。
一个可落地的结构化奖励通常包含三个分量:
示意性伪代码如下:
def structured_reward(image, target_char):# 1. 部件级:目标字拆解为部件,逐一比对形状ref_parts = decompose(target_char) # 参考部件及其标准掩码gen_parts = localize_parts(image, ref_parts) # 在生成图中定位对应部件part_score = mean([shape_iou(g, r) for g, r in zip(gen_parts, ref_parts)])# 2. 构型级:位置、比例、包围关系是否合理layout_score = layout_similarity(gen_parts, ref_parts)# 3. 整字级兜底:识别完全正确才给强奖励ocr_score = 1.0 if ocr_match(image, target_char) else 0.0# 加权组合:细粒度信号为主,整字正确为确认项return 0.5 * part_score + 0.3 * layout_score + 0.2 * ocr_score
结构化奖励同样需要防范奖励劫持:
汉字之美在于结构,让AI写对汉字,也要从结构入手。这篇思路的价值不在于某个具体技巧,而在于揭示了一个通用原则:当生成任务的失败模式具有内在层级时,评价体系必须具备同等颗粒度,否则强化学习只会在一无所知的黑暗中摸索。 把“整字对错”拆解为“部件与构型的连续评分”,模型第一次真正收到了“哪里错了、差多远”的反馈,写对中文字才从偶然变成必然。