Construirea și analizarea rețelelor neuronale pe date genetice

Miri Trope

28 aprilie · 12 min citire

Recent am efectuat lucrări de cercetare asupra secvențelor genetice. Principala întrebare care mi-a ocupat mintea despre aceasta a fost: „care este cea mai simplă rețea neuronală sugerată disponibilă în acest scop, care este cea mai compatibilă cu datele genetice?” După multă revizuire a literaturii, am descoperit că lucrarea cea mai „la pământ”, dar fascinantă, legată de acest subiect, a avut loc în Prof. Laboratorul lui Yoshua Bengio. Lucrarea numită „Rețea dietetică: parametri subțiri pentru genomica grăsimilor” și scopul său principal a fost clasificarea secvențelor genetice a 3.450 de indivizi în 26 de etnii. Acea lucrare m-a inspirat și aici aș vrea să explic elementele de bază ale construirii rețelelor neuronale pentru rezolvarea acestui tip de problemă. Pentru a înțelege acest blog, nu este nevoie de o experiență prealabilă în biologie; Voi încerca să acoper cele mai multe părți necesare pentru a trece direct în secțiunile de calcul.

reducerea

Ne confruntăm cu vremuri dificile: virusul SARS-CoV-2 ne-a lăsat neajutorați către forța puternică a naturii. Învățând noi instrumente: obținerea de intuiție în ceea ce privește datele genomice și explorarea metodelor de învățare automată care pot generaliza cel mai bine acele date; Sper că putem să ne unim forțele și să facem o schimbare pentru zile mai bune sau cel puțin să folosim inteligența incredibilă a rețelelor neuronale pentru a face ceva în afară de dezvoltarea aplicațiilor de divertisment, dar salvarea vieții și chiar a planetei noastre.

De ce găsesc genetică atrăgătoare?

Genetica dvs. dezvăluie nu doar informațiile biologice, ci și istoria genetică a strămoșilor voștri, reprezentând părțile dominante care au supraviețuit de-a lungul anilor (consultați „reconstrucția secvenței ancestrale”).

Cu alte cuvinte, este codificarea evoluției biologice a familiei dvs. și chiar mai mult, conform Teorii evoluției lui Darwin, întreaga colecție de creaturi organice (plante, animale etc.) împărtășesc aceleași principii genetice.

Permiteți-mi să vă prezint alte tipuri de date, cum ar fi imagini și propoziții, pentru a înțelege unicitatea datelor genetice. Pe de o parte, imaginile sunt date bidimensionale (sau tridimensionale pentru volume) cu relații de vecinătate. Propozițiile sunt vectori unidimensionali de până la aproximativ o mie de valori cu natura ierarhică a propozițiilor instruite printr-o manieră nesupravegheată.

Pe de altă parte, o secvență genetică este un vector unidimensional (o secvență) de cel puțin sute de mii de valori, fără relații bine definite între vecini și departe de a avea un set de modele pre-antrenate.

Astfel, un filtru de netezire australian G, care este foarte popular în procesarea imaginilor, nu este relevant aici, precum și toată gama de modele pre-antrenate în viziune (I mageNet, V GG, R esNet () și procesarea limbajului natural (W ord2Vec, G love, B ERT ...) sunt scoase din joc.

De ce este o provocare?

Gândiți-vă la o bază de date formată din mii de probe genetice. Trebuie să găsiți o metodă care să generalizeze bine (precizie peste 90%) cu date de intrare de zeci de milioane de combinații. O rețea neuronală poate fi potrivită, deoarece folosește puterea unităților conectate complet într-un mod care lipsește în alți algoritmi „clasici”, cum ar fi PCA, SVM și arborii de decizie care nu gestionează datele separat. Cu toate acestea, construirea celei mai simple arhitecturi de rețea necesită mai mult de zeci de milioane de parametri liberi în greutățile primului strat. Reducerea dimensiunii (pentru a evita o depășire a parametrilor liberi) este o modalitate de a face față acestei probleme; vom discuta mai târziu în acest blog.

Pentru a clarifica lucrurile și a nu pune dificultăți în scopul principal al acestui forum, vă prezint aici doar o imagine de nivel înalt a părților biologice necesare în acest blog. Inutil să spun că sunteți mai mult decât binevenit să explorați oricare dintre aceste subiecte biologice în continuare.

Ce este o secvență genetică?

O moleculă de ADN este o secvență de patru tipuri de baze reprezentate de literele lui A, C, G, T. Părți specifice ale secvenței (chiar dacă sunt localizate la distanță) sunt corelate cu un fenotip. De exemplu, un studiu recent: „Un focar de pneumonie asociat cu un nou coronavirus de origine probabilă a liliecilor” indică faptul că gena ACE2 ar putea fi receptorul gazdă (fenotipul) virusului SARS-CoV-2. Acest exemplu și multe altele arată în mod remarcabil informații valoroase (detectarea infractorilor, potrivirea tulpinilor de canabis, nutriție și medicamente personalizate) care pot fi realizate numai pe baza ADN-ului dvs.

Ce sunt genotipurile SNP?

În zilele noastre, suntem mai aproape ca oricând de realizarea unor secvențe genetice umane aproape complete. Cu toate acestea, suntem încă departe de a acoperi întregul său. Polimorfisme cu nucleotide unice SNP-urile sunt locații specifice genotipurilor în secvența genomică, reprezentate în general ca RS [număr]. Diferite populații au invarianți de secvență diferite, dar probabil să fie cam la fel în cadrul familiilor (prin urmare, asiaticii arată diferit de europeni). Analiza secvențelor SNP va fi un punct cheie în restul acestui blog.

În această secțiune, descriu datele și cei doi arhitecți principali ai rețelei (și o altă rețea cu parametri îmbunătățiți pentru a depăși unele dintre problemele majore în învățarea automată), precum și câteva sfaturi tehnice (

În comparație cu alte tipuri de date, seturile de date medicale sunt dificil de găsit, în principal din cauza restricțiilor de confidențialitate. În lumina acestui fapt, proiectul genomului 1000 a realizat o descoperire remarcabilă prin publicarea unui set de date disponibil public de 3.450 de probe de ADN uman, 315K SNP fiecare din cele 26 de populații din întreaga lume. Figura următoare prezintă o histogramă derivată din datele celor 1000 de genomi, care prezintă frecvența indivizilor pe populație (etnie); Numărul mediu de probe din fiecare populație este de aproximativ 133 de probe genetice.

După cum sa menționat mai sus, este preferată reducerea numărului de parametri liberi într-un model (în cazul nostru, avem de-a face cu aproximativ 30 de milioane de parametri). Metoda propusă pentru realizarea acestui lucru utilizează o altă rețea auxiliară deasupra rețelei discriminante care introduce o histogramă pe clasă (o matrice de încorporare calculată într-un mod nesupravegheat). Ieșirea acestei rețele inițializează greutățile primului strat al rețelei discriminatorii. Matricea de încorporare este histograma genotipurilor normalizate pe populație, iar dimensiunea sa este SNPs X [4x26], unde patru reprezintă patru combinații de genotipuri și 26 pentru numărul de clase (populații). Implementarea unei astfel de matrice de încorporare este descrisă mai jos.

Oricum, aceasta este soluția lor; soluția mea este prin reducerea numărului stratului de unități ascunse (vezi secțiunea arhitectură). Am numit această nouă arhitectură modelul îmbunătățit și unul dintre beneficiile sale este de a depăși supraadaptarea, așa cum am discutat mai târziu în secțiunea de rezultate.

Două rețele principale sunt comparate în acest blog. Ambele rețele sunt formate din două straturi ascunse complet conectate, urmate de un strat softmax, dar al doilea (a se vedea figura următoare) include o rețea uxiliară care prezice parametrii liberi ai rețelei discriminatorii. Rețeaua auxiliară ia ca intrare matricea de îmbinare și returnează greutățile rețelei discriminative mai întâi mai târziu (Fig. 1).

O descriere detaliată a arhitecturii poate fi văzută în Fig.2.: Norma de lot urmată de un strat de abandonare necesar înainte de fiecare strat complet conectat.

Am scris întregul cod în această lucrare de la zero în Pytorch, acesta poate fi găsit la depozitul public GitHub, numit „genom uman”. Mai jos sunt câteva puncte generale pe care le consider cele mai relevante pentru acest forum.

  1. Gestionarea structurii datelor

Pentru a obține rezultate obiective, generăm cinci ori, câte unul pentru fiecare experiment, calculând variantele statistice la final.

  • Împărțiți și amestecați

Am împărțit eșantioanele de 3,5K în tren (60%), validare (20%) și testare (20%). Ca de obicei, amestecăm aleatoriu datele și normalizăm valorile:

2. Reducerea dimensionalității

Generarea matricei de încorporare se realizează în doi pași: primul generează o histogramă de genotipuri pe clasă prin bincount () și al doilea normalizează histograma respectivă. Rezultatul este o reducere a dimensionalității cu un factor de aproximativ zece ordine de mărime.

3. Conectarea rețelelor

Ambele rețele (auxiliare și discriminative) au grafice de calcul separate, care nu sunt legate în niciun fel. Graficul de calcul al rețelei discriminante, care conține pierderea, nu are informații despre dependența dintre pierdere și tensorul de încorporare. O soluție poate fi setarea valorii gradientului tensorului de încorporare cu valoarea gradientului rețelei discriminante manual și apelarea torch.autograd.backward () pe rețeaua de încorporare, deoarece în graficul de calcul al rețelei de încorporare, dependența dintre tensori este cunoscut.

Bucla de antrenament este:

  • Trecere înainte în rețeaua de încorporare
  • Setați greutatea primului strat ascuns în rețeaua discriminativă cu valori de încorporare
  • Pasă înainte în discrim net
  • Înapoi în plasele încorporate și discriminatorii
  • Actualizarea parametrilor

În primul strat ascuns al modelului discriminativ, inițializăm 30 de milioane de greutăți cu ieșirea rețelei auxiliare (care este stratul de încorporare)

Atacantul trece:

Optimizatorul ar trebui să actualizeze parametrii ambelor rețele:

Trecerea înapoi:

Deoarece stabilim graficul de calcul al rețelei de încorporare, se cunoaște dependența dintre rețele de încorporare și discriminare.

4. Sesiunea de instruire

Daniel Godoy explică în blogul său procesul de instruire, aș dori să extind sfera activității sale în conformitate cu munca noastră cu mini-loturi.

  • Minibatch și Epoch

Funcția: loss_fn (y, yhat) returnează eroarea medie pătrată (norma L2 pătrată) între fiecare element din intrarea y și ținta yhat. Deoarece dorim să calculăm pierderea, trebuie să înmulțim acea valoare cu dimensiunea lotului și apoi să rezumăm toate valorile returnate ale fiecărui minibatch.

La final, fiecare epocă conține valoarea acumulată din ultima secțiune. Astfel, pentru a obține pierderea, trebuie să împărțim la numărul de mini-loturi din bucla respectivă.

Vă recomand cu tărie să utilizați oprirea timpurie, motivul pentru aceasta este să decideți automat în funcție de pierderea validării când este momentul potrivit pentru a opri antrenamentul și a salva cel mai bun rezultat al ultimului model.

Mai jos sunt câteva instrumente interesante pe care le consider utile (și gratuite):

  • Bibliotecă de rețea neuronală

Trebuie să menționez avantajul utilizării Pytorch ca cea mai bună bibliotecă de rețea neuronală, din experiența mea, în comparație cu multe altele, este cea mai bună din multe puncte de vedere. Lucrarea: „Un studiu comparativ de măsurare a învățării profunde ca cadru de servicii” prezintă o analiză empirică a cadrelor: TensorFlow, Caffe, Torch și Theano.

  • Instruire pe Cloud

Ați beneficia de antrenamentul modelului dvs. în cloud și de economisirea timpului. Ashwin De Silva descrie în blogul său cum puteți lucra la nivel local, să vă angajați și să vă îndreptați către depozitul GitHub, să vă trageți comitetele pe cloud și să vă desfășurați antrenamentul acolo. În opinia mea, merită timpul și efortul de a crea unele teste cu parametri diferiți, cum ar fi numărul de unități ascunse, valorile abandonului ș.a.

Într-o perspectivă retro-perspectivă, am parcurs unele dificultăți cunoscute în rândul oamenilor de știință de date în timpul analizei rezultatelor și am considerat că este important să vă împărtășesc, pentru a vă oferi dovezi oneste ale comportamentului dinamic al dezvoltării unor astfel de rețele. Găsesc următoarele observații ca personaje principale în timpul investigării performanței rețelei dvs.:

Să începem cu funcția de pierdere: acesta este „untul” performanței rețelei, care scade exponențial pe parcursul epocilor. Mai mult, un model care generalizează bine păstrează pierderea prin validare sub pierderea antrenamentului. Motivul pentru acest lucru este simplu: modelul returnează o valoare a pierderilor mai mare în timpul antrenamentului, nevalidând. Dacă întâlniți un caz diferit (pierderea de antrenament este sub pierderea de validare), modelul dvs. este probabil supradaptat. Soluțiile pentru supra-montare pot fi una sau o combinație dintre următoarele: mai întâi este scăderea unităților stratului ascuns sau eliminarea straturilor pentru a reduce numărul de parametri liberi. Așa cum am discutat mai sus, rețeaua noastră îmbunătățită, precum și rețeaua auxiliară, vin în ajutor de dragul acestei probleme. Alte soluții posibile sunt creșterea valorii abandonului sau regularizarea. Mazid Osseni, în blogul său, explică diferite tipuri de metode de regularizare și implementări. FIG. 3 prezintă funcția de pierdere a versiunii mai simple a rețelei mele înainte (în stânga) și după (în dreapta) care se ocupă de așa-numita problemă de suprasolicitare.

Soluția mea este combinația de a reduce dimensiunea unităților ascunse (de la 100 la 50 de unități) și de a crește valoarea abandonului din primul strat (de la 0,5 la 0,8). Rețeaua auxiliară poate avea o soluție la problema numărului mare de parametri liberi, dar, după cum puteți vedea, încă se potrivește (mijloc).

Precizia testului a fost calculată în fiecare arhitectură. În mod surprinzător, se pare că depășirea supraadaptării sau reducerea numărului de parametri liberi nu promite o precizie mai mare. FIG. 4 prezintă acuratețea testului celor trei arhitecți: observați că acuratețea este mai mare, deși problema supraadaptării.

Testarea performanței cu diferite dimensiuni de lot este o sarcină amuzantă. Kevin Shen, pe blogul său, investighează efectul dimensiunii lotului asupra dinamicii antrenamentului. În funcție de timpul total de antrenament, probabil din cauza diversității datelor, dimensiunea lotului este invers proporțională cu timpul de antrenament (Fig. 6). Din același motiv, pierderea este direct proporțională cu dimensiunea lotului (Fig. 5).

FIG. 6 arată clar comportamentul utilizării diferitelor dimensiuni de lot în ceea ce privește timpii de antrenament, ambii arhitecți au același efect: dimensiunea mai mare a lotului este mai eficientă din punct de vedere statistic, dar nu asigură generalizarea. Citiți lucrarea: „Antrenați-vă mai mult, generalizați mai bine: înlăturarea decalajului de generalizare în formarea pe loturi mari a rețelelor neuronale” pentru a înțelege mai multe despre fenomenul de generalizare și metodele de îmbunătățire a performanței de generalizare, păstrând în același timp timpul de antrenament intact, folosind o dimensiune mare a lotului.

Observați efectul schimbării arhitecturii în ceea ce privește timpul de antrenament (Fig. 7). Timpul de antrenament este semnificativ mai mic fie cu 15 milioane de parametri liberi decât rețeaua auxiliară.

De asemenea, am comparat performanța modelului îmbunătățit cu abordarea arborilor de decizie, în special Mașina de creștere a gradientului de lumină, care este frecvent utilizată în domeniul științei datelor. Cu toate acestea, performanța a depășit limitele noastre în ceea ce privește eroarea de clasificare greșită (consultați Anexa pentru mai multe detalii).

Care este cel mai bun model? 04.30 Întrebarea celor mii de dolari

În acest blog, am descris două rețele principale: cu și fără rețeaua auxiliară și o rețea suplimentară cu parametri îmbunătățiți. Avantajul rețelelor de predicție a parametrilor este că reduce considerabil numărul de parametri liberi din primul strat al unui model atunci când intrarea este foarte mare dimensională, ca în secvențele genetice.

Am arătat că modificarea parametrilor rețelei de bază a generat o generalizare mai bună în ceea ce privește supraadaptarea. Am validat abordările acelor rețele pe setul de date de 1000 de genomi disponibil public, abordând sarcina de predicție a strămoșilor pe baza datelor SNP. Această lucrare a demonstrat potențialul modelelor de rețea neuronală pentru a aborda sarcinile în care există o nepotrivire între numărul de eșantioane și dimensionalitatea ridicată a acestora, ca în secvențierea ADN-ului.

Având în vedere acuratețea ridicată obținută în sarcina de predicție a strămoșilor, cred că tehnicile rețelei neuronale pot îmbunătăți practicile standard în analiza datelor genetice. Mă aștept ca aceste tehnici să ne permită să abordăm studii de asociere genetică mai provocatoare.

Mulțumesc Camille Rochefort-Boulanger (Universitatea din Montreal) pentru că mi-a dat câteva sfaturi bune cu privire la procesul de implementare.

Pentru cei care se întreabă ce computer am: aș dori să spun câteva cuvinte bune despre MacBook Pro, 16 GB de memorie, Intel Core i7 pentru că mi-a permis să lucrez la o sarcină atât de uimitoare, lăsându-mă cu acele perioade de antrenament satisfăcătoare (vezi secțiunea Rezultate) și întreaga experiență a „laboratorului de calculatoare” (în timp ce lucrați de acasă în timpul perioadei de închidere a Coronavirusului).

Rezultate folosind arbori de decizie

Pe lângă metoda rețelei neuronale pe care am evidențiat-o în acest blog, aș dori să menționez rezultatele experienței mele cu Gradient Boosting Decision Trees. Implementarea poate fi găsită în acest depozit GitHub. Parametrii algoritmului sunt:

Rezultatele arată că eroarea de clasificare este mai mare în cazul arborilor de decizie, explicând motivele care depășesc domeniul de aplicare al blogului.