简介:AI生成图片里的中文常常“差之毫厘”:少一笔、错半边、结构颠倒,而常用作裁判的OCR只会给出“对/错”的二值分数,既无法定位错误,也无法度量程度。本文围绕“把汉字拆成部件与空间结构、逐项打分”的细粒度评估思路展开,解析连续奖励为何能让强化学习更快收敛,并梳理工程落地的关键要点。
文生图模型近两年进步显著,画面质量、构图控制都已相当成熟,但“图里的文字”始终是块短板,而中文又是短板中的短板。常见症状包括:笔画缺漏、部首变形、部件位置颠倒、比例失衡,甚至凭空造出一个字典里不存在的“伪汉字”。
根源在于:生成模型本身并没有“字”的概念,它学习的是像素的分布规律。要让模型主动写对字,业界通行做法是在基础训练之后叠加后训练环节(尤其是强化学习),让模型在“生成—打分—修正”的闭环中逐步逼近正确字形。而这个闭环的效率,几乎完全取决于打分者——“裁判”——的水平。
先交代这个“裁判”在训练流程中的位置。一个典型的后训练闭环如下:
对裁判有两个基本要求:一是判断准确,不能把错的判成对的;二是信号丰富,至少要能区分“比较好”和“比较差”。OCR(光学字符识别,即让机器“认字”、把图片文字转换为计算机可读文本的技术)因为成熟、成本低、可大规模并行,成了最常被选用的裁判。
OCR裁判的打分方式简单直接:从生成图中裁出文字区域,识别一遍,将识别结果与目标文字逐字符对比——相等给分,不相等不给分。
问题恰恰出在这个“对就给分、错就不给分”上。打个比方:你在批改一份一百道选择题的试卷,但无论学生错一道题还是错九十道题,你给的分都一样,统统零分。这样的打分无法告诉学生“哪里需要改进”——对人类如此,对模型同样如此。在强化学习语境下,这叫奖励信号稀疏且无梯度方向:策略每次尝试得到的反馈都是同一个0,训练便容易陷入低效的随机试错。
而汉字,把这一缺陷放大到了极致。
英文字母本身是最小书写单位,二十六个字母按一维序列排列成词。汉字则不同,它是一种二维组合结构:偏旁部首按照左右、上下、包围等空间关系拼装成字。举例来说,“尬”由“九”和一个“龙”的变体左右排布而成;“想”由“相”与“心”上下叠放而成。这种由部件按空间关系组合的规律,通常称为汉字的构型。
组合结构意味着汉字的错误天然是分层的:
一套只输出0或1的评价体系,等于把上述四个层次的信息全部压平成单个比特。而OCR面对复杂构型时,经常要么硬猜一个形近字,要么直接放弃——无论AI生成的字是错了一笔还是错了半边,只要最终识别不出,得分一律为零。
那篇论文给了一个很直观的案例:生成图中有个“尬”字,结构写错了。让三类裁判分别评判:
三条路径殊途同归:没有一个裁判能回答“这个字错到什么程度”。
论文的关键洞察正如其主题所言——既然汉字是“部件+空间关系”的积木,评分就应该在同一粒度上进行。把这套思路抽象出来,大致分四步:
示意性伪代码如下:
def score_glyph(rendered_img, target_char):# 1. 目标侧:拆字target = decompose(target_char)# 例:"尬" -> components=["九", "龙*"], layout="left-right"# 2. 生成侧:部件检测与布局分析detected = detect_components(rendered_img)# 3. 局部得分:部件命中率 + 结构正确性s_comp = match_components(target.components, detected)s_layout = verify_layout(target.layout, detected.layout)# 4. 融合为连续分数return alpha * s_comp + beta * s_layout
效果上:部件全对但位置放错的字,得到中等分数;只写对一半部件的字,得到低分;全部正确得满分。灰色地带回来了,“批改老师”终于能说出“你错在右半边”这样的话。
把汉字从“不可拆分的黑箱”还原为“可拼装的积木”,评价粒度从整字下沉到部件与结构,奖励信号从一位比特扩展为连续刻度——这既是让AI写对中文的关键一步,也揭示了评估体系设计的一条普遍规律:想让模型学会改进,先得让裁判有能力说清楚“差在哪里、差多少”。对任何做生成模型后训练的团队而言,这个思路都值得纳入自己的奖励设计工具箱。