Mundarija (23)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Xavflar xaritasi
- 2.2. Deepfake va dezinformatsiya — himoya nuqtai nazaridan
- 2.3. Mualliflik huquqi va o'quv ma'lumoti
- 2.4. Yodlab olish va maxfiylik
- 2.5. Tarafkashlikning kuchayishi
- 2.6. Ko'rinmas watermark: rasm va matn
- 2.7. Sintetik kontent detektorlari va ularning umumlashmasligi
- 2.8. Kelib chiqish (C2PA), model kartalari va tashkiliy choralar
- 2.9. Tuzoqlar
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Yodlab olish: o'quv hajmi, o'rgatish uzunligi va a'zolik hujumi
- Misol 2 — Tarafkashlikning kuchayishi: 70/30 dan generatsiyada nima chiqadi
- Misol 3 — Ko'rinmas watermark: TPR, FPR va chidamlilik
- Misol 4 — Sintetik rasm detektori: tanish va yangi generatorlar
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
26.9-dars: Generativ AI etikasi va xavfsizligi
26-QISM — GENERATIV AI · 9-dars
1. Kirish va motivatsiya
26.8-darsda matn va rasmni bitta fazoga joylab, "matndan rasm" tizimlarining ichki tuzilishini ko'rdik. Shu paytgacha bitta savol bilan ishladik: model qanchalik yaxshi generatsiya qiladi? Endi ikkinchi, xuddi shunday muhim savolga o'tamiz: generatsiya qanday zarar keltirishi mumkin va biz uni qanday o'lchaymiz va kamaytiramiz?
Generativ modellarning xavflari mavhum emas. Ular ishonarli soxta rasm, ovoz va matn yaratadi (deepfake va dezinformatsiya); o'quv ma'lumotidagi mualliflik huquqi bilan himoyalangan asarlarni yoki shaxsiy ma'lumotni aynan qaytarishi mumkin (yodlab olish); o'quv ma'lumotidagi nomutanosiblikni saqlabgina qolmay, ba'zan kuchaytiradi (tarafkashlik); va zararli kontent yaratishga ishlatilishi mumkin. Bu darsda biz ularning har birini himoya nuqtai nazaridan ko'ramiz: qanday aniqlash, o'lchash va cheklash.
Real vaziyat. Klinika kichik ichki ma'lumot to'plamida — bir necha yuz bemorning tibbiy rasmlarida — generativ model o'rgatdi: maqsad "sintetik ma'lumot" yaratib, uni tashqi hamkorlarga "maxfiylik muammosi yo'q" deb berish edi. Model ko'z bilan qaraganda "yangi" rasmlar chiqardi. Keyin auditor oddiy tekshiruv o'tkazdi: har bir sintetik rasm uchun o'quv to'plamidagi eng yaqin rasmni topdi. Sintetik to'plamning sezilarli qismi o'quv rasmlarining deyarli aynan nusxasi bo'lib chiqdi — ya'ni "sintetik ma'lumot" haqiqiy bemor rasmlarini oshkor qilgan edi. Bu darsning 1-misoli aynan shu tekshiruvni raqam bilan ko'rsatadi: 40 ta rasmda uzoq o'rgatilgan model 1000 ta namunaning 85.9% ini o'quv rasmlarining aynan nusxasi sifatida qaytardi.
Bu darsda yodlab olishni o'lchaymiz, tarafkashlik kuchayishini halol tekshiramiz, ko'rinmas watermark quramiz va sintetik rasm detektorining chegaralarini ko'ramiz — hammasi o'lchanadigan raqamlar bilan.
Bu darsda:
- Xavflar xaritasi: deepfake, mualliflik huquqi, yodlab olish, tarafkashlik, zararli kontent
- Deepfake va dezinformatsiya — himoya nuqtai nazaridan
- Mualliflik huquqi va o'quv ma'lumoti
- Yodlab olish va maxfiylik: nusxalar, eng yaqin qo'shni, a'zolik hujumi
- Tarafkashlikning kuchayishi: nisbat saqlanadimi?
- Ko'rinmas watermark: rasm va matn ("green list")
- Sintetik kontent detektorlari va ularning umumlashmasligi
- Kelib chiqish (C2PA), model kartalari, tashkiliy choralar
- Tuzoqlar
ℹ Misollar real torch/numpy/sklearn bilan (Python 3.14, torch 2.14 CPU).
2. Nazariya — chuqur tushuntirish
2.1. Xavflar xaritasi
XAVF NIMA BO'LADI HIMOYA QATLAMLARI
deepfake va ishonarli soxta rasm/ovoz/video, kelib chiqish (C2PA), watermark,
dezinformatsiya real odam nomidan detektorlar, platforma siyosati
mualliflik huquqi o'quv ma'lumotida himoyalangan litsenziya auditi, opt-out,
asarlar; uslub va nusxa dublikatlarni olib tashlash, filtr
yodlab olish va o'quv namunasini aynan qaytarish dedup, erta to'xtatish, DP-SGD,
maxfiylik (shaxsiy ma'lumot, rasm, kod) eng yaqin qo'shni auditi
tarafkashlik nomutanosiblik saqlanadi yoki guruh ulushini o'lchash,
KUCHAYADI shartli generatsiya, balans
zararli kontent zo'ravonlik, firibgarlik matnlari, kirish/chiqish filtrlari,
xavfli yo'riqnomalar red-teaming, foydalanish siyosati
UMUMIY TAMOYIL (25.13 bilan bir xil):
bitta "sehrli" himoya yo'q - qatlamlar; har qatlam o'lchanadi
(TPR, FPR, nusxa ulushi, guruh ulushi) va cheklovlari hujjatlanadiBu jadvalning har qatori o'z o'lchov asbobiga ega. 25.13-darsda LLM xavfsizligini qatlamlar bilan ko'rgan edik — injection filtri, PII niqoblash, eng kam imtiyoz. Generativ rasm modellarida mantiq o'sha: har xavf uchun kamida bitta raqam bo'lishi kerak, aks holda "himoya bor" degan gap tekshirib bo'lmaydigan va'da bo'lib qoladi.
Etika — faqat qoidalar ro'yxati emas, o'lchov ham: nusxa ulushi, guruh ulushi, watermark TPR/FPR, detektor AUC.
2.2. Deepfake va dezinformatsiya — himoya nuqtai nazaridan
MUAMMO:
generatsiya sifati oshgan sari "ko'z bilan" ajratish qiyinlashadi
xavf: real odam nomidan soxta bayonot, firibgarlik, obro'ga zarar,
"hamma narsa soxta bo'lishi mumkin" degan umumiy ishonchsizlik
HIMOYA YO'NALISHLARI:
1) FAOL belgilash (generatsiya paytida):
watermark - chiqishga ko'rinmas signal (2.6, 3-misol)
kelib chiqish metama'lumoti - C2PA 2.8-bob
2) PASSIV aniqlash (keyin, belgisiz kontentda):
detektor-klassifikator - artefaktlarni o'rganadi (2.7, 4-misol)
yangi generatorda yiqilishi mumkin
3) JARAYON:
real odam tasvirini yaratishga rozilik talablari, platforma siyosati,
shikoyat va olib tashlash jarayoni, media savodxonlik
ASIMMETRIYA:
faol belgilash - model egasining hamkorligini talab qiladi
passiv aniqlash - hamkorliksiz, lekin doim "quvlash" o'yiniBu darsda deepfake yaratish usullarini ko'rmaymiz — faqat himoya tomonini. Muhim tushuncha — faol va passiv himoya farqi. Faol himoya (watermark, kelib chiqish belgisi) kuchli, lekin faqat generatsiya qiluvchi tizim uni qo'llasa ishlaydi. Passiv aniqlash (detektor) istalgan kontentga qo'llanadi, lekin u o'rgatilgan generatorning artefaktlarini o'rganadi — 4-misolda ko'ramizki, artefakt tuzatilgan yangi generatorda AUC 0.95-0.999 dan 0.63-0.65 ga tushadi.
Faol belgilash + passiv aniqlash + jarayon: bittasi yetarli emas, chunki har birining ma'lum zaif joyi bor.
2.3. Mualliflik huquqi va o'quv ma'lumoti
SAVOLLAR (huquqiy javob mamlakat va holatga qarab farq qiladi):
o'quv ma'lumotiga asarni kiritish mumkinmi? (litsenziya, ruxsat)
modelning chiqishi kimga tegishli?
chiqish o'quvdagi asarning nusxasi bo'lsa-chi?
MUHANDISLIK TOMONI (bizning qo'limizdagi):
ma'lumot manbalari va litsenziyalar reyestri ("datasheet")
opt-out: mualliflar o'z asarlarini chiqarib tashlashni so'ray oladi
DUBLIKATLARNI olib tashlash - ko'p takrorlangan namuna ko'proq yodlanadi
chiqishda o'quv to'plamiga yaqinlik tekshiruvi (1-misol usuli)
uslub va nusxa farqi: "uslubda" chizish va aynan nusxa - boshqa-boshqaHuquqiy savollar bo'yicha aniq javob berish bu kursning vazifasi emas — qonunlar mamlakatga qarab farq qiladi va o'zgarib turadi. Lekin muhandis uchun bir narsa aniq: aynan nusxa eng yaqqol va eng oson o'lchanadigan muammo. 1-misoldagi eng yaqin qo'shni tekshiruvi xuddi shu savolga javob beradi: "chiqish o'quv to'plamidagi biror namunaning nusxasimi?" Ma'lumot manbalarini hujjatlash esa keyingi har qanday huquqiy yoki tashkiliy savolga javob berishning asosi.
Manbalarni hujjatlang, dublikatlarni olib tashlang, chiqishlarni o'quv to'plamiga yaqinlik bo'yicha tekshiring — bu huquqiy tizimdan qat'i nazar foydali.
2.4. Yodlab olish va maxfiylik
YODLAB OLISH: model o'quv namunasini (deyarli) aynan qaytaradi
xavf: shaxsiy rasm, tibbiy yozuv, telefon raqami, kalit, himoyalangan matn
O'LCHOVLAR (1-misol):
nusxa ulushi - generatsiyaning qancha qismi o'quv namunasiga AYNAN teng
NN nisbati - mean NN(G -> o'quv) / mean NN(G -> held-out)
held-out o'quv bilan TENG hajmda bo'lishi shart!
~1 - umumlashma; << 1 - o'quvga yopishgan
a'zolik hujumi - log p(x) bo'yicha "bu namuna o'quvda bo'lganmi?"
(MIA) AUC 0.5 - sizish yo'q; 1.0 - to'liq ajraladi
1-MISOL (MADE, 0/1 piksellar, 1000 namuna):
n qadam nusxa nisbat MIA_AUC
40 300 0.6% 0.73 0.991
40 3000 85.9% 0.07 1.000 <- 40 ta rasmning 40 tasi ham qaytarildi
200 3000 15.3% 0.65 0.979
800 300 0.1% 0.98 0.582
800 3000 2.4% 0.89 0.817
OMILLAR: kichik ma'lumot + uzoq o'rgatish = yodlash
dublikat namunalar (ko'p takror -> ko'proq yodlanadi)
HIMOYA:
ko'proq va DEDUPLIKATSIYALANGAN ma'lumot
erta to'xtatish (val NLL bo'yicha): n=200 da nusxa 15.3% -> 0.1%
regulyarizatsiya, kichikroq model
differensial maxfiylik (DP-SGD): har namunaning gradientini kesish + shovqin
-> bitta namunaning ta'siri matematik chegaralanadi (aniqlik narxiga)
chiqish filtri: o'quv to'plamiga juda yaqin namunalarni rad etishJadvaldagi ikki o'q muhim: o'quv to'plami hajmi va o'rgatish uzunligi. 40 ta rasmda 3000 qadam — model har bir rasmni o'rganib oldi: nusxa ulushi 85.9%, held-out ga nusxa 0.0%, NLL o'quvda 3.9, held-out da 83.2 nat. 800 ta rasmda xuddi shu 3000 qadam — nusxa atigi 2.4%, va held-out ga ham 1.1% "nusxa" bor: 0/1 piksellarda oddiy raqamlar (masalan, "1") tasodifan ham takrorlanadi. Shuning uchun nusxa ulushini held-out bilan solishtirish kerak — mutlaq son yolg'iz aldashi mumkin.
Eng nozik o'lchov — a'zolik hujumi (membership inference). Hujumchi faqat modelning ehtimollarini ko'radi va "bu rasm o'quv to'plamida bo'lganmi?" deb so'raydi. 800 ta rasm, 300 qadamda ham AUC 0.582 — nusxa deyarli yo'q (0.1%), lekin model o'quv rasmlariga biroz yuqori ehtimol beradi. Erta to'xtatish nusxalarni yo'qotdi (15.3% → 0.1%), lekin AUC 0.787 qoldi. Maxfiylikni kafolatlash uchun "nusxa yo'q" yetarli emas — bu yerda DP-SGD kabi formal usullar kerak.
Yodlashni ikki o'lchov bilan tekshiring: eng yaqin o'quv namunasi (teng hajmli held-out bilan solishtirib) va a'zolik hujumi AUC. "Ko'z bilan yangi" — dalil emas.
2.5. Tarafkashlikning kuchayishi
SAVOL: o'quvda guruhlar nisbati 70/30 bo'lsa, generatsiyada ham 70/30 mi?
O'LCHASH:
alohida (generatorga ko'rsatilmagan) rasmlarda o'rgatilgan klassifikator
avval ASBOBNI tekshirish: haqiqiy 70/30 aralashmani qanday o'lchaydi? 0.300-bob
keyin generatsiyada ozchilik ulushi, 5 urug', 0.30 dan farq va SE
2-MISOL (1 va 7 raqamlari; ikkala yo'nalishda):
sozlama ozchilik 7 ozchilik 1
MADE T=1.0 0.307 0.313 - saqlanadi (farq sezilarli emas)
MADE T=0.7 0.232 * 0.255 * - KUCHAYADI
MADE T=0.5 0.184 * 0.169 * - yanada kuchayadi
GMM k=2 0.278 * 0.313 * - kichik siljish, yo'nalishi har xil
GMM k=10 0.291 0.300
shartli T=0.5 0.300 0.300 - nisbat TASHQARIDAN beriladi
NEGA PAST HARORAT KO'PCHILIKNI KUCHAYTIRADI:
T < 1 - taqsimotni "o'tkirlaydi": ehtimolli yo'llar yanada ehtimolli
birinchi piksellarda ko'pchilik guruhiga xos qiymat ko'proq ehtimolli
-> dastlabki qarorlar ko'pchilik tomonga og'adi, qolgan piksellar ergashadi
xuddi shu mexanizm: truncation (GAN), yuqori guidance (diffusion, 26.6)
HIMOYA:
guruh ulushini generatsiya SOZLAMASI bilan birga o'lchash
shartli generatsiya: guruh nisbatini aniq belgilash
o'quv ma'lumotini muvozanatlash; lekin "to'g'ri" nisbat - siyosat qarori2-misolning eng muhim natijasi — sozlama ta'siri. Bir xil o'rgatilgan model T = 1.0 da nisbatni saqladi (0.307, 0.313 — 0.30 dan farq sezilarli emas), lekin T = 0.5 da ozchilik ulushi 0.184 va 0.169 gacha tushdi. Buni "raqam 1 soddaroq, shuning uchun ko'proq chiqadi" deb tushuntirish mumkin edi — shuning uchun tajriba ikkala yo'nalishda o'tkazildi: 1 ko'pchilik bo'lganda ham, 7 ko'pchilik bo'lganda ham past harorat aynan ko'pchilikni kuchaytirdi. GMM k=2 esa kichik, lekin sezilarli siljish berdi — bir yo'nalishda ozchilik kamaydi (0.278), boshqasida ko'paydi (0.313) — ya'ni bu "kuchayish" emas, model xatosi.
Bu ahamiyatli, chunki amalda deyarli hamma "sifatni oshiruvchi" tugmalar — harorat, truncation, kuchli classifier-free guidance — taqsimotni tor qiladi. 26.7-darsda buni precision va recall murosasi sifatida ko'rgan edik; bu yerda xuddi shu murosa guruh ulushida ko'rinadi.
Guruh ulushini generatsiya sozlamasi bilan birga o'lchang: T = 1 da saqlangan nisbat T = 0.5 da buziladi. Shartli model nisbatni aniq boshqarishga imkon beradi.
2.6. Ko'rinmas watermark: rasm va matn
RASM (3-misol): kalitli pseudo-tasodifiy naqsh
w = +-1 naqsh (16 x 16), torch.Generator(kalit) bilan
joylash: x' = clip(x + a * w, 0, 1) a = 0.04 (4%)
aniqlash: r = yuqori_chastota(x') (x - 3x3 o'rtacha)
z = sqrt(N) * corr(r, yuqori_chastota(w))
z > 4 -> "watermark bor"
kalitni bilmasdan naqshni topish qiyin; kalit bilan tekshirish arzon
3-MISOL NATIJALARI:
a PSNR TPR FPR (toza, boshqa kalit, haqiqiy)
0.01 40.4 47.2% 0.0%
0.04 28.6 100.0% 0.0%
chidamlilik (a = 0.04): shovqin 0.05 - 100%, JPEG 70 - 99.7%,
JPEG 50 - 93.2%, xiralash 3x3 - 0.0%,
1 piksel siljitish - 0.0% (qidiruv bilan 100%)
MATN ("green list" g'oyasi, nazariy):
har qadamda: urug' = hash(oldingi token, kalit)
lug'at tasodifiy ikkiga: "yashil" (ulush gamma) va "qizil"
generatsiyada yashil tokenlar logitiga + delta
aniqlash: T tokenda yashillar soni |s|_G
z = (|s|_G - gamma * T) / sqrt(T * gamma * (1 - gamma))
watermarksiz matnda yashil ulushi ~ gamma -> z ~ 0
zaif joylar: parafraz (boshqa model bilan qayta yozish), qisqa matn,
past entropiyali matn (kod, faktlar - tanlov kam)Rasm watermarki — 25.3-darsdagi urug' va torch.Generator g'oyasining teskari tomoni: kalit naqshni aniq takrorlashga imkon beradi, kalitsiz esa naqsh shovqindan farq qilmaydi. Aniqlash — oddiy korrelyatsiya testi. Yuqori chastotali filtr rasm mazmunini (silliq qismlarni) olib tashlaydi, naqsh esa asosan yuqori chastotada — shuning uchun signal/shovqin nisbati yaxshilanadi.
3-misol uch muhim narsani ko'rsatdi. Birinchisi — ko'rinmaslik va ishonchlilik murosasi: a = 0.01 da PSNR 40.4 dB (deyarli ko'rinmas), lekin TPR 47.2%; a = 0.04 da TPR 100%, PSNR 28.6 dB. Ikkinchisi — nazariya va empirika: watermarksiz rasmlarda z nazariy N(0, 1) bo'lishi kerak edi, lekin o'rtacha +1.05, std 0.60 chiqdi, va boshqa kalitlarda o'rtacha -1.72 dan +0.47 gacha siljidi — raqamlar tasviri tuzilishli va naqsh bilan tasodifan korrelyatsiyalanadi. Shuning uchun chegara toza ma'lumotda empirik tekshiriladi. Uchinchisi — chidamlilik chegaralari: shovqin va JPEG ga yaxshi chidaydi, lekin 3x3 xiralash (yuqori chastotani o'chiradi) va 1 piksel siljitish (naqsh joyidan chiqadi) uni butunlay yo'qotdi. Siljishlar bo'yicha qidiruv (25 ta variant) siljitishni tikladi — lekin har qo'shimcha test yolg'on musbat ehtimolini oshiradi (toza rasmlarda maksimal z 2.80 → 2.87).
Matn uchun "green list" g'oyasi aynan shu mantiqning diskret varianti: naqsh o'rniga — har qadamda kalit va oldingi tokenga bog'liq "yashil" tokenlar ro'yxati. Matn yetarlicha uzun bo'lsa, yashil tokenlar ulushi gamma dan sezilarli yuqori bo'ladi va z-test uni ushlaydi. Lekin parafraz (boshqa model bilan qayta yozish) tokenlarni almashtiradi va signal so'nadi — bu rasmdagi xiralashning matndagi analogi.
Watermark — kalitli signal + statistik test: TPR va FPR ni birga, empirik chegara bilan va har hujum turiga alohida o'lchang. Watermark "olib tashlab bo'lmaydi" emas — u faqat hujumchi uchun narxni oshiradi.
2.7. Sintetik kontent detektorlari va ularning umumlashmasligi
DETEKTOR = klassifikator: haqiqiy (0) va sintetik (1)
u "sintetiklik"ni emas, O'RGATILGAN GENERATORLAR ARTEFAKTINI o'rganadi
4-MISOL (AUC, 3 urug'; qatorda o'quv, ustunda test):
o'quv / test GMM VAE VAE+hist
GMM 0.952 0.993 0.627
VAE 0.975 0.999 0.645
VAE+hist 0.758 0.838 0.839
GMM+VAE 0.962 0.997 0.641
NIMA BO'LDI:
GMM va VAE umumiy artefaktga ega: oraliq piksellar KO'P (0.566, 0.586;
haqiqiyda 0.419), nol piksellar KAM (0.379, 0.376; haqiqiyda 0.491)
-> bir-birida yaxshi umumlashadi
VAE+hist - gistogramma haqiqiyga moslangan (0.488, 0.420)
-> artefakt yo'q, detektor yiqiladi: tushish 0.33-0.36 AUC (sezilarli)
FPR 5% da TPR: 0.83-0.99 -> 0.15-0.17
XULOSA:
detektor bahosi faqat O'RGATILGAN generatorlar uchun to'g'ri
yangi generator artefaktni tuzatsa - detektor ko'r
-> detektorni doim "yangi generator" (hold-out generator) bilan baholang4-misolda kutilmagan natija ham bor edi: GMM da o'rgatilgan detektor VAE da yaxshiroq ishladi (0.993 va o'zining 0.952). Sabab — ikkala generatorning umumiy artefakti (juda ko'p oraliq piksellar), VAE da esa u kuchliroq. Ya'ni "boshqa generatorda umumlashdi" ham, "yiqildi" ham — artefakt umumiymi yoki yo'qmi, shunga bog'liq. Artefakt tuzatilgan generatorda (VAE+hist) esa uchala detektor ham 0.63-0.65 ga tushdi. Hatto VAE+hist ning o'zida o'rgatilgan detektor ham atigi 0.839 — u ancha haqiqiyga yaqin.
Bu passiv aniqlashning asosiy muammosi: bu quvlash o'yini. Detektor e'lon qilingan kundan boshlab generatorlar uning signalini chetlab o'tishi mumkin — ataylab yoki tasodifan (sifat oshishi bilan). Shuning uchun detektor natijasi dalil emas, balki signal; muhim qarorlar kelib chiqish ma'lumoti va boshqa dalillar bilan birga qabul qilinadi.
Detektorni o'quvda ko'rilmagan generatorda baholang; "AUC 0.99" faqat tanish generatorlar uchun.
2.8. Kelib chiqish (C2PA), model kartalari va tashkiliy choralar
KONTENT KELIB CHIQISHI (provenance):
C2PA - kontentga kriptografik imzolangan "manifest" biriktirish standarti:
kim yaratdi, qaysi vosita (masalan, generativ model), qanday tahrirlandi
imzo buzilsa - aniqlanadi; lekin metama'lumotni OLIB TASHLASH mumkin
-> watermark (kontentning o'zida) va manifest (yonida) bir-birini to'ldiradi
MODEL KARTASI (model card) - model bilan birga hujjat:
maqsad va maqsad bo'lmagan qo'llanishlar
o'quv ma'lumoti manbalari va litsenziyalari (datasheet)
baholash: sifat + xavf o'lchovlari (nusxa ulushi, guruh ulushi, ...)
ma'lum cheklovlar va xavflar; watermark / kelib chiqish usuli
TASHKILIY VA HUQUQIY CHORALAR (umumiy):
foydalanish siyosati: taqiqlangan qo'llanishlar (real odam nomidan soxta)
kirish/chiqish filtrlari va red-teaming 25.13-bob
shikoyat va olib tashlash jarayoni; opt-out
audit jurnali: kim, qachon, nimani generatsiya qildi
xavfni baholash - chiqarishdan OLDIN; qonunchilik talablari
mamlakatga qarab farq qiladi - yuristlar bilan birgaBu bo'limdagi choralar texnik emas, lekin texnik o'lchovlarsiz ular bo'sh qoladi. Model kartasidagi "yodlash tekshirildi" gapi 1-misoldagi jadval bilan, "tarafkashlik o'lchandi" — 2-misoldagi jadval bilan, "chiqishlar belgilanadi" — 3-misoldagi TPR/FPR bilan tasdiqlanishi kerak. 26.10-darsdagi loyihada model kartasining shu qismlarini haqiqiy raqamlar bilan to'ldiramiz.
Kelib chiqish manifesti + watermark + model kartasi + jarayon — birgalikda; har da'vo raqam bilan.
2.9. Tuzoqlar
Asosiy tuzoqlar: "rasm ko'z bilan yangi — demak nusxa emas" deb hisoblash; yodlashni o'quvdan boshqa hajmdagi held-out bilan solishtirish (eng yaqin qo'shni masofasi to'plam hajmiga bog'liq); nusxa ulushini held-out dagi tasodifiy mosliklar bilan solishtirmaslik; "nusxa yo'q — maxfiylik bor" deyish (a'zolik hujumi baribir ishlaydi); guruh ulushini faqat T = 1 da o'lchab, ishlab chiqarishdagi past harorat yoki kuchli guidance da tekshirmaslik; o'lchov klassifikatorini generator o'quv ma'lumotida o'rgatish yoki uni haqiqiy aralashmada tekshirmaslik; bitta urug' bilan "tarafkashlik kuchaydi" deyish; watermark chegarasini nazariy N(0, 1) dan olib, toza ma'lumotda empirik tekshirmaslik; watermarkni faqat hujumsiz sinash; siljish qidiruvi kabi ko'p testlarni yolg'on musbatni hisobga olmay qo'shish; watermark kalitini model bilan birga tarqatish; detektorni faqat o'quvdagi generatorlarda baholash; detektor javobini yakuniy dalil deb hisoblash; huquqiy savolga bir mamlakat qoidasini hamma joyga qo'llash.
3. Tez ma'lumotnoma
import numpy as np
import torch
from sklearn.metrics import roc_auc_score
# yodlash: teng hajmli held-out bilan eng yaqin qo'shni
d_oq = torch.cdist(G, X_oquv).min(1).values
d_ho = torch.cdist(G, X_heldout).min(1).values # len(X_heldout) == len(X_oquv)
nusxa = (d_oq == 0).float().mean() # uzluksizda: d_oq < chegara
nisbat = d_oq.mean() / d_ho.mean() # ~1 yaxshi, << 1 yodlash
# a'zolik hujumi: log p(x) bo'yicha AUC
auc = roc_auc_score(np.r_[np.ones(n), np.zeros(n)],
np.r_[model.logp(X_oquv), model.logp(X_heldout)])
# guruh ulushi: alohida klassifikator, avval haqiqiy aralashmada tekshirilgan
ulush = np.mean(klf.predict(G) == ozchilik)
# watermark
w = (torch.randint(0, 2, (16, 16), generator=torch.Generator().manual_seed(kalit)) * 2 - 1)
x_w = np.clip(x + a * w.numpy(), 0, 1)
z = np.sqrt(N) * corr(yuqori_chastota(x_w), yuqori_chastota(w)) # z > 4
# detektor: o'quvda KO'RILMAGAN generatorda baholash
auc_yangi = roc_auc_score(y, det.predict_proba(xus(np.r_[X_real, G_yangi]))[:, 1])Etika va xavfsizlik xulosasi
xavflar: deepfake, mualliflik, yodlash, tarafkashlik, zararli kontent
yodlash: nusxa ulushi + NN nisbati (teng held-out) + a'zolik hujumi AUC
tarafkashlik: guruh ulushi har generatsiya sozlamasida; shartli nisbat
watermark: kalitli naqsh + z-test; TPR/FPR, empirik chegara, hujumlar
detektor: artefaktni o'rganadi; yangi generatorda baholash shart
kelib chiqish (C2PA) + model kartasi + jarayon4. Batafsil misollar
Misollar real torch/numpy/sklearn bilan (Python 3.14, torch 2.14 CPU).
Misol 1 — Yodlab olish: o'quv hajmi, o'rgatish uzunligi va a'zolik hujumi
"""Yodlab olish: kichik ma'lumotda uzoq o'rgatilgan avtoregressiv model o'quv namunalarini qaytaradimi?"""
import copy
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from sklearn.datasets import load_digits
from sklearn.metrics import roc_auc_score
D = 64
class MADE(nn.Module):
"""Avtoregressiv model: p(x) = p(x_1) p(x_2 | x_1) ... ; niqobli bitta yashirin qatlam."""
def __init__(self, h=256, seed=0):
super().__init__()
g = torch.Generator().manual_seed(seed)
m = torch.randint(1, D, (h,), generator=g) # yashirin birlik "darajasi"
tartib = torch.arange(1, D + 1)
self.register_buffer("m1", (m[:, None] >= tartib[None, :]).float())
self.register_buffer("m2", (tartib[:, None] > m[None, :]).float())
self.l1, self.l2 = nn.Linear(D, h), nn.Linear(h, D)
def forward(self, x):
h = F.relu(F.linear(x, self.l1.weight * self.m1, self.l1.bias))
return F.linear(h, self.l2.weight * self.m2, self.l2.bias)
def logp(self, x):
return -F.binary_cross_entropy_with_logits(self(x), x, reduction="none").sum(1)
@torch.no_grad()
def namuna(self, n, g):
x = torch.zeros(n, D)
for i in range(D): # piksel-piksel, 64 qadam
p = torch.sigmoid(self(x)[:, i])
x[:, i] = (torch.rand(n, generator=g) < p).float()
return x
def orgat(X, qadamlar, seed, X_val=None):
"""X_val berilsa - har 100 qadamda val NLL; eng yaxshi holat qaytariladi (erta to'xtatish)."""
torch.manual_seed(seed)
model = MADE(seed=seed)
opt = torch.optim.Adam(model.parameters(), lr=3e-3)
g = torch.Generator().manual_seed(seed)
B = min(len(X), 64)
eng, eng_nll, eng_qadam = None, float("inf"), 0
for q in range(1, qadamlar + 1):
xb = X[torch.randint(0, len(X), (B,), generator=g)]
loss = -model.logp(xb).mean()
opt.zero_grad()
loss.backward()
opt.step()
if X_val is not None and q % 100 == 0:
with torch.no_grad():
nll = -model.logp(X_val).mean().item()
if nll < eng_nll:
eng, eng_nll, eng_qadam = copy.deepcopy(model.state_dict()), nll, q
if eng is not None:
model.load_state_dict(eng)
model.eval()
return model, eng_qadam
def eng_yaqin(A, B):
"""A dagi har namuna uchun B gacha eng kichik Hamming masofasi va indeksi."""
d = torch.cdist(A, B, p=1)
return d.min(1).values, d.argmin(1)
def olchov(model, oq, ho, seed=1):
G = model.namuna(1000, torch.Generator().manual_seed(seed))
d_oq, j = eng_yaqin(G, oq)
d_ho, _ = eng_yaqin(G, ho)
with torch.no_grad():
lp_oq, lp_ho = model.logp(oq), model.logp(ho)
y = np.r_[np.ones(len(oq)), np.zeros(len(ho))]
auc = roc_auc_score(y, np.r_[lp_oq.numpy(), lp_ho.numpy()]) # a'zolik hujumi
return {"nusxa": (d_oq == 0).float().mean().item(), "nusxa_ho": (d_ho == 0).float().mean().item(),
"d_oq": d_oq.mean().item(), "d_ho": d_ho.mean().item(),
"nll_oq": -lp_oq.mean().item(), "nll_ho": -lp_ho.mean().item(), "auc": auc,
"G": G, "j": j, "d": d_oq}
def chiz(x):
return ["".join("##" if v else " ." for v in qator) for qator in x.reshape(8, 8).int().tolist()]
def main() -> None:
torch.set_num_threads(1)
X_hamma, _ = load_digits(return_X_y=True)
X_hamma = torch.tensor((X_hamma > 7).astype(np.float32)) # 0/1 piksellar
perm = np.random.default_rng(0).permutation(len(X_hamma))
print("=== 1. O'quv to'plami hajmi x o'rgatish uzunligi (1000 ta namuna) ===")
print(" held-out to'plam o'quv bilan TENG hajmda - NN masofalar adolatli")
print(" n qadam nusxa nusxa_ho NN_oquv NN_ho nisbat NLL_oquv NLL_ho MIA_AUC")
natija = {}
for n in (40, 200, 800):
oq, ho = X_hamma[perm[:n]], X_hamma[perm[n:2 * n]]
for qadam in (300, 3000):
model, _ = orgat(oq, qadam, seed=0)
r = olchov(model, oq, ho)
natija[(n, qadam)] = r
print(f" {n:<5} {qadam:>5} {r['nusxa']:>6.1%} {r['nusxa_ho']:>9.1%} {r['d_oq']:>8.2f} "
f"{r['d_ho']:>6.2f} {r['d_oq'] / r['d_ho']:>7.2f} {r['nll_oq']:>9.1f} "
f"{r['nll_ho']:>7.1f} {r['auc']:>8.3f}")
print("\n=== 2. Yodlangan namuna: generatsiya va o'quv to'plamidagi asli ===")
r = natija[(40, 3000)]
nusxa_i = torch.nonzero(r["d"] == 0)[:, 0]
asl = r["j"][nusxa_i]
print(f" n=40, 3000 qadam: {len(nusxa_i)} ta nusxa, ular {len(torch.unique(asl))} ta "
f"turli o'quv rasmidan (40 tadan)")
sanoq = torch.bincount(asl, minlength=40)
print(f" eng ko'p qaytarilgan o'quv rasmi: {int(sanoq.max())} marta")
i = int(nusxa_i[0])
oq = X_hamma[perm[:40]]
print(" generatsiya o'quvdagi asli (Hamming 0)")
for a, b in zip(chiz(r["G"][i]), chiz(oq[r["j"][i]])):
print(f" {a} {b}")
print("\n=== 3. Himoya: val NLL bo'yicha erta to'xtatish (n = 200) ===")
oq, ho = X_hamma[perm[:200]], X_hamma[perm[200:400]]
val = X_hamma[perm[400:600]] # uchinchi, alohida to'plam
model, q = orgat(oq, 3000, seed=0, X_val=val)
e = olchov(model, oq, ho)
u = natija[(200, 3000)]
print(f" tanlangan qadam: {q} (3000 dan)")
print(f" {'':<16} {'nusxa':>7} {'NLL_oquv':>9} {'NLL_ho':>7} {'MIA_AUC':>8}")
print(f" {'3000 qadam':<16} {u['nusxa']:>7.1%} {u['nll_oq']:>9.1f} {u['nll_ho']:>7.1f} {u['auc']:>8.3f}")
print(f" {'erta to`xtatish':<16} {e['nusxa']:>7.1%} {e['nll_oq']:>9.1f} {e['nll_ho']:>7.1f} "
f"{e['auc']:>8.3f}".replace("`", "'"))
if e["nusxa"] < u["nusxa"] and e["nll_ho"] < u["nll_ho"]:
print(" erta to'xtatish nusxalarni kamaytirdi VA held-out NLL ni yaxshiladi")
if e["auc"] > 0.6:
print(f" lekin a'zolik hujumi AUC {e['auc']:.3f} > 0.5 - sizish to'liq yo'qolmadi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. O'quv to'plami hajmi x o'rgatish uzunligi (1000 ta namuna) ===
held-out to'plam o'quv bilan TENG hajmda - NN masofalar adolatli
n qadam nusxa nusxa_ho NN_oquv NN_ho nisbat NLL_oquv NLL_ho MIA_AUC
40 300 0.6% 0.0% 6.59 9.01 0.73 10.3 32.1 0.991
40 3000 85.9% 0.0% 0.54 7.87 0.07 3.9 83.2 1.000
200 300 0.1% 0.2% 6.90 7.41 0.93 16.6 21.5 0.787
200 3000 15.3% 0.9% 3.79 5.80 0.65 7.8 36.5 0.979
800 300 0.1% 0.1% 6.14 6.30 0.98 18.5 19.7 0.582
800 3000 2.4% 1.1% 4.12 4.65 0.89 12.7 19.3 0.817
=== 2. Yodlangan namuna: generatsiya va o'quv to'plamidagi asli ===
n=40, 3000 qadam: 859 ta nusxa, ular 40 ta turli o'quv rasmidan (40 tadan)
eng ko'p qaytarilgan o'quv rasmi: 45 marta
generatsiya o'quvdagi asli (Hamming 0)
. . .#### . . . . . .#### . . .
. . .#### . . . . . .#### . . .
. .#### . . . . . .#### . . . .
.#### . .## . . .#### . .## . .
. .######## . . . .######## . .
. . . .## . . . . . . .## . . .
. . . .## . . . . . . .## . . .
. . . .## . . . . . . .## . . .
=== 3. Himoya: val NLL bo'yicha erta to'xtatish (n = 200) ===
tanlangan qadam: 300 (3000 dan)
nusxa NLL_oquv NLL_ho MIA_AUC
3000 qadam 15.3% 7.8 36.5 0.979
erta to'xtatish 0.1% 16.6 21.5 0.787
erta to'xtatish nusxalarni kamaytirdi VA held-out NLL ni yaxshiladi
lekin a'zolik hujumi AUC 0.787 > 0.5 - sizish to'liq yo'qolmadiNima ko'rsatdi: 0/1 piksellarga keltirilgan digits da avtoregressiv MADE modeli uch xil o'quv hajmida (40, 200, 800) va ikki xil uzunlikda (300 va 3000 qadam) o'rgatildi; har holatda 1000 ta namuna olindi va o'quv to'plami bilan teng hajmli held-out to'plam bilan solishtirildi. Eng og'ir holat — 40 ta rasm, 3000 qadam: namunalarning 85.9% i o'quv rasmining aynan nusxasi (Hamming 0), held-out ga nusxa 0.0%, NN nisbati 0.07, NLL o'quvda 3.9, held-out da 83.2, a'zolik hujumi AUC 1.000. 2-bo'lim: 859 ta nusxa 40 ta o'quv rasmining hammasidan olingan, eng ko'p qaytarilgani 45 marta — ASCII rasmda generatsiya va asli piksel-piksel bir xil. Hajm oshgan sari yodlash kamaydi: n=800, 3000 qadamda nusxa 2.4% (held-out ga ham 1.1% — oddiy raqamlar tasodifan mos keladi), nisbat 0.89. Diqqat qiling: hatto n=800, 300 qadamda — nusxa 0.1%, lekin MIA AUC 0.582 — model o'quv rasmlarini baribir biroz "taniydi". 3-bo'lim: alohida val to'plamdagi NLL bo'yicha erta to'xtatish n=200 da 300-qadamni tanladi va nusxalarni 15.3% dan 0.1% ga, held-out NLL ni 36.5 dan 21.5 ga tushirdi — himoya va sifat bir yo'nalishda. Lekin AUC 0.787 qoldi: erta to'xtatish nusxalarni yo'qotadi, a'zolik sizishini esa to'liq emas. Bog'liq bo'limlar: 2.3, 2.4.
Misol 2 — Tarafkashlikning kuchayishi: 70/30 dan generatsiyada nima chiqadi
"""Tarafkashlik kuchayishi: 70/30 o'quv ma'lumotidan generatsiyada nisbat saqlanadimi?"""
import warnings
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.mixture import GaussianMixture
D = 64
URUGLAR = range(5)
class MADE(nn.Module):
"""Avtoregressiv model; shartli=True bo'lsa guruh (0/1) yashirin qatlamga beriladi."""
def __init__(self, h=256, seed=0, shartli=False):
super().__init__()
g = torch.Generator().manual_seed(seed)
m = torch.randint(1, D, (h,), generator=g)
tartib = torch.arange(1, D + 1)
self.register_buffer("m1", (m[:, None] >= tartib[None, :]).float())
self.register_buffer("m2", (tartib[:, None] > m[None, :]).float())
self.l1, self.l2 = nn.Linear(D, h), nn.Linear(h, D)
self.shart = nn.Embedding(2, h) if shartli else None
def forward(self, x, c=None):
a = F.linear(x, self.l1.weight * self.m1, self.l1.bias)
if self.shart is not None:
a = a + self.shart(c)
return F.linear(F.relu(a), self.l2.weight * self.m2, self.l2.bias)
@torch.no_grad()
def namuna(self, n, g, T=1.0, c=None):
x = torch.zeros(n, D)
for i in range(D):
p = torch.sigmoid(self(x, c)[:, i] / T)
x[:, i] = (torch.rand(n, generator=g) < p).float()
return x
def orgat_made(X, c, seed, shartli=False, qadamlar=600):
torch.manual_seed(seed)
model = MADE(seed=seed, shartli=shartli)
opt = torch.optim.Adam(model.parameters(), lr=3e-3)
g = torch.Generator().manual_seed(seed)
for _ in range(qadamlar):
i = torch.randint(0, len(X), (64,), generator=g)
xb = X[i]
loss = F.binary_cross_entropy_with_logits(model(xb, c[i]), xb, reduction="none").sum(1).mean()
opt.zero_grad()
loss.backward()
opt.step()
return model.eval()
def toplam(pool, y, rng, n, kop, oz, ulush=0.3):
i_oz = rng.choice(pool[y[pool] == oz], int(round(n * ulush)), replace=False)
i_kop = rng.choice(pool[y[pool] == kop], n - len(i_oz), replace=False)
return np.r_[i_kop, i_oz]
def tajriba(X, B, y, pool, klf, kop, oz):
"""Har urug'da: yangi 70/30 o'quv to'plami, modellar, 1000 namuna; ozchilik ulushi."""
sozlama = ["MADE T=1.0", "MADE T=0.7", "MADE T=0.5", "GMM k=2", "GMM k=10", "shartli T=0.5"]
res = {s: [] for s in sozlama}
for seed in URUGLAR:
oq = toplam(pool, y, np.random.default_rng(100 + seed), 150, kop, oz)
Xt = torch.tensor(B[oq])
c = torch.tensor((y[oq] == oz).astype(np.int64))
model = orgat_made(Xt, c, seed)
for T in (1.0, 0.7, 0.5):
G = model.namuna(1000, torch.Generator().manual_seed(seed), T).numpy()
res[f"MADE T={T}"].append(np.mean(klf.predict(G) == oz))
pca = PCA(16, random_state=seed).fit(X[oq])
for k in (2, 10):
with warnings.catch_warnings():
warnings.simplefilter("ignore")
gmm = GaussianMixture(k, random_state=seed).fit(pca.transform(X[oq]))
Z, _ = gmm.sample(1000)
G = (pca.inverse_transform(Z) > 7).astype(np.float32)
res[f"GMM k={k}"].append(np.mean(klf.predict(G) == oz))
sh = orgat_made(Xt, c, seed, shartli=True)
cn = torch.tensor(np.r_[np.zeros(700), np.ones(300)].astype(np.int64)) # nisbat ANIQ
G = sh.namuna(1000, torch.Generator().manual_seed(seed), 0.5, cn).numpy()
res["shartli T=0.5"].append(np.mean(klf.predict(G) == oz))
return {s: np.array(v) for s, v in res.items()}
def main() -> None:
torch.set_num_threads(1)
X, y = load_digits(return_X_y=True)
B = (X > 7).astype(np.float32)
ikki = np.flatnonzero((y == 1) | (y == 7))
rng = np.random.default_rng(0)
rng.shuffle(ikki)
baho_i, pool = ikki[:120], ikki[120:] # klassifikator faqat baho_i da
klf = LogisticRegression(max_iter=2000).fit(B[baho_i], y[baho_i])
print("=== 1. O'lchov asbobi ===")
print(f" guruhlar: raqam 1 va raqam 7; klassifikator {len(baho_i)} ta alohida rasmda")
print(f" generator uchun qolgan pool: {len(pool)} rasm (1: {np.sum(y[pool] == 1)}, "
f"7: {np.sum(y[pool] == 7)})")
acc = np.mean(klf.predict(B[pool]) == y[pool])
print(f" klassifikator aniqligi pool da: {acc:.3f}")
for kop, oz in ((1, 7), (7, 1)):
r = np.random.default_rng(5)
haq = toplam(pool, y, r, 150, kop, oz)
print(f" haqiqiy 70/30 aralashma (ozchilik {oz}): o'lchangan ulush "
f"{np.mean(klf.predict(B[haq]) == oz):.3f}")
barcha = []
for bolim, (kop, oz) in enumerate(((1, 7), (7, 1)), 2):
print(f"\n=== {bolim}. Ko'pchilik {kop}, ozchilik {oz} (o'quvda 30%), {len(URUGLAR)} urug' ===")
res = tajriba(X, B, y, pool, klf, kop, oz)
print(" sozlama ozchilik ulushi (urug'lar) o'rtacha 0.30 dan farq (SE)")
xulosa = {}
for s, v in res.items():
f = v - 0.3
se = f.std(ddof=1) / np.sqrt(len(f))
xulosa[s] = f.mean() if abs(f.mean()) > max(2 * se, 1e-9) else 0.0
print(f" {s:<14} {', '.join(f'{x:.3f}' for x in v)} {v.mean():>8.3f} "
f"{f.mean():+.3f} ({se:.3f})" + (" *" if xulosa[s] else ""))
kuch = [s for s, f in xulosa.items() if f < 0]
print(f" ozchilik sezilarli KAMAYGAN (* - 2*SE dan katta): {', '.join(kuch) or 'yo`q'}"
.replace("`", "'"))
barcha.append(set(kuch))
ikkala = sorted(barcha[0] & barcha[1])
print(f"\n ikkala yo'nalishda ham ozchilik kamaygan: {', '.join(ikkala) or 'hech biri'}")
print(" ⭐ Ulushni o'lchang: generatsiya sozlamasi (harorat) nisbatni o'zgartirishi mumkin")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. O'lchov asbobi ===
guruhlar: raqam 1 va raqam 7; klassifikator 120 ta alohida rasmda
generator uchun qolgan pool: 241 rasm (1: 119, 7: 122)
klassifikator aniqligi pool da: 1.000
haqiqiy 70/30 aralashma (ozchilik 7): o'lchangan ulush 0.300
haqiqiy 70/30 aralashma (ozchilik 1): o'lchangan ulush 0.300
=== 2. Ko'pchilik 1, ozchilik 7 (o'quvda 30%), 5 urug' ===
sozlama ozchilik ulushi (urug'lar) o'rtacha 0.30 dan farq (SE)
MADE T=1.0 0.325, 0.285, 0.316, 0.309, 0.301 0.307 +0.007 0.007-bob
MADE T=0.7 0.263, 0.199, 0.245, 0.243, 0.210 0.232 -0.068 0.012-bob *
MADE T=0.5 0.266, 0.135, 0.164, 0.201, 0.156 0.184 -0.116 0.023-bob *
GMM k=2 0.288, 0.273, 0.287, 0.268, 0.273 0.278 -0.022 0.004-bob *
GMM k=10 0.287, 0.306, 0.304, 0.265, 0.291 0.291 -0.009 0.007-bob
shartli T=0.5 0.300, 0.300, 0.300, 0.300, 0.300 0.300 +0.000 0.000-bob
ozchilik sezilarli KAMAYGAN (* - 2*SE dan katta): MADE T=0.7, MADE T=0.5, GMM k=2
=== 3. Ko'pchilik 7, ozchilik 1 (o'quvda 30%), 5 urug' ===
sozlama ozchilik ulushi (urug'lar) o'rtacha 0.30 dan farq (SE)
MADE T=1.0 0.312, 0.358, 0.326, 0.268, 0.301 0.313 +0.013 0.015-bob
MADE T=0.7 0.249, 0.317, 0.246, 0.234, 0.229 0.255 -0.045 0.016-bob *
MADE T=0.5 0.144, 0.213, 0.163, 0.172, 0.154 0.169 -0.131 0.012-bob *
GMM k=2 0.306, 0.302, 0.319, 0.306, 0.334 0.313 +0.013 0.006-bob *
GMM k=10 0.278, 0.295, 0.296, 0.321, 0.311 0.300 +0.000 0.007-bob
shartli T=0.5 0.300, 0.300, 0.300, 0.300, 0.300 0.300 +0.000 0.000-bob
ozchilik sezilarli KAMAYGAN (* - 2*SE dan katta): MADE T=0.7, MADE T=0.5
ikkala yo'nalishda ham ozchilik kamaygan: MADE T=0.5, MADE T=0.7
⭐ Ulushni o'lchang: generatsiya sozlamasi (harorat) nisbatni o'zgartirishi mumkinNima ko'rsatdi: avval o'lchov asbobi tekshirildi: 1 va 7 raqamlarini ajratuvchi klassifikator generatorga ko'rsatilmaydigan 120 ta rasmda o'rgatildi va qolgan pool da aniqligi 1.000; haqiqiy 70/30 aralashmani ikkala yo'nalishda ham aynan 0.300 deb o'lchadi — asbob ishonchli. Keyin har urug'da yangi 70/30 o'quv to'plami (150 rasm) olinib, modellar o'rgatildi. T = 1.0 da MADE nisbatni saqladi (0.307 va 0.313, farq 2·SE ichida). Harorat pasayishi bilan ozchilik ulushi sezilarli kamaydi: T = 0.7 da 0.232/0.255, T = 0.5 da 0.184/0.169. Bu ikkala yo'nalishda ham sodir bo'ldi — ya'ni sabab raqam shaklida emas, aynan ko'pchilikda. GMM k=2 kichik, lekin sezilarli siljishlar berdi — bir tomonda 0.278, boshqasida 0.313 — bu yo'nalishi yo'q model xatosi. GMM k=10 nisbatni saqladi. Shartli model esa ulushni aynan 0.300 da ushladi, hatto T = 0.5 da ham: guruh nisbati modeldan emas, bizdan keladi. Bog'liq bo'lim: 2.5.
Misol 3 — Ko'rinmas watermark: TPR, FPR va chidamlilik
"""Ko'rinmas watermark: kalitli pseudo-tasodifiy naqsh, korrelyatsiya testi va chidamlilik."""
import io
import warnings
import numpy as np
import torch
from PIL import Image
from scipy.ndimage import uniform_filter
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.mixture import GaussianMixture
R = 16
CHEGARA = 4.0 # z > 4 -> "watermark bor" (N(0,1) da P ~ 3e-5)
def generator_rasmlar(n, seed):
"""Kichik generativ model (PCA + GMM) dan 8x8 raqamlar -> 16x16, [0, 1] oralig'ida."""
X, _ = load_digits(return_X_y=True)
pca = PCA(20, random_state=0).fit(X)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
gmm = GaussianMixture(20, random_state=0).fit(pca.transform(X))
gmm.random_state = seed
Z, _ = gmm.sample(n)
x8 = np.clip(pca.inverse_transform(Z), 0, 16).reshape(n, 8, 8) / 16
x16 = np.kron(x8, np.ones((1, 2, 2)))
return np.clip(uniform_filter(x16, size=(1, 3, 3)), 0, 1)
def naqsh(kalit):
g = torch.Generator().manual_seed(kalit)
return (torch.randint(0, 2, (R, R), generator=g) * 2 - 1).numpy().astype(float)
def joyla(x, kalit, a):
return np.clip(x + a * naqsh(kalit), 0, 1)
def yuqori_chastota(x):
return x - uniform_filter(x, size=(1, 3, 3), mode="nearest")
def z_ball(x, kalit):
"""Normallangan korrelyatsiya: z = sqrt(N) * corr(qoldiq, naqsh); watermark yo'q -> ~N(0, 1)."""
r = yuqori_chastota(x).reshape(len(x), -1)
w = yuqori_chastota(naqsh(kalit)[None]).reshape(-1)
r = r - r.mean(1, keepdims=True)
w = w - w.mean()
corr = (r @ w) / (np.linalg.norm(r, axis=1) * np.linalg.norm(w) + 1e-12)
return np.sqrt(r.shape[1]) * corr
def jpeg(x, sifat):
chiq = []
for rasm in x:
buf = io.BytesIO()
Image.fromarray((rasm * 255).round().astype(np.uint8)).save(buf, "JPEG", quality=sifat)
chiq.append(np.asarray(Image.open(io.BytesIO(buf.getvalue())), dtype=float) / 255)
return np.array(chiq)
def psnr(a, b):
return 10 * np.log10(1.0 / np.mean((a - b) ** 2))
def main() -> None:
KALIT = 2026
x = generator_rasmlar(1000, seed=1)
toza = generator_rasmlar(1000, seed=2) # watermarksiz generatsiya
rng = np.random.default_rng(0)
print("=== 1. Kuch va ko'rinmaslik (1000 rasm, z > 4 chegara) ===")
print(" a PSNR dB TPR z o'rtacha")
for a in (0.01, 0.02, 0.04, 0.08):
xw = joyla(x, KALIT, a)
z = z_ball(xw, KALIT)
print(f" {a:<6} {psnr(x, xw):>7.1f} {np.mean(z > CHEGARA):>7.1%} {z.mean():>9.2f}")
A = 0.04
print(f"\n=== 2. Yolg'on musbat: watermark yo'q yoki boshqa kalit (a = {A}) ===")
z0 = z_ball(toza, KALIT)
z1 = z_ball(joyla(toza, 7, A), KALIT)
print(f" toza generatsiya: FPR {np.mean(z0 > CHEGARA):.1%}, z o'rtacha {z0.mean():+.2f}, "
f"std {z0.std():.2f}, max {z0.max():.2f}")
print(f" boshqa kalit (7): FPR {np.mean(z1 > CHEGARA):.1%}, max {z1.max():.2f}")
X, _ = load_digits(return_X_y=True)
hq = np.clip(uniform_filter(np.kron(X.reshape(-1, 8, 8) / 16, np.ones((1, 2, 2))),
size=(1, 3, 3)), 0, 1)
zh = z_ball(hq, KALIT)
print(f" haqiqiy raqamlar: FPR {np.mean(zh > CHEGARA):.1%} ({len(hq)} ta), max {zh.max():.2f}")
ortalar = np.array([z_ball(toza, kalit).mean() for kalit in range(100, 120)])
print(f" 20 ta boshqa kalit, toza rasmlarda z o'rtachasi: {ortalar.min():+.2f} .. "
f"{ortalar.max():+.2f}")
if z0.std() < 0.9 or np.abs(ortalar).max() > 0.5:
print(" -> toza z nazariy N(0, 1) emas: chegarani toza ma'lumotda empirik tekshiring")
print(f"\n=== 3. Chidamlilik (a = {A}): TPR z > 4 da ===")
xw = joyla(x, KALIT, A)
hujumlar = [
("hech narsa", xw),
("shovqin sigma 0.02", np.clip(xw + rng.normal(0, 0.02, xw.shape), 0, 1)),
("shovqin sigma 0.05", np.clip(xw + rng.normal(0, 0.05, xw.shape), 0, 1)),
("shovqin sigma 0.10", np.clip(xw + rng.normal(0, 0.10, xw.shape), 0, 1)),
("JPEG sifat 90", jpeg(xw, 90)),
("JPEG sifat 70", jpeg(xw, 70)),
("JPEG sifat 50", jpeg(xw, 50)),
("xiralash 3x3", uniform_filter(xw, size=(1, 3, 3))),
("1 piksel siljitish", np.roll(xw, 1, axis=2)),
]
for nom, h in hujumlar:
z = z_ball(h, KALIT)
print(f" {nom:<20} TPR {np.mean(z > CHEGARA):>6.1%} z o'rtacha {z.mean():>6.2f}")
print("\n=== 4. Siljitishga qarshi: 5x5 siljishlarni qidirish va uning narxi ===")
def qidir(h):
return np.max([z_ball(np.roll(h, (dy, dx), axis=(1, 2)), KALIT)
for dy in range(-2, 3) for dx in range(-2, 3)], axis=0)
zs = qidir(np.roll(xw, 1, axis=2))
z0s = qidir(toza)
print(f" siljitilgan watermark: TPR {np.mean(zs > CHEGARA):.1%}")
print(f" toza rasmlar: FPR {np.mean(z0s > CHEGARA):.1%}, max z {z0s.max():.2f} "
f"(25 ta test -> max kattaroq)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Kuch va ko'rinmaslik (1000 rasm, z > 4 chegara) ===
a PSNR dB TPR z o'rtacha
0.01 40.4 47.2% 4.01
0.02 34.5 100.0% 6.53
0.04 28.6 100.0% 10.04
0.08 22.8 100.0% 13.17
=== 2. Yolg'on musbat: watermark yo'q yoki boshqa kalit (a = 0.04) ===
toza generatsiya: FPR 0.0%, z o'rtacha +1.05, std 0.60, max 2.80
boshqa kalit (7): FPR 0.0%, max 1.92
haqiqiy raqamlar: FPR 0.0% (1797 ta), max 2.70
20 ta boshqa kalit, toza rasmlarda z o'rtachasi: -1.72 .. +0.47
-> toza z nazariy N(0, 1) emas: chegarani toza ma'lumotda empirik tekshiring
=== 3. Chidamlilik (a = 0.04): TPR z > 4 da ===
hech narsa TPR 100.0% z o'rtacha 10.04
shovqin sigma 0.02 TPR 100.0% z o'rtacha 9.38
shovqin sigma 0.05 TPR 100.0% z o'rtacha 7.62
shovqin sigma 0.10 TPR 89.2% z o'rtacha 5.20
JPEG sifat 90 TPR 100.0% z o'rtacha 9.44
JPEG sifat 70 TPR 99.7% z o'rtacha 5.82
JPEG sifat 50 TPR 93.2% z o'rtacha 5.04
xiralash 3x3 TPR 0.0% z o'rtacha -0.86
1 piksel siljitish TPR 0.0% z o'rtacha -2.79
=== 4. Siljitishga qarshi: 5x5 siljishlarni qidirish va uning narxi ===
siljitilgan watermark: TPR 100.0%
toza rasmlar: FPR 0.0%, max z 2.87 (25 ta test -> max kattaroq)Nima ko'rsatdi: kichik generativ model (PCA + GMM) chiqargan 1000 ta raqam 16x16 formatga keltirildi va ularga 2026 kaliti bilan ±a naqsh qo'shildi. 1-bo'lim — murosa: a = 0.01 da PSNR 40.4 dB, lekin TPR 47.2%; a = 0.02 dan boshlab TPR 100%; a = 0.04 da z o'rtacha 10.04, PSNR 28.6 dB. 2-bo'lim: watermarksiz generatsiyada, boshqa kalit bilan belgilangan rasmlarda va 1797 ta haqiqiy raqamda yolg'on musbat — 0.0%. Lekin toza rasmlarda z taqsimoti nazariy N(0, 1) emas: o'rtacha +1.05, std 0.60; 20 ta boshqa kalitda o'rtacha -1.72 .. +0.47 — chegarani empirik tekshirish shart. 3-bo'lim: shovqin sigma 0.05 va JPEG 90/70 ga deyarli to'liq chidadi, sigma 0.10 da 89.2%, JPEG 50 da 93.2%. 3x3 xiralash va 1 piksel siljitish esa watermarkni butunlay yo'qotdi (0.0%; siljitishda z hatto manfiy -2.79). 4-bo'lim: 5x5 siljishlarni qidirish siljitilgan watermarkni 100% tikladi, toza rasmlarda FPR 0.0% qoldi, lekin maksimal z 2.80 dan 2.87 ga oshdi — ko'p test narxi. Bog'liq bo'lim: 2.6.
Misol 4 — Sintetik rasm detektori: tanish va yangi generatorlar
"""Sintetik va haqiqiy detektori: bitta generatorda o'rgatilgan detektor boshqasida umumlashadimi?"""
import warnings
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
from sklearn.mixture import GaussianMixture
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
class VAE(nn.Module):
def __init__(self, z=8, h=128):
super().__init__()
self.enc = nn.Sequential(nn.Linear(64, h), nn.ReLU(), nn.Linear(h, 2 * z))
self.dec = nn.Sequential(nn.Linear(z, h), nn.ReLU(), nn.Linear(h, 64))
self.z = z
def forward(self, x):
mu, logv = self.enc(x).chunk(2, 1)
zz = mu + torch.randn_like(mu) * (0.5 * logv).exp()
return self.dec(zz), mu, logv
def gen_gmm(Xg, n, seed):
pca = PCA(20, random_state=seed).fit(Xg)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
gmm = GaussianMixture(10, random_state=seed).fit(pca.transform(Xg))
Z, _ = gmm.sample(n)
return pca.inverse_transform(Z)
def gen_vae(Xg, n, seed, qadamlar=1500):
torch.manual_seed(seed)
m = VAE()
opt = torch.optim.Adam(m.parameters(), lr=2e-3)
X = torch.tensor(Xg / 16, dtype=torch.float32)
g = torch.Generator().manual_seed(seed)
for _ in range(qadamlar):
xb = X[torch.randint(0, len(X), (128,), generator=g)]
r, mu, logv = m(xb)
loss = F.mse_loss(r, xb, reduction="sum") / len(xb) * 20 + \
(-0.5 * (1 + logv - mu ** 2 - logv.exp()).sum(1)).mean()
opt.zero_grad()
loss.backward()
opt.step()
with torch.no_grad():
z = torch.randn(n, m.z, generator=torch.Generator().manual_seed(seed + 1))
return m.dec(z).numpy() * 16
def kvant(x):
"""Haqiqiy digits 0..16 butun sonlar - generatsiyani ham shunday formatga keltiramiz."""
return np.clip(np.round(x), 0, 16)
def histmos(g, real):
"""Piksel qiymatlari taqsimotini haqiqiyga moslash (kvantil xaritasi)."""
q = np.linspace(0, 1, 201)
return np.interp(g, np.quantile(g, q), np.quantile(real, q))
XUS_NOMLARI = ["nol ulushi", "16 ulushi", "oraliq ulushi", "o'rtacha", "gradient x", "gradient y"]
def xus(x):
"""64 piksel + 6 ta global statistika (qiymatlar gistogrammasi va silliqlik)."""
im = x.reshape(-1, 8, 8)
gx = np.abs(np.diff(im, axis=2)).mean((1, 2))
gy = np.abs(np.diff(im, axis=1)).mean((1, 2))
return np.c_[x, (x == 0).mean(1), (x == 16).mean(1), ((x > 0) & (x < 16)).mean(1), x.mean(1), gx, gy]
def tpr_fpr5(s_real, s_gen):
"""Chegara haqiqiy rasmlarning 95-foizligida (FPR 5%) - sintetiklarning qancha qismi ushlanadi."""
return float(np.mean(s_gen > np.quantile(s_real, 0.95)))
def main() -> None:
torch.set_num_threads(1)
X, _ = load_digits(return_X_y=True)
perm = np.random.default_rng(0).permutation(len(X))
Xg, Xd_tr, Xd_te = X[perm[:800]], X[perm[800:1300]], X[perm[1300:]]
print("=== 1. Bo'linish va generatorlar ===")
print(f" generatorlar uchun {len(Xg)}, detektor o'quvi {len(Xd_tr)}, detektor testi {len(Xd_te)}")
print(" GMM (PCA 20), VAE (z = 8), VAE+hist (piksel gistogrammasi haqiqiyga moslangan)")
print(" hammasi 0..16 butun songa yaxlitlangan - haqiqiy format bilan bir xil")
manbalar = ["GMM", "VAE", "VAE+hist"]
auc, tpr, vazn = {}, {}, []
for seed in range(3):
v = gen_vae(Xg, 1000, seed)
G = {"GMM": kvant(gen_gmm(Xg, 1000, seed)), "VAE": kvant(v), "VAE+hist": kvant(histmos(v, Xg))}
for manba in manbalar + ["GMM+VAE"]:
Gtr = np.r_[G["GMM"][:250], G["VAE"][:250]] if manba == "GMM+VAE" else G[manba][:500]
det = make_pipeline(StandardScaler(), LogisticRegression(C=1.0, max_iter=3000))
det.fit(xus(np.r_[Xd_tr, Gtr]), np.r_[np.zeros(len(Xd_tr)), np.ones(len(Gtr))])
if manba == "GMM" and seed == 0:
vazn, G0 = det[-1].coef_[0][64:], G
s_real = det.predict_proba(xus(Xd_te))[:, 1]
for maqsad in manbalar:
s_gen = det.predict_proba(xus(G[maqsad][500:]))[:, 1]
y = np.r_[np.zeros(len(s_real)), np.ones(len(s_gen))]
auc.setdefault((manba, maqsad), []).append(roc_auc_score(y, np.r_[s_real, s_gen]))
tpr.setdefault((manba, maqsad), []).append(tpr_fpr5(s_real, s_gen))
print("\n=== 2. AUC: qatorda o'quv manbasi, ustunda test generatori (3 urug' o'rtachasi) ===")
print(" o'quv / test " + "".join(f"{m:>10}" for m in manbalar))
for manba in manbalar + ["GMM+VAE"]:
print(f" {manba:<12} " + "".join(f"{np.mean(auc[(manba, m)]):>10.3f}" for m in manbalar))
print(" TPR (FPR 5% da):")
for manba in manbalar + ["GMM+VAE"]:
print(f" {manba:<12} " + "".join(f"{np.mean(tpr[(manba, m)]):>10.3f}" for m in manbalar))
print("\n=== 3. Yangi generatorda yiqilish (juftlashgan, urug'lar bo'yicha) ===")
for manba in ("GMM", "VAE", "GMM+VAE"):
uz = np.array(auc[(manba, "GMM" if manba == "GMM" else "VAE")])
yangi = np.array(auc[(manba, "VAE+hist")])
d = uz - yangi
se = d.std(ddof=1) / np.sqrt(len(d))
print(f" {manba:<8}: o'z generatori {uz.mean():.3f} -> VAE+hist {yangi.mean():.3f}, "
f"tushish {d.mean():.3f} (SE {se:.3f}) "
f"{'sezilarli' if d.mean() > 2 * se else 'sezilarli emas'}")
print("\n=== 4. GMM detektori nimaga tayanadi (global xususiyatlar vazni, seed 0) ===")
for nom, w in sorted(zip(XUS_NOMLARI, vazn), key=lambda p: -abs(p[1]))[:3]:
print(f" {nom:<14} {w:+.2f}")
print(" manba nol ulushi oraliq (1..15) ulushi")
for nom, A in [("haqiqiy", Xd_te)] + [(m, G0[m]) for m in manbalar]:
print(f" {nom:<10} {(A == 0).mean():>10.3f} {((A > 0) & (A < 16)).mean():>12.3f}")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Bo'linish va generatorlar ===
generatorlar uchun 800, detektor o'quvi 500, detektor testi 497
GMM (PCA 20), VAE (z = 8), VAE+hist (piksel gistogrammasi haqiqiyga moslangan)
hammasi 0..16 butun songa yaxlitlangan - haqiqiy format bilan bir xil
=== 2. AUC: qatorda o'quv manbasi, ustunda test generatori (3 urug' o'rtachasi) ===
o'quv / test GMM VAE VAE+hist
GMM 0.952 0.993 0.627
VAE 0.975 0.999 0.645
VAE+hist 0.758 0.838 0.839
GMM+VAE 0.962 0.997 0.641
TPR (FPR 5% da):
GMM 0.825 0.973 0.148
VAE 0.915 0.992 0.168
VAE+hist 0.177 0.391 0.274
GMM+VAE 0.861 0.985 0.173
=== 3. Yangi generatorda yiqilish (juftlashgan, urug'lar bo'yicha) ===
GMM : o'z generatori 0.952 -> VAE+hist 0.627, tushish 0.325 (SE 0.024) sezilarli
VAE : o'z generatori 0.999 -> VAE+hist 0.645, tushish 0.353 (SE 0.009) sezilarli
GMM+VAE : o'z generatori 0.997 -> VAE+hist 0.641, tushish 0.356 (SE 0.019) sezilarli
=== 4. GMM detektori nimaga tayanadi (global xususiyatlar vazni, seed 0) ===
nol ulushi -3.40
oraliq ulushi +2.24
gradient y -1.95
manba nol ulushi oraliq (1..15) ulushi
haqiqiy 0.491 0.419
GMM 0.379 0.566
VAE 0.376 0.586
VAE+hist 0.488 0.420Nima ko'rsatdi: uch generator bir xil 800 ta haqiqiy rasmda o'rgatildi: GMM (PCA), VAE va VAE+hist — piksel qiymatlari taqsimoti haqiqiyga moslangan VAE ("artefaktni tuzatgan yangi generator"). Hammasi 0..16 butun sonlarga yaxlitlandi — "butun emas" kabi arzimas belgi qolmasin. Detektor (64 piksel + 6 global statistika, logistik regressiya) alohida 500 ta haqiqiy rasm va bitta manbaning 500 ta namunasida o'rgatildi. 2-bo'lim: GMM va VAE detektorlari bir-birida ham yaxshi ishladi (0.952–0.999), hatto ikkalasini birlashtirish ham (0.962, 0.997) — lekin VAE+hist da uchalasi 0.627–0.645 ga tushdi; FPR 5% da ular sintetik rasmlarning atigi 15-17% ini ushladi. 3-bo'lim: tushish 0.325–0.356 AUC, SE 0.009–0.024 — uch urug'da ham sezilarli. 4-bo'lim sababni ko'rsatdi: GMM detektorining eng katta vaznlari — nol piksellar ulushi (-3.40) va oraliq piksellar ulushi (+2.24). Haqiqiy rasmlarda nol 0.491, oraliq 0.419; GMM va VAE da nol 0.38, oraliq 0.57–0.59; VAE+hist da esa 0.488 va 0.420 — deyarli haqiqiy. Detektor "sintetiklik"ni emas, gistogramma artefaktini o'rgangan edi. Bog'liq bo'limlar: 2.2, 2.7.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Generativ model yangi narsa yaratadi, nusxa ko'chirmaydi" | 1-misolda 40 ta rasmda uzoq o'rgatilgan model 85.9% nusxa berdi |
| "Nusxa yo'q — maxfiylik muammosi yo'q" | Nusxa 0.1% bo'lganda ham a'zolik hujumi AUC 0.787 |
| "Sintetik ma'lumot avtomatik anonim" | Faqat yodlash o'lchangan va cheklangan bo'lsa (masalan, DP bilan) |
| "Model o'quv nisbatini saqlaydi" | T = 1.0 da saqladi, T = 0.5 da ozchilik 0.30 → 0.17-0.18 |
| "Tarafkashlik — faqat ma'lumot muammosi" | Generatsiya sozlamasi (harorat, guidance) ham uni kuchaytiradi |
| "Watermark olib tashlab bo'lmaydi" | 3x3 xiralash yoki 1 piksel siljitish TPR ni 0.0% ga tushirdi |
| "Watermarksiz z doim N(0, 1)" | O'rtacha +1.05, std 0.60; chegara empirik tekshiriladi |
| "Detektor AUC 0.99 — muammo hal" | Yangi generatorda 0.63-0.65 |
| "Ikki generatorda o'rgatilgan detektor hammasini ushlaydi" | GMM+VAE detektori VAE+hist da 0.641 |
6. Keng tarqalgan xatolar va yechimlari
1. Held-out har xil hajmda
nisbat = eng_yaqin(G, X_oquv).mean() / eng_yaqin(G, X_val_kichik).mean() # ⚠️ hajm farqi
nisbat = eng_yaqin(G, X_oquv).mean() / eng_yaqin(G, X_ho_teng).mean() # ✅ len teng2. Nusxani held-out bilan solishtirmaslik
print(f"nusxa {(d_oq == 0).float().mean():.1%}") # ⚠️ 2.4% - ko'pmi?
print(f"nusxa {(d_oq == 0).float().mean():.1%} / held-out {(d_ho == 0).float().mean():.1%}") # ✅3. Faqat nusxalarni tekshirish
maxfiy = nusxa_ulushi < 0.01 # ⚠️
maxfiy = nusxa_ulushi < 0.01 and abs(mia_auc - 0.5) < 0.05 # ✅ + a'zolik hujumi4. Guruh ulushini bitta sozlamada
ulush = np.mean(klf.predict(model.namuna(1000, g, T=1.0)) == oz) # ⚠️
for T in (1.0, 0.7, 0.5): # ✅ ishlatiladigan
ulush[T] = np.mean(klf.predict(model.namuna(1000, g, T)) == oz) # har sozlamada5. O'lchov klassifikatori generator ma'lumotida
klf.fit(B[oquv], y[oquv]); generator.fit(B[oquv]) # ⚠️ bir xil rasmlar
klf.fit(B[baho_i], y[baho_i]); generator.fit(B[pool_i]) # ✅ alohida + tekshiruv6. Nazariy chegara
bor = z > 4 # "N(0,1) da FPR 3e-5" # ⚠️
chegara = max(4.0, np.quantile(z_toza, 0.999)); bor = z > chegara # ✅ empirik7. Detektorni tanish generatorda baholash
auc = roc_auc_score(y, det.predict_proba(xus(np.r_[X_te, G_gmm_te]))[:, 1]) # ⚠️
auc_yangi = roc_auc_score(y, det.predict_proba(xus(np.r_[X_te, G_yangi]))[:, 1]) # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 25.3 va 25.13-darslar (o'tilgan): harorat va sampling; LLM xavfsizligi, filtrlar, PII niqoblash va qatlamli himoya
- 26.2, 26.5-26.6-darslar (o'tilgan): VAE, diffusion va classifier-free guidance — tarafkashlik kuchayishi va yodlash aynan shu modellarda ham tekshiriladi
- 26.7-dars (o'tilgan): precision/recall, Frechet masofa va eng yaqin qo'shni — bu yerda ular xavf o'lchovi sifatida
- 09-qism (o'tilgan): z-test, yolg'on musbat va manfiy ehtimollar
- Keyingi dars — Amaliyot: raqam generatori loyihasida yodlash darvozasi, model kartasi va chiqishga watermark qo'shish
- MLOps va deploy qismida: audit jurnali, chiqishlarni kuzatish, watermark kalitini sir sifatida saqlash
8. Eng yaxshi amaliyotlar
Har xavf uchun kamida bitta o'lchov: nusxa ulushi, MIA AUC, guruh ulushi, watermark TPR/FPR, detektor AUC.
Yodlashni teng hajmli held-out bilan va a'zolik hujumi bilan tekshiring.
O'quv ma'lumotini deduplikatsiya qiling; erta to'xtatishni val NLL bo'yicha qiling.
Guruh ulushini ishlab chiqarishdagi generatsiya sozlamasida o'lchang; kerak bo'lsa shartli model bilan nisbatni belgilang.
Watermark chegarasini toza ma'lumotda empirik tekshiring va har hujum turiga TPR ni alohida yozing.
Watermark kalitini sir sifatida saqlang — model yoki paket bilan tarqatmang.
Detektorni o'quvda ko'rilmagan generatorda baholang; uning javobini signal deb qarang.
Model kartasiga cheklovlar va xavf o'lchovlarini raqam bilan yozing.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # nega yodlashni o'lchashda held-out o'quv bilan teng hajmda bo'lishi kerak?
2. # NN nisbati 0.07 nimani bildiradi?
3. # nusxa ulushi 0.1%, MIA AUC 0.79 - maxfiylik bormi?
4. # T = 0.5 da ozchilik ulushi qaysi tomonga siljiydi va nega?
5. # shartli modelda guruh nisbati qayerdan keladi?
6. # watermark kuchi a ni oshirsak TPR va PSNR qanday o'zgaradi?
7. # nega 3x3 xiralash yuqori chastotali watermarkni o'chiradi?
8. # 25 ta siljishni qidirish FPR ga qanday ta'sir qiladi?
9. # green list da gamma = 0.25, T = 200 token, 80 ta yashil - z?
10. # detektor nega yangi generatorda yiqilishi mumkin?
11. # C2PA manifesti va watermarkning asosiy farqi?
12. # watermark kaliti paketda saqlanishi kerakmi?Javoblar
- Eng yaqin qo'shni masofasi to'plam hajmiga bog'liq: katta to'plamda eng yaqin namuna tabiiy ravishda yaqinroq
- Namunalar o'quv to'plamiga held-out dan 14 barobar yaqin — kuchli yodlash (1-misol, n=40)
- Kafolatlanmagan: model o'quv namunalarini baribir "taniydi"; formal kafolat uchun DP kerak
- Ko'pchilik tomonga: past harorat ehtimolli yo'llarni kuchaytiradi (2-misol, ikkala yo'nalishda)
- Bizdan — biz sinf yorliqlarini kerakli nisbatda beramiz
- TPR oshadi, PSNR tushadi (ko'rinadiganroq)
- Xiralash — past chastotali filtr; watermark signali yuqori chastotada
- Oshiradi: har test yolg'on musbat berishi mumkin, maksimum kattalashadi
(80 - 50) / sqrt(200 * 0.25 * 0.75) = 30 / 6.12 ≈ 4.9- U o'quvdagi generatorlar artefaktini o'rganadi; yangi generatorda artefakt boshqa yoki yo'q
- Manifest — kontent yonidagi imzolangan metama'lumot (olib tashlash mumkin); watermark — kontentning o'zida
- Yo'q — kalit alohida sir; kalitni bilgan kishi watermarkni soxtalashtirishi yoki olib tashlashni osonlashtirishi mumkin
Vazifa 2: Xatolarni tuzating
1. sub = X[perm[:40]]; ho = X[perm[40:400]]
nisbat = eng_yaqin(G, sub)[0].mean() / eng_yaqin(G, ho)[0].mean()
2. klf = LogisticRegression().fit(B[oq], y[oq])
ulush = np.mean(klf.predict(G) == oz)
3. if nusxa_ulushi == 0:
print("sintetik ma'lumot maxfiy - tarqatish mumkin")
4. paket = {"holat": model.state_dict(), "watermark_kalit": 2026}
5. det.fit(np.r_[X_tr, G_gmm], y)
print("detektor AUC", roc_auc_score(y_te, det.predict_proba(np.r_[X_te, G_gmm_te])[:, 1]))Javoblar
1. oq = X[perm[:40]]; ho = X[perm[40:80]] # teng hajm
nisbat = eng_yaqin(G, oq)[0].mean() / eng_yaqin(G, ho)[0].mean()
2. klf = LogisticRegression().fit(B[baho_i], y[baho_i]) # generatorga ko'rsatilmagan
print(np.mean(klf.predict(B[haqiqiy_70_30]) == oz)) # avval asbobni tekshirish
ulush = np.mean(klf.predict(G) == oz)
3. if nusxa_ulushi <= nusxa_heldout and abs(mia_auc - 0.5) < 0.05:
print("yodlash belgisi topilmadi (kafolat emas; DP bilan formal cheklash)")
4. paket = {"holat": model.state_dict(),
"watermark": {"usul": "16x16 +-a naqsh", "a": 0.04, "kalit_id": "wm-01"}}
# kalitning o'zi - sirlar omborida
5. for G_te, nom in [(G_gmm_te, "tanish"), (G_yangi, "yangi generator")]:
s = det.predict_proba(xus(np.r_[X_te, G_te]))[:, 1]
print(nom, roc_auc_score(np.r_[np.zeros(len(X_te)), np.ones(len(G_te))], s))Vazifa 3: Yodlash
Modellang:
- 1-misolda o'quv to'plamiga 5 ta rasmni 10 martadan takrorlab qo'shing — aynan shu rasmlar ko'proq qaytariladimi?
- Nusxa ta'rifini Hamming ≤ 2 ga kengaytiring
- Yashirin qatlam 64 va 1024 — yodlash qanday o'zgaradi?
- MIA AUC ni qadamlar bo'yicha (100, 300, 1000, 3000) chizing
Yechim yo'nalishi
Takrorlangan rasmlar uchun torch.bincount(asl) dan ularning qaytarilish sonini qolganlarining o'rtachasi bilan solishtiring — dublikatlar yodlashni kuchaytirishi kutiladi, bu dedup ning asosiy sababi. Katta yashirin qatlam ko'proq "sig'im" beradi — yodlash tezroq boshlanadi. MIA AUC odatda qadamlar bilan monoton o'sadi; erta to'xtatish nuqtasini shu egri bilan solishtiring.
Vazifa 4: Tarafkashlik
Modellang:
- Ozchilik ulushi 10%, 30%, 50% — harorat ta'siri qanday o'zgaradi?
- 50/50 da
T = 0.5— qaysi guruh ko'payadi? - Muvozanatlangan o'rgatish (ozchilikni takroriy tanlash) va shartli model — qaysi biri nisbatni yaxshiroq saqlaydi?
- Guruh ichidagi sifat: har guruhda klassifikator ishonchi
Yechim yo'nalishi
toplam(..., ulush=...) parametrini o'zgartiring. 50/50 holati muhim: agar T = 0.5 da baribir bir guruh ko'paysa — sabab ko'pchilik emas, balki guruhning "soddaligi" (past entropiya). 2-misol 70/30 da bu ikkala yo'nalishni tekshirib ajratgan edi. Har holatda 5 urug' va SE ni saqlang.
Vazifa 5: Watermark
Modellang:
- Past chastotali watermark: naqsh 4x4 bloklarda — xiralashga chidamlilik va ko'rinish
- Chegarani toza ma'lumotdagi
zning 99.9-foizligidan oling — TPR qanchaga o'zgaradi? - Kesish (crop) hujumi: chetdan 2 piksel olib, qayta kattalashtirish
- Kichik "green list" simulyatsiyasi: tasodifiy tokenlar, gamma = 0.25, delta = 2 — T = 25, 100, 400 tokenda z
Yechim yo'nalishi
Past chastotali naqsh xiralashga chidamliroq, lekin rasm mazmuni bilan ko'proq korrelyatsiyalanadi — toza rasmlarda z ning tarqalishi kattaroq bo'ladi va chegarani ko'tarish kerak. Green list simulyatsiyasida har qadam yashil tokenni p = gamma * e^delta / (gamma * e^delta + 1 - gamma) ehtimol bilan tanlaydi; z taxminan sqrt(T) ga proporsional o'sadi — qisqa matnda watermark ishonchsiz.
Vazifa 6: Detektor
Modellang:
- Detektorga faqat 6 ta global statistika va faqat 64 piksel — qaysi biri umumlashadi?
- Uchinchi yangi generator: haqiqiy rasmlar aralashmasi (mixup) — detektorlar qanday ishlaydi?
- Detektorni VAE+hist da ham o'rgating — GMM ga qaytadimi?
- FPR 1% da TPR jadvali
Yechim yo'nalishi
Global statistikalar tez o'rganiladi va shuning uchun tez eskiradi. Mixup ikki haqiqiy rasmni aralashtiradi — oraliq piksellar ko'payadi, shuning uchun GMM detektori uni "sintetik" deb ushlashi mumkin, lekin bu tasodifiy muvaffaqiyat. Har holatda "o'quv / test" jadvalini to'liq yozing — diagonal va diagonaldan tashqarini alohida.
Vazifa 7: O'ylash
Kompaniya rahbari aytdi: "Biz mijozlar rasmlari asosida sintetik ma'lumot yaratamiz va uni hamkorlarga beramiz. Sintetik ma'lumot — haqiqiy odamlar emas, demak maxfiylik bo'yicha hech qanday tekshiruv shart emas. Qo'shimcha xavfsizlik uchun chiqishga watermark qo'yamiz." Siz nima deysiz?
Javob
Qisqa javob: "sintetik — demak maxfiy" — tekshirilmagan da'vo; 1-misol aynan uning teskarisini ko'rsatdi. Watermark esa boshqa muammoni hal qiladi — kelib chiqishni, maxfiylikni emas.
1. Yodlash haqiqiy xavf. 1-misolda kichik ma'lumotda uzoq o'rgatilgan model namunalarning 85.9% ini o'quv rasmlarining aynan nusxasi sifatida chiqardi. Ma'lumot ko'p bo'lsa ham, a'zolik hujumi sizishni ko'rsatishi mumkin (n=800 da AUC 0.582–0.817).
2. Nima tekshiriladi. (a) Har sintetik namuna uchun eng yaqin haqiqiy rasm — teng hajmli held-out bilan solishtirib; (b) nusxa va juda yaqin namunalar ulushi; (c) a'zolik hujumi AUC; (d) dublikatlar va kam uchraydigan (noyob) mijozlar — ular eng ko'p yodlanadi.
3. Nima qilinadi. Deduplikatsiya, erta to'xtatish, o'quv to'plamiga juda yaqin chiqishlarni filtrlash; maxfiylik kafolati talab qilinsa — differensial maxfiylik bilan o'rgatish va uning sifatga narxini o'lchash. Tarqatishdan oldin huquqiy va maxfiylik bo'yicha mas'ullar bilan kelishish.
4. Watermark haqida. Watermark "bu rasm bizning modelimiz chiqishi" ekanini keyin isbotlashga yordam beradi — bu foydali. Lekin u yodlangan bemor yoki mijoz rasmini himoya qilmaydi: nusxa watermark bilan ham nusxa.
Rahbarga javob: "Sintetik ma'lumot maxfiylikni avtomatik bermaydi — model o'quv rasmlarini qaytarishi mumkin, buni o'lchab ko'rsatdik. Tarqatishdan oldin eng yaqin qo'shni va a'zolik hujumi tekshiruvini o'tkazamiz, natijani model kartasiga yozamiz. Watermark — kelib chiqish uchun, maxfiylik uchun emas."
Nimani mustahkamlaydi: 2.4, 2.5, 2.6, 2.7-bo'limlar.
Xulosa
Bu darsda generativ modellarning asosiy xavflarini himoya nuqtai nazaridan ko'rdik va har birini raqam bilan o'lchadik: yodlab olish, tarafkashlik kuchayishi, watermark va sintetik kontent detektorlari.
Eng muhim uch fikr:
Yodlash — o'lchanadigan xavf. 1-misolda 40 ta rasmda 3000 qadam o'rgatilgan model 1000 ta namunaning
85.9%ini o'quv rasmlarining aynan nusxasi sifatida qaytardi (40 tadan 40 ta rasm), NN nisbati0.07, a'zolik hujumi AUC1.000. Hajm oshsa yodlash kamaydi (n=800 da nusxa2.4%), erta to'xtatish n=200 da nusxalarni15.3%dan0.1%ga tushirdi — lekin a'zolik hujumi AUC0.787qoldi: "nusxa yo'q" maxfiylik kafolati emas.Tarafkashlik generatsiya sozlamasida kuchayadi. 2-misolda 70/30 ma'lumotdan MADE
T = 1.0da nisbatni saqladi (0.307,0.313), lekinT = 0.5da ozchilik0.184va0.169gacha tushdi — ikkala yo'nalishda ham, ya'ni aynan ko'pchilik kuchaydi. Shartli model nisbatni aniq0.300da ushladi.Watermark va detektor — kuchli, lekin chegarali vositalar. 3-misolda
a = 0.04li watermark TPR100%, FPR0.0%berdi, shovqin va JPEG 70 ga chidadi (99.7%), lekin xiralash va 1 piksel siljitishda0.0%ga tushdi; toza rasmlarda zN(0, 1)emas edi (o'rtacha+1.05, std0.60). 4-misolda detektor tanish generatorlarda AUC0.95–0.999, artefakti tuzatilgan yangi generatorda esa0.63–0.65— u "sintetiklik"ni emas, gistogramma artefaktini o'rgangan edi.
Keyingi darsda Amaliyot: 26-qismning barcha bilimlarini bitta loyihaga yig'amiz — shartli raqam generatori: GMM, VAE va diffusion nomzodlarini bir xil baholash to'plami bilan juftlashgan taqqoslash, yodlash darvozasi, testni bir marta ochish, weights_only=True paket va chiqishga watermark.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!