What is self-critical sequence training (SCST)?

Antrenament Auto-Critic pentru Descrieri de Imagini

17/09/2022

Rating: 4.1 (11357 votes)

Generarea automată de descrieri pentru imagini, sau "Image Captioning", reprezintă una dintre cele mai fascinante și provocatoare sarcini în domeniul inteligenței artificiale și al viziunii computerizate. Capacitatea unui sistem de a „înțelege” conținutul vizual al unei imagini și de a-l traduce într-o descriere textuală coerentă și relevantă deschide noi orizonturi pentru accesibilitate, căutare vizuală și interacțiuni om-calculator. Cu toate acestea, atingerea unui nivel înalt de precizie și fluență în aceste descrieri necesită metode de antrenament sofisticate. Una dintre cele mai eficiente abordări, care a revoluționat performanța în acest domeniu, este Antrenamentul Auto-Critic Secvențial (Self-Critical Sequence Training – SCST), o tehnică inovatoare pe care o vom explora în detaliu, concentrându-ne pe o implementare practică în Python.

Is there a Python implementation for self-critical sequence training for image captioning?
This is an unofficial implementation for Self-critical Sequence Training for Image Captioning. The latest topdown and att2in2 model can achieve 1.12 Cider score on Karpathy's test split after self-critical training. This is based on Ruotian's self-critical.pytorch repository. Python 2.7 and PyTorch 0.2 (along with torchvision)
Cuprins

Ce este Antrenamentul Auto-Critic Secvențial (SCST)?

Antrenamentul Auto-Critic Secvențial (SCST) este o metodologie de optimizare bazată pe algoritmul REINFORCE, concepută pentru a îmbunătăți performanța modelelor de generare de secvențe, cum ar fi cele utilizate în „image captioning”. Spre deosebire de metodele tradiționale care se bazează pe estimarea unei linii de bază (baseline) pentru a normaliza recompensele și a reduce variația, SCST utilizează propria ieșire a algoritmului de inferență din timpul testării pentru a normaliza recompensele pe care le experimentează. Acest lucru înseamnă că modelul se „compară” cu el însuși: o descriere generată este evaluată în raport cu o descriere de referință (sau cu o altă descriere generată de model într-un mod controlat), iar recompensa este ajustată în funcție de cât de bine a performat propria sa predicție. Această abordare unică reduce semnificativ varianța în antrenament și permite modelului să învețe să genereze secvențe care maximizează direct metricile de evaluare, cum ar fi scorul CIDEr, care sunt de obicei non-diferențiabile și dificil de optimizat direct. O extensie interesantă a SCST este B-SCST, care încorporează inferența Bayesiană pentru a aduce o robustețe și mai mare procesului de antrenament.

Implementare în Python și Cerințe Tehnice

Implementarea neoficială a Antrenamentului Auto-Critic Secvențial pentru „Image Captioning” pe care o vom discuta este construită pe baza bibliotecii PyTorch. Este important de menționat că această implementare specifică necesită Python 2.7 și PyTorch 0.2 (împreună cu torchvision), versiuni care sunt considerate acum destul de vechi. Aceasta subliniază importanța verificării compatibilității mediului de dezvoltare înainte de a începe. Fundația acestei implementări se bazează pe depozitul self-critical.pytorch al lui Ruotian, o dovadă a colaborării și a construirii pe cercetările anterioare în comunitatea de inteligență artificială.

Modele Pre-antrenate Esențiale

Pentru a începe antrenamentul și evaluarea, veți avea nevoie de modele ResNet pre-antrenate. Acestea sunt rețele neuronale convoluționale (CNN) utilizate pentru extragerea caracteristicilor vizuale din imagini. Sunt disponibile modelele resnet101.pth sau resnet50.pth, care trebuie descărcate și plasate în directorul data/imagenet_weights. De asemenea, sunt furnizate modele de „image captioning” pre-antrenate pe setul de date COCO, care pot servi ca puncte de plecare sau pentru evaluare rapidă.

Pregătirea Setului de Date COCO

Setul de date COCO (Common Objects in Context) este standardul de aur pentru sarcini de „image captioning”. Procesul de pregătire a datelor este un pas crucial și necesită atenție.

Descărcarea Imaginilor și Preprocesarea

Primul pas este descărcarea imaginilor COCO din 2014, atât pentru antrenament (train2014), cât și pentru validare (val2014). Acestea ar trebui organizate în directoare specifice, de exemplu, image/train2014/ și image/val2014/. Apoi, este necesară descărcarea descrierilor COCO preprocesate de la Karpathy, un set de date standardizat care oferă descrieri curate și împărțiri predefinite pentru antrenament, validare și testare. Fișierul dataset_coco.json extras din arhiva ZIP trebuie copiat în directorul data/.

Generarea Fișierelor de Caracteristici și Etichete

Odată ce imaginile și descrierile sunt la locul lor, scripturile de preprocesare intră în joc:

$ python scripts/prepro_labels.py --input_json data/dataset_coco.json --output_json data/cocotalk.json --output_h5 data/cocotalk

Acest script, prepro_labels.py, este responsabil pentru crearea vocabularului. Orice cuvânt care apare de 5 ori sau mai puțin este mapat la un token special UNK (necunoscut), reducând astfel dimensiunea vocabularului și gestionând cuvintele rare. Informațiile despre imagini și vocabular sunt salvate în cocotalk.json, iar datele de descriere discretizate sunt stocate în cocotalk_label.h5. Ambele fișiere sunt plasate în directorul /data.

$ python scripts/prepro_feats.py --input_json data/dataset_coco.json --output_dir data/cocotalk --images_root image

Scriptul prepro_feats.py extrage caracteristicile din imagini folosind modelul ResNet101. Acestea includ atât caracteristicile din stratul fc (fully connected), cât și caracteristicile din ultimul strat convoluțional (conv feature). Caracteristicile sunt salvate ca fișiere .npy (pentru cocotalk_fc) și .npz (pentru cocotalk_att) în directorul data/cocotalk. Este important de reținut că aceste fișiere pot ocupa o cantitate considerabilă de spațiu pe disc, ajungând la aproximativ 200 GB.

Antrenarea Rețelei

Procesul de antrenament se desfășoară în două faze principale: o fază inițială de antrenament bazată pe entropie încrucișată și o fază ulterioară de antrenament auto-critic.

Faza 1: Antrenament Inițial (Entropie Încrucișată)

Antrenamentul începe cu o optimizare tradițională bazată pe entropie încrucișată, care ajută modelul să învețe asocierile de bază dintre imagini și descrieri.

Is there a Python implementation for self-critical sequence training for image captioning?
This is an unofficial implementation for Self-critical Sequence Training for Image Captioning. The latest topdown and att2in2 model can achieve 1.12 Cider score on Karpathy's test split after self-critical training. This is based on Ruotian's self-critical.pytorch repository. Python 2.7 and PyTorch 0.2 (along with torchvision)

$ python train.py --id fc --input_json data/cocotalk.json --input_fc_dir data/cocotalk_fc --input_att_dir data/cocotalk_att --input_label_h5 data/cocotalk_label.h5 --batch_size 48 --learning_rate 1e-3 --learning_rate_decay_start 0 --scheduled_sampling_start -1 --checkpoint_path log_fc --save_checkpoint_every 800 --val_images_use 1000 --max_epochs 300 --caption_model topdown --seq_per_img 1

Acest script va salva punctele de verificare (checkpoint-uri) într-un director specificat. De obicei, sunt salvate doar cel mai bun punct de verificare pe setul de validare și cel mai recent pentru a economisi spațiu. După o epocă de antrenament pe imagini MS COCO (aproximativ 11000 de iterații), se așteaptă o pierdere de validare de aproximativ 2.5 și un scor CIDEr de aproximativ 0.68. După 60.000 de iterații, scorul CIDEr poate crește la aproximativ 0.84. Opțiunea scheduled_sampling_start -1 dezactivează eșantionarea programată, care poate fi activată la o valoare pozitivă pentru a introduce cuvinte generate de model în timpul antrenamentului, imitând mai bine faza de inferență.

Faza 2: Antrenament Auto-Critic

După o pre-antrenare suficientă, modelul este pregătit pentru faza de antrenament auto-critic, care optimizează direct metricile de evaluare.

Înainte de a începe, trebuie să preprocesați setul de date pentru a obține un cache necesar calculării scorului CIDEr:

$ python scripts/prepro_ngrams.py --input_json data/dataset_coco.json --dict_json data/cocotalk.json --output_pkl data/coco-train --split train

De asemenea, veți avea nevoie de o versiune forked a depozitului CIDEr pentru calculul scorurilor. Copierea modelului pre-antrenat anterior (cross-entropy) nu este obligatorie, dar este recomandată ca măsură de siguranță.

$ bash scripts/copy_model.sh fc fc_rl

Apoi, se rulează scriptul de antrenament cu opțiunea self_critical_after activată:

$ python train.py --id fc_rl --caption_model fc --input_json data/cocotalk.json --input_fc_dir data/cocotalk_fc --input_att_dir data/cocotalk_att --input_label_h5 data/cocotalk_label.h5 --batch_size 10 --learning_rate 1e-3 --start_from log_fc_rl --checkpoint_path log_fc_rl --save_checkpoint_every 6000 --language_eval 1 --val_images_use 5000 --self_critical_after 30

Pornind antrenamentul auto-critic după 30 de epoci, scorul CIDEr poate ajunge la 1.05 după 600.000 de iterații (incluzând pre-antrenamentul de 30 de epoci). Această creștere semnificativă a performanței demonstrează eficacitatea SCST în alinierea antrenamentului cu metricile reale de evaluare.

Generarea și Evaluarea Descrierilor de Imagini

Odată ce modelul este antrenat, următorul pas este să-l folosim pentru a genera descrieri și a evalua performanța.

Evaluarea pe Imagini Brute

Pentru a genera descrieri pentru propriile imagini, plasați-le într-un director și rulați scriptul eval.py:

$ python eval.py --model log_fc_rl/model-best.pth --infos_path log_fc_rl/infos_fc_rl-best.pkl --image_folder image/test2014 --num_images 10

Acest lucru va genera descrieri pentru un număr specificat de imagini. Pentru a accelera evaluarea pe un GPU puternic, puteți crește batch_size. Un fișier vis.json va fi creat în directorul vis, care poate fi apoi vizualizat printr-o interfață HTML simplă, rulând un server HTTP local:

$ cd vis

$ python -m SimpleHTTPServer

Vizitând localhost:8000 în browser, veți putea vedea descrierile generate de model.

Evaluarea pe Diviziunea de Test Karpathy

Pentru o evaluare standardizată și comparabilă, se poate folosi diviziunea de test Karpathy:

$ python eval.py --dump_images 0 --num_images 5000 --model log_fc_rl/model-best.pth --infos_path log_fc_rl/infos_fc_rl-best.pkl --language_eval 1

Setarea dump_images 0 previne salvarea imaginilor, iar language_eval 1 permite calcularea scorurilor BLEU/METEOR/CIDEr. Metoda implicită de inferență este decodarea gurmandă (greedy decoding, --sample_max 1), dar se poate eșantiona din distribuția posterioară setând --sample_max 0.

Tehnici de Decodare: Beam Search

Pentru a îmbunătăți calitatea descrierilor generate, puteți utiliza Beam Search. Această tehnică explorează mai multe căi posibile de generare a secvențelor, selectând cele mai probabile. Poate crește performanța cu aproximativ 5% în cazul decodării gurmande, deși este mai costisitoare computațional. Pentru a activa Beam Search, utilizați opțiunea --beam_size N, unde N este un număr întreg mai mare decât 1 (de exemplu, 3 sau 5).

Performanța și Impactul SCST

Tabelul de mai jos ilustrează impactul antrenamentului auto-critic asupra performanței modelului, folosind scorul CIDEr ca metrică principală.

What is B-SCST in image captioning?
We extend the well-known Self-Critical Sequence Training (SCST) approach for image captioning models by incorporating Bayesian inference, and refer to it as B-SCST.
Faza de AntrenamentMetodă de OptimizareScor CIDEr (Estimare)Note
InițialăEntropie Încrucișată~0.68 (după 1 epocă)Modelul învață asocieri de bază
Pre-antrenament ExtinsEntropie Încrucișată~0.84 (după 60k iterații)Performanță bună, dar nu optimă pentru metrici
Antrenament Auto-CriticSCST (cu Reinforce)~1.05 (după 600k iterații)Îmbunătățire semnificativă, optimizare directă a metricilor
Model de Top (topdown + att2in2)SCST1.12Cea mai bună performanță raportată pentru această implementare

Această îmbunătățire demonstrează că SCST este o metodă extrem de eficientă pentru a "împinge" performanța modelelor de generare de secvențe dincolo de limitele impuse de optimizarea bazată pe pierderea de entropie încrucișată, aliniindu-se mai bine cu metricile de evaluare umane.

Întrebări Frecvente (FAQ)

Ce este Self-Critical Sequence Training (SCST)?

SCST este o metodă de antrenament pentru modele de generare de secvențe care utilizează propria ieșire a modelului ca linie de bază pentru a normaliza recompensele, reducând varianța și permițând optimizarea directă a metricilor de evaluare non-diferențiabile.

De ce este importantă auto-critica în antrenament?

Auto-critica permite modelului să învețe să genereze secvențe care sunt direct optimizate pentru metricile de evaluare, în loc să minimizeze doar o pierdere de predicție a cuvântului următor. Acest lucru duce la descrieri mai relevante și de calitate superioară.

Ce este scorul CIDEr?

CIDEr (Consensus-based Image Description Evaluation) este o metrică de evaluare a calității descrierilor de imagini care măsoară concordanța dintre o descriere generată și un set de descrieri de referință scrise de oameni. Este considerat una dintre cele mai fiabile metrici pentru această sarcină.

De ce este necesar Python 2.7 și PyTorch 0.2 pentru această implementare?

Această implementare specifică a fost dezvoltată și testată cu aceste versiuni mai vechi. Compatibilitatea inversă nu este garantată, iar actualizarea la versiuni mai noi de Python sau PyTorch ar necesita modificări semnificative ale codului.

Cât spațiu de stocare necesită setul de date COCO preprocesat?

Fișierele de caracteristici extrase din imagini (pentru ResNet101) pot ocupa aproximativ 200 GB de spațiu pe disc, fiind o considerație importantă înainte de a începe procesul de preprocesare.

Pot folosi acest cod cu versiuni mai noi de Python/PyTorch?

Din păcate, având în vedere cerințele specificate (Python 2.7, PyTorch 0.2), este foarte puțin probabil ca acest cod să funcționeze direct cu versiuni mai noi fără modificări substanțiale. Ar fi necesară o migrare atentă a sintaxei și a API-urilor PyTorch, care au evoluat considerabil.

Antrenamentul Auto-Critic Secvențial reprezintă o piatră de hotar în evoluția sistemelor de „image captioning”, oferind o metodă robustă și eficientă pentru a depăși limitările antrenamentului tradițional. Deși implementarea discutată aici se bazează pe tehnologii mai vechi, principiile SCST rămân extrem de relevante și continuă să influențeze dezvoltarea de noi arhitecturi și metode de antrenament în inteligența artificială, deschizând calea către sisteme capabile să înțeleagă și să descrie lumea vizuală cu o acuratețe și o finețe din ce în ce mai mare.

Dacă vrei să descoperi și alte articole similare cu Antrenament Auto-Critic pentru Descrieri de Imagini, poți vizita categoria Fitness.

Go up