چیت‌شیت

Word2Vec، GloVe و FastText

Word2Vec, GloVe and FastText

شمارش کلمات، وزن‌دهی با TF-IDF، آموزش بردارهای متراکم و تقسیم کلمات نادر به زیرکلمه‌ها. کدهای پایتون درس‌ها.

  • ۱۱ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. Skip-gram با نمونه‌برداری منفی
  2. یک گام آموزش: train_pair
  3. وظایف در کد
  4. کتابخانه‌ها در محیط عملیاتی
  5. فرمول‌ها
  6. تنظیمات Vectorizer
  7. پیش‌فرض‌ها و ارقام
  8. عیب‌یابی
  9. کوته‌نوشت‌ها
  10. پرسش‌ها
  11. نکات

Skip-gram با نمونه‌برداری منفی

معماری
جستجو (lookup)ضرب داخلیu_pos، u_negsone-hot(مرکز)اندازه واژگانWجدول مرکز، نگه‌داشته‌شدهپنهانd-بعدی، بدون تابع غیرخطیW'جدول زمینه (context)امتیازهای سیگموئید1 مثبت، k منفی

یک گام آموزش: train_pair

گام‌به‌گام
  1. جفت‌هاتابع skipgram_pairs تمام جفت‌های (مرکز، زمینه) را درون window تولید می‌کند.
  2. منفی‌هاانتخاب k_neg شناسه تصادفی. شناسه‌های مرکز و زمینه را کنار بگذارید.
  3. امتیازهاsigmoid(v_c @ u_pos) باید نزدیک به 1 باشد؛ sigmoid(u_negs @ v_c) نزدیک به 0.
  4. خطاهاpos_err برابر امتیاز مثبت منهای 1.0 است. neg_errs همان امتیازهای منفی هستند.
  5. به‌روزرسانی W'برای هر سطر زمینه، مقدار lr ضرب‌در خطا ضرب‌در v_c را کم کنید.
  6. به‌روزرسانی Wمقدار lr * grad_center را از سطر مرکز کم کنید.

وظایف در کد

کار و کد
وظیفهکد
ماتریس شمارشbag_of_words(docs, vocab)
سطرهای TF-IDF با طول واحد (نرمال‌شده)l2_normalize(tfidf(bow))
آموزش skip-gram از صفرtrain(docs, dim=16, window=2, k_neg=5, epochs=100, lr=0.05, seed=0)
پرس‌وجوی قیاس (Analogy)analogy(vocab, W, "man", "king", "woman")
شمارش هم‌آییbuild_cooccurrence(docs, window=5)
آموزش GloVeglove_train(vocab, pair_counts, dim=16, epochs=100, lr=0.05, x_max=100, alpha=0.75, seed=0)
n-gramهای FastTextchar_ngrams(word, n_min=3, n_max=6)
یادگیری و اعمال BPEapply_bpe("lowest", learn_bpe(corpus, k_merges=10))

کتابخانه‌ها در محیط عملیاتی

کد
python
tfidf = TfidfVectorizer().fit_transform(docs)  # وزن‌های IDF به همراه نرم L2
model = Word2Vec(sentences, vector_size=100, window=5,
                 min_count=1, sg=1, negative=5, workers=4, epochs=30)
model.wv.most_similar("cat", topn=3)           # نزدیک‌ترین همسایه‌ها
fasttext.util.download_model("en", if_exists="ignore")
ft = fasttext.load_model("cc.en.300.bin")
ft.get_word_vector("zoomerapproved")           # کلمه OOV همچنان بردار دریافت می‌کند
tok = AutoTokenizer.from_pretrained("gpt2")
tok.tokenize("unbelievably tokenized")         # Ġ نشان‌دهنده مرز کلمه است

فرمول‌ها

مفهوم‌ها
TF-IDF
$\frac{\mathrm{count}(w \text{ in } d)}{|d|} \cdot \log\frac{N}{\mathrm{df}(w)}$
IDF هموارشده
$\log\frac{n+1}{d+1} + 1$. کلمه‌ای که در همه اسناد باشد IDF برابر 1 می‌گیرد.
کسینوس
ضرب داخلی سطرهای نرمال‌شده با L2. مقدار 1 یعنی همسان، 0 یعنی متعامد.
برازش GloVe
$v_i \cdot v_j + b_i + b_j \approx \log X_{ij}$
وزن GloVe
$f(x) = (x / x_{max})^{\alpha}$ برای مقادیر کمتر از x_max، در غیر این صورت 1.0.
خروجی GloVe
W + W_tilde. مجموع دو جدول از هر کدام به تنهایی بهتر است.
بردار FastText
مجموع بردارهای کاراکتر n-gramهای کلمه.
واژگان BPE
شامل k + 256 توکن پس از k بار merge.

تنظیمات Vectorizer

دستورها
دستورکارکرد
ngram_range=(1, 2)افزودن bigramها. معمولاً به دسته‌بندی کمک می‌کند
min_df=2حذف کلماتی که در کمتر از 2 سند آمده‌اند
max_df=0.95حذف کلماتی که در بیش از 95% اسناد آمده‌اند
stop_words="english"فهرست درونی stopwordها. مناسب برای تحلیل حس نیست
sublinear_tf=Trueاستفاده از 1 + log(tf) برای کلمات پرتکرار
get_feature_names_outفهرست کردن ستون‌های واژگان

پیش‌فرض‌ها و ارقام

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
gensim `vector_size`100بردارهای متراکم معمولاً 100 تا 300 بعدی هستند
gensim `window`5کد پیاده‌سازی از صفر از 2 استفاده می‌کند
`negative`, `k_neg`5تعداد منفی‌ها به ازای هر جفت مثبت
sg1Skip-gram؛ برای کلمات نادر بهتر است
Init std0.1rng.normal(0, 0.1, size=(vocab_size, dim))
GloVe `x_max`100جفت‌های برابر یا بالاتر از آن وزن 1.0 می‌گیرند
GloVe `alpha`0.75کاهش وزن جفت‌های پرتکرار
FastText n-gram length3 to 6کاراکترها، به همراه نشانه‌های < و >

عیب‌یابی

عیب‌یابی
  • «not good» و «excellent» شبیه به هم به نظر می‌رسند

    علت
    BoW ترتیب کلمات را حذف می‌کند
    راه‌حل
    افزودن bigramها یا استفاده از امبدینگ‌ها
  • Zoomer-approved هیچ برداری ندارد

    علت
    کلمه OOV در BoW و Word2Vec
    راه‌حل
    استفاده از FastText یا BPE
  • bank برای دو معنای متفاوت تنها یک بردار دارد

    علت
    امبدینگ ایستا
    راه‌حل
    استفاده از امبدینگ‌های زمینه‌ای
  • اسناد طولانی بر شباهت غلبه می‌کنند

    علت
    سطرها نرمال‌سازی نشده‌اند
    راه‌حل
    اعمال l2_normalize
  • سیگنال منفی‌ساز از دست رفته است

    علت
    حذف stopwordها
    راه‌حل
    نگه‌داشتن stopwordها در تحلیل حس
  • نرم بردار کمتر از 0.01 یا بیشتر از 100 است

    علت
    باگ در آموزش
    راه‌حل
    مدل را علامت‌گذاری و متوقف کنید
  • خروجی نامناسب و بی‌صدا در محیط عملیاتی

    علت
    عدم تطابق توکنایزر و مدل
    راه‌حل
    استفاده از همان توکنایزر پیش‌فرض مدل
  • ماتریس متراکم 100k سند در حافظه جا نمی‌شود

    علت
    تبدیل زودهنگام به ماتریس متراکم
    راه‌حل
    اسپارس (sparse) نگه داشتن ماتریس

کوته‌نوشت‌ها

اصطلاح‌ها
BoW
مدل Bag of Words. شمارش کلمات واژگان بدون حفظ ترتیب.
TF / DF
بسامد کلمه در سند (TF) و تعداد اسناد حاوی آن کلمه (DF).
IDF
بسامد معکوس سند. کاهش وزن کلماتی که همه‌جا تکرار شده‌اند.
CBOW
مدل Continuous Bag of Words. پیش‌بینی کلمه مرکز بر اساس زمینه.
Skip-gram
پیش‌بینی زمینه بر اساس کلمه مرکز. حالت پیش‌فرض.
GloVe
بردارهای سراسری (Global Vectors). فاکتورگیری از ماتریس هم‌آیی.
OOV
خارج از واژگان (Out of vocabulary). مشکلی که Word2Vec و GloVe دارند.
BPE
کدگذاری جفت‌بایت (Byte-Pair Encoding). ادغام مکرر جفت‌های مجاور پرتکرار.

پرسش‌ها

پرسش و پاسخ
TF-IDF چه زمانی برنده است؟
هرزنامه‌ها، دسته‌بندی موضوعی، لاگ‌ها، داده‌های کم، تاخیر بسیار کم و خروجی تفسیرپذیر.
چرا نمونه‌برداری منفی؟
سافت‌مکس روی 100k کلمه بسیار کند است؛ یک وظیفه دودویی جایگزین آن می‌شود.
چرا قیاس کار می‌کند؟
تفریق (king - man) جهت «سلطنت» را حفظ می‌کند؛ آن را به woman اضافه کنید.
GloVe یا FastText؟
FastText برای غلط‌های املایی، کلمات جدید و ساخت‌واژه غنی.
آیا برای فاین‌تیونینگ باید توکنایزر آموزش داد؟
خیر؛ از توکنایزر مدل از‌پیش‌آموزش‌دیده استفاده کنید.

نکات

نکته‌ها
  • با کمتر از 500 نمونه برچسب‌دار، با یک خط مبنای TF-IDF شروع کنید.
  • با کمتر از حدود 50k داده برچسب‌دار، امبدینگ‌های وزن‌دهی‌شده با TF-IDF را امتحان کنید.
  • امبدینگ‌ها را فقط با دقت قیاس نسنجید؛ یک آزمون وظیفه نهایی اضافه کنید.
  • بردارهای از‌پیش‌آموزش‌دیده را دانلود کنید؛ تقریباً هیچ‌وقت نیاز نیست خودتان Word2Vec آموزش دهید.
  • توکنایزرهای GPT، BERT و T5 بین 30k تا 100k عملیات ادغام (merge) یاد می‌گیرند.