简介:文生图模型常把笔画复杂的汉字画得“轮廓对、细节崩”,一个重要根因是评测环节用OCR把汉字当成不可拆分的黑箱,只输出对或错的0/1分,导致强化学习后训练缺乏有效梯度。本文剖析这一缺陷的成因,介绍基于部件拆解与空间布局的结构化打分思路,给出示意性评分设计与工程落地建议。
让当前的文生图模型画一张带中文标语的海报,几乎总会遇到同一个尴尬:整体看版式漂亮、氛围到位,凑近一读,字不对了——有的多一撇,有的偏旁被挤成四不像,有的干脆整个字变成一团“像字的东西”。英文字母的渲染早已基本可用,汉字却始终是重灾区,而且笔画越多、结构越复杂的字,崩得越彻底。
技术上的原因并不难理解:
要让模型把字画对,业界通行方案是在预训练之后追加一轮强化学习式的后训练:让模型大量生成图片,由一个“裁判”对文本渲染质量打分,再用分数作为奖励更新策略。于是问题被归结为一点——裁判怎么打分。
先解释概念:OCR(光学字符识别)是让机器“认字”的通用技术,把图片中的文字转换成机器可处理的文本,与具体厂商无关。
后训练中最常用的裁判信号就是OCR识别准确率:从生成图中截出文字区域,喂给识别模型,识别结果与目标文本一致记1分,不一致记0分。这套逻辑对英文基本够用,对汉字却存在结构性缺陷:它把一个二维组合结构压缩成一个不可拆的类别标签,只输出“是/不是”,丢掉了全部中间信息。 具体表现为三类典型失效模式:
打个比方:这相当于批改一份一百道选择题的卷子,规定只要不是全对就给零分。错一道和错九十道同分,学生永远不知道该往哪里改。对强化学习而言,这样的奖励稀疏且高噪声:策略梯度方向混乱,训练低效,甚至可能催生“钻空子”行为——模型学会生成识别器容易认出、但结构上并不正确的字形。
突破点在于换一个视角看汉字。汉字不是原子化的符号,而是一套有限部件在有限空间规则下组合成的系统:
更重要的是,这套拆解不需要逐字人工标注:国际字符编码标准中有一套表意文字描述序列(IDS),用几何算符(如⿰表示左右、⿱表示上下、⿴表示包围)递归描述整字结构,配合公开字形数据,可以对绝大多数常用字建立“部件—布局”的结构化描述。
一旦接受这个视角,“整字对错”就不再是二值问题,而可以分解为两个可量化的子问题:该有的部件是否出现、形状是否正确;部件之间的空间关系是否成立。
在此基础上,评测可以从“整字识别”改造成分层打分:
示意性的奖励函数大致如下:
def structure_reward(img_crop, target_char):# 目标字的结构描述:部件集合 + 空间关系(可来自公开字形数据)ref = decompose(target_char)# 例如: {"尢": ("半包围外框", 0.4), "介": ("被包部件", 0.6)}pred = detect_components(img_crop) # 从生成图中检测/分割部件recall = part_recall(pred, ref) # 该有的部件出现了多少precision = part_precision(pred, ref) # 出现的部件有多少是对的layout = layout_distance(pred, ref) # 位置与比例偏差,越小越好ocr_ok = cropped_ocr(img_crop) == target_char # 底线:整字能否被认出return w1 * recall + w2 * precision + w3 * (1 - layout) + w4 * ocr_ok
在这种打分下,错误的“程度”终于被刻画出来:错一撇,只影响个别部件精度,扣一点分;错半边,相关部件归零但另一侧仍得分,拿部分分;整字崩坏,才接近0分。奖励从稀疏的0/1跳变,变成随错误程度单调变化的稠密信号,策略梯度方向随之清晰:先保住部件齐全,再修正布局,最后打磨笔画。
几条配套的工程要点:
对工程团队而言,这套思路并不要求推倒重来。结构化评测器本质上是一个独立的奖励服务:输入图像与目标文本,输出连续分数。无论是调用百度智能云等云平台提供的文生图与大模型服务做快速验证,还是自建训练集群做完整后训练,都可以把它作为独立服务挂进训练循环,通过消息队列与日志服务和采样、训练进程解耦,便于独立升级、灰度与回滚。
实现部件比对时,常见路径有两条:一是图像空间模板匹配,用标准字体渲染部件模板做多尺度比对,优点是实现简单,缺点是对字体风格敏感,需要覆盖多字体的模板库;二是轻量部件分类/检测模型,用合成数据(对标准字形做部件级扰动、自动生成标注)即可获得充足监督信号,泛化性更好。
这个案例的价值超出汉字本身:
汉字之美在于结构,汉字之难也在于结构。把评测的黑箱拆开,让每一撇的得失都被看见,AI才谈得上真正“写对”一个字。这既是文生图模型攻克中文渲染的关键一步,也为所有结构化生成任务的奖励设计提供了一个可复用的范式。