|
|
--- |
|
|
library_name: transformers |
|
|
tags: [] |
|
|
--- |
|
|
|
|
|
# NN-NER-FT: โมเดล Named Entity Recognition (NER) ที่ Fine-tune แล้ว |
|
|
|
|
|
## ภาพรวม |
|
|
**NN-NER-FT** เป็นโมเดลสำหรับงาน Named Entity Recognition (NER) ในภาษาไทย ที่ผ่านการ fine-tune จากโมเดลพื้นฐาน โดยใช้ชุดข้อมูล NN-NER จาก Hugging Face ในการฝึก |
|
|
โมเดลนี้สามารถระบุ entity ต่าง ๆ เช่น BRAND, PRODUCT_NAME, PRODUCT_SIZE, SPEC, SPEC_PER_UNIT, PACKAGE, และอื่น ๆ ในข้อความภาษาไทย |
|
|
|
|
|
## การใช้งานที่ตั้งใจไว้ |
|
|
- **งานหลัก:** การระบุ Named Entities ในข้อความภาษาไทย |
|
|
- **กลุ่มเป้าหมาย:** นักวิจัย, นักพัฒนา และองค์กรที่ต้องการระบบ NER สำหรับภาษาไทย |
|
|
- **ข้อควรระวัง:** โมเดลนี้เหมาะสำหรับการทดลองและพัฒนาเบื้องต้น สำหรับงาน production อาจต้องปรับปรุงและเทรนเพิ่มเติม |
|
|
|
|
|
## รายละเอียดการเทรน |
|
|
|
|
|
### ข้อมูลชุดฝึก |
|
|
- **ชุดข้อมูล:** NN-NER (จาก Hugging Face) |
|
|
- **การแบ่งชุดข้อมูล:** |
|
|
- Train: 80% |
|
|
- Validation: 10% |
|
|
- Test: 10% |
|
|
|
|
|
### Hyperparameters (สำหรับการสาธิต) |
|
|
- **Batch Size:** 16 (สำหรับทั้งการเทรนและการประเมินต่ออุปกรณ์) |
|
|
- **Learning Rate:** 3e-5 |
|
|
- **Warmup Ratio:** 0.1 |
|
|
- **Weight Decay:** 0.01 |
|
|
- **Adam Optimizer:** |
|
|
- Beta1: 0.9 |
|
|
- Beta2: 0.999 |
|
|
- Epsilon: 1e-8 |
|
|
- **Epochs:** 3 (สำหรับการสาธิต – ในงานจริงอาจเทรนมากขึ้น) |
|
|
- **Mixed Precision:** ใช้ fp16 |
|
|
- **Checkpoint & Evaluation Strategy:** |
|
|
- ประเมินผลทุก 100 steps |
|
|
- บันทึก checkpoint ทุก 100 steps (จำกัดที่ 5 checkpoint ล่าสุด) |
|
|
- โหลดโมเดลที่ดีที่สุดตาม metric `eval_loss` |
|
|
|
|
|
### ตัวอย่างคำสั่งการตั้งค่า TrainingArguments |
|
|
```python |
|
|
thainer_training_args = TrainingArguments( |
|
|
output_dir=path.join("finetuned_models", "NN-NER-FT"), |
|
|
overwrite_output_dir=True, |
|
|
evaluation_strategy="steps", |
|
|
eval_steps=100, |
|
|
save_strategy="steps", |
|
|
save_steps=100, |
|
|
save_total_limit=5, |
|
|
per_device_train_batch_size=16, |
|
|
per_device_eval_batch_size=16, |
|
|
learning_rate=3e-5, |
|
|
warmup_ratio=0.1, |
|
|
weight_decay=0.01, |
|
|
adam_beta1=0.9, |
|
|
adam_beta2=0.999, |
|
|
adam_epsilon=1e-8, |
|
|
num_train_epochs=3, |
|
|
fp16=True, |
|
|
load_best_model_at_end=True, |
|
|
metric_for_best_model="eval_loss" |
|
|
) |
|
|
``` |
|
|
|
|
|
### ผลการประเมินบนชุดทดสอบ |
|
|
- **Test Loss**: 0.2114 |
|
|
- **Test Micro Average F1**: 0.8580 |
|
|
- **Test Macro Average F1**: 0.8034 |
|
|
|
|
|
### F1 Score แยกตาม Class |
|
|
- **BRAND**: 0.8358 |
|
|
- **GRADE**: 0.6835 |
|
|
- **PACKAGE**: 0.8788 |
|
|
- **PRODUCT_NAME**: 0.8638 |
|
|
- **PRODUCT_SIZE**: 0.9624 |
|
|
- **SPEC**: 0.6606 |
|
|
- **SPEC_PER_UNIT**: 0.7481 |
|
|
- **SPEC_SIZE**: 0.6471 |
|
|
- **STORAGE_CONDITION**: 0.9504 |
|
|
|
|
|
### โค้ดการประเมินผล (Evaluation Pipeline) |
|
|
```python |
|
|
def thainer_f1_metric(eval_pred): |
|
|
predictions = eval_pred.predictions.argmax(axis=2) |
|
|
labels = eval_pred.label_ids |
|
|
predictions = [ |
|
|
[thainer_id2label[p] for p, l in zip(p_row, l_row) if l != -100] |
|
|
for p_row, l_row in zip(predictions, labels) |
|
|
] |
|
|
labels = [ |
|
|
[thainer_id2label[l] for l in l_row if l != -100] |
|
|
for l_row in labels |
|
|
] |
|
|
result = seqeval_metric(y_pred=predictions, y_true=labels, output_dict=True) |
|
|
tag_set = {tag[2:] for tag in thainer_id2label.values() if tag != "O"} |
|
|
return { |
|
|
"micro_average_f1": result["micro avg"]["f1-score"], |
|
|
"macro_average_f1": result["macro avg"]["f1-score"], |
|
|
"class_f1": { |
|
|
tag: result[tag]["f1-score"] |
|
|
for tag in result if tag in tag_set |
|
|
} |
|
|
} |
|
|
|
|
|
thainer_trainer = Trainer( |
|
|
model=thainer_model, |
|
|
args=thainer_training_args, |
|
|
train_dataset=thainer["train"], |
|
|
eval_dataset=thainer["validation"], |
|
|
tokenizer=tokenizer, |
|
|
data_collator=thainer_data_collator, |
|
|
compute_metrics=thainer_f1_metric |
|
|
) |
|
|
``` |