8 张图、18 个标签,其中 3 个覆盖 100%(1girl、long_hair、black_hair)。 删掉共性标签加触发词之后,每张图的 caption 剩 5.2 个标签,最长一条 63 字。
上一节把图整好了。这一节给每张图配描述。 打标是 LoRA 训练里最影响结果的一步——标签写错,后面参数调得再细也救不回来。
一、打标到底在打什么
训练时模型看到的是「图 + 一段文字」,它要学的是「这段文字对应的图长什么样」。 所以标签决定了「哪部分信息被绑定到哪段文字上」。你写「1girl」,模型就把画面里的人绑到这个词; 你写「mystyle」,它就把画风绑到这个词。 如果每张图都写「1girl」,那模型会认为「这个画风必须配一个人」。 推理时你只写 mystyle,它也会硬塞一个人进来。 这就是打标的核心:让标签有区分度。不是面面俱到地描述,是只写「这张图和别的图不一样的地方」。
二、第一件事:找出每张都有的标签
Demo 的 8 张图里,1girl、long_hair、black_hair 三个标签覆盖 100%。
它们留不留,取决于你要练什么。练画风 → 删掉,因为它们描述的是「人」,不是「风格」。
练这个人 → 留着,因为你要的就是让模型记住她的黑长直。
这个判断没有标准答案,但必须有意识地做。
很多人直接拿自动打标工具的输出就训,
结果模型把「背景是白色」也当成风格的一部分——因为训练集里背景全是白的。
我的处理是删掉覆盖率 90% 以上的标签。这个阈值可以调,80% 也可以。
关键是别让「所有图都有」的东西占住触发词的位置。
三、第二件事:加触发词
触发词要挑一个底座模型原本不认识的生造词,比如 mystyle、ohwx、或者你的名字拼音加数字。
为什么不能用现成的词?
因为「水彩」这个词底座模型已经有很强的先验了,你再怎么训,也只是在原有概念上微调。
用一个生造词,等于给它一张白纸。
触发词要放在 caption 最前面。因为 CLIP 的分词有截断,靠前的位置权重最高。
这一步做完,标签库才真正变成「训练信号」:触发词负责画风,其余标签负责内容,两者分工明确。
四、第三件事:去重、排序、看字数
同一张图的标签要去重。自动打标工具经常吐出重复词,或者 long_hair 和 long hair 并存。
顺序按「触发词 → 主体 → 细节 → 动作 → 环境」排。
Demo 里我给 18 个标签分了 5 档优先级,
排完第一张的 caption 是 mystyle, school_uniform, looking_at_viewer, smile, outdoor, day。
最后看字数:最长一条 63 字,平均 5.2 个标签。
为什么要盯这个数?因为 CLIP 的分词上限是 77 个 token,超了直接截断。
按英文单词算,一条 caption 控制在 30 个词以内比较安全。
标签写太长还有个隐性代价:每个词都要和图像对齐,词太多等于每个词分到的注意力都变少,学得都不扎实。
宁可少写几个,写准的。
五、动手 Demo:打标:删共性、加触发词、按类别排序
造 8 张图的标签库(共 18 个不同标签),统计每个标签的覆盖张数; 删掉覆盖率 90% 以上的,统一加上触发词 mystyle,按五档优先级排序,输出前三张的 caption, 并算平均标签数和最长字数。
keep.sort(key=lambda w: PRI.get(w, 9))
out.append(u", ".join([trig] + keep))
if freq[t] >= N * 0.9: # 覆盖率 90% 以上的丢掉
continue
实跑输出:
--------------------------------------------------------------------
打标:把标签库整理成能用的 caption
--------------------------------------------------------------------
图片数 8 张
标签库 人工/自动标注得到的词,逗号分隔
标签 出现张数 覆盖率
------------------------------------
1girl 8 100%
black_hair 8 100%
long_hair 8 100%
day 5 62%
outdoor 5 62%
school_uniform 5 62%
indoor 3 38%
white_dress 3 38%
sitting 2 25%
smile 2 25%
standing 2 25%
bag 1 12%
book 1 12%
flower 1 12%
looking_at_viewer 1 12%
sky 1 12%
umbrella 1 12%
window 1 12%
设定的触发词 mystyle
覆盖率 100% 的标签 3 个
第一件事:找出「每张都有」的标签。上表覆盖 100% 的那几个,说明它们描述的是这个数据集里所有图共有的东西。
它们留不留,取决于你要不要模型记住它。如果想练的是「画风」,而每张都是同一个人,那 1girl 这种就该删掉——留着它等于告诉模型「这个风格必须配这个人」。如果想练的就是这个人,那就留着。
第二件事:加触发词。触发词要挑一个模型原本不认识的生造词,比如 mystyle。用它替换掉那些高频共性标签,训练时绑定到画风上,推理时一喊它就出效果。
第三件事:去重和排序。同一张图的标签要去重,顺序按「触发词 → 主体 → 细节 → 环境 → 质量词」排,
因为 CLIP 的分词有截断,超过 77 个 token 的部分直接丢掉。
第 1 张的 caption mystyle, school_uniform, looking_at_viewer, smile, outdoor, day
第 2 张的 caption mystyle, school_uniform, sitting, smile, indoor
第 3 张的 caption mystyle, white_dress, standing, outdoor, day, sky
平均标签数(删共性后) 5.2 个
最长一条的字数 63
删掉共性标签之后,每张图的描述才真正只描述它自己独特的部分。这就是打标的核心:让标签有区分度,而不是面面俱到。
覆盖率 100% 的有 3 个。这三个就是「共性标签」,是打标时第一个要处理的对象。
删掉之后平均每张剩 5.2 个标签。
这个量级比较健康——太少(1 到 2 个)描述不充分,太多(10 个以上)每个词都学不扎实。
排序的效果在 caption 里能直接看出来:mystyle 一定在第一位,然后是服装、动作、环境。
这个顺序不是美学,是给分词器服务的。
8 张图是我造的,所以频次分布很干净。
真实的自动打标工具输出会脏得多——同义词、大小写混用、拼写错误、下划线和空格混着来,得先做一轮清洗。
30 秒实验
- 把阈值从 90% 改成 60%,看会删掉哪些标签、caption 变成什么样。
- 把触发词换成「watercolor」这种现成词,想一想训练效果会有什么不同。
- 想一想:为什么触发词要放在 caption 最前面?
常见误区
- 「自动打标的结果直接用」——工具只会描述,不会替你判断哪个该删。
- 「标签越详细越好」——超 77 个 token 被截断,而且每个词都学不扎实。
- 「触发词用现成的词更方便」——现成词有强先验,会把你的风格往原概念上拉。
自测三问(点开对答案)
1. 打标的核心原则是什么? —— 让标签有区分度,只写这张图和其他图不一样的地方,而不是面面俱到。 2. 为什么触发词要用生造词? —— 生造词在底座模型里没有先验,等于一张白纸,能把画风干净地绑上去。 3. caption 为什么不能太长? —— CLIP 分词上限 77 个 token,超了被截断;而且词太多每个词分到的注意力都变少。图和数据都齐了,下一节进训练器:步数、学习率、显存这三个参数怎么定。
- ☐ (本节完,下一节 8.3.4 参数调整:设置训练模型和数据集)