13-bo‘lim
Fine-tuning - modelni sozlash
Tayyor modelga yangi bosh qo'yish, o'qitish sikli, 100% natijaning aldamchiligi va model haqiqatan nimani o'rgangani.
Ushbu bo‘lim mundarijasi
Endi tayyor modelni o'z ma'lumotimizga sozlaymiz. Bu PyTorch darsligining 16-bo'limidagi transfer learning ning matn versiyasi.
Modelni yuklash #
from transformers import AutoModelForSequenceClassification
NOM = "distilbert-base-multilingual-cased"
model = AutoModelForSequenceClassification.from_pretrained(NOM, num_labels=2)
parametrlar: 135,326,210
num_labels=2 bergani uchun kutubxona modelga yangi bosh qo'yadi.
Shu paytda quyidagi xabar chiqadi:
pre_classifier.weight | MISSING |
pre_classifier.bias | MISSING |
classifier.weight | MISSING |
classifier.bias | MISSING |
- MISSING: those params were newly initialized because missing from the
checkpoint. Consider training on your downstream task.
Tayyor modelda tasniflash boshi yo'q edi - u [MASK] to'ldirish uchun
o'qitilgan. Biz num_labels=2 deb so'raganimizda kutubxona yangi,
tasodifiy bosh qo'shdi. MISSING aynan shuni bildiradi.
Fine-tuning qilayotgan bo'lsangiz - bu normal. Agar siz allaqachon
sozlangan modelni yuklayotgan bo'lsangiz va classifier qatlamlari
MISSING deb chiqsa - unda muammo bor, model nomini tekshiring.
Xabar matni kutubxona versiyasiga qarab farq qiladi: eski versiyalarda u «Some weights ... were not initialized» ko'rinishida edi. Mazmuni o'sha.
Sozlashdan oldin #
y, a = baho()
print(f" yo'qotish={y:.4f} aniqlik={a:.2%}")
yo'qotish=0.6865 aniqlik=69.01% (tasodifiy daraja ~50%)
Bosh tasodifiy bo'lgani uchun natija ham tasodifiyga yaqin.
O'qitish sikli #
opt = torch.optim.AdamW(model.parameters(), lr=2e-5)
for davr in range(1, 5):
model.train()
for b in o_dl:
opt.zero_grad()
out = model(**b)
out.loss.backward()
opt.step()
PyTorch darsligining 8-bo'limidagi siklning o'zi. Ikki farq bor:
| Farq | Sabab |
|---|---|
model(**b) | Paket lug'at: input_ids, attention_mask, labels |
out.loss | Model yo'qotishni o'zi hisoblaydi |
lr ni katta qo'ymangFine-tuning uchun odatiy qiymat 2e-5 - bu PyTorch darsligidagi
1e-3 dan 50 barobar kichik.
Sabab: model allaqachon ko'p narsani biladi. Katta qadam uning o'rgangan bilimini birinchi paketlardayoq buzib yuboradi (16-bo'limdagi «catastrophic forgetting»).
1e-5 dan 5e-5 gacha - xavfsiz oraliq.
Natija #
Davr | O'quv yo'q. | Test yo'q. | Test aniqlik | Vaqt
1 | 0.4388 | 0.1006 | 100.00% | 22s
2 | 0.0443 | 0.0132 | 100.00% | 21s
3 | 0.0105 | 0.0056 | 100.00% | 20s
4 | 0.0056 | 0.0036 | 100.00% | 21s
100% aniqlik, birinchi davrdayoq. Bazaviy daraja 83.10% edi - demak model uni ancha urib o'tdi.
Ajoyib natija. Endi uni yangi jumlalarda sinaymiz.
Sinov #
sinov = ["Bu darslik juda zo'r!", "Menga umuman yoqmadi.",
"Mahsulot sifatli chiqdi, tavsiya qilaman.", "Pul isrofi bo'ldi, afsus."]
Bu darslik juda zo'r! -> SALBIY (98.69%)
Menga umuman yoqmadi. -> SALBIY (99.48%)
Mahsulot sifatli chiqdi, tavsiya qilaman. -> SALBIY (99.62%)
Pul isrofi bo'ldi, afsus. -> SALBIY (98.76%)
To'rttasidan hammasi salbiy. Aniq ijobiy jumlalar ham.
Test to'plamida 100%, haqiqiy jumlalarda esa amalda ishlamaydi.
Nima bo'ldi #
To'plam shablonlardan yasalgan edi: *«{obyekt} {sifat}, tavsiya qilaman»* kabi. 352 ta jumla, lekin atigi 8 ta shablon.
Tasodifiy bo'lganda har shablon ham o'quvda, ham testda paydo bo'ldi. Model shablonni yodlab oldi va test uchun shu yetarli edi.
Yangi jumla esa boshqa tuzilishda - va model yiqildi.
PyTorch darsligining 11-bo'limida sizib chiqish haqida gapirgan edik. Mana uning amaliy ko'rinishi.
Test to'plami rasman ajratilgan edi - model u namunalarni ko'rmagan. Lekin u o'sha shablonlarni ko'rgan, shuning uchun test hech nimani sinamadi.
Bu quyidagi holatlarda ham sodir bo'ladi:
- Bir foydalanuvchining sharhlari ham o'quvda, ham testda.
- Bir maqolaning turli jumlalari ikkala to'plamda.
- Vaqt bo'yicha aralashgan ma'lumot (kelajakdan o'tmishni bashorat qilish).
Qoida: bo'lish chegarasi namuna bo'yicha emas, manba bo'yicha o'tkazilishi kerak.
Haqiqiy masalada 100% deyarli har doim xato belgisi:
- Ma'lumot sizib chiqqan (bizdagi holat).
- Nishon belgisi kirish ichida yashiringan.
- Test to'plami juda kichik yoki juda oson.
Bizning modelimiz birinchi davrdayoq 100% berdi - bu ham alomat edi. Haqiqiy o'qishda natija asta-sekin yaxshilanadi.
Saqlash #
Xulosaga qaramay, saqlash usulini ko'rib qo'yamiz:
model.save_pretrained("uz_sentiment")
tok.save_pretrained("uz_sentiment")
saqlandi: uz_sentiment/ (519 MB)
Papkaga model og'irliklari, konfiguratsiya va tokenizator birga yoziladi. Keyin uni oddiygina qaytarib yuklash mumkin:
model = AutoModelForSequenceClassification.from_pretrained("uz_sentiment")
tok = AutoTokenizer.from_pretrained("uz_sentiment")
PyTorch darsligining 10-bo'limidagi muammo bu yerda yo'q -
save_pretrained tokenizatorni ham saqlaydi, shuning uchun kirishni
tayyorlash qoidasi model bilan birga ketadi.
AutoModelForSequenceClassificationninum_labels=2bilan yuklang.- Chiqqan ogohlantirishni o'qib, nima uchun chiqqanini tushuntiring.
- Sozlashdan oldin aniqlikni o'lchang.
lr=2e-5bilan 3 davr o'qiting.lrni1e-3qilib sinab, natija qanday buzilganini ko'ring.- Test aniqligini bazaviy daraja bilan solishtiring.
- O'zingiz yozgan 5 ta yangi jumlada modelni sinang.
- Test natijasi va yangi jumlalardagi natija farqini izohlang.
- To'plamingizda nechta turli shablon borligini sanang.
- Modelni saqlab, qaytadan yuklab, natija bir xilligini tekshiring.
Xulosa #
- Fine-tuning - tayyor modelga yangi bosh qo'yib, o'z ma'lumotingizda o'qitish.
num_labels=2bergani uchun kutubxona yangi, tasodifiy bosh qo'shadi.- «newly initialized» ogohlantirishi fine-tuning da normal.
- O'qitish sikli PyTorch darsligidagi bilan bir xil; model
lossni o'zi hisoblaydi. lr2e-5atrofida bo'lishi kerak - odatdagidan 50 barobar kichik.- Bizning model test to'plamida 100% aniqlik berdi.
- Lekin yangi jumlalarda to'rttadan to'rttasini ham salbiy dedi.
- Sabab: to'plam 8 ta shablondan yasalgan, tasodifiy bo'lishda ular ikkala to'plamga tushdi.
- Model ma'noni emas, shablonni yodlab oldi.
- Qoida: bo'lish chegarasi namuna bo'yicha emas, manba bo'yicha o'tkaziladi.
Keyingi bo'limda bo'lishni to'g'rilaymiz va model haqiqatan nimani o'rganayotganini o'lchaymiz.
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.