Rescorla-Wagner

Un semplice modello di apprendimento associativo.

Author

Corrado Caudek

First Published

October 2, 2021

1 Regola di Rescorla-Wagner

Il modello di Rescorla-Wagner fornisce una regola di apprendimento che descrive come cambia la forza associativa durante il condizionamento pavloviano. Supponiamo di prendere uno stimolo inizialmente neutro (ad es. un tono) e di associarlo a un risultato che ha un valore intrinseco per l’organismo (ad es. un premio – oppure una punizione). Col tempo l’organismo impara ad associare il tono al premio e risponderà al tono più o meno allo stesso modo in cui risponde al premio. In questo esempio il premio è lo stimolo incondizionato (US) e il tono è stimolo condizionato (SC).

Secondo il modello Rescorla-Wagner, la regola per l’aggiornamento della forza associativa tra US e SC è basata sul divario tra l’aspettativa di ricompensa e il risultato che viene effettivamente ottenuto:

vs,t=vs,t1+α(λt1vs,t1), dove

  • vs,t è il valore dello stimolo s nella prova t, che riflette l’aspettativa di una ricompensa,
  • λt1 è la ricompensa ricevuta nella prova t1,
  • α è il tasso di apprendimento.

Pertanto, il valore assegnato ad uno stimolo viene aggiornato in base all’errore di previsione (la differenza tra il feedback ricevuto λt1 e l’aspettativa di ricompensa vs,t1).

Il tasso di apprendimento α[0,1] determina quanto viene pesato questo errore di previsione nell’aggiornamento dell’aspettativa di ricompensa alla luce del feedback che è stato ottenuto.

2 Condizionamento

Per chiarire il funzionamento della regola di Rescorla-Wagner la implementiamo in una funzione R:

update_rw <- function(value, alpha=0.15, lambda=1) {
  value + alpha * (lambda - value)
}

In una prima simulazione costituita da una sequenza di 40 prove esaminiamo come varia l’aspettativa di ricompensa dello stimolo s nel tempo. Immaginiamo che il feedback ottenuto sia sempre pari ad una ricompensa (λ=1). Nella prima prova, il valore dello stimolo è inizializzato a zero.

n_trials <- 40
strength <- numeric(n_trials)
strength
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[39] 0 0
for(trial in 2:n_trials) {
  strength[trial] <- update_rw( strength[trial-1] )
}
print(strength)
 [1] 0.0000000 0.1500000 0.2775000 0.3858750 0.4779937 0.5562947 0.6228505
 [8] 0.6794229 0.7275095 0.7683831 0.8031256 0.8326568 0.8577582 0.8790945
[15] 0.8972303 0.9126458 0.9257489 0.9368866 0.9463536 0.9544006 0.9612405
[22] 0.9670544 0.9719962 0.9761968 0.9797673 0.9828022 0.9853819 0.9875746
[29] 0.9894384 0.9910226 0.9923692 0.9935139 0.9944868 0.9953138 0.9960167
[36] 0.9966142 0.9971221 0.9975538 0.9979207 0.9982326
plot(
  1:n_trials, 
  strength, 
  type = 'l', 
  ylim = c(0,1),
  xlab = "Prove",
  ylab = "Aspettativa di ricompensa")
points(1:n_trials, strength)

Applicando la regola di Rescorla-Wagner, il valore (ovvero, l’aspettativa di ricompensa) dello stimolo s, nel caso di feedback positivi, aumenta progressivamente fino a raggiungere l’asintoto di 1. Nella simulazione precedente abbiamo posto α=0.15. Con α=0.5 otteniamo:

strength <- numeric(n_trials)

for(trial in 2:n_trials) {
  strength[trial] <- update_rw(alpha = 0.5, strength[trial-1] )
}
plot(
  1:n_trials, 
  strength, 
  type = 'l', 
  ylim = c(0,1),
  xlab = "Prove",
  ylab = "Aspettativa di ricompensa"
)
points(1:n_trials, strength)

È chiaro dunque che il parametro α determina la velocità con la quale viene aggiornata l’aspettativa di ricompensa.

3 Estinzione

Consideriamo ora l’estinzione dell’associazione che è stata appresa. In questa seconda simulazione, le prime 25 prove saranno identiche a quelle della simulazione precedente. In esse verrà sempre fornita una ricompensa (λ=1). Le ultime 25 prove, invece, forniranno un feedback negativo, ovvero, λ=0 – possiamo immaginare il feedback come l’assenza di premio.

Quello che ci aspettiamo di vedere in questa situazione è che dopo la prova 25, quando il premio viene rimosso, la forza dell’associazione inizi a indebolirsi perché l’agente sta ora associando il CS con l’assenza di premio (cioè il parametro λ è sceso a zero e quindi l’associazione v ritorna lentamente al valore iniziale).

n_trials <- 50                
strength <- numeric(n_trials) 
lambda <- 1 # initial reward value 

for(trial in 2:n_trials) {
  
  # remove the shock after trial 25
  if(trial > 25) {
    lambda <- 0
  }
  
  # update associative strength on each trial
  strength[trial] <- update_rw(
    value = strength[trial-1],
    lambda = lambda
  )
}

plot(
  1:n_trials, 
  strength, 
  type = 'l', 
  ylim = c(0,1),
  xlab = "Prove",
  ylab = "Aspettativa di ricompensa"
)
points(1:n_trials, strength)

L’estinzione è efficace nel rimuovere l’associazione, ma la sua efficacia richiede del tempo, non è immediata. Se ci fermiamo alla 35-esima prova, per esempio, allo stimolo s sarà ancora associata una piccola aspettativa di ricompensa.

4 Regola soft-max

Una volta attribuita una aspettativa di ricompensa agli stimoli, l’agente deve scegliere tra i diversi stimoli che sono presenti. Potrebbe sembrare ovvio scegliere, tra i vari stimoli presenti, quello a cui è associata l’aspettativa di ricompensa più altra (“massimizzazione della probabilità”) in questo particolare compito. Ma gli organismi biologici non si comportano così. Piuttosto, tendono a scegliere più spesso lo stimolo a cui è associata l’aspettativa di ricompensa maggiore, ma non sempre. Ci sono marcate differenze individuali nella strategia di scelta che si colloca tra due estremi: un’estremo è quello in cui l’aspettativa di valore determina la scelta; l’altro estremo è quello in cui la scelta tra gli stimoli è puramente casuale (ovvero, non è in alcun modo determinata dall’aspettativa di ricompensa associata agli stimoli).

Per descrivere il continuum tra queste due diverse strategie di scelta

Per modellare il modo in cui gli agenti traducono i valori di aspettativa di ricompensa in una scelta, viene utilizzato un modello in grado di catturare queste diverse possibili strategie di scelta. A questo fine viene usata la cosiddetta equazione soft-max:

p(s)=exp(βvs)iexp(βvi). Se supponiamo che ci siano solo due stimoli, A e B, dove vB=1vA, allora otteniamo la situazione seguente.

softmax <- function(beta, x) {
  1 / (1 + exp(-beta * x))
}
beta <- 5
x <- seq(-1, 1, length.out = 100)
y <- softmax(beta, x)
plot(
  x, 
  y, 
  type = 'l', 
  #ylim = c(0,1),
  xlab = "Valore (A) - valore (B)",
  ylab = "p(scelta = A)"
)

Si noti che

  • La probabilità di scegliere lo stimolo A aumenta in modo monotono con la differenza di valore A - B.
  • La funzione softmax ci dice che l’agente sceglierà lo stimolo A la maggior parte delle volte quando vA>vB, ma non sempre.
  • Da qui deriva il termine ‘softmax’: l’agente sceglie lo stimolo con il valore maggiore la maggior parte delle volte (ma non sempre), quindi questa è una funzione di massimizzazione ‘soft’.

Informazioni sulla sessione di lavoro

Session Info

Sono qui fornite le informazioni sulla sessione di lavoro insieme all’elenco dei pacchetti usati. I pacchetti contrassegnati con un asterisco(*) sono stati usati esplicitamente nello script.

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.2 (2022-10-31)
 os       macOS Big Sur ... 10.16
 system   x86_64, darwin17.0
 ui       X11
 language (EN)
 collate  it_IT.UTF-8
 ctype    it_IT.UTF-8
 tz       Europe/Rome
 date     2022-11-22
 pandoc   2.19.2 @ /Applications/RStudio.app/Contents/MacOS/quarto/bin/tools/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version date (UTC) lib source
 cli           3.4.1   2022-09-23 [1] CRAN (R 4.2.0)
 digest        0.6.30  2022-10-18 [1] CRAN (R 4.2.2)
 evaluate      0.18    2022-11-07 [1] CRAN (R 4.2.2)
 fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.2.0)
 htmltools     0.5.3   2022-07-18 [1] CRAN (R 4.2.0)
 htmlwidgets   1.5.4   2021-09-08 [1] CRAN (R 4.2.0)
 jsonlite      1.8.3   2022-10-21 [1] CRAN (R 4.2.2)
 knitr         1.41    2022-11-18 [1] CRAN (R 4.2.2)
 magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.2.0)
 rlang         1.0.6   2022-09-24 [1] CRAN (R 4.2.0)
 rmarkdown     2.18    2022-11-09 [1] CRAN (R 4.2.0)
 rstudioapi    0.14    2022-08-22 [1] CRAN (R 4.2.0)
 sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.2.0)
 stringi       1.7.8   2022-07-11 [1] CRAN (R 4.2.1)
 stringr       1.4.1   2022-08-20 [1] CRAN (R 4.2.0)
 xfun          0.35    2022-11-16 [1] CRAN (R 4.2.0)
 yaml          2.3.6   2022-10-18 [1] CRAN (R 4.2.2)

 [1] /Library/Frameworks/R.framework/Versions/4.2/Resources/library

──────────────────────────────────────────────────────────────────────────────