15-bo‘lim

Embedding - ma'no vektorlari

Jumlani bitta vektorga aylantirish, mean pooling, kosinus o'xshashlik va embeddinglar nimani o'lchaydi - nimani emas.

🕑 8 daqiqa o‘qish 📄 620 so‘z 👁 2 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Maxsus model
  2. Mean pooling
  3. Ishlaydigan holat
  4. Endi muammoli holat
  5. Alohida so'zlar bilan ehtiyot bo'ling
  6. Tillararo
  7. Tezlik
  8. Xulosa

Fine-tuning kichik ma'lumotda ishlamadi. Boshqa yo'l bor: modelni o'qitmasdan, faqat uning ma'no vektorlaridan foydalanish.

Maxsus model #

AutoModel har token uchun vektor beradi (11-bo'lim). Bizga esa butun jumla uchun bitta vektor kerak.

Buning uchun maxsus o'qitilgan modellar bor:

Python
from transformers import AutoTokenizer, AutoModel
import torch.nn.functional as F

NOM = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
tok = AutoTokenizer.from_pretrained(NOM)
mdl = AutoModel.from_pretrained(NOM)
mdl.eval()
Natija
model: paraphrase-multilingual-MiniLM-L12-v2
parametrlar: 117,653,760

Nomidagi paraphrase muhim: bu model bir xil ma'noli jumlalar vektorlarini yaqinlashtirish uchun sozlangan.

Mean pooling #

Python
def ortacha_pool(chiqish, niqob):
    h = chiqish.last_hidden_state
    m = niqob.unsqueeze(-1).expand(h.size()).float()
    return (h * m).sum(1) / m.sum(1).clamp(min=1e-9)

@torch.no_grad()
def vektor(matnlar):
    e = tok(matnlar, padding=True, truncation=True, max_length=128, return_tensors="pt")
    v = ortacha_pool(mdl(**e), e["attention_mask"])
    return F.normalize(v, p=2, dim=1)
Natija
  shakl: (1, 384) | uzunlik: 1.0

Bu PyTorch darsligining 17-bo'limidagi niqobli o'rtachaning o'zi - [PAD] tokenlar hisobga olinmaydi.

F.normalize vektor uzunligini 1 ga keltiradi. Shunda skalyar ko'paytma to'g'ridan-to'g'ri kosinus o'xshashlik bo'lib qoladi (3-bo'lim).

Nega normallash qulay

Uzunligi 1 bo'lgan ikki vektor uchun a @ b natijasi -1 dan 1 gacha bo'ladi:

  • 1.0 - bir xil yo'nalish
  • 0.0 - bog'liq emas
  • -1.0 - qarama-qarshi

Shuning uchun taqqoslash oddiy ko'paytmaga aylanadi - va minglab hujjatni bitta matritsa amali bilan solishtirish mumkin (16-bo'lim).

Ishlaydigan holat #

Python
juftlar = [
 ("Men kitob o'qiyapman", "Kitobni o'qimoqdaman"),
 ("Telefon buzildi", "Telefonim ishlamayapti"),
 ("Men kitob o'qiyapman", "Bugun havo issiq"),
]
Natija
  Men kitob o'qiyapman       | Kitobni o'qimoqdaman         -> 0.842
  Telefon buzildi            | Telefonim ishlamayapti       -> 0.822
  Men kitob o'qiyapman       | Bugun havo issiq             -> 0.269

Bu aynan kutilgan natija. Bir xil ma'noli jumlalar 0.82-0.84, bog'liq bo'lmaganlari 0.27.

Diqqat qiling: «Telefon buzildi» va «Telefonim ishlamayapti» jumlalarida birorta ham umumiy so'z yo'q (shakli boshqa). Kalit so'zli qidiruv ularni bog'lay olmasdi.

Endi muammoli holat #

Natija
  Telefon buzildi            | Telefon zo'r ishlayapti      -> 0.825

Bu ikki jumla qarama-qarshi ma'noda. Lekin o'xshashlik 0.825 - yuqoridagi to'g'ri juftlikdan ham yuqori.

Embedding ma'noni emas, MAVZUNI o'lchaydi

Bu darslikdagi eng muhim nozik nuqtalardan biri.

Model «telefon» va «ishlash» haqidagi ikkala jumlani bir xil mavzuga tegishli deb ko'radi. Ijobiy yoki salbiy ekani uni qiziqtirmaydi.

Shuning uchun:

  • Semantik qidiruv uchun a'lo - «telefon buzilgani haqida» so'rovga ikkala jumla ham mavzuan mos.
  • Kayfiyat tahlili uchun yaroqsiz - u qutbni ajratmaydi.

14-bo'lim oxirida «embedding yondashuvini sinang» deb aytgan edik. Mana sinov natijasi: u qidiruv masalasini yechadi, kayfiyat masalasini emas. Kayfiyat uchun haqiqiy yorliqlangan ma'lumot kerak - boshqa yo'li yo'q.

Kosinus o'xshashlik: nima yaqin, nima uzoq 0.0 0.5 1.0 0.27 kitob o'qish va havo to'g'ri: uzoq 0.82 telefon buzildi / ishlamayapti to'g'ri: yaqin 0.825 telefon buzildi / zo'r ishlayapti qarama-qarshi, lekin eng yaqin! Bir mavzudagi qarama-qarshi fikrlar ham yaqin chiqadi
Embedding «nima haqida» ekanini o'lchaydi, «nima deyilgani»ni emas

Alohida so'zlar bilan ehtiyot bo'ling #

Natija
          shifokor  vrach  kasalxona  dastur  kompyuter  olma  banan
  shifokor     1.00   0.56     0.72     0.65      0.50    0.55   0.24
  vrach        0.56   1.00     0.77     0.80      0.64    0.71   0.37
  kasalxona    0.72   0.77     1.00     0.84      0.67    0.74   0.40
  dastur       0.65   0.80     0.84     1.00      0.78    0.78   0.41

Bu jadval yomon. «Kasalxona» va «dastur» o'rtasida 0.84 - «shifokor» va «vrach» o'rtasidagi 0.56 dan ancha yuqori. Mantiqan teskari.

Sabab: model jumlalar uchun sozlangan, yolg'iz so'zlar uchun emas. Qolaversa, o'zbekcha so'zlar bo'laklarga sochiladi (2-bo'lim) va kontekstsiz bo'lak modelga kam narsa aytadi.

Embeddingni jumla darajasida ishlating

Yolg'iz so'zlarni taqqoslash kerak bo'lsa, ularni jumlaga joylang: «shifokor kasalni ko'rdi» va «vrach bemorni tekshirdi».

Kontekst bilan model ancha ishonchli ishlaydi.

Tillararo #

Natija
  Telefon buzildi            | The phone is broken    -> 0.781
  Men kitob o'qiyapman       | I am reading a book    -> 0.284
  Men kitob o'qiyapman       | The phone is broken    -> 0.125

Ko'p tilli model tarjimalarni bog'lay oladi - birinchi juftlikda 0.781. Lekin ikkinchisida atigi 0.284, garchi ular ham aniq tarjima bo'lsa ham.

Ya'ni qobiliyat bor, lekin ishonchsiz. Muhim loyihada bunga tayanmang - o'z misollaringizda o'lchab ko'ring.

Tezlik #

Natija
  256 ta jumla: 360 ms

Protsessorda sekundiga ~700 ta jumla. Ming-o'n minglab hujjatni indekslash uchun yetarli.

XususiyatQiymat
Vektor o'lchami384
Parametrlar117.6 mln
Tezlik (CPU)~700 jumla/soniya
O'qitish kerakmiYo'q
Amaliy topshiriq
  1. Embedding modelini yuklab, bitta jumla vektorini oling.
  2. F.normalize dan keyin vektor uzunligini tekshiring.
  3. Bir xil ma'noli ikki jumla o'xshashligini hisoblang.
  4. Bog'liq bo'lmagan ikki jumla uchun takrorlang.
  5. Qarama-qarshi ma'noli ikki jumlani sinab, natijani izohlang.
  6. Nega embedding qutbni ajratmasligini tushuntiring.
  7. Yolg'iz so'zlar matritsasini qurib, g'alati juftliklarni toping.
  8. O'sha so'zlarni jumlaga joylab, natija yaxshilanishini tekshiring.
  9. O'zbekcha jumla va uning inglizcha tarjimasini taqqoslang.
  10. 256 ta jumla uchun vektor hisoblash vaqtini o'lchang.

Xulosa #

  • Embedding - butun jumlani ifodalovchi bitta vektor.
  • sentence-transformers modellari aynan shu uchun sozlangan.
  • Mean pooling token vektorlarini niqob bilan o'rtachalaydi.
  • F.normalize dan keyin skalyar ko'paytma kosinus o'xshashlik bo'ladi.
  • Bir xil ma'noli jumlalar 0.82-0.84, bog'liq bo'lmaganlari 0.27 berdi.
  • Umumiy so'zsiz jumlalarni ham bog'lay oladi - kalit so'zli qidiruvdan ustunligi shu.
  • Lekin qarama-qarshi jumlalar ham yuqori ball oldi: 0.825.
  • Demak embedding mavzuni o'lchaydi, fikrning qutbini emas.
  • Shuning uchun u qidiruvga a'lo, kayfiyat tahliliga yaroqsiz.
  • Yolg'iz o'zbekcha so'zlarda natija ishonchsiz - jumla darajasida ishlating.

Keyingi bo'limda shu vektorlardan ishlaydigan semantik qidiruv tizimi quramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.