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.
Ushbu bo‘lim mundarijasi
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:
| Tur | Misol | Yorliq |
|---|---|---|
| Oddiy | dastur yomon, tavsiya qilmayman. | 0 |
| Inkor | mahsulot qimmat emas, aksincha yoqdi. | 1 |
| Aralash | Narxi yomon, lekin xizmat zo'r - roziman. | 1 |
| Kalit so'zsiz | buyurtmani boshqa urinmayman. | 0 |
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.
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 #
random.shuffle(data)
n = int(0.8 * len(data))
oquv, test = data[:n], data[n:]
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 #
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)
'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 #
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
kalit so'zli qoida aniqligi: 83.10%
Yigirmata so'zdan iborat ro'yxat 83.10% beryapti. Hech qanday neyron tarmoqsiz, o'qitishsiz, GPU siz.
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 #
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]
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 yozingUsiz 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:
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 majburiyKalit 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.
- O'z sohangiz uchun 50 ta sharh yozing va yorliq qo'ying.
- To'plamga inkorli («yomon emas») 10 ta misol qo'shing.
- Aralash («qimmat, lekin sifatli») 10 ta misol qo'shing.
- To'plamni 80/20 ga bo'lib, ikkala qismda sinf ulushini tekshiring.
- «Hammasini bitta sinfga» bazaviy darajasini hisoblang.
- Kalit so'zli qoida yozib, uning aniqligini o'lchang.
- Qoida qaysi misollarda xato qilganini ko'rib chiqing.
- Xatolarning aksariyati qaysi turga tegishli ekanini aniqlang.
- Matnlaringizda so'z va token nisbatini hisoblang.
- Eng uzun matnga qarab
max_lengthni 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_lengthni o'lchov bilan tanlang vatruncation=Trueni unutmang.
Keyingi bo'limda shu to'plamda tayyor modelni sozlaymiz va bazaviy darajani urib o'tishga urinamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.