File size: 8,183 Bytes
2651102 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | # Diffutslator
基于扩散模型的中英互译系统。使用非自回归并行生成,通过DDIM加速推理
## 原理
### 扩散翻译的核心思想
传统翻译模型(如Transformer)是自回归的,逐token生成。扩散模型则是非自回归的,并行生成所有token:
```
自回归: [SOS] → [token1] → [token2] → [token3] → [EOS]
↓ ↓ ↓
扩散: 噪声 ──同时去噪──→ 完整句子(一步生成所有token)
```
### 双向翻译架构
```
┌─────────────────────────────────────────────────────────────────────┐
│ 噪声空间 (共享) │
│ [L × D] │
│ │
│ 中文嵌入 ──前向扩散(q_sample)──→ 噪声 ←──前向扩散── 英文嵌入 │
│ ↓ ↓ │
│ 中文去噪网络 英文去噪网络 │
│ ↓ ↓ │
│ 中文逆扩散 英文逆扩散 │
│ ↓ ↓ │
│ 中文输出 英文输出 │
└─────────────────────────────────────────────────────────────────────┘
```
### 翻译流程
以 **中译英** 为例:
1. **编码**: 中文句子 → 中文token → 中文嵌入向量
2. **前向扩散**: 中文嵌入添加噪声到指定时间步(或到纯噪声)
3. **逆扩散去噪**:
- 前半段:用中文去噪网络(保持源语言特征)
- 后半段:切换到英文去噪网络(转向目标语言)
4. **解码**: 最终嵌入 → 英文token → 英文句子
### 为什么扩散能做翻译?
扩散过程将数据逐步加噪变成纯噪声,逆扩散则从噪声恢复数据。关键洞察:
- 两种语言嵌入经过充分加噪后,在噪声空间中变得"不可区分"
- 从这个共享噪声空间出发,用不同语言的去噪路径,可以恢复到不同语言
- 类比:把中文和英文都"打散"成同样的积木,再用英文的说明书拼回去
## 安装
### 依赖
```bash
pip install torch tqdm
```
### 硬件要求
- CPU训练可用(本项目针对CPU优化)
- 内存:至少4GB
- 推荐:GPU可大幅加速
## 快速开始
### 训练
```bash
# 快速验证模式(1000条数据,5轮)
python train.py --quick
# 完整训练
python train.py
# 从检查点续训
python train.py --resume checkpoints/epoch_1.pt
```
训练中按 `Ctrl+C` 可安全中断,自动保存 `checkpoints/interrupted.pt`。
### 推理
```bash
# 中译英
python inference.py --text "你好世界" --zh
# 英译中
python inference.py --text "Hello world" --en
# 交互模式
python inference.py --interactive
```
## 详细使用
### 训练命令
```bash
# 基本训练
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
```
### 推理命令
```bash
# 基本推理(中译英)
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>`
```python
# 示例
tokenizer_zh.encode("你好世界") # [123, 456, 789]
tokenizer_en.encode("hello world") # [234, 567]
```
### 嵌入层 (embedding.py)
```python
class LanguageEmbedding:
token_embedding # [vocab_size, d_model]
position_embedding # [max_len, d_model]
length_embedding # [max_len, d_model]
```
将离散token转换为连续向量,加入位置信息。
### 噪声预测网络 (model.py)
```python
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)
```python
# 前向扩散(加噪)
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)
```python
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下 |