文本反演 Textual Inversion:学一个新词代表概念
什么是文本反演 (Textual Inversion)
文本反演是一种轻量级模型定制技术,它不修改基础模型权重,而是在文本编码器的嵌入空间中学习一个新的“词”来代表特定概念。这个新词被映射为一个嵌入向量,能够像真实词汇一样被模型理解并使用。最简单的理解是:你给模型看几张图,让它给图中共同的核心概念“发明”一个全新的单词,之后只要你输入这个单词,模型就能生成包含该概念的全新图像。
为什么叫“反演”
常规的文本转图像过程是:文本 → 文本编码器 → 嵌入向量 → 扩散模型 → 图像。文本反演则是反过来:给定一组图像 → 找到那个能让模型生成类似图像的嵌入向量。所以是“反演”。
文本反演的核心优势
- 模型本体不变:不对UNet或其他组件微调,文件极小(通常只有几KB),不会造成灾难性遗忘。
- 风格与物体分离:可以分别学习物体外观、艺术风格、构图方式,且能自由组合。
- 即插即用:训练出的
.pt或.bin文件可直接加载到任何兼容的Stable Diffusion工作流中,像使用普通Prompt一样调用。 - 隐私与安全:适合为个人项目或敏感内容创建专属概念词,无需分享整个模型。
工作原理简述
- 准备一组代表同一个概念的图像(比如你的宠物狗、特定画风的作品)。
- 为这些图像搭配一个占位文本模板,例如
“a photo of S*”,其中S*就是待学习的“伪词”。 - 冻结扩散模型的所有参数,只随机初始化
S*的嵌入向量。 - 用这些图像进行前向扩散和去噪,计算模型预测噪声与实际噪声的损失。
- 反向传播只更新
S*的向量,使其逐渐聚拢到能正确描述图像概念的语义位置。 - 训练结束后,该向量被保存下来,它就“成了”那个新词。
本质上,文本反演是在文本编码器连续且平滑的语义空间中,通过梯度下降寻找一个最优坐标点。
动手实践:训练你的第一个Embedding
以下使用 Stable Diffusion WebUI(Automatic1111) 作为示例,这也是最广泛的实践环境。
前期准备
- 已安装并正常运行 SD WebUI
- 5-20张高质量、内容一致且变化适中的图片(太多雷同会过拟合,太少会学不充分)
- 图片建议尺寸 512×512,背景干净,多角度/多姿势有助于泛化
步骤一:预处理图片
在WebUI中进入 Train 标签页 → Preprocess images:
- 源目录:你的原始图片文件夹
- 目标目录:处理后的输出文件夹
- 勾选
Create flipped copies(水平翻转增加数据量) - 勾选
Use BLIP for caption或Use deepbooru for caption自动生成描述文本 - 执行处理后,每张图会生成同名
.txt文件,内含自动标注的描述。你需要手动检查并修改这些描述,将想要学习的概念统一用你选定的初始化词替换(习惯上用[name]或[filewords]占位,但实际训练会用到initialization text)。
关键原则:描述中与本概念无关的内容保持原样,与概念直接对应的部分用占位符替代。例如要学你的猫“Mimi”,描述可写成
“a photo of [name] cat sitting on a sofa”。
步骤二:创建Embedding并开始训练
进入 Train → Create embedding:
- Name:给Embedding起个名字,比如
my_style(系统会自动加上<和>显示) - Initialization text:初始化词,强烈建议使用一个与概念接近的已有词汇(如学狗用
“dog”,学油画风用“oil painting”),这比随机向量收敛快得多。 - Number of vectors per token:每个词占用多少个token,默认为1可满足大多数需求;复杂概念可设为2-4,但不宜过高。
创建后,切换到 Train 子标签页:
- Embedding:选择刚创建的嵌入
- Learning rate:建议
0.005或0.001,过大会破坏空间结构 - Dataset directory:指向包含图像和
.txt描述文件的文件夹 - Prompt template file:通常是
subject.txt或style.txt,根据你学的内容选择模板(WebUI自带若干模板,也可自定义) - Max steps:先用1000-3000步做实验,根据损失曲线和生成预览调整
步骤三:监控与保存
训练开始后,可以在WebUI控制台观察 loss 下降趋势。同时可设置每隔一定步数生成预览图像,检查概念是否被正确学习。当预览图中概念特征清晰且不过度嵌入背景时,即可停止训练。Embedding会自动保存为 .pt 文件,位于 embeddings 文件夹。
使用你训练的Embedding
在文生图或图生图界面,把Embedding文件名(不含扩展名)放入Prompt中即可。例如你训练了 my_cat.pt,直接输入 my_cat 就像使用普通单词一样。
高级技巧:
- 搭配负面提示排除意外元素
- 调节提示词权重:
(my_cat:1.2)增强该概念 - 可与LoRA、ControlNet等方法叠加使用
- 若学习的是风格,Prompt可写
“a landscape in the style of my_style”
常见问题与调优建议
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 生成的图与训练图几乎一样 | 学习率太高 / 步数过多 / 图片太少 | 降低LR、减少步数、增加图量及多样性 |
| 概念泛化差,换个角度就扭曲 | 训练图姿势单一、描述未覆盖变化 | 补充多角度、多光照图片,在描述中保留变化细节 |
| 学到的概念在生成时不受控制 | 初始化词选择不当,嵌入漂移 | 改用语义更接近的初始化词,适当降低学习率 |
| Loss 不下降或震荡 | 学习率不合适、描述与图片矛盾 | 检查描述准确性,优先保证“干净”的文本-图像对 |
文本反演的应用场景
- 角色一致性:为原创角色、特定人物(需合规)、宠物学习专属词
- 风格统一:将个人画风、笔触抽象成一个词,后续创作保持视觉连贯
- 产品设计:为特定商品生成多角度展示图,保持产品特征不变
- 医学术语可视化:将罕见病征、细胞形态等定义为新词,辅助科研绘图
通过文本反演,你可以在不触碰模型本体的前提下,将任意视觉概念封装进一个可传播、可堆叠的词符之中。这是个性化生成最安全、最轻量的起点。