本项目是一个完整的自然语言处理(NLP)学习实践项目,涵盖从基础中文分词、RNN/LSTM、Transformer 到 LLM(类 LLaMA2 架构)从零实现与训练的全流程。主要使用 PyTorch 和 HuggingFace Transformers 生态。
NLP/
├── 分词.ipynb # 中文分词与文本预处理
├── rnn.ipynb # 循环神经网络(RNN)模型
├── transformer.ipynb # Transformer 模型详解
├── 迁移学习.ipynb # BERT 迁移学习实践
├── seq2seq与注意力机制案例.ipynb # Seq2Seq 与注意力机制
├── tranformer_model.py # 从零实现完整 Transformer(~500行)
├── llm_LLaMA2.py # 类 LLaMA2 架构 LLM(RMSNorm、RoPE、GQA、Flash Attention)
├── llm_pretraining_demo.py # LLM 预训练数据集与流程
├── llm_sft_demo.py # LLM 监督微调(SFT)数据集
├── llm_generate_demo.py # LLM 文本生成(Top-K、Top-P、温度采样)
├── llm训练流程实践.py # LLM 完整训练流程实践
├── prompt_builder.py # Chat/SFT 提示词构建工具
├── BPE_tokenizer.py # BPE 分词器训练
├── demo.py # HuggingFace 微调示例
├── requirements.txt # 项目依赖
├── readme.md # 项目说明文档
├── bert-base-chinese/ # BERT 中文预训练模型
├── chinese-sentiment/ # 中文情感分析模型
├── checkpoint/ # 模型检查点
├── models/ # 训练好的模型权重
├── tokenizer/ # 训练好的分词器
└── data/ # 数据集目录
中文分词与文本预处理基础
主要内容包括:
- jieba 分词:精确模式、搜索引擎模式
- 命名实体识别(NER):识别文本中的人名、地名、组织机构等实体
- One-hot 编码:使用 PyTorch 实现文本的 One-hot 编码
- Word2Vec:词向量训练(CBOW 和 Skip-gram 模型原理)
- Embedding 层:PyTorch
nn.Embedding的使用 - 文本长度规范:截断(truncation)和填充(padding)操作
- N-gram 特征:提取文本的 N-gram 特征
- TensorBoard 可视化:词向量可视化
依赖库:jieba, torch, fasttext, tensorboard
循环神经网络(RNN)模型
主要内容包括:
- RNN 基础:模型结构、计算过程、参数说明
- RNN API:PyTorch
nn.RNN的使用方法 - LSTM 模型:长短期记忆网络原理与实现
- Bi-LSTM:双向 LSTM 模型
- 人名分类器案例:字符级文本处理、序列 padding、模型训练与评估
依赖库:torch, pandas, numpy
Transformer 模型详解
涵盖 Transformer 核心组件:
- Self-Attention 机制:Scaled Dot-Product Attention 原理
- Multi-Head Attention:多头注意力的实现
- Positional Encoding:位置编码的原理与多种实现方式
- Encoder-Decoder 架构:完整的编码器-解码器结构
- Layer Normalization:层归一化
- 残差连接与 FFN:残差连接和前馈网络
BERT 迁移学习实践
主要内容包括:
- BERT 模型加载:使用 HuggingFace 加载预训练 BERT
- Feature Extraction:提取 BERT 特征向量
- Fill-Mask 任务:完形填空任务实践
- 下游任务微调:在特定任务上微调 BERT
Seq2Seq 与注意力机制
主要内容包括:
- Encoder-Decoder 框架:序列到序列模型架构
- 注意力机制:Bahdanau Attention / Luong Attention 实现
- 机器翻译案例:完整的翻译任务实践
- Beam Search:束搜索解码策略
从零实现完整 Transformer(约 500 行)
纯 PyTorch 实现,包含:
ModelArgs:模型参数配置类MultiheadAttention:多头注意力(支持因果掩码)LayerNorm:层归一化MLP:前馈网络(SwiGLU 激活)PositionEncoding:正弦位置编码EncoderLayer/Encoder:编码器层和编码器DecoderLayer/Decoder:解码器层和解码器Transformer:完整的 Transformer 模型(支持训练和推理)
类 LLaMA2 架构 LLM 从零实现(约 570 行)
从零实现现代 LLM 的核心组件:
ModelConfig:模型配置(维度、层数、注意力头数、KV 头数、词表大小等)RMSNorm:RMS 归一化(替代 LayerNorm,更高效)Attention:分组查询注意力(GQA, Grouped Query Attention) + KV CacheRotary Position Embedding (RoPE):旋转位置编码,支持任意长度扩展MLP:SwiGLU 激活的前馈网络DecoderLayer:解码器层(Pre-Norm 架构)Transformer:完整 LLM 模型,支持自回归生成generate():自回归文本生成(支持 Top-K 采样)eval_tokenizer():分词器评估工具
LLM 预训练流程
实现预训练的核心数据流:
Pretraindataset:预训练数据集类,构建输入-标签对(next-token prediction)eval_on_valid_set():验证集评估函数- 数据加载与批处理
LLM 监督微调(SFT)流程
实现指令微调的数据处理:
SFTDataset:SFT 数据集类,支持 JSON 列表collate_fn():批次整理函数(处理 padding 和 label masking)eval_on_valid_set():验证集评估
LLM 文本生成演示
实现可控文本生成:
generate_eos():支持多种解码策略的自回归生成- Top-K 采样:限制候选词数量
- Top-P(Nucleus)采样:核采样
- Temperature:温度调节
- Repetition Penalty:重复惩罚
LLM 完整训练流程实践
端到端的 LLM 训练实践:
SFTDataset:SFT 数据加载与处理collate_fn():批次整理- 模型初始化、训练循环、评估的完整流程
Chat/SFT 提示词构建工具
支持多种提示词格式:
build_chat_prompt():Chat 格式提示词构建(system/user/assistant 角色)build_sft_prompt():SFT 指令格式提示词构建(指令/输入/回答)encode_prompt():提示词编码与答案提取collate():批次整理
BPE 分词器训练
从头训练 Byte-Pair Encoding 分词器:
read_texts_from_files():读取训练语料create_tokenizer_config():创建分词器配置(含特殊 token)train_tokenizer():训练 BPE 分词器并保存
HuggingFace 模型微调示例
使用 HuggingFace Transformers 进行模型微调:
FinetuningModel:微调模型类(预训练模型 + 分类头)collate_fn():数据整理函数
- Python:3.8+
- 深度学习框架:PyTorch
- HuggingFace 生态:transformers, datasets, tokenizers, peft
- 实验追踪:swanlab
- 其他依赖:jieba, pandas, numpy, tqdm, python-dotenv
pip install -r requirements.txt| 库 | 用途 |
|---|---|
| torch | 深度学习框架 |
| transformers | HuggingFace 模型加载与使用 |
| datasets | 数据集加载与处理 |
| tokenizers | 分词器训练 |
| peft | 参数高效微调(LoRA 等) |
| jieba | 中文分词 |
| pandas | 数据处理 |
| numpy | 数值计算 |
| tqdm | 进度条 |
| swanlab | 实验追踪与可视化 |
| python-dotenv | 环境变量管理 |
| fasttext | 词向量训练 |
| tensorboard | 可视化 |
- 克隆项目到本地
- 安装依赖:
pip install -r requirements.txt
- 打开 Jupyter Notebook 运行交互式代码:
jupyter notebook
- 或直接运行 Python 脚本:
python transformer_model.py # 训练从零实现的 Transformer python llm_LLaMA2.py # 训练类 LLaMA2 架构 LLM
建议按照以下顺序学习,从基础到进阶:
- 分词.ipynb → 掌握中文分词、文本编码、词向量基础
- rnn.ipynb → 学习序列模型,理解 RNN/LSTM 原理和应用
- transformer.ipynb → 深入理解 Transformer 架构
- seq2seq与注意力机制案例.ipynb → 掌握 Seq2Seq 与注意力机制
- tranformer_model.py → 从零实现完整 Transformer(理论与实践结合)
- 迁移学习.ipynb → 掌握 BERT 预训练模型的迁移学习
- BPE_tokenizer.py → 理解并训练 BPE 分词器
- llm_LLaMA2.py → 从零实现类 LLaMA2 架构的现代 LLM
- prompt_builder.py → 理解 Chat/SFT 提示词构建
- llm_pretraining_demo.py → 掌握 LLM 预训练数据流
- llm_sft_demo.py → 掌握指令微调(SFT)流程
- llm_generate_demo.py → 掌握可控文本生成
- llm训练流程实践.py → 端到端 LLM 训练实战
项目包含以下预训练/微调后的模型权重:
bert-base-chinese/:BERT 中文预训练模型chinese-sentiment/:中文情感分析模型checkpoint/:训练过程中的模型检查点models/:训练完成的模型权重
项目使用 SwanLab 进行实验追踪与可视化:
启动 TensorBoard 查看词向量可视化:
tensorboard --logdir=./runs --host 0.0.0.0然后在浏览器中访问 http://localhost:6006
- PyTorch 官方文档
- HuggingFace Transformers
- Attention Is All You Need
- LLaMA: Open and Efficient Foundation Language Models
- RoFormer: Enhanced Transformer with Rotary Position Embedding
- RMSNorm / Root Mean Square Layer Normalization
- jieba 中文分词
- Word2Vec 论文
- Understanding LSTM Networks
本项目仅供学习参考使用。