Downloads · 30 days
303
21% of all-time downloads
ChisatoY/Qwen2.5-7B-ReWrite
Qwen2.5-7B-ReWrite is a text generation model from ChisatoY. Use it when you need the model to write or continue text. It is set up for transformers.
这是一个用于将中英文 AI 风格文本改写为更自然的人类写作风格的模型。模型基于 Qwen2.5-7B-Instruct,通过 LoRA 进行监督微调(SFT),并将最佳 LoRA adapter 完整合并回基础模型。当前目录包含可直接通过 Transformers 加载的 BF16 Safetensors 权重,不需要额外挂载 LoRA adapter。
Downloads · 30 days
303
21% of all-time downloads
All-time downloads
1.4K
Public
Parameters
7.6B
28 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors15.2 GB · 54%
From the Hugging Face model README
这是一个用于将中英文 AI 风格文本改写为更自然的人类写作风格的模型。模型基于
Qwen2.5-7B-Instruct,通过 LoRA 进行监督微调(SFT),并将最佳 LoRA adapter
完整合并回基础模型。当前目录包含可直接通过 Transformers 加载的 BF16
Safetensors 权重,不需要额外挂载 LoRA adapter。
| 项目 | 值 |
|---|---|
| 基础模型 | Qwen2.5-7B-Instruct |
| 模型架构 | Qwen2ForCausalLM |
| 参数规模 | 约 7.6B |
| 导出精度 | BF16 |
| 权重格式 | Safetensors(4 个分片) |
| 上下文上限 | 32,768 tokens |
| 训练最大长度 | 1,024 tokens |
| 最佳 checkpoint | step 2600(epoch 1.968) |
| 最佳验证损失 | 0.641895 |
训练数据统一为以下格式:
{
"instruction": "Rewrite the provided text in a natural, human-written style while preserving its original meaning, facts, language, and formatting. Do not add explanations. 请将给定文本改写为自然的人类写作风格,保持原意、事实、语言和格式不变,不要添加解释。",
"input": "需要改写的 AI 风格文本",
"output": "目标人类写作风格文本"
}
训练时使用 Qwen ChatML 模板,将 instruction 作为 system message、input 作为
user message、output 作为 assistant message。损失只计算 assistant 回复部分,system
和 user tokens 均被 mask。
清洗合并后共有 43,124 条训练候选数据,按固定随机种子从中划分 42,261 条用于训练、 863 条用于验证(验证比例 2%)。另外保留 100 条英文人工改写数据作为最终测试集, 该测试集没有参与训练、early stopping 或最佳模型选择。
中文数据来自 XiangJinYu/Qwen3.5-9B-Humanize-Dataset,共保留 24,999 条:
| 原始文件 | 转换方式 | 保留条数 |
|---|---|---|
v15_sft_18k.jsonl | input → output | 18,000 |
v16_dpo_4000_formal2000_casual2000.jsonl | rejected → chosen | 4,000 |
v17next_dpo_1500_clean_no_ckpt.jsonl | rejected → chosen | 1,000 |
v20_dpo_2000_v18rejected.jsonl | rejected → chosen | 1,999 |
该数据以中文学术摘要和正式写作为主,数据集标注许可证为 CC BY-NC 4.0。
英文训练数据来自 KNipun/ai-humanizer,共保留 18,125 条:
| 原始文件 | 保留条数 |
|---|---|
train_data.jsonl | 16,311 |
val_data.jsonl | 1,814 |
该数据从原始长 prompt 的 Input: 区段中抽取源文本,以 completion 作为目标文本,
数据集标注许可证为 Apache 2.0。
测试集来自 alexreversegpt/ai-writing-tells,包含 100 组人工编写的英文
ai_text → human_text 改写对,数据集标注许可证为 CC BY 4.0。
清洗过程包括:
instruction/input/output 格式;input 与 output 完全相同的样本;| 超参数 | 值 |
|---|---|
| 训练方法 | LoRA SFT |
LoRA rank (r) | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0.05 |
| LoRA bias | none |
| Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| LoRA 可训练参数 | 40,370,176(约 0.5273%) |
| 最大序列长度 | 1,024 |
| 单卡训练 batch size | 4 |
| 单卡验证 batch size | 4 |
| 梯度累积步数 | 8 |
| 有效 batch size | 32 |
| 最大 epoch | 3 |
| 实际停止 epoch | 2.4225 |
| 初始学习率 | 1e-4 |
| 学习率调度 | Cosine |
| Warmup ratio | 0.03 |
| Weight decay | 0.01 |
| 最大梯度范数 | 1.0 |
| 优化器 | Fused AdamW (adamw_torch_fused) |
| 训练精度 | BF16,TF32 enabled |
| Attention 实现 | PyTorch SDPA |
| Gradient checkpointing | Enabled,non-reentrant |
| Dynamic batching | 按长度分组 (group_by_length) |
| 随机种子 | 42 |
| 日志间隔 | 10 steps |
| 验证间隔 | 200 steps |
| 保存间隔 | 200 steps |
| Checkpoint 保留数 | 2(最佳与最近) |
| 最佳模型指标 | eval_loss,越低越好 |
| Early stopping patience | 3 次验证 |
训练使用单张 NVIDIA RTX A6000 48 GB GPU。完整训练耗时约 25,515 秒(约 7 小时 5 分钟),吞吐量约 4.97 samples/s。
验证损失在 step 2600 达到最低点:
| Step | Epoch | Eval loss |
|---|---|---|
| 200 | 0.151 | 0.681554 |
| 1000 | 0.757 | 0.652373 |
| 1800 | 1.363 | 0.648567 |
| 2200 | 1.666 | 0.645911 |
| 2400 | 1.817 | 0.645167 |
| 2600 | 1.968 | 0.641895 |
| 2800 | 2.120 | 0.661740 |
| 3000 | 2.271 | 0.668160 |
| 3200 | 2.422 | 0.663423 |
step 2600 之后连续三次验证没有改善,因此 early stopping 在 step 3200 终止训练, 并恢复 step 2600 的最佳权重。全程汇总训练损失为 0.652253。
在保留的 100 条英文测试集上,使用 completion-only teacher-forced loss 进行对比:
| 模型 | Test loss | Perplexity |
|---|---|---|
| 原始 Qwen2.5-7B-Instruct | 7.9728 | 2900.89 |
| 本模型 | 3.4172 | 30.48 |
测试 loss 相对下降约 57.14%。由于每个输入只有一个参考改写,该指标适合比较微调前后 的相对变化,不能替代人工评价。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "export/best-safetensors"
system_prompt = (
"Rewrite the provided text in a natural, human-written style while preserving "
"its original meaning, facts, language, and formatting. Do not add explanations. "
"请将给定文本改写为自然的人类写作风格,保持原意、事实、语言和格式不变,"
"不要添加解释。"
)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.bfloat16,
device_map="auto",
)
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "需要改写的文本"},
]
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=512,
do_sample=False,
repetition_penalty=1.05,
)
result = tokenizer.decode(
outputs[0, inputs["input_ids"].shape[1]:],
skip_special_tokens=True,
)
print(result)