YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Diffutslator
基于扩散模型的中英互译系统。使用非自回归并行生成,通过DDIM加速推理
原理
扩散翻译的核心思想
传统翻译模型(如Transformer)是自回归的,逐token生成。扩散模型则是非自回归的,并行生成所有token:
自回归: [SOS] → [token1] → [token2] → [token3] → [EOS]
↓ ↓ ↓
扩散: 噪声 ──同时去噪──→ 完整句子(一步生成所有token)
双向翻译架构
┌─────────────────────────────────────────────────────────────────────┐
│ 噪声空间 (共享) │
│ [L × D] │
│ │
│ 中文嵌入 ──前向扩散(q_sample)──→ 噪声 ←──前向扩散── 英文嵌入 │
│ ↓ ↓ │
│ 中文去噪网络 英文去噪网络 │
│ ↓ ↓ │
│ 中文逆扩散 英文逆扩散 │
│ ↓ ↓ │
│ 中文输出 英文输出 │
└─────────────────────────────────────────────────────────────────────┘
翻译流程
以 中译英 为例:
- 编码: 中文句子 → 中文token → 中文嵌入向量
- 前向扩散: 中文嵌入添加噪声到指定时间步(或到纯噪声)
- 逆扩散去噪:
- 前半段:用中文去噪网络(保持源语言特征)
- 后半段:切换到英文去噪网络(转向目标语言)
- 解码: 最终嵌入 → 英文token → 英文句子
为什么扩散能做翻译?
扩散过程将数据逐步加噪变成纯噪声,逆扩散则从噪声恢复数据。关键洞察:
- 两种语言嵌入经过充分加噪后,在噪声空间中变得"不可区分"
- 从这个共享噪声空间出发,用不同语言的去噪路径,可以恢复到不同语言
- 类比:把中文和英文都"打散"成同样的积木,再用英文的说明书拼回去
安装
依赖
pip install torch tqdm
硬件要求
- CPU训练可用(本项目针对CPU优化)
- 内存:至少4GB
- 推荐:GPU可大幅加速
快速开始
训练
# 快速验证模式(1000条数据,5轮)
python train.py --quick
# 完整训练
python train.py
# 从检查点续训
python train.py --resume checkpoints/epoch_1.pt
训练中按 Ctrl+C 可安全中断,自动保存 checkpoints/interrupted.pt。
推理
# 中译英
python inference.py --text "你好世界" --zh
# 英译中
python inference.py --text "Hello world" --en
# 交互模式
python inference.py --interactive
详细使用
训练命令
# 基本训练
python train.py
# 快速验证(小数据集,少轮次)
python train.py --quick
# 从检查点续训
python train.py --resume checkpoints/best.pt
# 使用更多数据
python train.py --max-samples 10000
# 指定轮次和批量
python train.py --epochs 20 --batch-size 32
推理命令
# 基本推理(中译英)
python inference.py --text "今天天气很好" --zh
# 英译中
python inference.py --text "The weather is nice today" --en
# 使用DDPM(更慢但可能更准)
python inference.py --text "你好" --zh --ddpm
# 交互模式
python inference.py --interactive
# 指定检查点
python inference.py --text "你好" --zh --checkpoint checkpoints/best.pt
# 静默模式(不显示扩散过程)
python inference.py --text "你好" --zh --quiet
配置参数
模型配置 (ModelConfig)
| 参数 | 默认值 | 说明 |
|---|---|---|
d_model |
256 | 嵌入维度,影响模型容量 |
n_heads |
4 | 多头注意力头数 |
n_layers |
4 | Transformer编码器层数 |
d_ff |
512 | 前馈网络隐藏层维度 |
max_len |
128 | 最大序列长度 |
dropout |
0.1 | Dropout比率 |
vocab_size_zh |
8000 | 中文词表大小 |
vocab_size_en |
8000 | 英文词表大小 |
扩散配置 (DiffusionConfig)
| 参数 | 默认值 | 说明 |
|---|---|---|
timesteps |
1000 | 训练时的扩散总步数 |
ddim_steps |
50 | DDIM推理采样步数 |
beta_start |
0.0001 | 噪声调度起始值 |
beta_end |
0.02 | 噪声调度结束值 |
训练配置 (TrainingConfig)
| 参数 | 默认值 | 说明 |
|---|---|---|
batch_size |
64 | 批量大小 |
learning_rate |
1e-4 | 学习率 |
weight_decay |
0.01 | 权重衰减 |
warmup_steps |
500 | 学习率预热步数 |
epochs |
10 | 训练轮次 |
save_every |
1 | 每N轮保存检查点 |
数据配置 (DataConfig)
| 参数 | 默认值 | 说明 |
|---|---|---|
max_samples |
None | 最大样本数(None=全部) |
min_len |
2 | 最小句子长度 |
max_len |
128 | 最大句子长度 |
架构说明
分词器 (tokenizer.py)
使用BPE(Byte Pair Encoding)算法:
- 中文: 字符级为主,BPE处理罕见词和数字
- 英文: 标准BPE子词分割
- 词表大小:各8000 tokens
- 特殊token:
<pad>,<sos>,<eos>,<unk>,<mask>
# 示例
tokenizer_zh.encode("你好世界") # [123, 456, 789]
tokenizer_en.encode("hello world") # [234, 567]
嵌入层 (embedding.py)
class LanguageEmbedding:
token_embedding # [vocab_size, d_model]
position_embedding # [max_len, d_model]
length_embedding # [max_len, d_model]
将离散token转换为连续向量,加入位置信息。
噪声预测网络 (model.py)
class DiffusionTransformer:
"""基于Transformer的噪声预测网络"""
# 输入: x_t [batch, len, d_model], t [batch], lang [str]
# 输出: predicted_noise [batch, len, d_model]
# 结构:
# 1. 时间步嵌入 (sinusoidal)
# 2. 语言特定输入投影
# 3. N层 Transformer blocks
# 4. 语言特定输出投影
扩散过程 (diffusion.py)
# 前向扩散(加噪)
x_t, noise = diffusion.q_sample(x_0, t) # x_0 → x_t
# 反向扩散(去噪)
x_t_minus_1 = diffusion.p_sample(x_t, t, predicted_noise)
使用线性噪声调度,支持DDIM加速采样。
语言切换器 (switcher.py)
class LanguageSwitcher:
"""判断当前噪声状态更接近哪种语言"""
# 输入: x_t [batch, len, d_model]
# 输出: lang_prob [batch, 2] # [中文概率, 英文概率]
在推理时判断何时切换去噪路径。
文件结构
diffutslator/
├── config.py # 超参数配置
├── tokenizer.py # BPE分词器
├── embedding.py # 嵌入层
├── model.py # 噪声预测网络 (Transformer)
├── diffusion.py # 扩散过程 + DDIM采样
├── switcher.py # 语言切换分类器
├── dataset.py # 数据加载(流式)
├── train.py # 训练脚本
├── inference.py # 推理脚本
├── main.py # 主入口
├── utils.py # 工具函数
├── .cache/ # 分词器缓存
│ ├── tokenizer_zh.json
│ └── tokenizer_en.json
└── checkpoints/ # 模型检查点
├── best.pt
├── epoch_1.pt
└── interrupted.pt
数据集
_dataset/cveto/_dataset/tatoeba.tsv
上面是AI生成的,我到这补充一下
生成这个项目的模型是GLM-5,用iflow cli,在我的电脑上训练了九个半小时,用了2.8w条数据,权重在checkpoints下
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support