83 lines
2.3 KiB
Markdown
83 lines
2.3 KiB
Markdown
# 第8节:MiniMindForCausalLM 模型结构
|
||
|
||
> 模型类核心机制笔记
|
||
|
||
---
|
||
|
||
## 📚 本节目录
|
||
|
||
1. [_tied_weights_keys 和 weight = weight 是否重复?](#1-tied_weights_keys-和-weight-weight-是否重复)
|
||
2. [self.post_init() 是干什么的?](#2-selfpost_init-是干什么的)
|
||
3. [超短记忆版](#超短记忆版考试面试级)
|
||
|
||
---
|
||
|
||
## 1. _tied_weights_keys 和 weight = weight 是否重复?
|
||
|
||
**结论**:不是重复,而是"真实共享 + 框架声明"两层机制
|
||
|
||
### (1) 真正起作用的是这一句(PyTorch 层)
|
||
|
||
```python
|
||
self.model.embed_tokens.weight = self.lm_head.weight
|
||
```
|
||
|
||
**作用**:
|
||
- 两个参数指向同一块内存
|
||
- 真正实现"权重共享"
|
||
- forward + backward 都共享梯度
|
||
|
||
**本质**:计算图层面的绑定(真实共享)
|
||
|
||
### (2) _tied_weights_keys(HF 框架层)
|
||
|
||
```python
|
||
_tied_weights_keys = {"lm_head.weight": "model.embed_tokens.weight"}
|
||
```
|
||
|
||
**作用**:告诉 HuggingFace 这两个权重是 tied 的
|
||
|
||
**用于**:
|
||
- `save_pretrained`(避免重复存储)
|
||
- `from_pretrained`(恢复绑定关系)
|
||
- `state_dict` 管理
|
||
|
||
### 总结
|
||
|
||
| 层级 | 代码 | 作用 |
|
||
|------|------|------|
|
||
| PyTorch 层 | `weight = weight` | 真的共享参数 |
|
||
| HF 框架层 | `_tied_weights_keys` | 框架识别共享关系(存储/加载) |
|
||
|
||
---
|
||
|
||
## 2. self.post_init() 是干什么的?
|
||
|
||
**一句话版本**:模型构建完成后的"框架统一初始化 + 校验 + 补全步骤"
|
||
|
||
### 它主要做 4 件事:
|
||
|
||
| 序号 | 作用 | 说明 |
|
||
|------|------|------|
|
||
| (1) | 权重初始化收尾 | Linear / Embedding 初始化补全,`_init_weights()` 可能在这里被调用 |
|
||
| (2) | 检查/补齐 weight tying | 确认 embedding 和 lm_head 是否真的 tied,没绑定可能自动修复 |
|
||
| (3) | dtype / device 统一 | float32 / float16 对齐,meta tensor 修正,device consistency |
|
||
| (4) | config 驱动初始化逻辑 | `initializer_range`、`tie_word_embeddings` 等配置 |
|
||
|
||
### 一句话总结
|
||
|
||
`post_init()` = HF 在模型构建结束后做的"最后一次统一初始化 + 校验 + 修正"
|
||
|
||
---
|
||
|
||
## 超短记忆版(考试/面试级)
|
||
|
||
### tied weights
|
||
|
||
- `weight = weight` → 真正共享参数(计算图层)
|
||
- `_tied_weights_keys` → 框架识别共享关系(存储/加载层)
|
||
|
||
### post_init
|
||
|
||
- 模型构建完成后的统一收尾步骤:初始化 + 校验 + 修正 + tie 检查
|