Neyron tarmoq formulalari: qo‘llanma · Keyingi bosqich

Triplet Loss: o‘ziniki begonadan yaqinroq

Sinflarni emas, masofalarni o‘rgatadigan yo‘qotish funksiyasi: langar «o‘ziniki»ga «begona»dan kamida m oraliqqa yaqinroq bo‘lishi kerak. Formulani, uchliklarning uch rejimini, gradiyentlarni, batch-hard mayningni, sferada normallashtirishni va FaceNet hamda odamlarni qayta identifikatsiya qilish (Re-ID) shu matematikaga qanday tayanishini mayda detallarigacha ko‘rib chiqamiz.

Javharbek Abdulatipov · 35 daq o‘qish
$$L(a,p,n)=\max\bigl(0,\;d(a,p)-d(a,n)+m\bigr)$$

U nima uchun kerak

Oddiy klassifikator sinflarning qat’iy ro‘yxatini biladi. Lekin yuzni tanish tizimi o‘quv to‘plamida bo‘lmagan odamlarni ham tanishi, qayta identifikatsiya (re-identification, Re-ID) tizimi esa o‘sha odamni boshqa kamera yozuvida, boshqa rakursda va boshqa yorug‘likda topishi kerak. Har bir yangi odam uchun tarmoqni qayta o‘qitib bo‘lmaydi.

Yechim — sinflarni emas, metrikani o‘rgatish (metric learning). $f$ tarmoq tasvirni $f(x)\in\mathbb R^d$ embedding vektoriga shunday aylantiradiki, bir odamning suratlari yonma-yon, turli odamlarniki esa uzoqda bo‘ladi. Shunda «bu kim?» savoli masofa bo‘yicha eng yaqin qo‘shnilarni qidirishga keltiriladi, yangi odam esa bazaga bitta embedding bilan qo‘shiladi.

Triplet Loss bu talabni to‘g‘ridan-to‘g‘ri qo‘yadi. Uchlik olamiz: langar $a$ (anchor), o‘ziniki $p$ (positive, o‘sha odam) va begona $n$ (negative, boshqa odam). O‘ziniki begonadan kamida $m$ oraliqqa (margin) yaqinroq bo‘lishini talab qilamiz.

  • yuzni tanish — FaceNet (Google, 2015): 128 o‘lchovli embeddinglar, $0{,}2$ oraliq, LFW to‘plamida $99{,}63\%$ aniqlik;
  • odamlarni kameralar orasida qayta identifikatsiya qilish — batch-hard triplet loss (Xermans va boshq., 2017); torchreid kutubxonasida uni shaxslar bo‘yicha kross-entropiya bilan birga o‘qitish mumkin (ImageTripletEngine);
  • o‘xshash tasvirlar, tovarlar, ovozlarni qidirish va umuman savol «bu namunaga nima yaqinroq?» bo‘lgan har qanday ma’no bo‘yicha qidiruv.
Bir daqiqada asosiysi

$L=\max\bigl(0,\,d(a,p)-d(a,n)+m\bigr)$. Agar begona o‘zinikidan $m$ dan ko‘proq uzoq bo‘lsa, yo‘qotish nolga teng va uchlik hech narsa o‘rgatmaydi. Aks holda gradiyent o‘zinikini langarga tortadi va begonani itaradi. Tasodifiy uchliklarning deyarli hammasi oson, shuning uchun asosiy mahorat — qiyinlarini tanlash (mayning), masalan batch ichidagi eng uzoq o‘ziniki va eng yaqin begonani (batch-hard).

Intuitsiya: o‘ziniki begonadan yaqinroq

Embeddinglarni tekislikda chizamiz. $a$ langar atrofida o‘ziniki $p$ orqali aylana o‘tkazamiz — uning radiusi $d(a,p)$. Ikkinchisini oraliq qadar kengroq qo‘shamiz: radiusi $d(a,p)+m$. Formula talabi oddiy: begona tashqi aylanadan tashqarida yotishi kerak. To‘q sariq halqaga yoki ichkariga tushsa — yo‘qotish musbat.

1-rasm. Langar, o‘ziniki va begonani torting. To‘q sariq strelkalar — gradiyent tushish har bir nuqtani siljitadigan yo‘nalishlar. Boshlang‘ich holatda $d(a,p)=0{,}9$, $d(a,n)=1{,}0$, $m=0{,}2$: begona halqa ichida, $L=0{,}9-1{,}0+0{,}2=0{,}1$. Uni halqadan tashqariga chiqaring — strelkalar yo‘qoladi.
Nimaga e’tibor berish kerak

O‘ziniki va begonadagi strelkalar doim langarga boruvchi chiziqlar bo‘ylab yo‘nalgan, oddiy (kvadratsiz) metrikada esa nuqtalar qayerda bo‘lmasin, ularning uzunliklari bir xil: gradiyent normasi 1 ga teng, buzilish kattaligi emas, uning faktining o‘zi muhim. Langar strelkasi ikki birlik vektor yig‘indisi, uning uzunligi 0 dan 2 gacha. Masofalar kvadratlarini yoqing — strelkalar uzunligi masofalarga proporsional bo‘lib qoladi.

Formula mayda detallarigacha

Yo‘qotishni to‘liq yozamiz — tarmoq, masofalar va uchliklar bo‘yicha o‘rtachalash bilan:

$$\mathcal L=\frac{1}{|T|}\sum_{(a,p,n)\in T}\max\Bigl(0,\;\bigl\|f(x_a)-f(x_p)\bigr\|-\bigl\|f(x_a)-f(x_n)\bigr\|+m\Bigr)$$
$f(x)$
embedding: $x$ tasvir uchun tarmoq chiqishi, $\mathbb R^d$ dagi vektor (FaceNet’da $d=128$), ko‘pincha birlik uzunlikka normallashtirilgan;
$d(a,p)$
o‘zinikigacha masofa, $\|f(x_a)-f(x_p)\|$; uni kamaytirmoqchimiz;
$d(a,n)$
begonagacha masofa, $\|f(x_a)-f(x_n)\|$; uni oshirmoqchimiz;
$m>0$
oraliq: begona o‘zinikidan shunchaki emas, $m$ zaxira bilan uzoqroq bo‘lishi kerak;
$\max(0,\cdot)$
sharnir (hinge): bajarilgan talab jarimalanmaydi va gradiyent bermaydi;
$T$
o‘rtachalanadigan uchliklar to‘plami — odatda batch ichidagi uchliklar (mayning bo‘limiga qarang).

Bitta o‘zgaruvchi — masofalar ayirmasi $\Delta=d(a,p)-d(a,n)$ ni kiritish qulay. U holda $L=\max(0,\Delta+m)$: bu $m$ ga surilgan ReLU. Manfiy $\Delta$ o‘ziniki allaqachon yaqinroq ekanini bildiradi; lekin $\Delta>-m$ ekan, zaxira yetmaydi.

$m=0{,}2$ dagi misollar: $d(a,p)=0{,}4$, $d(a,n)=1{,}1$ $\Delta=-0{,}7$ va $L=\max(0;\,-0{,}5)=0$ beradi — uchlik allaqachon ajratilgan. $d(a,p)=0{,}9$, $d(a,n)=1{,}0$ $\Delta=-0{,}1$ va $L=0{,}1$ beradi: o‘ziniki yaqinroq, lekin oraliq kam.

2-rasm. $\Delta$ funksiyasi sifatidagi yo‘qotish (yuqorida) va uning hosilasi (pastda). Hosila — zinapoya: bajarilgan uchliklar uchun 0, buzilganlari uchun 1, oraliq qiymatlarsiz. Punktir — Xermans va boshqalar ishidagi «yumshoq oraliq» (soft margin) $\ln(1+e^{\Delta})$: u hech qachon nolga aylanmaydi, hosilasi esa sigmoida $\sigma(\Delta)$. $\Delta=-0{,}1$ da: hinge $0{,}1$, yumshoq variant $0{,}644$ beradi.
Oraliq — nisbiy

Triplet Loss o‘zinikilar qandaydir qat’iy chegaradan yaqinroq bo‘lishini talab qilmaydi — faqat begonalardan yaqinroq bo‘lishini. Shuning uchun turli odamlarning klasterlari turli o‘lchamda bo‘lishi mumkin. «Bu o‘sha odam» javobi uchun chegara keyin, validatsiyada tanlanadi.

Uch rejim: oson, yarim qiyin, qiyin

Har bir uchlik $d(a,p)$ va $d(a,n)$ ga qarab uch rejimdan biriga tushadi:

RejimShart$L$Gradiyent
oson (easy)$d(a,n)\ge d(a,p)+m$$0$yo‘q
yarim qiyin (semi-hard)$d(a,p)<d(a,n)<d(a,p)+m$$0$ dan $m$ gachabor
qiyin (hard)$d(a,n)\le d(a,p)$$m$ dan kam emasbor

$(d(a,p),\,d(a,n))$ tekisligida rejimlar chegaralari — ikkita parallel to‘g‘ri chiziq: $d(a,n)=d(a,p)$ va $d(a,n)=d(a,p)+m$. $d(a,p)-d(a,n)+m$ yo‘qotish — sath chiziqlari shu to‘g‘ri chiziqlarga parallel bo‘lgan qiya tekislik; yuqoridagi chiziqdan tepada u nol bilan kesilgan.

3-rasm. $(d(a,p),\,d(a,n))$ tekisligidagi yo‘qotish: qizil rang qancha to‘q bo‘lsa, u shuncha katta. Nuqtalar — 5-rasmdagi batchning barcha 576 uchligi (4 kishi, har biri 4 suratdan). $m=0{,}2$ da ulardan 510 tasi oson, 31 tasi yarim qiyin va 35 tasi qiyin: 576 tadan faqat 66 uchlik gradiyent beradi. Oraliqni oshiring — yarim qiyinlar polosasi kengayadi.
Nega tasodifiy uchliklar foydasiz

Tarmoq ozgina o‘rgangan zahoti tasodifiy uchliklarning aksariyati oson bo‘lib qoladi: ularning yo‘qotishi va gradiyenti nolga teng. Ular bo‘yicha o‘rtachalash foydali signalni suyultiradi va o‘qitish deyarli to‘xtaydi. Mayning shundan kelib chiqadi — qiyin va yarim qiyin uchliklarni maqsadli tanlash.

Gradiyentlar: har bir nuqta qayerga tortiladi

Faol uchlik ($L>0$) uchun yo‘qotish $d(a,p)-d(a,n)+m$ ga teng va hammasi masofa gradiyentiga keltiriladi. Evklid normasi uchun $u\ne v$ da $\nabla_u\|u-v\|=\frac{u-v}{\|u-v\|}$ — $v$ dan $u$ ga yo‘nalgan birlik vektor ($u=v$ da norma differensiallanmaydi; uning subgradiyentlari — uzunligi 1 dan oshmaydigan barcha vektorlar, kodda odatda 0 olinadi).

Uch nuqta bo‘yicha gradiyentlarni keltirib chiqarish

Embeddinglarni $a,p,n$ va $d_{ap}=\|a-p\|$, $d_{an}=\|a-n\|$ deb belgilaymiz. $d_{ap}=\sqrt{(a-p)^\top(a-p)}$ ni zanjir qoidasi bo‘yicha differensiallaymiz:

$$\nabla_a d_{ap}=\frac{1}{2d_{ap}}\cdot2(a-p)=\frac{a-p}{d_{ap}},\qquad \nabla_p d_{ap}=\frac{p-a}{d_{ap}}$$

$d_{an}$ uchun ham xuddi shunday. $L=d_{ap}-d_{an}+m$ ga qo‘yamiz:

$$\nabla_p L=\frac{p-a}{d_{ap}},\qquad \nabla_n L=-\frac{n-a}{d_{an}},\qquad \nabla_a L=\frac{a-p}{d_{ap}}-\frac{a-n}{d_{an}}$$

Uch gradiyent yig‘indisi nolga teng: uchala nuqtani bir xil vektorga surish masofalarni o‘zgartirmaydi, demak, yo‘qotish ham o‘zgarmaydi. Masofalar kvadratlari uchun $L=d_{ap}^2-d_{an}^2+m$ dan $\nabla_pL=2(p-a)$, $\nabla_nL=-2(n-a)$ va $\nabla_aL=2(n-p)$ ni olamiz — langarning gradiyenti umuman uning holatiga bog‘liq emas.

Gradiyent tushish qadami gradiyentga qarshi yo‘naladi: o‘ziniki $p$ langarga qarab, begona $n$ langardan uzoqqa siljiydi, langar esa o‘zinikiga qarab va begonadan uzoqlashadi. Oddiy metrikada o‘ziniki va begonaning siljishlari istalgan masofada 1 uzunlikka ega (langarniki — 0 dan 2 gacha); kvadratli metrikada — $2\,d(a,p)$ va $2\,d(a,n)$, ya’ni masofalarga proporsional.

Buni 3D sirtda ko‘rish mumkin. Langarni koordinata boshida, o‘zinikini esa $0{,}6$ masofada mahkamlaymiz; yo‘qotish begonaning $n=(x,y)$ holatiga qanday bog‘liq? To‘ntarilgan konus hosil bo‘ladi: markazda $L=0{,}6+m$, radiusi $0{,}6+m$ bo‘lgan doira chetida — nol. Konus qiyaligi hamma joyda bir xil, $|\nabla L|=1$.

4-rasm. Langar mahkamlanganda begona (yoki o‘ziniki) holatining funksiyasi sifatidagi yo‘qotish; sirtni aylantirish mumkin. O‘ngda — langardan chiqqan nur bo‘ylab kesim: yo‘qotishning o‘zi va gradiyent normasi. $m=0{,}4$ va oddiy masofada konus balandligi $1{,}0$ va radiusi $1{,}0$. $d^2$ ga o‘ting: sirt balandligi $0{,}76$ va radiusi $0{,}872$ bo‘lgan paraboloidga aylanadi, langarning o‘zida esa gradiyent nolga aylanadi. O‘ziniki uchun (begona $1{,}2$ masofada, oddiy masofa) — voronka: yo‘qotish radiusi $1{,}2-0{,}4=0{,}8$ bo‘lgan aylanadan tashqarida o‘sadi.
Masofa kvadrati va qiyin begonalar

Masofalar kvadratlarida itarish kuchi $2\,d(a,n)$ begona langarga qancha yaqin bo‘lsa, shuncha zaif — ya’ni aynan eng xavfli xatolar uchun. Oddiy metrikada u doimiy. Shuning uchun Re-ID’da (Xermans va boshq., 2017) oddiy Evklid masofasi tavsiya etiladi; FaceNet kvadratlardan foydalanadi, lekin normallashtirilgan vektorlarda va yarim qiyin uchliklar bilan.

Mayning: qaysi uchliklarni olish kerak

$N$ ta tasvir to‘plamida $N^3$ tartibidagi uchlik bor — hammasini sanab chiqib bo‘lmaydi, ularning deyarli barchasi oson ham. Uchliklar batch ichida onlayn tanlanadi. Batch $P\times K$ sxemasida quriladi: $P$ kishi, har biridan $K$ surat. Bunday batch ichida

$$|T|=\underbrace{PK}_{\text{langarlar}}\cdot\underbrace{(K-1)}_{\text{o‘zinikilar}}\cdot\underbrace{(P-1)K}_{\text{begonalar}}$$

$P=4$, $K=4$ da bu 576 uchlik, $P=18$, $K=4$ da (Xermans va boshqalar shunday batchdan foydalangan) — allaqachon 14 688. Asosiy strategiyalar:

  • batch-all — batchning barcha uchliklarini olamiz va osonlari signalni suyultirmasligi uchun yo‘qotishni faqat faollari ($L>0$) bo‘yicha o‘rtachalaymiz (Xermans va boshqalarda — BA$_{\ne0}$ varianti);
  • batch-hard — har bir langar uchun bitta uchlik: eng uzoq o‘ziniki va eng yaqin begona; $PK$ ta eng informativ uchlik;
  • semi-hard (FaceNet) — $(a,p)$ juftligi uchun o‘zinikidan uzoqroq, lekin oraliq ichidagi begona olinadi; shunda boshida o‘qitish yumshoqroq bo‘ladi.
$$\mathcal L_{\text{BH}}=\frac{1}{PK}\sum_{a}\max\Bigl(0,\;\max_{p:\,y_p=y_a}d(a,p)-\min_{n:\,y_n\ne y_a}d(a,n)+m\Bigr)$$
5-rasm. Embedding fazosidagi $P=4$, $K=4$ batch. Langar va strategiyani tanlang. batch-hard rejimida qalin chiziqlar eng uzoq o‘ziniki va eng yaqin begonaga olib boradi, punktir aylana — $d_{\max}(a,p)+m$ radius. $m=0{,}2$ da batch-hard $L=0{,}353$, batch-all esa 576 tadan 66 faol uchlik bo‘yicha $0{,}306$ beradi. Birinchi langarning 36 uchligidan 34 tasi oson va 2 tasi yarim qiyin.
Eng qiyinlarining xavfi

Eng qiyin uchliklar ko‘pincha belgilashdagi xatolar yoki deyarli farqlanmaydigan suratlar bo‘lib chiqadi. O‘qitish boshida, embeddinglar tasodifiy bo‘lganda, ularning ortidan quvish modelni «yopishtirib» qo‘yishi mumkin: barcha $f(x)$ bitta nuqtaga tortiladi, u yerda istalgan uchlik uchun $L=m$. Boshida yarim qiyin uchliklar, embeddinglarni normallashtirish, yumshoq oraliq va kross-entropiya bilan birlashtirish yordam beradi.

O‘qitishda bu qanday ishlaydi

Hammasini birlashtiramiz. Har bir suratning ikki belgisi bo‘lsin: $x_1$ — bir odamning o‘zida kuchli o‘zgaradigan xalaqit (rakurs, yoritilish), $x_2$ esa — xalaqit ozgina egib yuborgan shaxs belgisi. Kirish fazosida bir odamning ikki surati turli odamlarning suratlaridan uzoqroq bo‘lishi mumkin: uchliklarning faqat $62{,}7\%$ i to‘g‘ri tartiblangan.

Kichik $f:\mathbb R^2\to\mathbb R^2$ tarmoq (12 ta tanh neyron) $m=0{,}5$ dagi batch-hard triplet loss va Adam optimizatori bilan o‘qitiladi. Unga qaysi odam qayerda bo‘lishi kerakligi aytilmaydi — faqat o‘zinikilar begonalardan yaqinroq bo‘lishi kerakligi.

6-rasm. Chapda — har biri 12 suratli 4 kishining kirishlari, o‘ngda — ularning embeddinglari, pastda — yo‘qotish. «Boshlash»ni bosing. Boshida $L=1{,}266$, barcha 48 langar faol, uchliklarning $64{,}9\%$ i to‘g‘ri tartiblangan. 60-qadamga kelib $100\%$ i tartiblangan, lekin 42 langarga hali oraliq yetmaydi; 300-qadamga kelib 4 tasi faol qoladi, 600-qadamda yo‘qotish nolga teng. Tarmoq polosalarni «to‘g‘riladi»: $x_1$ xalaqitga qaramay, endi har bir surat barcha o‘zinikilariga istalgan begonadan $0{,}5$ zaxira bilan yaqinroq.

Re-ID ham xuddi shunday ishlaydi: so‘rov (query) — bir kameradagi odam surati, galereya (gallery) — qolgan barcha kameralardagi suratlar. Galereya embeddinglari so‘rovgacha bo‘lgan masofa bo‘yicha saralanadi va birinchi to‘g‘ri javob nechanchi o‘rinda ekaniga qaraladi. Metrikalar — Rank-1 (to‘g‘ri javob birinchi o‘rinda) va mAP (barcha to‘g‘rilar bo‘yicha o‘rtacha aniqlik).

Bu qayerdan boshlangan

O‘zinikilar va begonalar orasidagi oraliq g‘oyasi — katta oraliqli eng yaqin qo‘shnilar usulidan (LMNN, Vaynberger, Blitser va Sol, 2005). Oraliqli o‘ziniki va begona juftliklarini kontrastiv yo‘qotish kiritgan (Xadsell, Chopra va LeKun, 2006). Shroff, Kalenichenko va Filbin uchliklarni FaceNet asosiga aylantirdi (2015), Xermans, Bayer va Leybe esa «In Defense of the Triplet Loss for Person Re-Identification» (2017) ishida batch-hard mayning bilan uchliklar Re-ID’da ham yaxshi ishlashini ko‘rsatdi.

Sferada normallashtirish va oraliqni tanlash

Cheklovlarsiz tarmoq fazoni shunchaki cho‘zib, barcha masofalarni oshirishi mumkin: oddiy metrikada masshtab qat’iy bo‘lmasa, $m$ oraliq ma’nosini yo‘qotadi. Shuning uchun embeddinglar ko‘pincha normallashtiriladi: $\hat f=f/\|f\|$, barcha nuqtalar birlik sferada yotadi. Birlik vektorlar uchun

$$\|u-v\|^{2}=\|u\|^2+\|v\|^2-2\,u^\top v=2-2\cos\theta$$

bunda $\theta$ — vektorlar orasidagi burchak. Masofa kvadrati 0 dan (ustma-ust) 4 gacha (qarama-qarshi) o‘zgaradi va FaceNet’dagi $m=0{,}2$ oraliq butun diapazonning $5\%$ i. $d^2(a,n)\ge d^2(a,p)+m$ talabi burchaklarga qo‘yilgan talabga aylanadi: $\cos\theta_{an}\le\cos\theta_{ap}-m/2$.

7-rasm. Birlik aylanadagi normallashtirilgan embeddinglar (nuqtalarni aylana bo‘ylab torting) va burchak funksiyasi sifatidagi masofa kvadrati. To‘q sariq yoy — begona oraliqni buzadigan zona. $\theta_{ap}=40^\circ$ va $m=0{,}2$ da begona langardan kamida $48{,}2^\circ$ uzoqda bo‘lishi kerak; boshlang‘ich holatda u $45^\circ$ da: $d^2(a,p)=0{,}468$, $d^2(a,n)=0{,}586$, $L=0{,}082$.
Oraliqni qanday tanlash kerak

Oraliq masofa birliklarida o‘lchanadi, shuning uchun normallashtirishga va masofa kvadratmi yoki yo‘qligiga bog‘liq. Odatiy qiymatlar: FaceNet’da $0{,}2$ (normallashtirilgan embeddinglarda $d^2$) va torchreid’da $0{,}3$ (normallashtirilmagan belgilarda oddiy $d$); nn.TripletMarginLoss’da standart $m=1$. Juda kichik oraliq deyarli ajratishni talab qilmaydi, juda kattasiga esa erishib bo‘lmasligi mumkin va u barcha uchliklarni faol ushlab turadi.

Kodda: batch ichida mayning va barqarorlik

Samaradorlik kaliti — batchdagi barcha juft masofalar matritsasi, undan mayning sikllarsiz, niqoblar bilan olinadi. Sonli nozik jihat: $\|u-v\|$ $u=v$ da differensiallanmaydi (ildizning noldagi hosilasi cheksiz), $\|u\|^2-2u^\top v+\|v\|^2$ formulasi esa yaxlitlash tufayli juda kichik manfiy son berishi mumkin. Shuning uchun ildiz ostiga $\max(\cdot,\varepsilon)$ qo‘yiladi, nn.TripletMarginLoss esa vektorlar ayirmasiga $\varepsilon=10^{-6}$ qo‘shadi. Unda swap=True parametri ham bor — «masofalarni almashtirish» (distance swap, Balntas va boshq., 2016): $d(a,n)$ o‘rniga $\min\bigl(d(a,n),\,d(p,n)\bigr)$ olinadi, ya’ni begona ikki «o‘ziniki» nuqtaning yaqinrog‘i bilan solishtiriladi.

pythonimport numpy as np

def pairwise_dist(E, eps=1e-12):
    """E (n × d) satrlari orasidagi Evklid masofalari matritsasi."""
    sq = (E * E).sum(1)
    d2 = sq[:, None] - 2.0 * E @ E.T + sq[None, :]
    return np.sqrt(np.maximum(d2, eps))     # max: −1e-16 dan va noldan ildiz olishdan himoya

def batch_hard_triplet(E, labels, margin=0.3):
    D = pairwise_dist(E)
    same = labels[:, None] == labels[None, :]
    hardest_pos = np.where(same, D, 0.0).max(1)       # eng uzoq o‘ziniki
    hardest_neg = np.where(same, np.inf, D).min(1)    # eng yaqin begona
    has_pos = same.sum(1) > 1                         # batchda o‘zinikisi yo‘q langarni o‘tkazib yuboramiz
    loss = np.maximum(hardest_pos - hardest_neg + margin, 0.0)
    return loss[has_pos].mean()

E = np.array([[0.0, 0.0], [0.9, 0.0], [0.6, 0.8]])   # langar, o‘ziniki, begona
labels = np.array([0, 0, 1])
print(batch_hard_triplet(E, labels, margin=0.2))      # ≈ 0.1728 = (0.1 + 0.2456) / 2: begonaning o‘zinikisi yo‘q
pythonimport torch
import torch.nn as nn
import torch.nn.functional as F

# 1) Uchliklar oldindan yig‘ilgan: tayyor yo‘qotish (standart: margin=1.0, p=2, swap=False)
loss_fn = nn.TripletMarginLoss(margin=0.2, p=2)
a = torch.tensor([[0.0, 0.0]], requires_grad=True)
p = torch.tensor([[0.9, 0.0]], requires_grad=True)
n = torch.tensor([[0.6, 0.8]], requires_grad=True)
loss = loss_fn(a, p, n)            # max(0, 0.9 − 1.0 + 0.2) ≈ 0.1
loss.backward()
print(p.grad, n.grad)              # ≈ [1, 0] va [−0.6, −0.8]: birlik vektorlar

# 2) P × K batch ichida mayning (batch-hard)
def batch_hard(emb, labels, margin=0.3, normalize=True):
    if normalize:
        emb = F.normalize(emb, dim=1)          # birlik sferadagi nuqtalar
    D = torch.cdist(emb, emb)                  # n × n Evklid masofalari
    same = labels[:, None] == labels[None, :]
    pos = (D * same).max(1).values             # eng uzoq o‘ziniki
    neg = D.masked_fill(same, float("inf")).min(1).values   # eng yaqin begona
    has_pos = same.sum(1) > 1                  # batchda o‘zinikisi yo‘q langarni o‘tkazib yuboramiz
    return F.relu(pos - neg + margin)[has_pos].mean()
Amaliyot

$P\times K$ batch (masalan, $P=16$, $K=4$) albatta kerak: batchda bir odamning bir nechta surati bo‘lmasa, o‘zinikilar bo‘lmaydi. Triplet loss odatda shaxslar bo‘yicha kross-entropiya bilan birlashtiriladi — shunda o‘qitish tezroq va barqarorroq.

Ko‘p uchraydigan xatolar

  1. $P\times K$ o‘rniga tasodifiy batchlar. Tasodifiy batchda ko‘p langarlarning birorta ham o‘zinikisi yo‘q va uchliklar yig‘ilmaydi.
  2. Faqat tasodifiy uchliklarda o‘qitish. Ularning deyarli hammasi oson, gradiyent nol va model yomon bo‘lsa ham yo‘qotish kichik qiymatda «qotib qoladi».
  3. Birinchi qadamdan eng qiyin uchliklar normallashtirish va qizdirishsiz — barcha embeddinglarning bitta nuqtaga yopishib qolish xavfi.
  4. Masshtabni hisobga olmagan oraliq. Normallashtirishsiz tarmoq fazoni cho‘zadi; sferada $m$ ni masofa maksimumiga ($d$ uchun 2, $d^2$ uchun 4) solishtirish kerak.
  5. Noldan ildiz. Matritsa diagonalidagi nuqtaning o‘zigacha masofasi, agar $\varepsilon$ qo‘shilmasa yoki diagonal niqoblanmasa, gradiyentda NaN beradi.

Eng yaqin qarindoshi — kontrastiv yo‘qotish (contrastive loss): u nisbiy taqqoslash bilan emas, juftliklar va mutlaq chegaralar bilan ishlaydi. $y=1$ (o‘zinikilar) va $y=0$ (begonalar) belgili juftlik uchun:

$$L_{\text{contr}}=y\,d^{2}+(1-y)\,\max(0,\;m-d)^{2}$$
  • ReLU: $\max(0,\Delta+m)$ sharnir — masofalarning surilgan ayirmasidan olingan ReLU; uning hosilasi — zinapoya.
  • Sigmoida: $\ln(1+e^\Delta)$ yumshoq oraliq hosilasi $\sigma(\Delta)$ ga teng.
  • Softmax va kross-entropiya: N-pair loss va InfoNCE uchlikni o‘xshashliklar bo‘yicha softmax orqali bitta o‘ziniki va ko‘plab begonalarga umumlashtiradi; ArcFace oraliqni softmax ichidagi burchakka ko‘chiradi.
  • MSE: Evklid masofasi kvadrati — ayirmalar kvadratlarining o‘sha yig‘indisi.
  • Focal Loss: «qiyinlardan o‘rganish» g‘oyasining o‘zi, faqat uchliklarni tanlash orqali emas, misol vazni orqali.
  • Adam: 6-rasmdagi simulyatsiya optimizatori.

Xulosa

1) $L=\max(0,\,d(a,p)-d(a,n)+m)$: o‘ziniki begonadan $m$ zaxira bilan yaqinroq bo‘lishi kerak; bu $\Delta+m$ dan olingan ReLU. 2) Rejimlar: oson ($L=0$, gradiyent yo‘q), yarim qiyin ($0<L<m$), qiyin ($L\ge m$). 3) Gradiyentlar — langarga boruvchi chiziqlar bo‘ylab birlik vektorlar ($d^2$ uchun masofalarga proporsional), yig‘indisi nolga teng. 4) Uchliklar $P\times K$ batch ichida tanlanadi: batch-all, batch-hard, semi-hard. 5) Sferada normallashtirish $d^2=2-2\cos\theta$ va ma’noli oraliq beradi. 6) FaceNet va Re-ID shunga tayanadi: embedding va eng yaqin qo‘shnilarni qidirish.

O‘zingizni tekshiring

1. $m=0{,}2$, $d(a,p)=0{,}9$, $d(a,n)=1{,}0$. Yo‘qotish nimaga teng?
2. $m=0{,}2$ da $d(a,p)=0{,}5$, $d(a,n)=0{,}4$ bo‘lgan uchlik —…
3. Faol uchlikdagi begona $n$ uchun gradiyent tushish qadami qayerga yo‘nalgan (oddiy metrika)?
4. batch-hard har bir langar uchun nimani tanlaydi?
5. $90^\circ$ burchak ostidagi birlik vektorlar uchun masofa kvadrati…