Junior Learner, Senior Lover
2 subscribers
1 video
1 file
2 links
چیزایی که توی حوزه جدید و عزیزم میخونم و یاد میگیرم، اینجا میگم شاید به درد شما هم خورد

@ellyvesfahani
Download Telegram
خب خب خب
بیاید باهم انواع توکنایزرها رو در LLMs ببینیم.
توکنایز کردن به زبان ساده یعنی متن رو به واحدهای کوچیکتر تقسیم میکنیم. براساس تسکی که در nlp داریم میتونیم ببینیم از چه نوع توکنایزری میخوایم استفاده کنیم.
این مطلب رو من از لینک پایین برداشته م و اگه آپدیتی چیزی باشه براتون همینجا میذارم
https://machinelearningmastery.com/tokenizers-in-language-models/
بریم که با انواع توکنایزرها آشنا بشیم

اول بیاید باهم یه نگاه از بالا داشته باشیم، ما توی این مطلب قراره با اینا آشنا بشیم:

Naive Tokenization
Stemming and Lemmatization
Byte-Pair Encoding (BPE)
WordPiece
SentencePiece and Unigram

نوع اول:
Naive Tokenization
یا توکنایز کردن ساده
ما بر اساس white space میایم و متن رو توکن توکن میکنیم.
این کدشه:
text = "Hello, world! This is a test."
tokens = text.split()
print(f"Tokens: {tokens}")
اینم نتیجه ش:
Tokens: ['Hello,', 'world!', 'This', 'is', 'a', 'test.']

این روش کاملا سریعه اما خیلی محدودیت داره، گذشته از محدودیتهایی شبیه به اینکه "world!" یک توکن در نظر گرفته میشه، زبانهایی مثل فارسی که white space اصلا گزینه خوبی برای درک نحو نیستن واقعن به مشکل برمیخورن.
اگه ما بخوایم مدلمون رو براساس این نوع توکنایز آموزش بدیم، به متنهای خیلی خیلی بیشتری نیاز داریم که این هم خودش هم زمانبره و هم هزینه بر.

دومی
Stemming and Lemmatization
(ایده ای برای فارسی سازیش ندارم)
برای این باید با پکیج re آشنا بشیم.
re : Regular Expression Operations
این پکیج زحمت میکشه و کار ما رو در تشخیص اعداد و پانکچوئیشن راحت میکنه
اینم نمونه کد:

import re

text = "Hello, world! This is a test."
tokens = re.findall(r'\w+|[^\w\s]', text)
print(f"Tokens: {tokens}")

در زبان انگلیسی ما مشکل lowercase کردن هم داریم، در نتیجه این پکیج اون کار رو هم برای ما انجام میده:

import re

text = "Hello, world! This is a test."
tokens = re.findall(r'\w+|[^\w\s]', text.lower())
print(f"Tokens: {tokens}")

این هم خروجیمون:
Tokens: ['hello', ',', 'world', '!', 'this', 'is', 'a', 'test', '.']

ولی با این حال، مدل بزرگی رو در نظر بگیرید که «درخت»، «درختها»، «درختان»، «درختهای»، «درختهایی» رو هر کدوم توکنهای جدا در نظر میگیره. پس ما با طیف خیلی گسترده ای از کلمات سر و کار داریم و مجبوریم این مشکل رو حل کنیم. stemming و lemmatization اینجا به کمکمون میان.
هردوتای این فرایندها ما رو به ریشه کلمه میرسونن
اما
اولی، stemming، سختگیرتره، یعنی همه پیشوندها و پسوندهای کلمه رو حذف میکنه اما lemmatization اونها رو میبره به حالتی که توی دیکشنری ثبت شده ن.
همین خط بالا گفتیم stemming سختگیرتره، پس وقتی سختگیرتره، امکان اینکه کلمات بیمعنا هم برای ما تولید کنه خیلی بیشتره.

خب، بریم دست به کد بشیم، برای این قسمت به nltk احتیاج داریم (کلا به nltk) نیاز داریم، یادتون نره

اول ایمپورت کنیم

import nltk
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize

خب، حالا بریم سراغ دانلود punkt که خیلی مهمه، چرا؟
توی یه پست جدا میگم بهتون

# download the necessary resources if haven't done so
nltk.download('punkt_tab')

خب حالا متنمون رو میدیم.

text = "These models may become unstable quickly if not initialized."

حالا یه متغیر میسازیم که داخلش PorterStemmer عمل کنه. دقت کنید که پایتون روی کوچیک و بزرگی حروف حساسه.

stemmer = PorterStemmer()

حالا بیایم متن رو توکنایز کنیم:

words = word_tokenize(text)

و در مرحله آخر، بگیم stemmer به ازای هر word در جمله، کار stemm رو انجام بده

stemmed_words = [stemmer.stem(word) for word in words]
print(stemmed_words)

و اینم نتیجه:

['these', 'model', 'may', 'becom', 'unstabl', 'quickli', 'if', 'not', 'initi', '.']

همونطور که میبینید، نتیجه برای unstabl اصلا valid نیست.

توی پست بعد میریم سراغ lemmatization

@junior_learner
image_2025-10-04_10-47-54.png
808.9 KB
#InSearchOf

برای من همیشه دیدن اینطور نمودارها خیلی وحشت‌برانگیز بود چون چیزی ازشون سر درنمی‌آوردم و مسلط به ابزار نبودم. اما الان میدونم چنین نموداری فقط با یک خط درست شده:

sns.pairplot(df)

(البته با یه عالمه خط دیگه که مبنای اینو میسازن😅)
باید بتونم تحلیلش کنم.
اونو هم میتونم، با صبر، صبر زیاد
بیاید باهم ببینیم INLP یعنی چه
INLP = Iterative Nullspace Projection
این یه روشه که با استفاده از اون لایه های word embedding یه جوری نمایش داده میشن که ویژگیهایی مثل جنسیت، نژاد و مذهب که خود به خود حاوی bias هستند از بین برن.
این روش خروجی شبکه های عصبی رو در مدلهای زبانی بزرگ کنترل میکنند و تلاش میکنند تا بایاس رو کاهش بدن.
متدشون چیه؟
براساس رگرسیون منطقی ما classifierهایی رو trainمیدیم که بدونن کجا باید اطلاعات رو از سیستم شبکه عصبی ریموو کنند. (یعنی اونا رو به null space تبدیل کنند)
این روش مخصوصا در تسک های classification بکار میره اما محدودیت هایی هم داره. اینکه اصلا چی رو بایاس بدونیم و چی رو بایاس ندونیم خودش خیلی مفصله. خطر دیگه ای که این روش داره اینه که ممکنه در یک مدل بایاس رو کاهش بده، ولی ممکنه پرفورمنس مدل رو پایین بیاره، کمااینکه روی مدل GPT-2 این اتفاق افتاده: بایاس تا حد خوبی کم شده ولی در عوض نتایج کمتر مطلوب بوده ن

@junior_learner
#InSearchOf

اینقدرر این چند روز دارم منابع مختلف میخونم و با اصطلاحات جدید بمبارون میشم که حد نداره🫠

میدونم که همه اینا ارزششو داره و آخر سر اونی که سود میکنه منم
#abbrivation_list

این لیست مدام به‌روز میشه

#INLP
#RAG
#CoT
#PEFT
Forwarded from CL & NLP Enthusiasts
Media is too big
VIEW IN TELEGRAM
مدل جدیدی به نام Jan-Nano اخیرا معرفی شد.
همانطور که در ویدیو می بینید ۴ میلیارد پارامتر داره که برای کارهای deep research اپتیمایز شده است. بخصوص برای وصل شدن به  Model Context Protocol (MCP) servers و انواع tools/ابزارها. و از لحاظ دقت هم خیلی خوبه. راهنمای نصب و استفاده بومی هم در لینک آورده شد.
@computationallinguisticsNLP
#RAG = Retrieval - Argument Generation

RAG هم مثل INLP یک روشه، البته باهم فرق دارند ولی توی دنیای تکنولوژی باید حتما بدونیم چی روش هست و چی نیست
rag به مدل زبانی اجازه میده از پایگاه داده برای تقویت پاسخش استفاده کنه.
خب خب خب
بریم ببینیم دقیقا چه تنظیماتی میشه به توکنایزرمون بدیم و هرکدوم چه عملکردی دارن:

سؤال خیلی خوبی پرسیدی 👏
چون AutoTokenizer.from_pretrained(model_name) یکی از پرکاربردترین خطوط در پروژه‌های NLPه — و می‌تونه کلی تنظیم اضافه بگیره که رفتار توکنایزر رو دقیق‌تر کنترل کنه.
بریم جزءبه‌جزء توضیح بدیم:

---

## 🧠 ساختار کلی

tokenizer = AutoTokenizer.from_pretrained(
model_name,
**پارامترهای_اختیاری
)


اینجا model_name مثلاً می‌تونه "bert-base-uncased" یا "facebook/bart-large-cnn" باشه،
و پارامترهای اختیاری می‌تونن چیزهایی باشن که توکنایزر رو مطابق نیازت تنظیم کنن.

---

## ⚙️ پارامترهای مهم و کاربردی

### 1️⃣ use_fast

use_fast=True  # یا False


* اگر True باشه (پیش‌فرض معمولاً Trueه)، از نسخه‌ی سریع‌تر توکنایزر استفاده می‌کنه (بر پایه‌ی Rust).
* نسخه‌ی "fast" سریع‌تره و اطلاعات دقیق‌تری درباره‌ی نگاشت توکن به متن اصلی می‌ده (برای tasks مثل NER یا alignment).

---

### 2️⃣ revision

revision="main"  # یا مثلاً 'v1.2.0'


* مشخص می‌کنه از کدوم نسخه‌ی مدل در Hugging Face Hub استفاده کنه.
مثلاً اگه مدل نسخه‌های مختلف داشته باشه، می‌تونی یه نسخه خاص رو لود کنی.

---

### 3️⃣ trust_remote_code

trust_remote_code=True


* برای مدل‌هایی که توکنایزرشون **کد سفارشی** دارن (نه فقط پیکربندی ساده).
* به Hugging Face اجازه می‌ده کد Python داخل ریپوی مدل رو اجرا کنه (امنیتش بستگی به منبع داره؛ مراقب باش).

---

### 4️⃣ cache_dir

cache_dir="./models_cache"


* مسیر محلی برای ذخیره‌ی فایل‌های دانلودی (توکنایزر، vocab و غیره).
* مفیده اگه نمی‌خوای هر بار از اینترنت دانلود کنه.

---

### 5️⃣ force_download

force_download=True


* حتی اگر فایل قبلاً دانلود شده، دوباره از اینترنت می‌گیره (مثلاً برای اطمینان از آخرین نسخه).

---

### 6️⃣ local_files_only

local_files_only=True


* فقط از فایل‌های لوکال استفاده کن، حتی اگه فایل در کش یا اینترنت نباشه.

---

### 7️⃣ tokenizer_type

در بعضی مدل‌ها می‌تونی نوع توکنایزر رو مشخص کنی (اگر مدل چند تا نوع پشتیبانی کنه)،
مثلاً:

tokenizer = AutoTokenizer.from_pretrained(model_name, tokenizer_type="gpt2")


---

### 8️⃣ padding_side

padding_side="right"  # یا "left"


* مشخص می‌کنه پدینگ در سمت راست یا چپ جمله انجام بشه.
* برای مدل‌هایی مثل GPT (که چپ‌پد می‌خوان) خیلی مهمه.

---

### 9️⃣ truncation_side

truncation_side="right"  # یا "left"


* مشخص می‌کنه اگر جمله خیلی طولانی بود، از سمت راست بریده بشه یا از چپ.

---

### 🔟 add_prefix_space

add_prefix_space=True


* برای مدل‌هایی مثل GPT2 که نیاز دارن قبل از اولین کلمه یه فاصله اضافه بشه تا توکن‌ها درست تطبیق پیدا کنن.

---

### 🧩 چند پارامتر پیشرفته‌تر

| پارامتر | کاربرد |
| ------------------------------------- | -------------------------------------------------------- |
| model_max_length | حداکثر طول مجاز توالی؛ مثلاً model_max_length=512 |
| bos_token, eos_token, unk_token | تعیین توکن‌های خاص برای شروع/پایان/ناشناخته |
| padding | مقداردهی پدینگ خودکار هنگام tokenizer(...) |
| clean_up_tokenization_spaces | حذف فاصله‌های اضافی هنگام تبدیل توکن‌ها به متن |
| legacy | مشخص می‌کنه از رفتارهای قدیمی توکنایزر استفاده کنه یا نه |

---

## مثال کامل

tokenizer = AutoTokenizer.from_pretrained(
"facebook/bart-large-cnn",
use_fast=True,
cache_dir="./cache",
padding_side="right",
truncation_side="left",
add_prefix_space=True,
model_max_length=1024,
trust_remote_code=True
)
عالی 👌
در جدول زیر همه‌ی پارامترهای مهم `AutoTokenizer.from_pretrained()` رو به‌صورت دسته‌بندی‌شده آوردم تا راحت بتونی حفظ و استفاده‌شون کنی — مخصوصاً برای پروژه‌های NLP و مدل‌های Hugging Face.

---

## 🧩 جدول دسته‌بندی پارامترهای AutoTokenizer.from_pretrained()

| دسته | پارامتر | توضیح | مثال |
| ------------------------------------- | ------------------------------ | --------------------------------------------------- | ------------------------------------------- |
| 🧠 پرفورمنس و سرعت | use_fast | از نسخه‌ی سریع‌تر (Rust-based) استفاده می‌کند. | use_fast=True |
| | revision | نسخه‌ی خاصی از مدل را لود می‌کند. | revision="v1.2.0" |
| | trust_remote_code | اجازه‌ی اجرای کد سفارشی توکنایزر از ریپوی مدل. | trust_remote_code=True |
| ⚙️ حافظه و فایل‌ها | cache_dir | محل ذخیره فایل‌های دانلودی مدل. | cache_dir="./cache_dir" |
| | force_download | دانلود مجدد حتی اگر فایل در کش موجود باشد. | force_download=True |
| | local_files_only | فقط از فایل‌های محلی استفاده می‌کند. | local_files_only=True |
| 🔠 تنظیمات توکن‌ها و پدینگ | padding_side | سمت اعمال پدینگ را مشخص می‌کند. | padding_side="left" |
| | truncation_side | سمت حذف توکن‌های اضافی را مشخص می‌کند. | truncation_side="right" |
| | model_max_length | حداکثر طول مجاز توالی. | model_max_length=512 |
| | add_prefix_space | در ابتدا فاصله اضافه می‌کند (برای GPT-2 لازم است). | add_prefix_space=True |
| | padding | مشخص می‌کند آیا پدینگ انجام شود یا نه. | padding="max_length" |
| 🧱 توکن‌های ویژه (Special Tokens) | bos_token | توکن شروع جمله (beginning of sentence). | bos_token="<s>" |
| | eos_token | توکن پایان جمله (end of sentence). | eos_token="</s>" |
| | unk_token | توکن ناشناخته برای واژه‌های خارج از واژگان. | unk_token="<unk>" |
| | pad_token | توکن پدینگ برای پر کردن توالی‌ها. | pad_token="<pad>" |
| 🧩 رفتار در بازسازی متن | clean_up_tokenization_spaces | فاصله‌های اضافی را در بازسازی جمله حذف می‌کند. | clean_up_tokenization_spaces=True |
| 🧰 سازگاری و کنترل نسخه | legacy | استفاده از رفتار قدیمی‌تر توکنایزر (برای سازگاری). | legacy=False |
| 🧪 دیگر تنظیمات خاص | tokenizer_type | نوع توکنایزر را مشخص می‌کند (اگر مدل چند نوع دارد). | tokenizer_type="gpt2" |
| | special_tokens_map | نگاشت دستی توکن‌های ویژه. | special_tokens_map={"cls_token": "[CLS]"} |

---

## 🎯 مثال کامل و کاربردی
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
"facebook/bart-large-cnn",
use_fast=True,
cache_dir="./cache",
padding_side="right",
truncation_side="left",
model_max_length=1024,
add_prefix_space=True,
trust_remote_code=True,
clean_up_tokenization_spaces=True
)
حتماً! در ادامه به زبان سانه توضیح می‌دم که این سه الگوریتم مهم در یادگیری ماشین چیستند و چه تفاوت‌هایی باهم دارند.

### خلاصه سریع و مقایسه

| الگوریتم | نام کامل | نحوه کار (تشبیه) | نقاط قوت | نقاط ضعف |
| :--- | :--- | :--- | :--- | :--- |
| SVM | ماشین بردار پشتیبان | پیدا کردن بهترین "خط یا مرز" برای جدا کردن دسته‌ها | بسیار قدرتمند در داده‌های با ابعاد بالا، مقاوم در برابر بیش‌برازش | کند در مجموعه داده‌های بسیار بزرگ، عملکرد ضعیف با داده‌های پرنویز |
| RF | جنگل تصادفی | تصمیم‌گیری گروهی با رای‌گیری بین درختان تصمیم مختلف | بسیار قوی و دقیق، نیاز به پیش‌پردازش کمی دارد، اهمیت ویژگی‌ها را می‌دهد | مانند جعبه سیاه است، ممکن است حافظه زیادی مصرف کند |
| MLP | پرسپترون چندلایه | شبیه‌سازی شبکه عصبی مغز برای یادگیری الگوهای پیچیده | فوق‌العاده در یادگیری روابط غیرخطی و پیچیده، انعطاف‌پذیر | نیاز به داده و قدرت پردازشی زیاد، تنظیم دقیق پارامترها سخت است |

---

### توضیح جزئیات هر کدام:

#### 1. SVM - ماشین بردار پشتیبان

- هدف اصلی: عمدتاً برای دسته‌بندی استفاده می‌شود (مثلاً تشخیص اسپم از غیراسپم).
- نحوه کار: SVM سعی می‌کند یک مرز یا صفحه‌ای (Hyperplane) بین دسته‌های مختلف داده پیدا کند که بیشترین حاشیه امن (Margin) را داشته باشد. یعنی این مرز تا نزدیک‌ترین داده‌های هر دسته (بردارهای پشتیبان) حداکثر فاصله را دارد. این کار باعث می‌شود مدل در برابر داده‌های جدید، عملکرد بهتری داشته باشد و "عمومیت‌پذیر" (Generalize) شود.
- یک تشبیه: فرض کنید دو نوع میوه (سیب و پرتقال) روی میز دارید. SVM سعی می‌کند بهترین خط مستقیمی را بکشد که این دو دسته را از هم جدا کند، طوری که فاصله این خط از نزدیک‌ترین سیب و نزدیک‌ترین پرتقال حداکثر باشد.

#### 2. RF - جنگل تصادفی

- هدف اصلی: هم برای دسته‌بندی و هم برای رگرسیون (پیش‌بینی مقادیر عددی) استفاده می‌شود.
- نحوه کار: RF نمونه‌ای از "یادگیری گروهی" (Ensemble Learning) است. این الگوریتم تعداد زیادی درخت تصمیم (Decision Tree) می‌سازد. هر درخت تصمیم با بخشی تصادفی از داده‌ها آموزش می‌بیند. در نهایت، برای پیش‌بینی یک داده جدید، همه درختان رای می‌دهند و پاسخ نهایی، پاسخ اکثریت (در دسته‌بندی) یا میانگین آراء (در رگرسیون) است.
- یک تشبیه: به جای اینکه از یک متخصص (یک درخت تصمیم) بپرسید، از یک گروه متخصص (جنگل) نظر می‌خواهید. هر متخصص با تجربه کمی متفاوت آموزش دیده است. تصمیم نهایی که گروه می‌گیرد، معمولاً بسیار دقیق‌تر و قابل‌اعتمادتر از نظر یک متخصص به تنهایی است. این کار از "بیش‌برازش" (Overfitting) جلوگیری می‌کند.

#### 3. MLP - پرسپترون چندلایه

- هدف اصلی: یک نوع ساده از شبکه عصبی مصنوعی است که هم برای دسته‌بندی و هم برای رگرسیون به کار می‌رود.
- نحوه کار: MLP از لایه‌های متوالی از "نورون"‌های مصنوعی تشکیل شده است:
- لایه ورودی: داده را دریافت می‌کند.
- لایه(های) پنهان: محاسبات پیچیده روی داده انجام می‌دهند و الگوها را یاد می‌گیرند. "چندلایه" بودن به همین لایه‌های پنهان اشاره دارد.
- لایه خروجی: نتیجه نهایی را تولید می‌کند.
هر نورون با نورون‌های لایه بعدی ارتباط دارد و این ارتباطات دارای "وزن" هستند. فرآیند آموزش، در واقع تنظیم همین وزن‌ها برای کم کردن خطا است.
- یک تشبیه: مغز انسان را در نظر بگیرید که از نورون‌های به هم پیوسته تشکیل شده. MLP یک مدل ساده‌شده از این شبکه است که می‌تواند روابط بسیار پیچیده و غیرخطی را در داده‌ها یاد بگیرد.

### جمع‌بندی نهایی

- SVM: مثل یک نقشه‌کش است که دقیق‌ترین مرز ممکن را بین مناطق ترسیم می‌کند.
- RF: مثل یک دموکراسی است که از جمع‌بندی نظرات چندین متخصص ساده (درختان) برای گرفتن بهترین تصمیم استفاده می‌کند.
- MLP: مثل یک مغز مصنوعی کوچک است که با تنظیم ارتباطات داخلی‌اش، مسائل پیچیده را حل می‌کند.

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