File size: 8,923 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
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# Diffutslator 实现计划

基于扩散模型的中英互译系统

## 一、架构概述

```
┌─────────────────────────────────────────────────────────────────┐
│                        噪声空间 (共享)                           │
│                          [L×D]                                   │
│              ┌─────────────────────────┐                         │
│              │                         │                         │
│    中文扩散 ↗     语言切换判断器     ↖ 英文扩散                  │
│    (加噪)          [分类器]          (加噪)                      │
│              │                         │                         │
│              └─────────────────────────┘                         │
│              ↓                         ↓                         │
│        中文逆扩散                 英文逆扩散                      │
│         (去噪)                    (去噪)                         │
│              ↓                         ↓                         │
│     ┌────────────┐            ┌────────────┐                    │
│     │ 中文解码器  │            │ 英文解码器  │                    │
│     └────────────┘            └────────────┘                    │
│           ↓                         ↓                           │
│       中文输出                  英文输出                         │
└─────────────────────────────────────────────────────────────────┘
```

### 核心设计决策

| 问题 | 决策 | 理由 |
|------|------|------|
| 扩散空间 | 词嵌入连续空间 | 实现成熟、CPU友好、训练稳定 |
| 长度处理 | 变长序列 + 长度嵌入 | 扩散可变长,逆扩散收敛到目标长度 |
| 双向切换 | 可学习分类器 | 让模型自己判断何时切换 |

## 二、模块设计

### 2.1 分词器 (tokenizer.py)

**中文分词**:字符级 + BPE
- 字符级处理中文字符
- BPE处理罕见词和数字

**英文分词**:BPE
- 使用相同的BPE算法
- 与中文共享词表大小设置

**词表**- 中文词表:8000 tokens
- 英文词表:8000 tokens
- 特殊token:`<pad>`, `<sos>`, `<eos>`, `<mask>`, `<unk>`

### 2.2 嵌入层 (embedding.py)

```python
class LanguageEmbedding:
    """语言特定的嵌入层"""
    - token_embedding: [vocab_size, d_model]
    - position_embedding: [max_len, d_model]
    - length_embedding: [max_len, d_model]  # 长度编码
```

**参数**- `d_model = 256`(CPU环境下适中)
- `max_len = 128`(最大序列长度)

### 2.3 扩散核心 (diffusion.py)

**前向扩散(加噪)**```python
def forward_diffusion(x_0, t):
    """
    x_0: 初始嵌入 [batch, len, d_model]
    t: 时间步 [batch]
    返回: x_t, noise
    """
    # 线性噪声调度
    alpha_t = 1 - t / T  # 简化调度
    noise = randn_like(x_0)
    x_t = sqrt(alpha_t) * x_0 + sqrt(1 - alpha_t) * noise
    return x_t, noise
```

**反向扩散(去噪)**```python
def reverse_diffusion(x_t, t, model):
    """
    x_t: 当前噪声状态
    t: 当前时间步
    model: 噪声预测网络
    """
    predicted_noise = model(x_t, t)
    x_t_minus_1 = denoise_step(x_t, predicted_noise, t)
    return x_t_minus_1
```

**时间调度**- 训练时:T = 1000 步
- 推理时:DDIM加速,可降到 10-50 步

### 2.4 噪声预测网络 (model.py)

```python
class DiffusionTransformer:
    """预测噪声的Transformer"""
    - 输入: x_t [batch, len, d_model], t [batch]
    - 输出: predicted_noise [batch, len, d_model]
    
    结构:
    - 语言特定的输入投影
    - 时间步嵌入 (sinusoidal)
    - N层 Transformer blocks
    - 语言特定的输出投影
```

**参数**(CPU优化):
- `n_layers = 4`
- `n_heads = 4`
- `d_ff = 512`
- 总参数量:约 2M

### 2.5 语言切换器 (switcher.py)

```python
class LanguageSwitcher:
    """判断当前噪声更接近哪种语言"""
    - 输入: x_t [batch, len, d_model]
    - 输出: 语言概率 [batch, 2]  # [中文, 英文]
    
    结构:
    - 全局平均池化
    - 2层MLP
    - Softmax输出
```

### 2.6 训练流程 (train.py)

```
训练步骤:
1. 加载中英平行句对 (zh, en)
2. 分别嵌入到连续空间
3. 随机采样时间步 t
4. 对中文嵌入做前向扩散到 t 步 → zh_t
5. 对英文嵌入做前向扩散到 t 步 → en_t
6. 训练噪声预测网络预测噪声
7. 训练切换器判断语言
8. 反向传播更新参数
```

**损失函数**```python
L_total = L_noise_zh + L_noise_en + λ * L_switcher

L_noise: 噪声预测MSE损失
L_switcher: 语言分类交叉熵损失
```

### 2.7 推理流程 (inference.py)

**中文→英文翻译**```
1. 中文输入 → 中文嵌入
2. 完整前向扩散到纯噪声 (T步)
3. 迭代反向扩散:
   for t in [T, T-1, ..., 1]:
       - 切换器判断当前语言
       - 若判断为中文→用中文去噪
       - 若判断为英文→切换到英文去噪
       - 输出当前步骤状态(可视化)
4. 最终噪声状态 → 英文解码 → 英文输出
```

**英文→中文翻译**:对称过程

## 三、文件结构

```
diffutslator/
├── TASK.md              # 任务描述
├── PLAN.md              # 本文件
├── config.py            # 超参数配置
├── tokenizer.py         # 分词器
├── embedding.py         # 嵌入层
├── model.py             # 扩散模型
├── diffusion.py         # 扩散过程
├── switcher.py          # 语言切换器
├── dataset.py           # 数据集加载
├── train.py             # 训练脚本
├── inference.py         # 推理脚本
├── main.py              # 主入口
├── utils.py             # 工具函数
└── checkpoints/         # 模型检查点
```

## 四、实现步骤

### Phase 1: 基础框架(确保可训练)

1. **配置文件** - 定义所有超参数
2. **分词器** - 实现中英文分词
3. **数据集** - 加载tatoeba数据
4. **嵌入层** - 简单的token嵌入
5. **扩散核心** - 前向和反向扩散
6. **简单模型** - 基础噪声预测网络
7. **训练脚本** - 带进度条的训练循环

**验证目标**:能在少量数据上跑通训练,loss下降

### Phase 2: 完整架构

1. **语言切换器** - 实现切换判断
2. **变长处理** - 实现长度嵌入
3. **完整模型** - 整合所有模块
4. **推理脚本** - 可视化扩散过程

**验证目标**:完整训练流程,能输出翻译结果

### Phase 3: 优化加速

1. **DDIM采样** - 减少推理步数
2. **训练加速** - 混合精度、梯度累积
3. **模型调优** - 调整超参数

**验证目标**:提升训练和推理速度,改善翻译质量

## 五、训练策略

### 快速验证模式

```bash
# 使用tatoeba前1000条数据
# batch_size=8, epochs=10
python train.py --quick --samples 1000
```

### 完整训练模式

```bash
# 使用全部数据
# 支持暂停/继续
python train.py --full
# Ctrl+C 暂停,自动保存检查点
# python train.py --resume 继续训练
```

### 训练输出

```
Epoch 1/10: 100%|████████| 125/125 [02:30<00:00, loss=0.452]
  预计剩余: 22:30 | 速度: 0.5 it/s
  最新检查点: checkpoints/model_epoch1.pt
  
按 Ctrl+C 停止训练(自动保存)
```

## 六、推理展示

```
$ python inference.py --zh "你好世界"

翻译模式: 中文 → 英文
输入: 你好世界

扩散过程:
Step 1000: [噪声状态 - 切换器: 中文 95%]
Step 900:  [噪声状态 - 切换器: 中文 78%]
Step 800:  [噪声状态 - 切换器: 中文 52%]
Step 700:  [噪声状态 - 切换器: 英文 61%] ← 语言切换!
Step 600:  [噪声状态 - 切换器: 英文 89%]
...
Step 50:   [接近完整句子 - 切换器: 英文 99%]
Step 1:    [完整句子]

输出: Hello world
```

## 七、环境适配

针对CPU环境的优化:

1. **小模型**:参数量控制在2-5M
2. **小批量**:batch_size = 4-16
3. **梯度累积**:模拟更大batch
4. **简单架构**:减少层数和维度
5. **内存优化**:及时释放中间变量

## 八、预期效果

| 指标 | 目标 |
|------|------|
| 训练速度 | 1-2 it/s (CPU) |
| 推理速度 | 1-5秒/句 (DDIM 50步) |
| 翻译质量 | 简单句子可理解 |
| 模型大小 | < 50MB |

---

*计划制定完成,待用户确认后开始实现*