Ottimizzazione a sciame di particelle: inerzia, esperienza propria ed esperienza dello sciame
Boid e stormi, l’algoritmo PSO, le tre componenti della velocità, un’esecuzione sulla funzione di Rastrigin a confronto con una strategia evolutiva, il ruolo dell’inerzia, la stabilità di una particella, la topologia dello sciame e il teorema del «nessun pasto gratis».
Serie Basi di IA Parte 30 di 52
- Mappa dell’intelligenza artificiale: che cos’è ciascuna cosa e come si incastra tutto
- Breve storia dell’intelligenza artificiale: da Turing ai modelli linguistici
- Dati, modello, addestramento, inferenza: i concetti di base su un unico esempio
- Come leggere la notazione matematica: simboli, indici, sommatorie e quantificatori
- Insiemi e relazioni: i mattoncini con cui si costruiscono le definizioni nell’IA
- Funzioni e applicazioni: perché ogni modello di IA è una funzione
- Logica e dimostrazioni: le regole con cui si ragiona nell’IA
- Grafi e alberi: la struttura su cui poggiano la ricerca e le reti neurali
- Algebra lineare per l’apprendimento automatico: vettori, matrici e perché l’IA soprattutto moltiplica
- Derivate, gradiente e regola della catena: come un modello capisce in quale direzione imparare
- Discesa del gradiente: come impara un modello
- Che cos’è la probabilità: dal lancio di un dado agli assiomi di Kolmogorov
- Probabilità condizionata e teorema di Bayes: come cambiare una stima quando scopri qualcosa di nuovo
- Variabile aleatoria e funzione di ripartizione: una sola funzione che dice tutto sulla distribuzione
- Funzione di densità e funzione di massa: perché una variabile continua ha probabilità zero in un punto
- Valore atteso, varianza e covarianza: dove si trova una distribuzione, quanto è larga e che cosa è legato a che cosa
- Panoramica delle distribuzioni di probabilità: Bernoulli, binomiale, Poisson, uniforme, normale ed esponenziale
- Legge dei grandi numeri e teorema del limite centrale: perché le medie si comportano in modo così prevedibile
- Statistica e stima dei parametri: massima verosimiglianza, MAP e intervalli di confidenza
- Teoria dell’informazione: entropia, entropia incrociata e divergenza KL — da dove vengono le funzioni di perdita
- Ricerca nello spazio degli stati: BFS, DFS, UCS e A* con animazioni
- Giochi e avversari: minimax, potatura alfa-beta e Monte Carlo tree search
- Soddisfacimento di vincoli: backtracking, propagazione dei vincoli e AC-3 su un sudoku e una mappa delle regioni ceche
- Logica e sistemi basati sulla conoscenza: concatenazione in avanti e all’indietro, risoluzione e sistemi esperti
- Pianificazione: STRIPS, il mondo dei blocchi, euristiche dal rilassamento e pianificazione negli agenti IA
- Ricerca locale e ricottura simulata: un commesso viaggiatore tra i capoluoghi di regione cechi
- Algoritmi genetici: popolazione, incrocio, mutazione e selezione su uno zaino per l’escursione
- Strategie evolutive e programmazione genetica: dalla regola di un quinto alla legge di Keplero
- Ottimizzazione con colonie di formiche: come una traccia di feromone trova un percorso breve
- Ottimizzazione a sciame di particelle: inerzia, esperienza propria ed esperienza dello sciame
- Neuroevoluzione: evoluzione dei pesi e della forma delle reti neurali e l’algoritmo NEAT
- Insiemi fuzzy e funzioni di appartenenza: come scrivere «un po’ caldo»
- Logica fuzzy e probabilità: perché «un po’ caldo» non significa «probabilmente caldo»
- Logica fuzzy: t-norme, implicazioni e regole SE–ALLORA
- Controllo fuzzy: Mamdani e Sugeno, dal ventilatore al pendolo inverso su un carrello
- Clustering fuzzy: l’algoritmo fuzzy c-means e i punti tra i cluster
- Sistemi neuro-fuzzy (ANFIS): regole fuzzy che imparano dai dati
- Catene di Markov: matrice di transizione, distribuzione stazionaria e PageRank
- Modelli di Markov nascosti: l’algoritmo di Viterbi e il casinò disonesto
- Reti bayesiane: perché l’erba è bagnata e che cosa significa per l’irrigatore
- Filtro di Kalman: come stimare da misure imprecise dove si trova un’auto e a che velocità va
- Tipi di apprendimento automatico: supervisionato, non supervisionato, semi-supervisionato e altri
- Prompt, contesto e RAG: come dare a un modello le informazioni giuste
- Autoencoder variazionali (VAE): immagini nuove da uno spazio latente continuo
- Reti generative avversarie (GAN): il falsario contro il detective
- Modelli di diffusione: come il rumore puro diventa un’immagine
- Processi decisionali di Markov: stati, azioni, ricompense ed equazioni di Bellman
- Q-learning e DQN: imparare il valore delle azioni, dalla tabella alla rete neurale
- Policy gradient e PPO: imparare direttamente la politica
- Come funziona un agente IA: un modello linguistico in un ciclo con strumenti
- Programmare con agenti IA: incarico, test e controllo
- Valutazione e sicurezza dei sistemi di IA: come misurare e come sorvegliare
Programma completo della serie 52 di 83 argomenti pubblicati
- Come una particella dello sciame combina l’inerzia, il proprio posto migliore e il posto migliore dello sciame.
- Perché l’inerzia e l’equilibrio fra le componenti contano, e quando lo sciame si assesta.
- Perché non esiste un ottimizzatore migliore per tutto e a che cosa fare attenzione negli algoritmi «ispirati alla natura».
Utile sapere prima: Strategie evolutive e programmazione genetica: dalla regola di un quinto alla legge di Keplero
Uno stormo di storni sopra la città al tramonto si muove come un unico essere vivente — eppure non ha un capo. Ogni uccello osserva solo pochi vicini più prossimi. Nel 1995 lo psicologo sociale James Kennedy e l’ingegnere elettrico Russell Eberhart si sono posti una domanda: e se gli uccelli, oltre alla posizione dei vicini, si passassero anche l’informazione su dove hanno trovato più cibo? Dalla loro simulazione è nato uno degli algoritmi di ottimizzazione più semplici e più usati in assoluto — l’ottimizzazione a sciame di particelle (particle swarm optimization, PSO).
Riprende le parti Strategie evolutive e programmazione genetica e Ottimizzazione con colonie di formiche. Lanceremo lo sciame sulla stessa funzione di Rastrigin della strategia evolutiva, con la stessa partenza e lo stesso budget.
1. Stormi in natura e nel computer
Già nel 1987 Craig Reynolds mostrò che per un movimento di stormo credibile bastano tre regole locali. I suoi «boid» evitano le collisioni con i vicini più prossimi, allineano con loro la direzione di volo e restano vicini al centro del gruppo. Nessuno guida l’insieme; la forma dello stormo emerge dalle regole locali. Kennedy ed Eberhart aggiunsero una quarta cosa — la memoria dei posti buoni — e l’animazione divenne un ottimizzatore.
Definizione — le tre regole dei boid (semplificate)
Reynolds descrisse le regole a parole; oggi di solito si scrivono così. Il boid i ha una posizione xi, una velocità vi e un intorno Si — i boid più vicini di un raggio dato. Alla propria velocità aggiunge una somma pesata di tre vettori:
- separazione −∑j ∈ Si (xj − xi) / ‖xj − xi‖2 — repulsione, tanto più forte quanto più il vicino è vicino;
- allineamento v̄i − vi, dove v̄i è la velocità media dei vicini;
- coesione x̄i − xi, dove x̄i è la posizione media dei vicini.
Ogni boid usa quindi solo informazioni del proprio intorno. Le equazioni della PSO qui sotto hanno la stessa forma «velocità ← velocità + attrazioni verso obiettivi», solo che gli obiettivi non sono i vicini, ma i posti migliori trovati.
2. L’algoritmo
Definizione — ottimizzazione a sciame di particelle
Minimizziamo f : ℝn → ℝ. Lo sciame è formato da N particelle; la particella i ha una posizione xi, una velocità vi e la sua migliore posizione finora pi. Lo sciame conosce la migliore posizione di tutte, g. A ogni iterazione, per ogni particella:
vi ← w · vi + c1 r1 (pi − xi) + c2 r2 (g − xi),
xi ← xi + vi,
dove r1, r2 sono numeri casuali in [0, 1) estratti separatamente per ogni coordinata. Se f(xi) < f(pi), si aggiorna pi ed eventualmente anche g.
Valori consueti (Clerc e Kennedy, 2002): w = 0,7298, c1 = c2 = 1,49618.
Ogni particella è un uccello che sorvola un paesaggio e ricorda dove si è trovato meglio. In più sente dove si è trovato meglio l’intero stormo. Il suo passo successivo è un compromesso fra tre cose: continuare a volare dove volava, tornare al suo posto migliore e dirigersi verso il posto migliore dello stormo. I numeri casuali r fanno sì che ogni uccello raggiunga quel compromesso in modo un po’ diverso.
vi ← w · vi + c1 r1 (pi − xi) + c2 r2 (g − xi)
- vi a sinistra
- la nuova velocità — di quanto si sposta la particella in questo passo (xi ← xi + vi); lo sciame non controlla la posizione direttamente ma attraverso la velocità, e per questo il moto è fluido
- w · vi
- inerzia — una parte della vecchia velocità rimane; w < 1 al tempo stesso la smorza, così che il moto col tempo si calmi
- c1 r1, c2 r2
- forza dell’attrazione — c fissa la forza media, l’r casuale in [0, 1) la accorcia ogni volta in modo diverso, così la particella non atterra esattamente sull’obiettivo e lungo la strada assaggia anche i posti intorno
- pi − xi
- il vettore dalla particella al suo posto migliore — più è lontano, più forte la tira indietro (come una molla)
- g − xi
- il vettore verso il posto migliore dello sciame — l’unico canale attraverso cui l’esperienza altrui raggiunge la particella
Definizione — limitazione della velocità
Dopo il calcolo ogni coordinata della velocità viene tagliata all’intervallo [−vmax, vmax]: vid ← min(vmax, max(−vmax, vid)). La nostra implementazione usa vmax = 5,12, cioè metà della larghezza del quadrato di ricerca [−5,12; 5,12]2 — una particella non attraversa in un solo passo più di mezza mappa.
Esempio — un passo di una particella
Una particella si trova in x = (4,2; −3,8) con velocità v = (0,5; 0,4). Il suo posto migliore è p = (4,0; −3,1), il posto migliore dello sciame g = (1,1; −2,0). Sono usciti i numeri casuali r1 = (0,6; 0,3) e r2 = (0,5; 0,8). Prima coordinata:
- inerzia 0,7298 · 0,5 = 0,365,
- cognitiva 1,49618 · 0,6 · (4,0 − 4,2) = −0,180,
- sociale 1,49618 · 0,5 · (1,1 − 4,2) = −2,319,
- nuova velocità 0,365 − 0,180 − 2,319 = −2,134, nuova posizione 4,2 − 2,134 = 2,066.
La seconda coordinata allo stesso modo: 0,292 + 0,314 + 2,154 = 2,761, nuova posizione −3,8 + 2,761 = −1,039. Entrambe le componenti della velocità sono sotto vmax, la limitazione non interviene. Il valore della funzione (quella di Rastrigin, vedi sotto) è sceso da 45,90 a 6,51. La componente sociale qui è la più grande, perché g è lontano; quella cognitiva è piccola, perché p si trova a due passi dalla particella.
import random
def pso(f, n, castic=40, iteraci=200, w=0.7298, c1=1.49618, c2=1.49618):
x = [[random.uniform(-5, 5) for _ in range(n)] for _ in range(castic)]
v = [[0.0] * n for _ in range(castic)]
p = [xi[:] for xi in x] # posto migliore di ogni particella
g = min(p, key=f)[:] # posto migliore dello sciame
for _ in range(iteraci):
for i in range(castic):
for d in range(n):
v[i][d] = (w * v[i][d]
+ c1 * random.random() * (p[i][d] - x[i][d])
+ c2 * random.random() * (g[d] - x[i][d]))
x[i][d] += v[i][d]
if f(x[i]) < f(p[i]):
p[i] = x[i][:]
if f(p[i]) < f(g):
g = p[i][:]
return g
Il costo dell’algoritmo si misura in numero di valutazioni di f — nei problemi reali ognuna è costosa (una simulazione, l’addestramento di un modello). Ogni particella viene valutata alla partenza e poi una volta per iterazione, in totale N + N · T = 40 + 40 · 200 = 8 040 per N = 40 particelle e T = 200 iterazioni. (Lo pseudocodice qui sopra chiama f più volte per chiarezza; l’implementazione reale si ricorda i valori f(pi).)
3. Tre forze
- Inerzia w · v — la particella non vuole cambiare direzione bruscamente. Grazie a lei lo sciame sorvola le buche poco profonde invece di cadere in ciascuna.
- Componente cognitiva c1 r1 (p − x) — esperienza propria: «lì mi sono trovata bene». Mantiene la diversità, perché ogni particella ricorda qualcosa di diverso.
- Componente sociale c2 r2 (g − x) — esperienza dello sciame: «lì c’è il meglio che qualcuno abbia trovato». Tiene unito lo sciame.
A differenza degli algoritmi genetici, qui nessuno muore e niente si incrocia. L’informazione si diffonde solo perché le particelle vedono il successo altrui. E a differenza delle strategie evolutive, la particella ha una velocità — uno slancio che la porta avanti anche quando le cose non vanno bene.
4. Lo sciame sulla funzione di Rastrigin
La funzione di Rastrigin della parte precedente: una ciotola con una griglia regolare di buche, il minimo globale nell’origine. 40 particelle partono intorno al punto (4,2; −3,8), dove f ≈ 45,9 — là dove partiva la strategia evolutiva:
Definizione — la funzione di Rastrigin
Per x = (x1, …, xn) ∈ [−5,12; 5,12]n si ha
f(x) = 10n + ∑d=1n (xd2 − 10 cos(2πxd)).
Il minimo globale è f(0, …, 0) = 0; i minimi locali si trovano vicino a ogni punto a coordinate intere, e nel quadrato ce ne sono, in due dimensioni, 11 · 11 = 121.
f(x) = 10n + ∑d (xd2 − 10 cos(2πxd))
- f(x)
- il valore che lo sciame minimizza — un paesaggio di prova di cui conosciamo il minimo, così sappiamo riconoscere il successo
- 10n
- uno spostamento — nell’origine il coseno vale 1 e ogni coordinata dà −10; questo termine compensa, così che il minimo valga esattamente 0
- ∑d
- una somma sulle coordinate — ognuna contribuisce in modo indipendente, così il numero di buche cresce esponenzialmente con la dimensione (11n)
- xd2
- la ciotola — la pendenza complessiva verso l’origine; senza di essa tutte le buche sarebbero ugualmente profonde e non ci sarebbe alcun minimo globale
- − 10 cos(2πxd)
- un’ondulazione di periodo 1 — scava una buca a ogni numero intero e, con ampiezza 10, le rende abbastanza profonde perché un metodo locale vi resti bloccato
Esempio — il valore nel punto di partenza
Per x = (4,2; −3,8): cos(2π · 4,2) = cos(8,4π) = cos(0,4π) ≈ 0,309 e cos(2π · (−3,8)) = cos(7,6π) = cos(1,6π) ≈ 0,309. Quindi
f = 20 + (17,64 − 3,090) + (14,44 − 3,090) = 20 + 14,550 + 11,350 ≈ 45,9.
La partenza si trova sul pendio della buca in (4; −4), dove f = 20 + (16 − 10) + (16 − 10) = 32; il fondo vero è un pelo più vicino all’origine, con un valore di circa 31,84. Il valore 31,9 dopo la prima iterazione (sotto) significa quindi che lo sciame è scivolato quasi sul fondo della buca di partenza. Più vicino al minimo arriverà solo attraversando le creste fra le buche.
Dopo la prima iterazione il posto migliore dello sciame ha valore 31,9. Poi succede una cosa che la strategia evolutiva non faceva: lo sciame si sparpaglia. La dispersione delle particelle sale da 0,7 a 1,3 alla decima iterazione — le particelle oltrepassano i loro posti migliori e strada facendo scoprono nuove buche. Alla 25ª iterazione il posto migliore ha valore 1,06, una buca accanto al minimo, e alla 50ª iterazione lo sciame trova il minimo globale. Poi si stringe intorno a esso.
Definizione — dispersione dello sciame ed esecuzione riuscita
La dispersione dello sciame è la radice quadrata della media del quadrato della distanza delle particelle dal loro baricentro x̄ = (1/N) ∑i xi:
σ = √( (1/N) ∑i=1N ‖xi − x̄‖2 ).
Un’esecuzione ha trovato il minimo globale se alla fine f(g) < 0,01. I minimi locali più vicini hanno valori intorno a 1 (per questo 1,06 alla 25ª iterazione significa «la buca accanto»), così questa soglia li distingue nettamente.
σ = √( (1/N) ∑i ‖xi − x̄‖2 )
- σ
- un solo numero per «quanto è sparpagliato lo sciame» — in unità delle coordinate, così lo si può confrontare con la distanza fra le buche (1)
- (1/N) ∑i
- una media sulle particelle — il risultato non dipende dalla dimensione dello sciame
- ‖xi − x̄‖2
- il quadrato della distanza dal baricentro — misuriamo dal centro dello sciame, non dal minimo, perché ci interessa la forma dello sciame, non dove si trova; il quadrato pesa di più gli esploratori lontani e la radice riporta poi alle unità originali
Traccia della stessa esecuzione, iterazione per iterazione:
| Iterazione | Miglior valore f(g) | Dispersione σ |
|---|---|---|
| 1 | 31,927 | 0,70 |
| 2 | 31,927 | 0,74 |
| 3 | 31,927 | 0,53 |
| 5 | 25,625 | 0,75 |
| 10 | 5,904 | 1,29 |
| 25 | 1,064 | 1,01 |
| 50 | 0,007 | 0,96 |
| 100 | < 0,001 | 0,51 |
| 200 | < 0,001 | 0,28 |
Per quattro iterazioni il miglior valore non si muove e intanto lo sciame si stringe dentro la buca di partenza (alla terza iterazione σ è solo 0,53); poi l’inerzia e le attrazioni verso g lo allargano di nuovo e il miglior valore scende di buca in buca — 31,9, 25,6, 5,9, 1,06. Il minimo viene trovato alla 50ª iterazione, ma σ è allora ancora 0,96: lo sciame si raccoglie intorno al minimo solo dopo.
Su cento esecuzioni con semi diversi lo sciame ha trovato il minimo globale in 97 — con un budget di 8 040 valutazioni. La strategia evolutiva (15, 100) con 8 000 valutazioni dello stesso problema ha avuto successo in 32 casi. Quando lo sciame parte distribuito su tutto il quadrato invece che da un angolo, riesce in tutte e cento.
5. Inerzia ed equilibrio delle forze
Che cosa succede se cambiamo solo l’inerzia? Il grafico mostra quanto sono lontane fra loro le particelle (l’asse verticale è logaritmico):
Con w = 0,4 lo sciame collassa in un solo punto prima di riuscire a guardarsi intorno — resta bloccato in una buca di valore 24,9. Con w = 0,9 resta sparpagliato per tutto il tempo: il minimo lo trova, ma non si stringe mai intorno a esso e non lo rifinisce. Su cento esecuzioni per ogni impostazione:
| Impostazione | Ha trovato il minimo | Miglior valore medio |
|---|---|---|
| w = 0,7298, c1 = c2 = 1,49618 | 97 su 100 | 0,18 |
| w = 0,9 | 93 su 100 | 0,003 |
| w = 0,4 | 0 su 100 | 24,2 |
| solo sociale (c1 = 0) | 55 su 100 | 3,0 |
| solo cognitiva (c2 = 0) | 0 su 100 | 18,6 |
Senza la componente sociale lo sciame è solo un gruppo di quaranta scalatori solitari che non sanno nulla l’uno dell’altro — nessuno esce dall’angolo. Senza quella cognitiva tutti inseguono un unico capo e metà delle volte restano bloccati con lui. Solo le due componenti insieme danno l’equilibrio fra esplorazione e sfruttamento che abbiamo già incontrato con la ricottura.
6. Perché lo sciame non impazzisce
La velocità continua a sommarsi. Perché non cresce all’infinito? La risposta la dà l’analisi di una sola particella, se per un momento dimentichiamo il caso.
Teorema — stabilità di una particella
Consideriamo una particella unidimensionale con p e g fissi e, al posto di c1r1, c2r2, numeri fissi di somma φ. La posizione segue allora la ricorrenza lineare
xt+1 = (1 + w − φ) xt − w xt−1 + cost.
e la particella converge (a una media pesata di p e g) se e solo se |w| < 1 e 0 < φ < 2 (1 + w).
La particella si comporta come un peso appeso a una molla smorzata: la attira un punto fra il suo posto migliore e quello dello sciame, l’inerzia la porta oltre e poi di nuovo indietro. Se lo smorzamento è sufficiente e la molla non è troppo rigida, le oscillazioni si riducono e la particella si assesta. Con i valori w = 0,7298 e c1 + c2 ≈ 2,99 la condizione è soddisfatta (2 · 1,7298 ≈ 3,46), quindi lo sciame si raccoglie gradualmente — ma abbastanza lentamente da guardarsi intorno lungo la strada. In più la velocità di solito viene limitata dall’alto, perché le particelle non volino fuori dalla zona di ricerca.
Dimostrazione — da dove vengono la ricorrenza e le condizioni
Senza caso, il passo unidimensionale è vt+1 = wvt + φ1(p − xt) + φ2(g − xt) e xt+1 = xt + vt+1. Poniamo φ = φ1 + φ2 e P = (φ1p + φ2g)/φ (la media pesata dei due posti migliori). Allora φ1(p − x) + φ2(g − x) = φ(P − x) e, sostituendo vt = xt − xt−1:
xt+1 = (1 + w − φ) xt − w xt−1 + φP.
Lo scarto et = xt − P soddisfa la stessa ricorrenza senza la costante, quindi et = aλ1t + bλ2t, dove λ1,2 sono le radici dell’equazione caratteristica λ2 − (1 + w − φ)λ + w = 0. La particella si assesta in P se e solo se |λ1|, |λ2| < 1. Per un’equazione di secondo grado λ2 + aλ + b = 0 ciò avviene esattamente quando |b| < 1 e 1 ± a + b > 0 (criterio di Jury). Qui b = w, a = −(1 + w − φ):
- |w| < 1,
- 1 − (1 + w − φ) + w = φ > 0,
- 1 + (1 + w − φ) + w = 2(1 + w) − φ > 0. ∎
xt+1 = (1 + w − φ) xt − w xt−1 + φP
- xt+1
- la posizione successiva — dipende dalle due precedenti, perché la velocità è la differenza di due posizioni; per questo la particella si comporta come un corpo che oscilla, non come una palla che rotola giù per un pendio
- (1 + w − φ) xt
- la posizione attuale spinta avanti dall’inerzia (+w) e richiamata dall’attrazione (−φ) — il duello fra «continuare a volare» e «tornare»
- − w xt−1
- la memoria del passo precedente — questo termine porta lo slancio; il suo coefficiente w è il prodotto delle radici, e per questo lo smorzamento lo determina proprio l’inerzia
- φP
- l’àncora — l’attrazione della media pesata di p e g; la particella oscilla intorno a essa e vi si assesta
Quanto in fretta si assesta? Per i φ consueti entrambe le radici risultano complesse (la particella oscilla) e hanno lo stesso modulo √w, perché il loro prodotto è w. L’ampiezza dello scarto viene quindi moltiplicata a ogni iterazione per √w e si dimezza in ln 2 / (−ln √w) iterazioni. Con il φ medio = (c1 + c2)/2 = 1,49618 (l’r casuale ha media ½):
| Inerzia w | Smorzamento per iterazione √w | Tempo di dimezzamento dello scarto |
|---|---|---|
| 0,4 | 0,632 | 1,5 iterazioni |
| 0,7298 | 0,854 | 4,4 iterazioni |
| 0,9 | 0,949 | 13,2 iterazioni |
Ciò corrisponde esattamente al grafico della dispersione qui sopra: con w = 0,4 lo sciame si raccoglie in poche iterazioni, con w = 0,9 le oscillazioni si spengono nell’arco di decine di iterazioni. È una semplificazione — gli r reali vengono estratti a ogni passo e p, g cambiano —, ma l’ordine di grandezza torna. E attenzione: con w = 0,4 il limite 2(1 + w) = 2,8 è minore del massimo φ = c1 + c2 ≈ 2,99 possibile, quindi un’attrazione casuale eccezionalmente forte fa oscillare la particella per un passo (smorzamento 1,280 > 1).
7. Chi sente chi: la topologia
Definizione — topologia dello sciame
La topologia è un grafo che determina di chi una particella vede i posti migliori. Nella topologia globale (gbest) ognuna vede tutte le altre e g è comune. Nella topologia ad anello (lbest) le particelle stanno in un anello e la particella i vede solo i − 1, i e i + 1; al posto di g usa il posto migliore del proprio intorno.
Nella topologia globale tutti vengono subito a sapere del ritrovamento migliore — lo sciame è veloce, ma si lascia facilmente trascinare da un unico fortunato in un minimo locale. Nell’anello la notizia si diffonde di vicino in vicino; nel frattempo parti diverse dello sciame esplorano posti diversi. Più lento, ma più prudente.
Formalmente ogni particella i ha un intorno S(i) e nella regola della velocità usa, al posto del g comune, gi = pk, dove k = arg minj ∈ S(i) f(pj). La topologia globale ha S(i) = {1, …, N}, quella ad anello S(i) = {i − 1, i, i + 1} (indici modulo N). Quante iterazioni ci vogliono perché la notizia di un nuovo ritrovamento arrivi a tutti? Nella topologia globale, una. Nell’anello avanza per iterazione al massimo di un vicino per lato, e la particella più lontana in un anello di 40 particelle è a 20 posti di distanza — la notizia la raggiunge al più presto dopo 20 iterazioni. Per tutto quel tempo le parti lontane dello sciame possono esplorare per conto proprio.
Sul nostro problema bidimensionale l’anello ha trovato il minimo in tutte le 100 esecuzioni, la topologia globale in 97. La differenza è più netta in dieci dimensioni, dove le buche sono astronomicamente tante: dopo 2 000 iterazioni la topologia globale è finita in media sul valore 5,84, quella ad anello su 4,57. Il minimo globale non l’ha trovato nessuna delle due — la funzione di Rastrigin in dieci dimensioni è davvero difficile per 40 particelle.
8. Attenzione alle metafore
Teorema — nessun pasto gratis (Wolpert e Macready, 1997)
In media su tutte le possibili funzioni obiettivo su un insieme finito, tutti gli algoritmi che non valutano due volte lo stesso punto hanno la stessa prestazione attesa.
Più precisamente: siano X e Y insiemi finiti, f : X → Y una funzione obiettivo e dmy la successione dei valori che l’algoritmo vede durante m valutazioni distinte. Allora per due algoritmi qualsiasi a1, a2
∑f P(dmy | f, m, a1) = ∑f P(dmy | f, m, a2),
dove si somma su tutte le |Y||X| funzioni. Ogni misura di prestazione che dipende solo dai valori visti (per esempio il migliore trovato) ha quindi la stessa media su tutte le funzioni.
Non esiste un ottimizzatore universalmente migliore. Un algoritmo che eccelle su un tipo di problemi deve essere peggiore altrove. Lo sciame è ottimo sulle funzioni lisce con una struttura regolare, come quella di Rastrigin; sul commesso viaggiatore senza modifiche non reggerebbe.
Dopo il successo delle formiche e dello sciame si è aperta una valanga di algoritmi «ispirati alla natura»: lucciole, cuculi, pipistrelli, lupi grigi, l’armonia di un gruppo jazz. Kenneth Sörensen nel 2015 ha fatto notare che molti di essi sono vecchie idee in un costume nuovo — la metafora ha sostituito la descrizione matematica e ha reso più difficile il confronto. La domanda giusta davanti a ogni nuovo algoritmo non è quindi «a che cosa si ispira», ma «che cosa fa di diverso da quelli noti, e dove lo si vede».
9. Gli sciami nella pratica
- Regolazione dei parametri. La PSO è apprezzata dove i parametri sono pochi, il gradiente non è noto e una valutazione è una simulazione: taratura di regolatori, forma di antenne, gestione di reti elettriche o iperparametri di modelli di apprendimento automatico.
- Robot in sciame. A Harvard, nel 2014, 1 024 piccoli robot Kilobot hanno composto forme assegnate seguendo regole locali — senza controllo centrale, solo comunicando con i vicini.
- E i droni degli spettacoli pirotecnici? Gli spettacoli di luci con migliaia di droni non sono intelligenza di sciame: ogni drone segue una traiettoria calcolata in anticipo da un piano centrale. Uno sciame in senso proprio decide da sé, in base ai vicini.
10. Riepilogo
- Una particella della PSO cambia velocità in base all’inerzia, al proprio posto migliore e al posto migliore dello sciame.
- Sulla funzione di Rastrigin lo sciame ha trovato il minimo in 97 esecuzioni su 100 — la strategia evolutiva con la stessa partenza e lo stesso budget in 32.
- L’inerzia controlla quanto a lungo lo sciame esplora: se è piccola lo fa collassare prima del tempo, se è grande non gli lascia rifinire il risultato. Senza la componente sociale, come senza quella cognitiva, lo sciame fallisce.
- Una particella è come una molla smorzata; per |w| < 1 e 0 < φ < 2(1 + w) si assesta.
- La topologia ad anello diffonde l’informazione più lentamente e sui problemi difficili tende a essere più robusta; e secondo il teorema del «nessun pasto gratis» non esiste un ottimizzatore migliore per tutto.
Vuoi metterci le mani? Fai scrivere a un agente IA una PSO con una visualizzazione dello sciame, dagli un paesaggio tuo — per esempio una funzione con due valli lontane — e guarda se lo sciame si divide.
La vedi diversamente? Scrivi a support@coden-app.com.