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下