← بازگشت به بلاگ

تنظیم دقیق مدل‌های زبانی برای محتوای فارسی: راهنمای جامع با هوشی

تنظیم دقیق مدل‌های زبانی برای محتوای فارسی: راهنمای جامع با هوشی
\n

پردازش زبان طبیعی (NLP) فارسی در سال ۲۰۲۵ با ظهور مدل‌های پیشرفته‌ای چون FaBERT و PersianMind شاهد جهشی چشمگیر بوده است. این مدل‌ها با بهبود قابل توجهی در تحلیل متن فارسی، امکان توسعه سیستم‌های هوشمند فارسی را به سطحی بی‌سابقه رسانده‌اند. تنظیم دقیق (Fine-tuning) این مدل‌ها برای داده‌های فارسی، چالش‌های منحصر به فردی را پیش روی متخصصان قرار می‌دهد؛ از جمله پردازش متن‌های راست به چپ، مدیریت نیم‌فاصله‌ها و درک ساختارهای پیچیده واژگانی زبان فارسی. موفقیت در این زمینه، کاربردهای گسترده‌ای را از تحلیل احساسات گرفته تا سیستم‌های پرسش و پاسخ فارسی امکان‌پذیر می‌سازد.

کلیدواژه اصلی: تنظیم دقیق مدل زبانی فارسی

مدل‌های از پیش آموزش‌دیده فارسی مناسب برای تنظیم دقیق

FaBERT: گزینه‌ای ایده‌آل برای سال ۲۰۲۵

FaBERT، با ۱۲۴ میلیون پارامتر و واژگانی شامل ۵۰ هزار کلمه، در حال حاضر یکی از بهترین گزینه‌ها برای اکثر کاربردهای فارسی محسوب می‌شود. این مدل که بر روی بیش از ۵۰ گیگابایت متن فارسی آموزش دیده، عملکردی برتر نسبت به مدل‌هایی چون ParsBERT ارائه می‌دهد و در عین حال، حافظه کمتری اشغال می‌کند.

برای استفاده از FaBERT، می‌توانید از کتابخانه Transformers بهره ببرید:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "sbunlp/fabert"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3)

PersianMind: قدرتمندترین مدل زبانی فارسی

PersianMind، که بر پایه LLaMA2-7B ساخته شده و دارای ۷ میلیارد پارامتر است، قابلیت پردازش متن‌هایی تا ۲۰۴۸ توکن را دارد. این مدل به عنوان اولین مدل زبانی بزرگ فارسی، در آزمون Belebele به دقت ۷۳.۹ درصد دست یافته و عملکردی قابل مقایسه با GPT-3.5-turbo را به نمایش می‌گذارد.

بارگذاری PersianMind به شکل زیر است:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "universitytehran/PersianMind-v1.0"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)

ParsBERT: استانداردی پایدار و قابل اعتماد

ParsBERT با ۱۶۲ میلیون پارامتر و آموزش بر روی ۱.۳ میلیارد کلمه فارسی، همچنان یک انتخاب مطمئن برای پروژه‌های عملیاتی است. نسخه v3.0 این مدل، پشتیبانی کاملی از نیم‌فاصله‌های فارسی را ارائه می‌دهد.

برای بارگذاری ParsBERT v3.0:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "HooshvareLab/bert-fa-zwnj-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

بهترین چارچوب‌ها برای تنظیم دقیق مدل‌های زبانی فارسی

کتابخانه Hezar: انتخاب اول توسعه‌دهندگان فارسی

Hezar جامع‌ترین کتابخانه هوش مصنوعی فارسی است که بر پایه PyTorch، Transformers و Hugging Face بنا شده و رابط کاربری ساده‌ای برای انواع وظایف NLP فارسی فراهم می‌کند. با استفاده از Hezar، می‌توانید به سرعت ایجنت‌های کدنویسی خود را توسعه دهید.

برای نصب Hezar:

# pip install hezar[all]

from hezar.models import BertSequenceLabeling, BertSequenceLabelingConfig
from hezar.data import Dataset
from hezar.trainer import Trainer, TrainerConfig

# تنظیم مدل برای برچسب‌گذاری توالی
base_model_path = "hezarai/bert-base-fa"
model = BertSequenceLabeling(
    BertSequenceLabelingConfig(id2label={0: "منفی", 1: "مثبت", 2: "خنثی"})
)

DadmaTools: ابزارهای جامع پردازش متن فارسی

DadmaTools مجموعه‌ای از ابزارهای پیشرفته برای پردازش متن فارسی، شامل نرمال‌سازی، توکن‌سازی و تحلیل مورفولوژیکی را در اختیار شما قرار می‌دهد.

برای نصب DadmaTools:

# pip install dadmatools

from dadmatools.normalizer import Normalizer
from dadmatools.tokenizer import Tokenizer

normalizer = Normalizer(
    unify_chars=True,
    refine_punc_spacing=True,
    remove_extra_space=True,
    remove_puncs=False
)

tokenizer = Tokenizer()
text = "امروز روز خوبی است"
tokens = tokenizer.tokenize(text)
print(tokens)

پیاده‌سازی گام به گام تنظیم دقیق با کد

مرحله اول: آماده‌سازی محیط و داده‌ها

در این مرحله، شما نیاز به آماده‌سازی داده‌های خود و همچنین توابع پیش‌پردازش متن فارسی دارید. این شامل نرمال‌سازی کاراکترها، حذف کاراکترهای غیرضروری و تبدیل اعداد است.

import torch
import re
from transformers import (
    AutoTokenizer, AutoModelForSequenceClassification,
    TrainingArguments, Trainer, TrainerConfig
)
from datasets import Dataset
import pandas as pd
from sklearn.model_selection import train_test_split

# فرض می‌شود Normalizer و Tokenizer از dadmatools بارگذاری شده‌اند
# from dadmatools.normalizer import Normalizer
# from dadmatools.tokenizer import Tokenizer

def preprocess_persian_text(text):
    normalizer = Normalizer(unify_chars=True, refine_punc_spacing=True, remove_extra_space=True, remove_puncs=False)
    text = normalizer.normalize(text)
    text = re.sub(r'[^\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\s0-9]', '', text)
    persian_numbers = '۰۱۲۳۴۵۶۷۸۹'
    english_numbers = '0123456789'
    for p, e in zip(persian_numbers, english_numbers):
        text = text.replace(p, e)
    return text.strip()

def prepare_dataset(texts, labels):
    processed_texts = [preprocess_persian_text(text) for text in texts]
    dataset = Dataset.from_dict({'text': processed_texts, 'labels': labels})
    return dataset

# مثال استفاده:
# texts = ["متن نمونه ۱", "متن نمونه ۲"]
# labels = [0, 1]
# train_dataset = prepare_dataset(texts, labels)
# val_dataset = prepare_dataset(val_texts, val_labels)

مرحله دوم: تنظیم مدل و توکن‌ساز

در این مرحله، مدل پایه و توکن‌ساز مربوطه را بارگذاری کرده و تابع توکن‌سازی را برای اعمال بر داده‌ها آماده می‌کنید.


model_name = "sbunlp/fabert"  # یا "HooshvareLab/bert-fa-zwnj-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3)

def tokenize_function(examples):
    return tokenizer(
        examples['text'],
        truncation=True,
        padding='max_length',
        max_length=512,
        return_tensors="pt"
    )

# اعمال توکن‌سازی بر داده‌ها
# tokenized_train = train_dataset.map(tokenize_function, batched=True)
# tokenized_val = val_dataset.map(tokenize_function, batched=True)

مرحله سوم: تنظیم پارامترهای آموزش

پارامترهای آموزش مانند تعداد دوره‌های یادگیری، اندازه دسته، نرخ یادگیری و سایر تنظیمات بهینه‌سازی را در این مرحله پیکربندی می‌کنید.


training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    learning_rate=2e-5,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
    logging_steps=10,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    metric_for_best_model="eval_loss",
    greater_is_better=False,
    dataloader_num_workers=4,
    fp16=True,
    gradient_checkpointing=True,
    gradient_accumulation_steps=2
)

مرحله چهارم: آموزش مدل

در نهایت، با استفاده از کلاس Trainer، فرآیند آموزش مدل را آغاز کرده و مدل نهایی را ذخیره می‌کنید. برای اطمینان از شفافیت در هزینه‌ها و مدیریت بهتر منابع، می‌توانید از بخش بیلینگ هوشی استفاده کنید.


def compute_metrics(eval_pred):
    import numpy as np
    from sklearn.metrics import accuracy_score, precision_recall_fscore_support
    
    predictions, labels = eval_pred
    predicti axis=1)
    
    precision, recall, f1, _ = precision_recall_fscore_support(
        labels, predictions, average='weighted'
    )
    
    return {
        'accuracy': accuracy_score(labels, predictions),
        'f1': f1,
        'precision': precision,
        'recall': recall
    }

# فرض می‌شود tokenized_train و tokenized_val آماده شده‌اند
# trainer = Trainer(
#     model=model,
#     args=training_args,
#     train_dataset=tokenized_train,
#     eval_dataset=tokenized_val,
#     tokenizer=tokenizer,
#     compute_metrics=compute_metrics
# )

# trainer.train()
# trainer.save_model("./persian_model_finetuned")

چالش‌های خاص زبان فارسی و راه‌حل‌ها

مسئله نیم‌فاصله‌ها و کاراکترهای ZWNJ

کاربرد کاراکتر Zero-Width Non-Joiner (ZWNJ) در زبان فارسی می‌تواند فرآیند توکن‌سازی را با چالش مواجه کند. مدل‌هایی مانند ParsBERT v3.0 و FaBERT با در نظر گرفتن این ویژگی، این مشکل را تا حد زیادی مرتفع کرده‌اند.

مدیریت نیم‌فاصله‌ها:


def handle_half_spaces(text):
    # تبدیل نیم‌فاصله‌ها به فاصله معمولی
    text = text.replace('\u200c', ' ')  # ZWNJ
    return text

با استفاده از پلتفرم هوشی، می‌توانید به راحتی توکن API خود را بسازید و فرآیند تنظیم دقیق مدل‌های زبانی را برای نیازهای خاص خود تسریع کنید.

سوالات متداول

  • تنظیم دقیق مدل زبانی فارسی چیست؟
    تنظیم دقیق به فرآیند آموزش یک مدل زبانی از پیش آموزش‌دیده بر روی مجموعه داده‌ای خاص (در اینجا، داده‌های فارسی) گفته می‌شود تا عملکرد آن در وظایف مرتبط با آن زبان بهبود یابد.
  • چرا مدیریت نیم‌فاصله‌ها در NLP فارسی مهم است؟
    نیم‌فاصله‌ها (ZWNJ) بر نحوه توکن‌سازی و درک متن توسط مدل‌های زبانی تأثیر می‌گذارند. مدل‌هایی که این مسئله را به خوبی مدیریت می‌کنند، دقت بالاتری در پردازش زبان فارسی دارند.
  • چگونه می‌توانم از هوشی برای تنظیم دقیق مدل‌های زبانی استفاده کنم؟
    شما می‌توانید با ثبت‌نام در هوشی، به ابزارهای لازم برای ساخت توکن API، تنظیم دقیق مدل‌ها و استقرار آن‌ها دسترسی پیدا کنید. برای شروع، به بخش مستندات ما در hooshi.net/p/docs مراجعه کنید.
⌃