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.

🕑 9 daqiqa o‘qish 📄 671 so‘z 👁 2 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Modelni yuklash
  2. Sozlashdan oldin
  3. O'qitish sikli
  4. Natija
  5. Sinov
  6. Nima bo'ldi
  7. Saqlash
  8. Xulosa

Endi tayyor modelni o'z ma'lumotimizga sozlaymiz. Bu PyTorch darsligining 16-bo'limidagi transfer learning ning matn versiyasi.

Modelni yuklash #

Python
from transformers import AutoModelForSequenceClassification

NOM = "distilbert-base-multilingual-cased"
model = AutoModelForSequenceClassification.from_pretrained(NOM, num_labels=2)
Natija
parametrlar: 135,326,210

num_labels=2 bergani uchun kutubxona modelga yangi bosh qo'yadi. Shu paytda quyidagi xabar chiqadi:

Natija
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.
Bu xato emas, kutilgan xabar

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 #

Python
y, a = baho()
print(f"  yo'qotish={y:.4f}  aniqlik={a:.2%}")
Natija
  yo'qotish=0.6865  aniqlik=69.01%  (tasodifiy daraja ~50%)

Bosh tasodifiy bo'lgani uchun natija ham tasodifiyga yaqin.

O'qitish sikli #

Python
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:

FarqSabab
model(**b)Paket lug'at: input_ids, attention_mask, labels
out.lossModel yo'qotishni o'zi hisoblaydi
lr ni katta qo'ymang

Fine-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 #

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 #

Python
sinov = ["Bu darslik juda zo'r!", "Menga umuman yoqmadi.",
         "Mahsulot sifatli chiqdi, tavsiya qilaman.", "Pul isrofi bo'ldi, afsus."]
Natija
  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.

Bir xil model, ikki xil o'lchov Test to'plamida 100% 71 ta namunadan 71 tasi to'g'ri hisobotga yozsa - ajoyib model Yangi jumlalarda 2 / 4 hammasini «salbiy» dedi amalda - yaroqsiz Sabab: test to'plami o'quv to'plami bilan bir xil shablonlardan tuzilgan model ma'noni emas, shablonni yodlab oldi
100% aniqlik model yaxshi ekanini isbotlamaydi - u faqat test to'plami haqida gapiradi

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.

Bu «ma'lumot sizib chiqishi» ning eng ko'p uchraydigan turi

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.

100% ko'rsangiz - xursand bo'lmang, shubhalaning

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:

Python
model.save_pretrained("uz_sentiment")
tok.save_pretrained("uz_sentiment")
Natija
saqlandi: uz_sentiment/ (519 MB)

Papkaga model og'irliklari, konfiguratsiya va tokenizator birga yoziladi. Keyin uni oddiygina qaytarib yuklash mumkin:

Python
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.

Amaliy topshiriq
  1. AutoModelForSequenceClassification ni num_labels=2 bilan yuklang.
  2. Chiqqan ogohlantirishni o'qib, nima uchun chiqqanini tushuntiring.
  3. Sozlashdan oldin aniqlikni o'lchang.
  4. lr=2e-5 bilan 3 davr o'qiting.
  5. lr ni 1e-3 qilib sinab, natija qanday buzilganini ko'ring.
  6. Test aniqligini bazaviy daraja bilan solishtiring.
  7. O'zingiz yozgan 5 ta yangi jumlada modelni sinang.
  8. Test natijasi va yangi jumlalardagi natija farqini izohlang.
  9. To'plamingizda nechta turli shablon borligini sanang.
  10. 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=2 bergani uchun kutubxona yangi, tasodifiy bosh qo'shadi.
  • «newly initialized» ogohlantirishi fine-tuning da normal.
  • O'qitish sikli PyTorch darsligidagi bilan bir xil; model loss ni o'zi hisoblaydi.
  • lr 2e-5 atrofida 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.

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.