12-bo‘lim

Ma'lumot va bazaviy daraja

O'zbekcha to'plam tuzish, inkor va aralash holatlar, oddiy qoidadan bazaviy daraja olish va nega u shart.

🕑 8 daqiqa o‘qish 📄 612 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. To'plam
  2. Bo'lish
  3. Bazaviy daraja
  4. 1-daraja: hammasini bitta sinfga tashlash
  5. 2-daraja: kalit so'zli qoida
  6. Tokenizatsiya tekshiruvi
  7. Dataset sinfi
  8. Xulosa

13-bo'limda modelni o'z ma'lumotimizga sozlaymiz. Lekin undan oldin ikkita ish bajarilishi kerak - va ikkalasi ham ko'pincha tashlab ketiladi.

To'plam #

Sharhlar kayfiyatini aniqlaydigan model quramiz. To'plam to'rt xil holatdan iborat:

TurMisolYorliq
Oddiydastur yomon, tavsiya qilmayman.0
Inkormahsulot qimmat emas, aksincha yoqdi.1
AralashNarxi yomon, lekin xizmat zo'r - roziman.1
Kalit so'zsizbuyurtmani boshqa urinmayman.0
Natija
  jami: 352
  ijobiy: 176 | salbiy: 176
   [0] kurs foydali emas, umidim puchga chiqdi.
   [0] dastur yomon, tavsiya qilmayman.
   [0] buyurtma ko'rinishi ajoyib, lekin ishlamadi - pushaymonman.

To'plam muvozanatli: 176 ta ijobiy, 176 ta salbiy.

Nega aynan bu to'rt tur

Agar to'plam faqat birinchi turdan iborat bo'lsa, masala juda oson bo'lib qoladi - buni pastda o'lchab ko'rsatamiz.

Inkor va aralash holatlar esa haqiqiy sharhlarda doim uchraydi. «Yomon emas» iborasi kalit so'z bo'yicha salbiy, ma'no bo'yicha ijobiy - modelni aynan shunday holatlar sinaydi.

Bo'lish #

Python
random.shuffle(data)
n = int(0.8 * len(data))
oquv, test = data[:n], data[n:]
Natija
  o'quv: 281 | test: 71
  o'quvda ijobiy ulushi: 50.2%
  testda ijobiy ulushi:  49.3%

Ikkala to'plamda ham ijobiy ulushi ~50% - bo'lish taqsimotni buzmadi.

Buni har doim tekshiring. Agar testda ijobiy ulushi 80% bo'lib qolsa, natijalaringizni solishtirib bo'lmaydi.

Bazaviy daraja #

Bu bo'limning eng muhim qismi. Model qurishdan oldin eng oddiy yechimni o'lchang.

1-daraja: hammasini bitta sinfga tashlash #

Python
kop = max(0, 1, key=lambda y: sum(1 for d in oquv if d["yorliq"] == y))
aniq = sum(1 for d in test if d["yorliq"] == kop) / len(test)
Natija
  'hammasi 1' deydigan model aniqligi: 49.30%

Hech nima o'rganmaydigan model 49.30% oladi. Demak modelingiz 49% dan past bo'lsa - u tasodifdan ham yomon.

2-daraja: kalit so'zli qoida #

Python
kalit_ij = ["zo'r", "ajoyib", "yaxshi", "sifatli", "foydali", "qulay",
            "tavsiya qilaman", "yoqdi", "roziman", "mamnun"]
kalit_sa = ["yomon", "sifatsiz", "noqulay", "yaroqsiz", "zerikarli",
            "qimmat", "tavsiya qilmayman", "pushaymon", "afsus"]

def qoida(m):
    ml = m.lower()
    return 1 if sum(k in ml for k in kalit_ij) > sum(k in ml for k in kalit_sa) else 0
Natija
  kalit so'zli qoida aniqligi: 83.10%

Yigirmata so'zdan iborat ro'yxat 83.10% beryapti. Hech qanday neyron tarmoqsiz, o'qitishsiz, GPU siz.

Model qurishdan oldin: nimani urib o'tish kerak 100% 50% 0 49.30% Hammasi bitta sinfga 83.10% Kalit so'zli qoida 20 ta so'z, 3 qator kod ? Transformer 135 mln parametr urib o'tish kerak Transformer 83% dan oshmasa - u bu masalada keraksiz
Bazaviy daraja modelingiz haqiqatan foyda berayotganini ko'rsatadi
Bazaviy darajasiz natija ma'nosiz

Faraz qiling, transformer o'qitdingiz va 85% aniqlik oldingiz. Yaxshi natijami?

Bazaviy darajani bilmasangiz, javob yo'q. Bu yerda 83.10% ni oddiy qoida beryapti - demak 85% atigi ikki foizlik yutuq, 135 million parametr va o'qitish vaqti evaziga.

Menga bu darslikni tayyorlashda ham shu bo'ldi: birinchi to'plamda kalit so'zli qoida 100% bergan edi. Transformer u yerda butunlay keraksiz edi - shuning uchun to'plamga inkor va aralash holatlar qo'shildi.

Avval bazaviy darajani o'lchang. U yetarli bo'lsa, murakkab model qurmang.

Tokenizatsiya tekshiruvi #

Python
tok = AutoTokenizer.from_pretrained("distilbert-base-multilingual-cased")
uz = [len(tok(d["matn"], add_special_tokens=False)["input_ids"]) for d in data]
so = [len(d["matn"].split()) for d in data]
Natija
  o'rtacha so'z: 6.1 | o'rtacha token: 17.0 | nisbat: 2.81x
  eng uzun: 22 token -> max_length=64 yetarli
  paket shakli: (3, 23)
  kalitlar: ['input_ids', 'token_type_ids', 'attention_mask']

2-bo'limdagi 2.81x nisbat yana tasdiqlandi.

Eng uzun matn 22 token - demak max_length=64 xavfsiz. Buni o'lchash muhim: juda kichik qiymat matnni kesadi, juda katta esa xotira va vaqt yeydi.

truncation=True ni har doim yozing

Usiz modelning chegarasidan uzun matn kelsa, xato chiqadi.

max_length ni esa taxmin bilan emas, o'lchov bilan tanlang: eng uzun namunangizdan biroz kattaroq qiling.

Dataset sinfi #

PyTorch darsligining 7-bo'limidagi qolip:

Python
class SharhDataset(Dataset):
    def __init__(s, rows):
        s.enc = tok([r["matn"] for r in rows], padding=True,
                    truncation=True, max_length=64, return_tensors="pt")
        s.y = torch.tensor([r["yorliq"] for r in rows])

    def __len__(s):
        return len(s.y)

    def __getitem__(s, i):
        d = {k: v[i] for k, v in s.enc.items()}
        d["labels"] = s.y[i]
        return d
labels nomi majburiy

Kalit aynan labels bo'lishi kerak. Shunda model loss ni o'zi hisoblab, out.loss sifatida qaytaradi.

Boshqa nom bersangiz, model yo'qotishni hisoblamaydi va out.loss None bo'ladi - keyin backward() chaqirganda tushunarsiz xato chiqadi.

Amaliy topshiriq
  1. O'z sohangiz uchun 50 ta sharh yozing va yorliq qo'ying.
  2. To'plamga inkorli («yomon emas») 10 ta misol qo'shing.
  3. Aralash («qimmat, lekin sifatli») 10 ta misol qo'shing.
  4. To'plamni 80/20 ga bo'lib, ikkala qismda sinf ulushini tekshiring.
  5. «Hammasini bitta sinfga» bazaviy darajasini hisoblang.
  6. Kalit so'zli qoida yozib, uning aniqligini o'lchang.
  7. Qoida qaysi misollarda xato qilganini ko'rib chiqing.
  8. Xatolarning aksariyati qaysi turga tegishli ekanini aniqlang.
  9. Matnlaringizda so'z va token nisbatini hisoblang.
  10. Eng uzun matnga qarab max_length ni tanlang.

Xulosa #

  • To'plamga inkor va aralash holatlarni ataylab qo'shing - haqiqiy matnda ular bor.
  • To'plam muvozanatli bo'lsin: bizda 176 ijobiy, 176 salbiy.
  • Bo'lgandan keyin ikkala qismda sinf ulushini tekshiring.
  • Model qurishdan oldin bazaviy darajani o'lchang.
  • «Hammasini bitta sinfga» tashlash bizda 49.30% berdi.
  • Yigirmata kalit so'zdan iborat qoida esa 83.10%.
  • Bazaviy darajasiz model natijasi ma'nosiz: 85% yaxshimi yoki yomonmi - bilib bo'lmaydi.
  • Oddiy qoida yetarli bo'lsa, murakkab model qurmang.
  • O'zbekcha matnda token/so'z nisbati yana 2.81x chiqdi.
  • max_length ni o'lchov bilan tanlang va truncation=True ni unutmang.

Keyingi bo'limda shu to'plamda tayyor modelni sozlaymiz va bazaviy darajani urib o'tishga urinamiz.

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.