minimind/course/notes/08_model_architecture_notes.md

83 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 第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 检查