🧠 第八章 神经网络训练
📄 一句话概括

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 秒实验

  1. 把阈值从 90% 改成 60%,看会删掉哪些标签、caption 变成什么样。
  2. 把触发词换成「watercolor」这种现成词,想一想训练效果会有什么不同。
  3. 想一想:为什么触发词要放在 caption 最前面?

常见误区

  1. 「自动打标的结果直接用」——工具只会描述,不会替你判断哪个该删。
  2. 「标签越详细越好」——超 77 个 token 被截断,而且每个词都学不扎实。
  3. 「触发词用现成的词更方便」——现成词有强先验,会把你的风格往原概念上拉。
自测三问(点开对答案) 1. 打标的核心原则是什么? —— 让标签有区分度,只写这张图和其他图不一样的地方,而不是面面俱到。 2. 为什么触发词要用生造词? —— 生造词在底座模型里没有先验,等于一张白纸,能把画风干净地绑上去。 3. caption 为什么不能太长? —— CLIP 分词上限 77 个 token,超了被截断;而且词太多每个词分到的注意力都变少。

图和数据都齐了,下一节进训练器:步数、学习率、显存这三个参数怎么定。

相关笔记