初始化项目,由ModelHub XC社区提供模型

Model: DanJZY/SmolLM-135M-GEC-SFT-DPO
Source: Original Platform
This commit is contained in:
ModelHub XC
2026-08-01 18:51:20 +08:00
commit 1061fc24cf
12 changed files with 294425 additions and 0 deletions

35
.gitattributes vendored Normal file
View File

@@ -0,0 +1,35 @@
*.7z filter=lfs diff=lfs merge=lfs -text
*.arrow filter=lfs diff=lfs merge=lfs -text
*.bin filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.ckpt filter=lfs diff=lfs merge=lfs -text
*.ftz filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.h5 filter=lfs diff=lfs merge=lfs -text
*.joblib filter=lfs diff=lfs merge=lfs -text
*.lfs.* filter=lfs diff=lfs merge=lfs -text
*.mlmodel filter=lfs diff=lfs merge=lfs -text
*.model filter=lfs diff=lfs merge=lfs -text
*.msgpack filter=lfs diff=lfs merge=lfs -text
*.npy filter=lfs diff=lfs merge=lfs -text
*.npz filter=lfs diff=lfs merge=lfs -text
*.onnx filter=lfs diff=lfs merge=lfs -text
*.ot filter=lfs diff=lfs merge=lfs -text
*.parquet filter=lfs diff=lfs merge=lfs -text
*.pb filter=lfs diff=lfs merge=lfs -text
*.pickle filter=lfs diff=lfs merge=lfs -text
*.pkl filter=lfs diff=lfs merge=lfs -text
*.pt filter=lfs diff=lfs merge=lfs -text
*.pth filter=lfs diff=lfs merge=lfs -text
*.rar filter=lfs diff=lfs merge=lfs -text
*.safetensors filter=lfs diff=lfs merge=lfs -text
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.tar.* filter=lfs diff=lfs merge=lfs -text
*.tar filter=lfs diff=lfs merge=lfs -text
*.tflite filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.wasm filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text

131
README.md Normal file
View File

@@ -0,0 +1,131 @@
---
license: apache-2.0
language:
- en
tags:
- text-generation
- grammar-correction
- grammatical-error-correction
- gec
- style-preserving
- dpo
- sft
- smollm
- small-language-model
- writing-assistant
- proofreading
- nlp
base_model: HuggingFaceTB/SmolLM-135M
datasets:
- jfleg
pipeline_tag: text-generation
model-index:
- name: SmolLM-135M-GEC-SFT-DPO
results:
- task:
type: text-generation
name: Grammar Correction
metrics:
- type: bleu
value: 0.50
name: BLEU
---
# SmolLM-135M-GEC-SFT-DPO
A **style-preserving grammar correction** model based on SmolLM-135M, trained with SFT + DPO to make minimal, targeted corrections while preserving your original writing style.
## Why This Model?
Unlike large language models (GPT, Claude, etc.) that tend to rewrite entire sentences, this model makes **minimal, targeted corrections** - fixing only grammatical errors while preserving your vocabulary, tone, and voice. Perfect for:
- **Legal documents**: Maintain precise legal terminology
- **Academic writing**: Preserve scholarly tone
- **ESL/EFL education**: Help learners without changing their ideas
- **Professional communications**: Keep your authentic voice
## Key Features
- **Minimal corrections**: Fixes only grammatical errors, doesn't rewrite your sentences
- **Style preservation**: Maintains your vocabulary, tone, and voice
- **Small & efficient**: Only 135M parameters (~500MB) - runs on CPU!
- **BLEU score**: ~0.50 on grammar correction benchmarks
## Quick Start
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("DanJZY/SmolLM-135M-GEC-SFT-DPO")
tokenizer = AutoTokenizer.from_pretrained("DanJZY/SmolLM-135M-GEC-SFT-DPO")
text = "As the number of people grows, the need of habitable environment is essential."
inputs = tokenizer(f"Fix grammar: {text}", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```
## Example: Style-Preserving vs Over-Correction
```
Original (with error):
"As the number of people grows, the need of habitable environment is essential."
✅ Our Model (Style-Preserving):
"As the number of people grows, the need for a habitable environment is essential."
Only fixes "of" → "for a"
❌ Typical Model (Over-Correction):
"As population growth continues, the necessity for a habitable environment becomes essential."
Completely rewrites: changes vocabulary, structure, and tone
```
## Training Details
| Parameter | Value |
|-----------|-------|
| Base model | [SmolLM-135M](https://huggingface.co/HuggingFaceTB/SmolLM-135M) |
| Training method | SFT + DPO (Direct Preference Optimization) |
| Preference pairs | ~19,000 (generated using edit distance) |
| Total experiments | 28 (22 SFT + 6 DPO/IPO) |
| Hardware | 8x RTX 3090 |
| Training time | ~3 hours |
## Resources
| Resource | Link |
|----------|------|
| GitHub Repository | [ZhuoyuanJiang/SmolLM-GEC-SFT-DPO](https://github.com/ZhuoyuanJiang/SmolLM-GEC-SFT-DPO) |
| Full Experiment Checkpoints | [Google Drive](https://drive.google.com/drive/folders/1fxd_yi4r4crp7UK3tJVKxVPHo9gRcw4z) (~68GB) |
| Training Notebooks | [GitHub notebooks/](https://github.com/ZhuoyuanJiang/SmolLM-GEC-SFT-DPO/tree/main/notebook) |
## Intended Use
- Grammar correction for English text
- Writing assistance that preserves author's voice
- Educational tools for language learners
- Proofreading applications
## Limitations
- English only
- Best for sentence-level corrections
- Not designed for stylistic improvements (only grammar)
## Citation
```bibtex
@misc{smollm_gec_sft_dpo_2025,
title={SmolLM-135M-GEC-SFT-DPO: Style-Preserving Grammar Correction with Direct Preference Optimization},
author={Zhuoyuan Jiang},
year={2025},
url={https://huggingface.co/DanJZY/SmolLM-135M-GEC-SFT-DPO},
note={Fine-tuned SmolLM-135M for minimal, style-preserving grammatical error correction}
}
```
## Acknowledgments
Special thanks to **Nima Tajbakhsh** (Nvidia) for guidance on efficient training methods.

4
added_tokens.json Normal file
View File

@@ -0,0 +1,4 @@
{
"[PAD]": 49152,
"[SEP]": 49153
}

30
config.json Normal file
View File

@@ -0,0 +1,30 @@
{
"architectures": [
"LlamaForCausalLM"
],
"attention_bias": false,
"attention_dropout": 0.0,
"bos_token_id": 0,
"eos_token_id": 0,
"head_dim": 64,
"hidden_act": "silu",
"hidden_size": 576,
"initializer_range": 0.02,
"intermediate_size": 1536,
"max_position_embeddings": 2048,
"mlp_bias": false,
"model_type": "llama",
"num_attention_heads": 9,
"num_hidden_layers": 30,
"num_key_value_heads": 3,
"pad_token_id": 49152,
"pretraining_tp": 1,
"rms_norm_eps": 1e-05,
"rope_scaling": null,
"rope_theta": 10000.0,
"tie_word_embeddings": true,
"torch_dtype": "float32",
"transformers_version": "4.53.0",
"use_cache": true,
"vocab_size": 49154
}

6
generation_config.json Normal file
View File

@@ -0,0 +1,6 @@
{
"_from_model_config": true,
"bos_token_id": 0,
"eos_token_id": 0,
"transformers_version": "4.53.0"
}

48901
merges.txt Normal file

File diff suppressed because it is too large Load Diff

3
model.safetensors Normal file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6bf7eb0815e495414712a04c3a52d100634ff946794e425a76b89f8c93deb3c3
size 538095016

158
special_tokens_map.json Normal file
View File

@@ -0,0 +1,158 @@
{
"additional_special_tokens": [
{
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<|im_start|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<|im_end|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<repo_name>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<reponame>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<file_sep>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<filename>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<gh_stars>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<issue_start>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<issue_comment>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<issue_closed>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<jupyter_start>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<jupyter_text>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<jupyter_code>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<jupyter_output>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<jupyter_script>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "<empty_output>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
{
"content": "[SEP]",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
}
],
"bos_token": {
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
"eos_token": {
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
"pad_token": {
"content": "[PAD]",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
},
"unk_token": {
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false
}
}

244967
tokenizer.json Normal file

File diff suppressed because it is too large Load Diff

186
tokenizer_config.json Normal file
View File

@@ -0,0 +1,186 @@
{
"add_prefix_space": false,
"added_tokens_decoder": {
"0": {
"content": "<|endoftext|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"1": {
"content": "<|im_start|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"2": {
"content": "<|im_end|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"3": {
"content": "<repo_name>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"4": {
"content": "<reponame>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"5": {
"content": "<file_sep>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"6": {
"content": "<filename>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"7": {
"content": "<gh_stars>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"8": {
"content": "<issue_start>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"9": {
"content": "<issue_comment>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"10": {
"content": "<issue_closed>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"11": {
"content": "<jupyter_start>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"12": {
"content": "<jupyter_text>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"13": {
"content": "<jupyter_code>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"14": {
"content": "<jupyter_output>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"15": {
"content": "<jupyter_script>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"16": {
"content": "<empty_output>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"49152": {
"content": "[PAD]",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"49153": {
"content": "[SEP]",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
}
},
"additional_special_tokens": [
"<|endoftext|>",
"<|im_start|>",
"<|im_end|>",
"<repo_name>",
"<reponame>",
"<file_sep>",
"<filename>",
"<gh_stars>",
"<issue_start>",
"<issue_comment>",
"<issue_closed>",
"<jupyter_start>",
"<jupyter_text>",
"<jupyter_code>",
"<jupyter_output>",
"<jupyter_script>",
"<empty_output>",
"[SEP]"
],
"bos_token": "<|endoftext|>",
"clean_up_tokenization_spaces": false,
"eos_token": "<|endoftext|>",
"extra_special_tokens": {},
"model_max_length": 1000000000000000019884624838656,
"pad_token": "[PAD]",
"tokenizer_class": "GPT2Tokenizer",
"unk_token": "<|endoftext|>",
"vocab_size": 49152
}

3
training_args.bin Normal file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d9a9b895689b2ca3e89869ac0f4a2116b6bf9e2ef31fcd9914eb540059d6e265
size 6264

1
vocab.json Normal file

File diff suppressed because one or more lines are too long