简介:OCR裁判对生成汉字只给“对/错”二元打分,错一笔与错半边的惩罚完全相同,导致模型学不到改进方向。本文从汉字二维积木结构出发,分析黑箱式OCR评估的失真机制与假阳性问题,并给出可落地的分级评分思路:拆解偏旁部首与空间关系,按结构、笔画、部件维度分档给分,让生成模型获得有梯度的训练信号。
在图像生成模型的后期训练中,强化学习是提升输出质量的常见手段。而强化学习要运转起来,离不开一个“裁判”角色——它负责给模型生成的样本打分,告诉模型这次生成得好还是不好。在文字渲染类任务里,这个裁判通常由 OCR(光学字符识别)模型担任。
OCR 的工作方式本身并不复杂:把生成图片中对应的文字区域截取出来,识别成计算机可读的文本,再与目标文字逐字比对,一致则给分,不一致则不给分。这套逻辑在拉丁字母体系下基本够用,因为英文的最小单位就是 26 个字母,单词由字母线性排列组合而成,错一个字母就是明确的局部错误。
但汉字不是线性结构。汉字是一种二维的“积木”系统:一个字符往往由若干偏旁部首按照左右、上下、包围等空间关系拼装而成。例如左右结构的字由两个部件横向排布,上下结构的字由两个部件纵向叠放。这种由部件及其空间关系构成的组织方式,可以称为汉字的“构型”。构型的核心在于:字符不是原子单位,而是有内部结构的组合体。
问题恰恰出在这里。当 OCR 面对一个结构复杂的汉字时,它并不理解内部构造,而是把整个字符当作一个不可拆分的整体来匹配。一旦字形出现任何偏差——写错一笔、错一个部件、空间关系错位——OCR 往往直接判定为“不认识”,输出一个形近字或者干脆放弃识别。无论偏差是轻微的还是严重的,裁判给出的分数都一样:零分。
这就好比批改一份满分 100 分的试卷,学生错一道题和错九十道题得到的分数完全相同,都是零分。这样的信号无法告诉模型“你哪里需要改进”,模型也就无从学习优化的方向。
强化学习的核心在于利用奖励信号的差异来调整策略。如果一批生成样本无论质量高低都得到相同的零分,那么策略梯度就失去了方向性。模型无法区分“只错了一个部件的样本”和“结构完全崩坏的样本”,也就无法朝着“少错一点”的中间状态前进。二元评分抹平了错误程度,等于抹平了学习路径。
一个更隐蔽的问题是多模态大模型的“脑补”能力。当生成图中某个汉字的构型出现错误时,专用 OCR 模型会如实判定为不认识并给零分;但换成具备上下文理解能力的多模态模型去识别,它可能结合句子语境“猜”出原本想写的字,从而给出满分。
这实际上是一个假阳性:图上那个字形明明是错的,模型只是依靠语言能力蒙对了答案。用这样的裁判做强化学习,等于在奖励“写错但能被猜对”的样本,反而会鼓励模型弱化字形精度、依赖上下文兜底。
还有一类专门检测错字的工具,能够较准确地判断某个字符的结构存在问题。但它们的处理方式是把整个字符标记为一个异常符号,同样直接给零分。这类方法虽然不会被语言先验误导,但依然是非黑即白的判断:要么对,要么错,中间没有灰色地带。
然而汉字的错误本来就有程度之分:少一横、多一撇、部件位置颠倒、部件缺失、整体结构崩坏,这些错误的严重性显然不在同一量级。评估体系如果不能表达这种程度差异,就无法为模型提供精细的改进信号。
要解决上述问题,核心思路是把评估粒度从“整个字符”下放到“字符内部结构”。具体来说,可以把一个汉字的评估拆成三个维度。
第一步是判断目标字符由哪些部件构成,并检查生成字形中这些部件是否齐全、是否正确。例如一个左右结构的字,左侧部件和右侧部件是否都出现了,各自的形态是否接近正确写法。部件级别的比对可以用部件识别模型或模板匹配完成,输出的是“部件缺失/部件错误/部件正确”这样的分档结果。
部件齐全不等于结构正确。左右、上下、包围等空间关系同样关键。两个部件都写对了,但位置颠倒或比例严重失调,字符依然是错的。这一维度可以通过检测部件包围框的相对位置、面积比例、重叠程度来量化,输出“关系正确/关系偏移/关系崩坏”等档位。
在部件和空间关系都正确的前提下,还可以进一步考察笔画层面的偏差,例如某一笔过长、过短、缺失或多余。笔画级评估对细粒度优化的价值最大,因为它能指出“差一点点”的中间状态,而这正是二元评分最缺失的区间。
将上述维度组合起来,可以设计一个分档的评分函数,而不是单一的对错判定。示意性逻辑如下:
def score_char(generated, target):parts_score = compare_parts(generated, target) # 0 / 0.5 / 1layout_score = compare_layout(generated, target) # 0 / 0.5 / 1stroke_score = compare_strokes(generated, target) # 0 / 0.5 / 1# 加权组合,突出结构正确性的优先级return 0.5 * parts_score + 0.3 * layout_score + 0.2 * stroke_score
这样,一个“部件齐全但位置略偏”的样本会得到高于“部件缺失”样本的分数,一个“笔画略有偏差”的样本又会得到更高分。奖励信号从此有了梯度,模型能够沿着“部件补齐 → 关系摆正 → 笔画精修”的路径逐步优化。
第一,裁判模型本身需要校准。分级评分依赖部件识别与空间关系检测的准确性,如果裁判自身误判率高,梯度信号同样会失真。建议在训练前用带标注的错字样本集对裁判做一致性评估。
第二,避免奖励漏洞。分级评分引入了更多档位,也意味着模型可能找到“刷分”捷径,例如通过堆叠部件换取部件分而忽视整体结构。加权设计时应确保整体结构正确性的权重足够高,并定期用人工抽检校准。
第三,与语言先验解耦。评估阶段应尽量使用不依赖上下文的字形比对,避免多模态模型的“脑补”干扰评分。上下文信息可以用于其他训练目标,但不应混入字形正确性的裁判逻辑。
第四,评分粒度可按任务调整。如果训练目标是整体排版与可读性,部件级和关系级评分权重可以更高;如果目标是书法风格或精细字形还原,笔画级评分应占更大比重。
把汉字当作不可拆分的黑箱来评估,是当前文字生成训练中一个容易被忽视却影响深远的问题。二元评分带来的梯度消失、假阳性和非黑即白的判定,都会让模型失去精细优化的方向。将汉字还原为“部件 + 空间关系 + 笔画”的构型结构,并据此设计分档评分,能够为强化学习提供有梯度、可解释的奖励信号。评估粒度的下放,本质上是对汉字本身结构的尊重——只有裁判看得懂结构,模型才学得会结构。