Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Fondamenti di Python - Parte 02
Fondamenti di Python - Parte 02
Sono il dottor Soper e oggi ho il piacere di presentare la seconda puntata della nostra serie in tre parti sui fondamenti del linguaggio di programmazione Python.
Prima di addentrarci nella lezione di oggi, voglio sottolineare che le informazioni che condividerò si basano sulle conoscenze e abilità che abbiamo sviluppato nella lezione precedente. Pertanto, se non hai avuto la possibilità di guardare il video precedente, ti consiglio vivamente di farlo prima di iniziare questa lezione su Python.
Ora, prendiamoci un momento per rivedere brevemente cosa puoi aspettarti di imparare in questa lezione.
Alla fine di questo video, acquisirai conoscenze sui seguenti aspetti di Python:
Durante la lezione, esploreremo ciascuno di questi argomenti in dettaglio, completo di esempi illustrativi e dimostrazioni che mostrano le loro caratteristiche all'interno del linguaggio di programmazione Python.
Iniziamo discutendo le liste in Python.
In Python, un elenco è semplicemente una raccolta denominata di elementi. Questi elementi possono essere di qualsiasi tipo, inclusi numeri, testo, variabili, oggetti e persino altri elenchi! Se un elenco contiene altri elenchi come elementi, viene definito elenco multidimensionale.
Per illustrare, consideriamo un paio di esempi. Nel primo esempio, creiamo una lista chiamata "int list" e assegniamo i valori -3, 7, 4, 0, -2 e 342 ai suoi elementi. Puoi immaginare un semplice elenco unidimensionale come un vettore. Python identifica una lista tramite le sue parentesi quadre. Per assegnare valori agli elementi della lista, li separiamo con le virgole all'interno delle parentesi quadre. Ricorda che gli elenchi possono contenere elementi di qualsiasi tipo di dati.
Nel secondo esempio, dichiariamo un elenco di pianeti e assegniamo i nomi di tutti i pianeti conosciuti nel nostro sistema solare come suoi elementi. Vale la pena notare che Plutone è stato retrocesso allo status di "pianeta nano" dall'Unione Astronomica Internazionale nel 2006, quindi non è incluso in questo elenco. Passando al terzo esempio, dichiariamo una lista bidimensionale. In altre parole, anche gli elementi di questa lista sono liste. Puoi pensarla come una matrice 2x3 con due righe e tre colonne.
Ora, osserviamo alcune dimostrazioni in cui le liste sono dichiarate e utilizzate in Python. Nella prima cella di codice dichiariamo semplicemente le tre liste discusse in precedenza. Quando eseguiamo questa cella, non verrà visualizzato alcun output perché stiamo semplicemente istruendo Python a creare questi tre elenchi e memorizzarli nella memoria del computer. Nella successiva cella di codice, esploreremo come accedere a valori specifici all'interno di un elenco. Tuttavia, prima di procedere, è importante comprendere l'indicizzazione in Python.
Python utilizza un sistema di indicizzazione a base zero. Ciò significa che quando si ha a che fare con raccolte come elenchi o matrici, il primo elemento ha un indice pari a zero, il secondo elemento ha un indice pari a uno e così via. Per illustrare, consideriamo la nostra "lista int" come esempio. Questo elenco contiene sei valori. Se vogliamo accedere, diciamo, al quinto elemento nell'elenco, quell'elemento avrebbe un indice di 4.
Avendo afferrato questo sistema di indicizzazione a base zero, la cella di codice successiva stampa semplicemente il nome del terzo pianeta nell'elenco dei "pianeti", che, in questo caso, è "Terra". Poiché è il terzo elemento nell'elenco, dovrebbe trovarsi nella posizione dell'indice 2. Facciamo clic sul pulsante Esegui per verificare che l'output sia quello previsto e confermiamo che la Terra è effettivamente la terza roccia dal sole.
Andando avanti, approfondiamo il prossimo argomento di questa lezione: gli array NumPy in Python. Passiamo ora al prossimo argomento di questa lezione: istruzioni if e operatori logici. Python ci offre la possibilità di usare istruzioni condizionali usando le istruzioni if. Un'istruzione if ci consente di eseguire diversi blocchi di codice in base al fatto che una determinata condizione sia vera o falsa. Inoltre, Python fornisce anche operatori logici che ci consentono di combinare più condizioni insieme.
Nel primo esempio, abbiamo una semplice struttura if-else che controlla se una variabile chiamata 'x' è minore di 10. Se la condizione è vera, stampa "x è minore di 10" sullo schermo. Altrimenti, se la condizione è falsa, stampa "x è maggiore o uguale a 10". L'istruzione else viene utilizzata per specificare il codice che deve essere eseguito quando la condizione nell'istruzione if è falsa.
Possiamo estendere questa struttura per gestire molteplici possibilità utilizzando una struttura if-elif-else. Nel secondo esempio, introduciamo una condizione aggiuntiva verificando se l'età della persona è inferiore a 13 anni. In base all'età della persona, il codice determina se la persona è un bambino, un adolescente o un adulto. L'istruzione elif ci consente di verificare la presenza di condizioni aggiuntive prima di tornare all'istruzione else se nessuna delle condizioni è vera.
Vediamo alcune dimostrazioni di queste istruzioni if e operatori logici in azione nel nostro Jupyter Notebook.
Nella prima cella di codice dichiariamo una variabile chiamata 'x' e ne impostiamo il valore. Quindi usiamo una struttura if-else per stampare un messaggio specifico a seconda che 'x' sia minore di 10. Eseguiamo la cella di codice e osserviamo l'output. Poiché il valore di 'x' è attualmente 10, Python stampa "x è maggiore o uguale a 10" sullo schermo. Se modifichiamo il valore di 'x' in -7 ed eseguiamo nuovamente la cella di codice, otterremo un risultato diverso. Dopo aver modificato il valore di 'x' in -7, Python ora stampa "x è minore di 10".
Nella cella di codice successiva, implementiamo la struttura if-elif-else per determinare se una persona è un bambino, un adolescente o un adulto in base alla sua età. Facciamo funzionare la cella e vediamo cosa succede. Come previsto, Python stampa "child" perché il valore della variabile 'age' è attualmente impostato su 5. Se modifichiamo il valore di 'age' e rieseguiamo la cella di codice, otterremo risultati diversi in base all'età della persona. Passando all'argomento successivo, discutiamo gli operatori logici in Python. Python fornisce tre operatori logici: 'e', 'o' e 'non'. Questi operatori ci consentono di testare più condizioni contemporaneamente.
Nel primo esempio, mostriamo come usare gli operatori 'and' e 'or' per determinare se due variabili, 'x' e 'y', sono positive. L'istruzione if controlla se sia 'x' che 'y' sono positivi. Se almeno una delle condizioni è falsa, il codice passa all'istruzione elif, che controlla se 'x' o 'y' sono positivi. Se né 'x' né 'y' sono positivi, viene eseguita l'istruzione else.
Nel secondo esempio, introduciamo l'operatore 'not', che viene utilizzato per invertire o invertire il risultato di un confronto. Controlliamo se l'età di una persona non è inferiore a 13 anni. Se la persona non ha meno di 13 anni, deve avere almeno 13 anni e, quindi, non essere un bambino. Altrimenti, sono considerati bambini.
Vediamo alcune dimostrazioni di questi operatori logici utilizzati in Python.
Nella prima cella di codice, utilizziamo gli operatori logici "e" e "o" per determinare se "x" e "y" sono positivi. Abbiamo impostato 'x' su 5 e 'y' su -2. Eseguiamo la cella e osserviamo l'output. Poiché 'y' è negativo, la condizione per l'operatore 'e' è falsa. Tuttavia, la condizione per l'operatore 'or' è vera perché 'x' è positivo. Pertanto, il codice stampa "x è positivo" sullo schermo. Ora cambiamo il valore di 'x' in -3 ed eseguiamo nuovamente la cella di codice. Questa volta, entrambe le condizioni per gli operatori 'and' e 'or' sono false, quindi il codice procede all'istruzione else e stampa "x e y non sono positivi".
Nella cella di codice successiva, utilizziamo l'operatore "not" per verificare se una persona non è un bambino in base alla sua età. Abbiamo impostato la variabile "età" su 10, il che significa che la persona è considerata un bambino. Eseguiamo la cella di codice e osserviamo l'output. Poiché l'età della persona è inferiore a 13 anni, la condizione per l'operatore 'not' è falsa e il codice stampa "Child" sullo schermo.
Ora, modifica il valore di "età" in 18 ed esegui nuovamente la cella del codice. Questa volta, l'età della persona non è inferiore a 13 anni, quindi la condizione per l'operatore 'not' è vera e il codice stampa "Not a child". Questo conclude la nostra lezione su elenchi, array NumPy, istruzioni if e operatori logici in Python. Spero che tu abbia trovato utili queste informazioni e che ti aiutino nel tuo viaggio di programmazione Python.
Nella parte successiva e finale di questa serie, esploreremo argomenti più avanzati, inclusi cicli, funzioni e gestione dei file. Quindi, resta sintonizzato per quello!
Grazie per l'attenzione e arrivederci alla prossima lezione!
Fondamenti dell'apprendimento per rinforzo
Fondamenti dell'apprendimento per rinforzo
Sono il dottor Soper e oggi parlerò delle basi dell'apprendimento per rinforzo, che è un'area cruciale all'interno del più ampio dominio dell'intelligenza artificiale. Prima di approfondire le basi dell'apprendimento per rinforzo, prendiamoci un momento per rivedere ciò che imparerai in questa lezione.
Alla fine di questo video, avrai una chiara comprensione di quanto segue:
Una volta afferrati questi concetti, saremo completamente attrezzati per iniziare a costruire veri modelli di intelligenza artificiale. Quindi, non perdiamo tempo e iniziamo!
Innanzitutto, esploriamo cosa si intende per "apprendimento per rinforzo". Insieme all'apprendimento supervisionato e all'apprendimento non supervisionato, l'apprendimento per rinforzo è uno dei tre paradigmi principali dell'apprendimento automatico.
Nell'apprendimento supervisionato, una macchina apprende una funzione generale per prevedere gli output in base alle coppie input-output. Nell'apprendimento non supervisionato, una macchina scopre modelli in un set di dati senza una conoscenza preliminare dei dati. D'altra parte, l'apprendimento per rinforzo mira ad addestrare una macchina a comprendere il suo ambiente in un modo che le consenta di intraprendere azioni per massimizzare i premi cumulativi. Per raggiungere questo obiettivo, l'apprendimento per rinforzo implica la ricerca dell'equilibrio ottimale tra l'esplorazione dell'ambiente e lo sfruttamento di ciò che è stato appreso finora. Ora, approfondiamo i cinque principi alla base dell'IA basata sull'apprendimento per rinforzo.
Il primo principio che discuteremo è il sistema di input e output. Questo sistema non è unico per l'apprendimento per rinforzo, ma è fondamentale per tutti i sistemi di intelligenza artificiale e di calcolo cognitivo. Si tratta di convertire gli input in output.
Nel contesto dell'apprendimento per rinforzo, gli input sono indicati come "stati", che rappresentano lo stato dell'ambiente. Gli output sono chiamati "azioni", in risposta alla domanda "Cosa dovrei fare dopo?" L'obiettivo dell'apprendimento per rinforzo è identificare una politica ottimale che guidi le azioni in ogni stato.
Andando avanti, parliamo di premi. I premi svolgono un ruolo cruciale in tutti i sistemi di intelligenza artificiale e di calcolo cognitivo. Agiscono come metriche che informano il sistema sulle sue prestazioni. Le funzioni di ricompensa possono essere progettate per massimizzare i guadagni o minimizzare le perdite, a seconda del problema da risolvere. I premi immediati e cumulativi sono considerati per massimizzare i premi totali accumulati nel tempo.
Il terzo principio è l'ambiente, che si riferisce all'ambiente o all'ambiente in cui opera il sistema di apprendimento per rinforzo. L'ambiente fornisce informazioni su stati e ricompense. Definisce inoltre le regole del gioco, determinando quali azioni sono possibili in un dato momento. Inizialmente, il sistema non è a conoscenza delle conseguenze delle sue azioni e deve sperimentare per imparare.
Successivamente, abbiamo i processi decisionali di Markov (MDP). Prendendo il nome dal matematico Andrey Andreyevich Markov, gli MDP forniscono un quadro matematico per modellare il processo decisionale quando i risultati sono in parte casuali e in parte sotto il controllo di un decisore. Nell'apprendimento per rinforzo, il sistema di intelligenza artificiale funge da decisore che opera nell'ambiente. Gli MDP coinvolgono unità di tempo discrete e il sistema passa da uno stato all'altro in base a osservazioni, azioni, ricompense e stati successivi.
Infine, abbiamo la modalità di addestramento e la modalità di inferenza. I sistemi di apprendimento per rinforzo attraversano due fasi: addestramento e inferenza. In modalità di addestramento, il sistema apprende e cerca di identificare una politica ottimale attraverso più cicli di addestramento. Aggiorna la propria policy sulla base delle conoscenze acquisite. In modalità di inferenza, il sistema è stato completamente addestrato e viene distribuito per eseguire la propria attività utilizzando la policy appresa senza ulteriori aggiornamenti.
Ora che abbiamo una solida comprensione dei principi dell'apprendimento per rinforzo, possiamo iniziare a costruire veri e propri modelli di apprendimento per rinforzo. Nei prossimi due video, esploreremo i modelli di apprendimento per rinforzo che utilizzano il Thompson Sampling per risolvere problemi pratici. Il primo modello affronterà il dilemma esplorazione-sfruttamento nel problema del bandito multi-armato, e il secondo modello ottimizzerà i risultati in una campagna pubblicitaria complessa utilizzando simulazioni.
Questi video forniranno un'esperienza pratica nella creazione di modelli AI utilizzando Python. Spero che ti unirai a me in queste entusiasmanti avventure nel cognitive computing e nell'intelligenza artificiale!
Questo conclude la nostra lezione sui fondamenti dell'apprendimento per rinforzo. Spero che abbiate trovato queste informazioni interessanti e auguro a tutti voi una buona giornata.
Apprendimento per rinforzo: campionamento di Thompson e problema del bandito multi-armato - Parte 01
Apprendimento per rinforzo: campionamento di Thompson e problema del bandito multi-armato - Parte 01
Sono il dottor Soper, ed è un piacere presentarvi la prima parte della nostra lezione completa sull'apprendimento per rinforzo, incentrata in particolare sul campionamento di Thompson e sul famoso problema del bandito multi-armato.
Prima di approfondire le complessità dell'apprendimento per rinforzo nel contesto di Thompson Sampling e Multi-Armed Bandit Problem, vorrei sottolineare l'importanza di guardare i video precedenti di questa serie. Queste lezioni precedenti servono come base per i concetti che esploreremo oggi, e consiglio vivamente di familiarizzare con loro se non l'hai già fatto.
Per fornire una breve panoramica di ciò che puoi aspettarti di imparare in questa lezione, lasciami delineare i punti chiave:
Il viaggio che ci aspetta promette di essere illuminante, poiché scopriamo varie applicazioni e implicazioni dei problemi dei banditi multi-armati. Quindi, senza ulteriori indugi, iniziamo la nostra esplorazione!
Per cogliere il concetto di apprendimento per rinforzo nel contesto del problema dei banditi multi-armati, è essenziale definire innanzitutto cosa comporta questo problema.
Il problema del bandito multi-armato si riferisce a qualsiasi scenario in cui dobbiamo determinare come allocare una quantità fissa di una risorsa limitata tra un insieme di opzioni concorrenti. L'obiettivo principale è massimizzare le nostre ricompense attese affrontando l'incertezza.
Questa risorsa limitata potrebbe assumere varie forme, come tempo, denaro, turni e così via. Inoltre, i premi che potremmo ricevere da ogni opzione disponibile non sono completamente noti. Tuttavia, man mano che assegniamo risorse a diverse opzioni, acquisiamo gradualmente una migliore comprensione delle potenziali ricompense associate a ciascuna.
Il nome "Multi-Armed Bandit Problem" deriva da un'analogia con il gioco d'azzardo. Immagina un giocatore di fronte a una fila di slot machine, che tenta di identificare la macchina che massimizza le sue possibilità di vincita. Le slot machine sono giochi d'azzardo che si trovano comunemente nei casinò, dove i giocatori depositano denaro e giocano a turni. Se la fortuna favorisce il giocatore, la macchina eroga una ricompensa in denaro, che il giocatore spera superi il suo investimento iniziale.
Tradizionalmente, le slot machine venivano chiamate "banditi con un braccio solo" a causa della leva meccanica (braccio) utilizzata per avviare il gioco. Pertanto, quando un giocatore incontra diverse slot machine e deve decidere quale giocare, presenta un classico problema del bandito multi-armato. Questo problema incarna intrinsecamente il dilemma esplorazione-sfruttamento che è fondamentale per l'apprendimento per rinforzo.
Il dilemma esplorazione-sfruttamento ruota attorno alla determinazione di quante volte il giocatore dovrebbe giocare a ciascuna macchina. Se un giocatore scopre una macchina che sembra offrire premi frequenti, dovrebbe continuare a giocare a quella particolare macchina (sfruttamento) o rischiare potenziali perdite provando altre macchine nella speranza di trovare un'opzione ancora più gratificante (esplorazione)?
Ora, potresti chiederti perché il problema dei banditi multi-armati abbia una così grande importanza. Bene, la verità è che i problemi dei banditi multi-armati sono onnipresenti nel mondo reale, permeando sia la nostra vita quotidiana che gli ambienti aziendali.
Considera le scelte che incontri nella tua vita personale. Ad esempio, decidere se visitare ancora una volta il tuo ristorante preferito il venerdì sera o esplorare un nuovo ristorante che non hai mai provato prima. Allo stesso modo, immagina di avere più serie TV intriganti disponibili per lo streaming ma un tempo libero limitato per guardarle. Come determini in quale spettacolo investire il tuo tempo?
Thompson Sampling è un algoritmo popolare utilizzato per affrontare il dilemma esplorazione-sfruttamento nel problema del bandito multi-armato. Fornisce un approccio di principio per bilanciare esplorazione e sfruttamento sfruttando l'inferenza bayesiana.
L'idea alla base di Thompson Sampling è mantenere una credenza o una distribuzione di probabilità sulle vere probabilità di ricompensa sottostanti di ciascuna opzione (braccio) nel problema del bandito. Questa convinzione viene aggiornata in base alle ricompense osservate dalle precedenti interazioni con le braccia.
Thompson Sampling adotta un approccio probabilistico al processo decisionale. Invece di selezionare rigorosamente il braccio con la ricompensa attesa più alta (sfruttamento) o di esplorare casualmente le braccia, campiona un braccio dalla distribuzione delle credenze in un modo che bilancia esplorazione e sfruttamento.
Esaminiamo i passaggi dell'algoritmo di campionamento di Thompson:
Inizializzazione: inizia inizializzando la distribuzione delle convinzioni per ciascun braccio. Questa distribuzione rappresenta l'incertezza sulla vera probabilità di ricompensa di ciascun braccio. In genere, una distribuzione Beta viene utilizzata come distribuzione precedente, poiché è coniugata alla distribuzione binomiale comunemente utilizzata per modellare le ricompense nei problemi dei banditi.
Campionamento: per ogni round di interazione, campiona una probabilità di ricompensa dalla distribuzione delle convinzioni per ogni braccio. Questo passaggio incorpora l'esplorazione considerando le armi con maggiore incertezza nelle loro probabilità di ricompensa.
Selezione: Seleziona il braccio con la più alta probabilità di ricompensa campionata. Questo passaggio incorpora lo sfruttamento favorendo armi che potrebbero avere ricompense attese più elevate in base alla distribuzione delle convinzioni.
Aggiornamento: osserva la ricompensa dal braccio selezionato e aggiorna la distribuzione delle credenze per quel braccio in base all'inferenza bayesiana. Questo passaggio aggiorna la distribuzione posteriore utilizzando la distribuzione precedente e la ricompensa osservata.
Campionando, selezionando e aggiornando ripetutamente, Thompson Sampling adatta la sua distribuzione delle credenze in base alle ricompense osservate, migliorando gradualmente la selezione delle armi nel tempo.
Thompson Sampling ha dimostrato di essere un algoritmo efficace per risolvere il dilemma esplorazione-sfruttamento in varie applicazioni. È stato ampiamente utilizzato nella pubblicità online, negli studi clinici, nei sistemi di raccomandazione e in molti altri domini in cui è coinvolto il processo decisionale sequenziale in condizioni di incertezza.
Uno dei principali vantaggi di Thompson Sampling è la sua semplicità e facilità di implementazione. L'algoritmo non richiede calcoli complessi o messa a punto di iperparametri, rendendolo una scelta pratica in molti scenari del mondo reale.
In conclusione, Thompson Sampling offre un'elegante soluzione al problema dei banditi multi-armati bilanciando esplorazione e sfruttamento attraverso l'inferenza bayesiana. La sua capacità di adattarsi alle mutevoli probabilità di ricompensa e la sua ampia applicabilità lo rendono uno strumento prezioso nell'apprendimento per rinforzo e nel processo decisionale.
Nella parte successiva della nostra lezione, approfondiremo i fondamenti matematici del Thompson Sampling ed esploreremo le sue garanzie di prestazione. Resta sintonizzato per un emozionante viaggio nelle complessità di questo potente algoritmo!
Apprendimento per rinforzo: campionamento di Thompson e problema del bandito multi-armato - Parte 02
Apprendimento per rinforzo: campionamento di Thompson e problema del bandito multi-armato - Parte 02
Sono il dottor Soper e sono qui per presentare la seconda parte della nostra lezione sull'apprendimento per rinforzo nel contesto del campionamento di Thompson e del famoso problema del bandito multi-armato.
Nel video precedente di questa serie, abbiamo acquisito una comprensione del problema del bandito multi-armato e di come utilizzare il campionamento Thompson per risolverlo.
Prima di procedere, ti consiglio vivamente di guardare il video precedente se non l'hai già fatto, in quanto fornisce conoscenze essenziali che saranno di grande beneficio per la tua comprensione di questa lezione.
Oggi ci concentreremo sull'implementazione di un sistema di intelligenza artificiale basato sull'apprendimento per rinforzo che utilizza Thompson Sampling per risolvere un vero problema di banditi multi-armati. Per fare ciò, passeremo a Python e inizieremo! Per iniziare, esaminiamo brevemente lo scenario con cui lavoreremo. Immagina di essere in un casinò con $ 1.000 per giocare alle slot machine. Ci sono sei slot machine disponibili e ogni turno costa $ 1 per giocare. Il tasso di conversione, che rappresenta la probabilità di vincita in un dato turno, varia a seconda delle macchine e non ti è noto.
Il tuo obiettivo è massimizzare le tue possibilità di vincita identificando la slot machine con il più alto tasso di conversione il più rapidamente possibile.
Nella nostra implementazione Python, inizieremo importando le librerie richieste. Fortunatamente, per questo progetto, abbiamo solo bisogno di importare numpy. Successivamente, definiremo l'ambiente. Definire l'ambiente è un passaggio cruciale in qualsiasi progetto di apprendimento per rinforzo. Qui inizieremo specificando il numero totale di turni in cui giocheremo alle slot machine. Poiché abbiamo $ 1.000 e ogni turno costa $ 1, avremo un totale di 1.000 turni.
Dobbiamo anche definire il numero totale di slot machine, che in questo caso è sei. Inoltre, creeremo degli array per tenere traccia delle nostre vincite e perdite per ogni slot machine. Questi array serviranno come parametri di forma per la distribuzione beta, come discusso nella lezione precedente. Inoltre, imposteremo un seme per il generatore di numeri casuali per garantire la riproducibilità dei nostri risultati.
Successivamente, genereremo tassi di conversione casuali tra l'1% e il 15% per ogni slot machine. Questi tassi di conversione rappresentano la frequenza con cui un giocatore vincerebbe se giocasse a quella particolare macchina. Tieni presente che in uno scenario reale, il giocatore non avrebbe accesso a queste informazioni. Dopo aver generato i tassi di conversione, li stamperemo sullo schermo per osservare i valori memorizzati nella memoria del computer.
Nella fase successiva, creeremo il set di dati primario. Questo set di dati sarà una matrice con una riga per ogni turno e una colonna per ogni slot machine. In questo caso, il nostro set di dati avrà 1.000 righe e 6 colonne, che rappresentano i 1.000 turni e 6 possibili slot machine. Ogni voce nella matrice indicherà il risultato del gioco di una particolare slot machine in un turno specifico, con "1" che indica una vincita e "0" che indica una perdita.
Per generare il set di dati, utilizzeremo cicli "for" nidificati. Dopo aver generato il set di dati, stamperemo le prime 15 righe per avere un'idea della sua struttura.
L'esecuzione della cella di codice visualizzerà una matrice piena di uno e zero, che rappresentano rispettivamente vittorie e sconfitte. Ogni riga corrisponde a un turno e ogni colonna corrisponde a una slot machine. Ad esempio, nel primo turno, giocare a qualsiasi slot machine comporterebbe una perdita. Il set di dati ci consente di comprendere i risultati se dovessimo giocare a una specifica slot machine in un dato turno.
Successivamente, mostreremo le medie per ogni colonna nel set di dati. Questi mezzi rappresentano i veri tassi di conversione che possiamo aspettarci per ogni slot machine nella nostra simulazione. L'esecuzione della cella di codice mostrerà questi valori, che dovrebbero essere vicini ai tassi di conversione teorici definiti in precedenza, sebbene non esatti a causa del generatore di numeri casuali e del numero limitato di giri nel nostro set di dati.
Ora è il momento di simulare di giocare alle slot machine 1.000 volte rispettando il vincolo di giocare una sola macchina per turno.
Utilizzando cicli "for" nidificati, con il ciclo esterno che itera attraverso ogni turno e il ciclo interno che itera attraverso ogni slot machine, condurremo la simulazione. All'inizio di ogni turno, imposteremo la variabile "max_beta" a -1. Questa variabile ci aiuterà a tenere traccia del valore beta maggiore osservato per il turno corrente.
Per ogni slot machine, estrarremo un valore casuale dalla distribuzione beta della macchina, dove la forma della distribuzione è determinata dal numero di vincite e perdite accumulate giocando a quella particolare macchina. Confronteremo il valore beta dell'attuale slot machine con il valore beta più alto osservato finora nel round in corso. Se è più grande, aggiorneremo la variabile "index_of_machine_to_play" con l'indice della slot machine attuale.
Dopo aver esaminato i valori beta di tutte e sei le slot machine, la variabile "index_of_machine_to_play" memorizzerà l'indice della macchina con il valore beta più alto per il turno corrente. Giocheremo quindi alla slot machine selezionata cercando il risultato nel nostro set di dati e registrando se è stata una vittoria o una perdita incrementando l'elemento corrispondente nell'array "number_of_positive_rewards" o "number_of_negative_rewards".
Questo processo continuerà fino a quando non avremo completato tutti i 1.000 round. Il nostro sistema di intelligenza artificiale imparerà continuamente dall'ambiente in ogni round, utilizzando la sua conoscenza accumulata per decidere tra esplorazione e sfruttamento. Una volta terminati tutti i 1.000 round, calcoleremo il numero totale di volte in cui il nostro agente AI ha giocato a ciascuna slot machine e stamperemo i risultati sullo schermo.
L'esecuzione della cella del codice visualizzerà il numero di volte in cui ogni slot machine è stata giocata. Come puoi vedere, il nostro sistema di intelligenza artificiale basato sull'apprendimento per rinforzo ha identificato con successo la slot machine 4 come quella con la più alta probabilità di vincita. Ha scelto di giocare con quella macchina in 695 turni su 1.000 nel tentativo di massimizzare le sue ricompense cumulative.
Infine, è fondamentale confrontare questi risultati con una linea di base pertinente. In questo caso, l'approccio ingenuo sarebbe quello di selezionare casualmente una slot machine da giocare per ogni round. L'ultima cella di codice dimostra questo approccio di campionamento casuale calcolando il numero di vincite se dovessimo scegliere casualmente una slot machine da giocare ad ogni turno.
L'esecuzione della cella di codice rivelerà il confronto tra l'approccio di campionamento di Thompson e l'approccio di campionamento casuale. Come puoi vedere, l'approccio Thompson Sampling ha portato a molte più vincite rispetto all'ingenuo approccio di campionamento casuale. Pertanto, il nostro giocatore d'azzardo farebbe bene a utilizzare Thompson Sampling!
In questa lezione, abbiamo applicato le conoscenze acquisite finora nella nostra serie per risolvere un problema decisionale del mondo reale. In particolare, abbiamo creato con successo un sistema di intelligenza artificiale completo basato sull'apprendimento per rinforzo in Python che utilizza il campionamento Thompson per affrontare un vero problema di banditi multi-armati.
In questa fase della nostra serie, spero che tu stia iniziando a sviluppare una comprensione dell'utilità degli strumenti di intelligenza artificiale nel supportare il processo decisionale. Potresti anche immaginare applicazioni intelligenti e innovative di queste tecnologie per risolvere altri problemi del mondo reale.
Nel prossimo video di questa serie, esploreremo una versione più sofisticata dell'apprendimento per rinforzo basato sul campionamento di Thompson applicato a una campagna pubblicitaria complessa. Vi invito a unirvi a me anche per quel video.
Questo conclude la seconda parte della nostra lezione sull'apprendimento per rinforzo nel contesto del campionamento di Thompson e del famoso problema del bandito multi-armato. Spero che tu abbia trovato questa lezione interessante e, fino alla prossima volta, buona giornata!
Un sistema di intelligenza artificiale basato sull'apprendimento per rinforzo che massimizza il profitto in Python
Un sistema di intelligenza artificiale basato sull'apprendimento per rinforzo che massimizza il profitto in Python
Buon giorno a tutti! Questo è il dottor Soper che parla. Oggi approfondiremo un esempio completo in Python che dimostra come un sistema di intelligenza artificiale basato sull'apprendimento per rinforzo può massimizzare efficacemente i profitti aziendali in uno scenario complesso che coinvolge più opzioni e milioni di clienti.
Le tecniche mostrate in questo video sono state introdotte e ampiamente discusse nelle lezioni precedenti di questa serie. Se non hai avuto l'opportunità di guardare quei video precedenti, ti consiglio vivamente di farlo prima di procedere con questo.
Prima di immergerci nella codifica in Python, discutiamo del problema aziendale che miriamo a risolvere in questo video utilizzando un sistema di intelligenza artificiale basato sull'apprendimento per rinforzo del campionamento di Thompson.
Immagina di lavorare per un'azienda wireless che vanta 10 milioni di clienti. L'azienda ha deciso di aumentare i propri profitti lanciando un programma di aggiornamento per smartphone. Per invogliare i clienti ad aggiornare i propri smartphone, il team di marketing dell'azienda ha ideato otto campagne pubblicitarie distinte. Ogni campagna offre ai clienti funzionalità, promozioni o sconti specifici. Tuttavia, il profitto medio di ciascuna campagna varierà poiché le funzionalità, le promozioni e gli sconti associati comporteranno costi variabili per l'azienda. Sebbene l'azienda possa calcolare il costo e il profitto per vendita per ciascuna campagna pubblicitaria, rimane incerto quanto sarà efficace ciascuna campagna. Alcune campagne possono rivelarsi molto efficaci, mentre altre potrebbero non produrre risultati significativi.
Il nostro obiettivo è creare un sistema di intelligenza artificiale in grado di massimizzare i profitti dell'azienda per il suo programma di aggiornamento degli smartphone. È importante notare che il nostro obiettivo non è semplicemente massimizzare il numero di clienti che partecipano al programma. Puntiamo invece a ottimizzare i profitti, che dipendono non solo dal numero di clienti esposti a ciascuna campagna pubblicitaria, ma anche dall'efficacia di ciascuna campagna nel generare vendite e dal profitto medio per vendita. Con una chiara comprensione del problema aziendale, passiamo a Python e iniziamo l'implementazione.
Prima di descrivere il codice in questo taccuino, voglio informarti che un link a questo taccuino è disponibile nella descrizione del video. Sentiti libero di scaricare una copia del taccuino per sperimentare o adattarlo alle tue esigenze specifiche. Come al solito, iniziamo importando le librerie Python necessarie. Avremo bisogno di due librerie per questo progetto: NumPy, che utilizzeremo per generare valori casuali da varie distribuzioni di probabilità, e locale, che utilizzeremo per formattare i valori di valuta in modo appropriato. Poiché il nostro obiettivo è massimizzare i profitti, in questo progetto lavoreremo ampiamente con i valori monetari. L'impostazione della nostra attuale localizzazione negli Stati Uniti garantisce che Python formatti i valori di valuta in dollari USA e utilizzi le virgole per separare i numeri grandi. Se preferisci una formattazione di valuta diversa, sentiti libero di modificare le impostazioni internazionali di conseguenza.
La riga di codice successiva imposta un seme per il generatore di numeri casuali. Ciò garantisce che è possibile riprodurre i risultati esatti osservati in questo video se si sceglie di scaricare ed eseguire il notebook.
Il nostro compito successivo prevede la definizione di una classe per memorizzare le informazioni sulle diverse campagne pubblicitarie. Utilizzeremo questa classe per creare oggetti che rappresentano ciascuna campagna pubblicitaria, che manterranno gli attributi o le caratteristiche delle rispettive campagne. L'utilizzo degli oggetti della campagna in questo modo ci consente di separare tutti i dettagli relativi alla campagna dal resto della logica del programma, migliorando in modo significativo la nostra comprensione di come l'IA apprende e prende le decisioni.
Come puoi osservare, ogni oggetto campagna viene inizializzato fornendo un ID campagna univoco. La funzione __init__ successivamente assegna un tasso di conversione casuale compreso tra l'1% e il 20% alla campagna utilizzando NumPy per ricavare un valore casuale da una distribuzione di probabilità uniforme. Il tasso di conversione indica la percentuale di clienti che sceglieranno di aggiornare il proprio smartphone se esposti a una specifica campagna pubblicitaria. Vale la pena notare che la società wireless non è a conoscenza di queste informazioni. Utilizziamo anche NumPy per assegnare un profitto casuale per vendita andata a buon fine che va da $ 100 a $ 200 per ogni campagna. Sebbene assegniamo questi valori di profitto in modo casuale, è ugualmente possibile utilizzare valori specifici forniti dall'azienda wireless per ogni campagna pubblicitaria. Infine, la classe include un metodo get_profit() che restituisce il profitto per vendita andata a buon fine per la campagna.
Ecco il codice per la classe Campaign:
Ora che abbiamo definito la classe Campaign, possiamo procedere all'implementazione dell'algoritmo di apprendimento per rinforzo basato sul campionamento di Thompson. Creeremo una classe chiamata ThompsonSampling che incapsulerà l'algoritmo.
La classe ThompsonSampling avrà i seguenti attributi e metodi: num_campaigns: il numero di campagne pubblicitarie.
I metodi della classe ThompsonSampling sono i seguenti:
Ecco il codice per la classe ThompsonSampling:
Ora che abbiamo implementato la classe ThompsonSampling, possiamo procedere alla creazione di un'istanza della classe ed eseguire l'algoritmo. In questo esempio imposteremo il numero di campagne su 8 e il numero di prove su 1000. Dopo aver eseguito le prove, visualizzeremo le vendite e i profitti totali per ciascuna campagna.
Puoi modificare il codice in base ai tuoi requisiti specifici, come il numero di campagne e prove. Inoltre, puoi estendere la classe Campaign con più attributi e metodi per acquisire informazioni aggiuntive su ciascuna campagna.Ecco il codice per eseguire l'algoritmo di campionamento Thompson:
Fondamenti di Q-Learning
Fondamenti di Q-Learning
Buon giorno a tutti! Sono il dottor Soper e oggi sono entusiasta di approfondire le basi del Q-learning, una potente tecnica nel dominio dell'intelligenza artificiale. Prima di intraprendere questo viaggio di apprendimento, ti consiglio di guardare il video precedente di questa serie intitolato "Fondamenti dell'apprendimento per rinforzo" se sei nuovo al concetto.
In questa lezione esploreremo i concetti fondamentali del Q-learning, comprese le sue caratteristiche, i valori Q, le differenze temporali, l'equazione di Bellman e il processo complessivo di Q-learning. Alla fine di questa lezione, avrai una solida conoscenza di questi concetti e sarai ben attrezzato per costruire modelli di intelligenza artificiale che si basano sul Q-learning. Quindi, senza ulteriori indugi, iniziamo!
Per iniziare, discutiamo brevemente cosa comporta il Q-learning. Come accennato in precedenza, il Q-learning è una forma di apprendimento per rinforzo, in cui un agente di intelligenza artificiale interagisce con un ambiente composto da stati e ricompense. L'obiettivo dell'agente è costruire una politica ottimale direttamente interagendo con l'ambiente, senza la necessità di apprendere un modello matematico sottostante o una distribuzione di probabilità. Q-learning abbraccia tentativi ed errori, poiché l'agente tenta continuamente di risolvere il problema utilizzando approcci diversi su più episodi mentre aggiorna la sua politica in base alle conoscenze acquisite.
Ora, approfondiamo le caratteristiche dei modelli di Q-learning. Poiché il Q-learning è un tipo di apprendimento per rinforzo, condivide le caratteristiche fondamentali di tutti i modelli di apprendimento per rinforzo. Queste caratteristiche includono un sistema di input e output, ricompense, ambiente, processi decisionali di Markov e modalità di addestramento e inferenza. Oltre a queste caratteristiche, i modelli Q-learning hanno due attributi specifici. In primo luogo, il numero di possibili stati nei modelli di Q-learning è finito, il che significa che l'agente AI si troverà sempre in una di un numero fisso di possibili situazioni. In secondo luogo, anche il numero di azioni possibili nei modelli Q-learning è finito, richiedendo all'agente AI di scegliere da un insieme fisso di azioni possibili in ogni stato.
Ora che abbiamo una comprensione delle caratteristiche, esploriamo alcuni classici problemi di Q-learning. Uno di questi problemi è il labirinto, in cui ogni posizione rappresenta uno stato e le azioni dell'agente comportano lo spostamento in alto, a destra, in basso oa sinistra. L'obiettivo è navigare attraverso il labirinto e raggiungere l'uscita il più velocemente possibile. Un altro classico esempio è il problema del cliff walking, in cui l'agente deve navigare attraverso un ambiente simile a una griglia per raggiungere una posizione specifica senza cadere dal dirupo. In entrambi gli scenari, l'agente AI impara a conoscere l'ambiente facendo affidamento e aggiornando i valori Q.
Allora, quali sono i valori Q? I valori Q rappresentano la qualità di un'azione specifica (a) in un dato stato (s). Indicano la somma prevista delle ricompense future se tale azione viene intrapresa dallo stato attuale. In altre parole, i valori Q stimano la ricompensa aggiuntiva che l'agente può accumulare intraprendendo una particolare azione e procedendo in modo ottimale da lì. L'agente AI mira a massimizzare le sue ricompense totali o minimizzare le sue punizioni totali in scenari con ricompense negative. Aggiornando e perfezionando i valori Q, l'agente apprende attraverso il rinforzo sia positivo che negativo.
I valori Q sono memorizzati in una tabella Q, che ha righe che rappresentano i possibili stati e colonne che rappresentano le possibili azioni. Il Q-table funge da politica dell'agente, guidando le sue azioni nell'ambiente. Una tabella Q ottimale contiene valori che consentono all'agente di selezionare l'azione migliore in un dato stato, portando alla ricompensa potenziale più alta.
Le differenze temporali (TD) giocano un ruolo cruciale nel Q-learning. TD fornisce un metodo per calcolare quanto il valore Q per l'azione precedente dovrebbe essere regolato in base a ciò che l'agente ha appreso sui valori Q per le azioni dello stato corrente. Questa regolazione aiuta l'agente a prendere decisioni migliori negli episodi successivi. Il valore TD viene calcolato considerando la ricompensa immediata ricevuta per l'azione precedente, un fattore di sconto (gamma) che sconta le ricompense future e il valore Q massimo dello stato successivo.
L'errore TD, spesso indicato come δ, viene calcolato come la differenza tra il valore TD e l'attuale valore Q per la precedente coppia stato-azione. Rappresenta la discrepanza tra la previsione dell'agente e la ricompensa effettiva osservata nell'ambiente. L'errore TD viene utilizzato per aggiornare il valore Q della precedente coppia stato-azione, affinando così gradualmente i valori Q nel tempo.
Ora, introduciamo l'equazione di Bellman, che è al centro del Q-learning. L'equazione di Bellman esprime la relazione tra il valore Q di una coppia stato-azione ei valori Q delle coppie stato-azione vicine. È definito come segue:
Q(s, a) = R(s, a) + γ * max[Q(s', a')]
In questa equazione, Q(s, a) rappresenta il valore Q dello stato s e l'azione a, R(s, a) denota la ricompensa immediata ottenuta quando si compie l'azione a nello stato s, γ (gamma) è il fattore di sconto che determina l'importanza delle ricompense future rispetto alle ricompense immediate, s' è lo stato successivo raggiunto dopo aver compiuto l'azione a nello stato s, e a' rappresenta la migliore azione da intraprendere nello stato s'.
L'equazione di Bellman afferma essenzialmente che il valore Q di una coppia stato-azione dovrebbe essere uguale alla ricompensa immediata ottenuta più il valore Q massimo scontato delle successive coppie stato-azione. Applicando in modo iterativo l'equazione di Bellman e aggiornando i valori Q in base alle ricompense osservate e alle stime future, l'agente converge gradualmente verso una politica ottimale.
Passiamo ora al processo generale di Q-learning. Q-learning segue un approccio iterativo costituito dalle seguenti fasi:
Attraverso questo processo iterativo, i valori Q vengono aggiornati e convergono gradualmente verso i loro valori ottimali, portando a una politica migliore. La strategia di esplorazione-sfruttamento consente all'agente di bilanciare tra l'esplorazione di nuove azioni per scoprire strategie migliori e lo sfruttamento delle conoscenze apprese per prendere decisioni basate sulle migliori azioni correnti.
Vale la pena ricordare che Q-learning è un algoritmo di apprendimento off-policy, il che significa che l'agente può apprendere dalle esperienze generate da una policy diversa. Questa proprietà consente un apprendimento più efficiente e una maggiore flessibilità nell'esplorazione di diverse strategie.
In sintesi, il Q-learning è una tecnica potente all'interno del dominio dell'apprendimento per rinforzo. Implica l'apprendimento di politiche ottimali attraverso prove ed errori senza richiedere un modello matematico dell'ambiente. Utilizzando i valori Q per stimare la somma attesa delle ricompense future, aggiornandoli attraverso le differenze temporali e l'equazione di Bellman e seguendo un processo di apprendimento iterativo, l'agente migliora gradualmente la sua politica e ottiene prestazioni migliori nel compito assegnato.
Spero che questa lezione ti abbia fornito una solida comprensione dei fondamenti del Q-learning. Nella prossima lezione, approfondiremo i dettagli dell'implementazione ed esploreremo esempi pratici di Q-learning in azione. Grazie per l'attenzione e non vedo l'ora di vedervi nel prossimo video!
Q-Learning: un esempio completo in Python
Q-Learning: un esempio completo in Python
Sono il Dr. Soper e oggi sono entusiasta di presentare una panoramica dettagliata di un sistema di intelligenza artificiale basato su Python che utilizza Q-learning. Questa lezione si basa sui concetti discussi nel video precedente, quindi se non hai familiarità con Q-learning, ti consiglio vivamente di guardare il video precedente prima di procedere con questo.
In questa lezione, affronteremo un problema aziendale affrontato da una società di e-commerce in crescita. L'azienda sta costruendo un nuovo magazzino e desidera automatizzare le operazioni di prelievo utilizzando robot di magazzino. I robot di magazzino sono veicoli terrestri autonomi progettati per gestire varie attività di magazzino, incluso il prelievo.
Il prelievo si riferisce al processo di raccolta di singoli articoli da diverse posizioni all'interno del magazzino per evadere gli ordini dei clienti. Una volta che gli articoli sono stati prelevati dagli scaffali, la società di e-commerce desidera che i robot li trasportino in una specifica area di imballaggio all'interno del magazzino per la spedizione.
Per garantire la massima efficienza e produttività, i robot devono apprendere i percorsi più brevi tra l'area di imballaggio e tutte le altre posizioni all'interno del magazzino in cui sono autorizzati a spostarsi. In questo video, il nostro obiettivo è usare Q-learning per portare a termine questo compito.
Innanzitutto, introduciamo l'ambiente per il nostro scenario di robot da magazzino. Il magazzino può essere rappresentato come un diagramma, in cui ogni quadrato nero rappresenta una posizione di stoccaggio degli articoli (scaffale o contenitore di stoccaggio) e ogni quadrato bianco rappresenta un corridoio che i robot possono utilizzare per la navigazione. Il quadrato verde indica l'ubicazione dell'area di imballaggio dell'articolo.
In totale, ci sono 121 posizioni nel magazzino e ogni posizione rappresenta uno stato o una situazione in cui un robot potrebbe trovarsi in un determinato momento. Ogni stato può essere identificato da un indice di riga e colonna. Ad esempio, l'area di imballaggio dell'articolo si trova nella posizione (0, 5). I quadrati neri e verdi sono stati terminali, il che significa che se l'agente AI guida un robot in una di queste aree durante l'addestramento, l'episodio di addestramento sarà terminato. Il quadrato verde rappresenta lo stato obiettivo, mentre i quadrati neri rappresentano gli stati di errore poiché lo schianto del robot in un'area di stoccaggio degli oggetti è considerato un errore.
Successivamente, discutiamo delle azioni disponibili per l'agente AI. L'agente AI può scegliere una delle quattro direzioni: Su, Destra, Giù o Sinistra. L'obiettivo dell'agente è imparare le azioni che impediscono al robot di schiantarsi nelle aree di stoccaggio degli oggetti.
Ora, esploriamo la struttura della ricompensa per il nostro scenario. A ogni stato (posizione) nel magazzino viene assegnato un valore di ricompensa. Per aiutare l'agente AI ad apprendere, vengono utilizzate ricompense negative (punizioni) per tutti gli stati tranne lo stato obiettivo. All'area di imballaggio (stato obiettivo) viene assegnato un valore di ricompensa di 100, mentre a tutti gli altri stati viene assegnato un valore di ricompensa di -100. L'uso di ricompense negative incoraggia l'agente AI a trovare il percorso più breve verso l'obiettivo riducendo al minimo le sue punizioni. Le ricompense positive per i quadrati bianchi non vengono utilizzate perché l'obiettivo dell'agente è massimizzare le ricompense cumulative e l'utilizzo di ricompense positive per i quadrati bianchi potrebbe portare l'agente ad accumulare ricompense senza meta senza raggiungere l'obiettivo.
Ora che abbiamo definito l'ambiente con i suoi stati, azioni e ricompense, passiamo a Python e diamo un'occhiata più da vicino all'implementazione del codice.
Iniziamo importando le librerie Python necessarie. Per questo progetto, abbiamo solo bisogno della libreria numpy, che verrà utilizzata per creare array multidimensionali, generare valori casuali ed eseguire attività numeriche.
Il passo successivo è definire l'ambiente, a partire dagli stati. Il magazzino è rappresentato come una griglia 11x11, risultante in 121 stati possibili. Usiamo un array numpy tridimensionale per memorizzare i valori Q per ogni combinazione di stato e azione. Le prime due dimensioni rappresentano le righe e le colonne degli stati, mentre la terza dimensione contiene un elemento per ogni possibile azione che l'agente AI può intraprendere.
Successivamente, definiamo le quattro azioni disponibili per l'agente: Su, Destra, Giù, Sinistra.
Continuiamo con l'implementazione del codice.
Ecco il codice che implementa l'algoritmo Q-learning per il nostro scenario di robot da magazzino:
Per testare la politica appresa, possiamo utilizzare la tabella Q per selezionare le azioni in base ai valori Q più alti per ogni stato:
Fondamenti di reti neurali artificiali e deep Q-learning
Fondamenti di reti neurali artificiali e deep Q-learning
Sono il dottor Soper e oggi ho il piacere di discutere con tutti voi i fondamenti delle reti neurali artificiali e del deep Q-learning.
Prima di approfondire la complessità di questi argomenti, ti consiglio di guardare il video precedente di questa serie intitolato "Fondamenti di Q-Learning" se non hai familiarità con Q-learning.
Iniziamo riassumendo brevemente ciò che imparerai in questa lezione.
Alla fine di questo video, avrai una comprensione completa di:
Una volta afferrati questi concetti, saremo completamente attrezzati per costruire modelli di intelligenza artificiale che si basano su reti neurali artificiali e deep Q-learning.
Senza ulteriori indugi, iniziamo!
Per comprendere le reti neurali artificiali e il loro funzionamento interno, dobbiamo prima comprendere i neuroni artificiali e le funzioni di attivazione.
Allora, cos'è esattamente un neurone artificiale?
I neuroni artificiali fungono da elementi costitutivi di base su cui sono costruite tutte le reti neurali artificiali. Furono inizialmente proposti da Warren McCulloch e Walter Pitts nel 1943 come modello matematico di neuroni biologici, che costituiscono la base del cervello animale, compreso il cervello umano.
Ispirato da questi neuroni biologici, è emerso il modello del neurone artificiale.
Come illustrato nel diagramma, lo scopo di un neurone artificiale è trasformare uno o più valori di input in un valore di output. Ogni valore di input viene moltiplicato per un peso, che regola la forza dell'input. Ad esempio, se il valore di input è 0,8 e il peso è 0,5, la moltiplicazione risultante darebbe 0,4. In questo scenario, il peso ha diminuito la forza dell'input. Al contrario, se il peso fosse maggiore di 1, la forza dell'input verrebbe amplificata.
Una volta calcolati i valori di input ponderati, subiscono una funzione di attivazione, che produce il valore di output del neurone artificiale. Vale la pena notare che i pesi possono essere regolati durante l'allenamento per ridurre al minimo gli errori, un'idea che rivisiteremo a breve.
Ora, approfondiamo le funzioni di attivazione.
Una funzione di attivazione è una funzione matematica utilizzata da un neurone artificiale per trasformare i suoi valori di input pesati in un valore di output. Come mostrato nell'equazione, una funzione di attivazione prende un singolo valore di input, ottenuto moltiplicando ciascun valore di input per il suo peso associato, e quindi somma tutti questi risultati. Il valore sommato viene quindi passato attraverso la funzione di attivazione per ottenere il valore di output del neurone artificiale.
È importante notare che in un neurone artificiale possono essere utilizzate varie funzioni di attivazione, ognuna delle quali si comporta in modo diverso nel trasformare i valori di input in valori di output.
Esploriamo quattro funzioni di attivazione comuni:
Funzione di attivazione della soglia: questa funzione restituisce 0 o 1 come output. Se il valore di input è maggiore o uguale a zero, restituisce 1; in caso contrario, restituisce 0. Di conseguenza, i valori di output per i neuroni artificiali che impiegano una funzione di attivazione della soglia saranno sempre 0 o 1.
Funzione di attivazione del sigmoide: l'output della funzione di attivazione del sigmoide è compreso tra 0 e 1. I valori di input positivi producono valori di output che si avvicinano a 1,0 all'aumentare dei valori di input, mentre i valori di input negativi producono valori di output più vicini a 0,0 quando i valori di input diminuiscono. Pertanto, la funzione di attivazione sigmoidea produce sempre un'uscita compresa tra 0 e 1.
Funzione di attivazione della tangente iperbolica: la funzione della tangente iperbolica è molto simile alla funzione di attivazione del sigmoide, tranne per il fatto che il suo valore di output è sempre compreso tra -1,0 e +1,0. I valori di input positivi generano valori di output che si avvicinano a +1,0 man mano che i valori di input aumentano e i valori di input negativi generano valori di output che si avvicinano a -1,0 quando i valori di input diminuiscono.
Questi sono solo alcuni esempi di funzioni di attivazione utilizzate nelle reti neurali artificiali. La scelta della funzione di attivazione dipende dal problema specifico e dal comportamento desiderato della rete neurale. Ora che abbiamo trattato i neuroni artificiali e le funzioni di attivazione, passiamo a capire come funzionano le reti neurali.
Le reti neurali sono costituite da più strati di neuroni artificiali interconnessi, che formano una struttura di rete complessa. I tre livelli principali in una rete neurale sono il livello di input, i livelli nascosti e il livello di output. Il livello di input è responsabile della ricezione dei dati di input, come immagini, testo o valori numerici, e del loro trasferimento ai livelli successivi per l'elaborazione. Il numero di neuroni nel livello di input corrisponde al numero di feature o dimensioni di input nei dati. I livelli nascosti, come suggerisce il nome, sono livelli intermedi tra i livelli di input e output. Questi livelli eseguono la maggior parte del calcolo in una rete neurale. Ogni neurone in uno strato nascosto riceve input dal livello precedente e calcola un output utilizzando la funzione di attivazione.
Il livello di output produce l'output finale della rete neurale. Il numero di neuroni nello strato di output dipende dalla natura del problema. Ad esempio, in un problema di classificazione binaria, ci sarebbe tipicamente un neurone nel livello di output per rappresentare la probabilità di appartenere a una classe. Per consentire l'apprendimento e migliorare le prestazioni della rete neurale, i pesi delle connessioni tra i neuroni vengono regolati durante una fase di addestramento. Questa regolazione viene eseguita utilizzando un processo chiamato backpropagation, combinato con un algoritmo di ottimizzazione come la discesa del gradiente stocastico. Durante l'addestramento, alla rete neurale viene presentato un set di dati di input insieme ai corrispondenti output di destinazione. La rete calcola il suo output per ogni input e la differenza tra l'output calcolato e l'output target viene misurata utilizzando una funzione di perdita.
L'obiettivo dell'allenamento è ridurre al minimo questa perdita regolando i pesi delle connessioni. L'algoritmo di backpropagation calcola il gradiente della funzione di perdita rispetto ai pesi, consentendo di aggiornare i pesi nella direzione che riduce la perdita. Questo processo iterativo continua finché la rete neurale non impara a produrre output accurati per gli input forniti. Ora che abbiamo una solida conoscenza delle reti neurali artificiali, esploriamo i fondamenti del Q-learning profondo.
Deep Q-learning è una tecnica di apprendimento per rinforzo che utilizza reti neurali profonde come approssimatori di funzioni per apprendere azioni ottimali in un processo decisionale di Markov (MDP) o in un ambiente di apprendimento per rinforzo. Nel contesto del deep Q-learning, la rete neurale, spesso indicata come Q-network, prende lo stato dell'ambiente come input e produce un Q-value per ogni possibile azione. Il valore Q rappresenta la ricompensa futura attesa quando si intraprende un'azione particolare dallo stato dato. Durante l'addestramento, la rete Q viene aggiornata utilizzando l'algoritmo Q-learning, che combina elementi di apprendimento per rinforzo e reti neurali. L'algoritmo Q-learning utilizza una combinazione di esplorazione e sfruttamento per migliorare gradualmente le stime della rete Q dei valori Q ottimali.
I passaggi fondamentali dell'algoritmo di deep Q-learning sono i seguenti:
Aggiornando iterativamente la rete Q utilizzando l'algoritmo Q-learning, la rete impara gradualmente a stimare i valori Q ottimali per ciascuna coppia stato-azione. Una volta addestrata, la rete Q può essere utilizzata per selezionare l'azione con il valore Q più alto per un dato stato, consentendo a un agente di prendere decisioni informate in un ambiente di apprendimento per rinforzo. Il deep Q-learning è stato applicato con successo a vari domini, tra cui il gioco, la robotica e il controllo autonomo dei veicoli, tra gli altri. Ha mostrato prestazioni notevoli nell'apprendimento di compiti complessi da input sensoriali ad alta dimensione. Tuttavia, è importante notare che il Q-learning profondo presenta alcune limitazioni, come la possibilità di sovrastima dei valori Q e la difficoltà di gestire spazi di azione continua. I ricercatori continuano a esplorare tecniche e algoritmi avanzati per affrontare queste sfide e migliorare le capacità dell'apprendimento per rinforzo profondo.
Il deep Q-learning è una tecnica potente che combina l'apprendimento per rinforzo con reti neurali profonde per apprendere azioni ottimali in un determinato ambiente. Sfruttando la capacità delle reti neurali profonde di approssimare funzioni complesse, il deep Q-learning ha dimostrato progressi significativi in vari campi dell'intelligenza artificiale.
Reti neurali convoluzionali e Q-Learning convoluzionale profondo
Reti neurali convoluzionali e Q-Learning convoluzionale profondo
Buon giorno a tutti! Questo è il dottor Soper, e oggi parlerò delle reti neurali convoluzionali (CNN) e del Q-learning convoluzionale profondo. Se non hai familiarità con le reti neurali artificiali o il Q-learning, ti consiglio di guardare il video precedente di questa serie intitolato "Fondamenti di reti neurali artificiali e Q-learning profondo" prima di procedere con questo.
Prima di approfondire l'argomento delle reti neurali convoluzionali e del Q-learning convoluzionale profondo, esaminiamo brevemente cosa puoi aspettarti di apprendere in questa lezione. Alla fine di questo video, avrai una solida conoscenza di cosa sono le reti neurali convoluzionali e di come funzionano. Discuteremo concetti importanti come mappe delle caratteristiche, convoluzione, max pooling, appiattimento e connessione a livelli completamente connessi per generare previsioni. Inoltre, esploreremo come funziona il Q-learning convoluzionale profondo.
Una volta trattati questi concetti fondamentali, saremo in grado di costruire reti neurali convoluzionali in grado di svolgere compiti notevoli. Queste attività includono il riconoscimento di oggetti in immagini e video e persino la riproduzione di videogiochi a un livello che supera le capacità umane.
Quindi iniziamo. Innanzitutto, sviluppiamo una comprensione intuitiva di cosa sono le reti neurali convoluzionali e perché sono utili. In termini semplici, una rete neurale convoluzionale (CNN) è un tipo di rete neurale artificiale progettata per dati con una struttura spaziale. I dati con strutture spaziali includono immagini, video e persino testo (sebbene le CNN siano utilizzate principalmente per attività di visione artificiale). Ai fini di questo video, ci concentreremo sull'input basato su immagini.
I dati con una struttura spaziale, come le immagini, contengono pixel disposti in un modo specifico. La posizione di ogni pixel ha un significato ed è questa disposizione che ci consente di identificare gli oggetti in un'immagine. Ad esempio, se dovessimo riordinare in modo casuale i pixel in un'immagine, diventerebbe una raccolta di rumore priva di significato piuttosto che un oggetto riconoscibile. Questa disposizione spaziale è ciò che intendiamo per "dati che hanno una struttura spaziale".
Le reti neurali convoluzionali sono progettate intenzionalmente per catturare queste relazioni spaziali tra i valori di input, come la posizione di un pixel in un'immagine o la posizione di una parola in una frase. Considerando queste relazioni spaziali, le CNN possono elaborare e analizzare efficacemente i dati con strutture spaziali.
Ora, discutiamo di come funzionano le CNN ad alto livello. In generale, una CNN genera una serie di mappe delle caratteristiche per ogni caso di input. In altre parole, crea dati per il livello convoluzionale. Successivamente, viene applicata una tecnica chiamata pooling per semplificare ogni mappa delle caratteristiche. Quindi, le mappe delle caratteristiche raggruppate vengono appiattite e i vettori risultanti vengono collegati a livelli completamente connessi. Questa connessione consente alle informazioni di propagarsi attraverso la rete, portando alla generazione di previsioni.
Per approfondire i dettagli, iniziamo con il primo passaggio: applicare i filtri all'immagine di input. I filtri, noti anche come rilevatori di caratteristiche o kernel, sono progettati per rilevare caratteristiche specifiche in un'immagine, come linee, curve o forme. Applicando questi filtri a un'immagine di input, generiamo mappe delle caratteristiche. La raccolta di mappe caratteristiche costituisce il livello convoluzionale.
Per illustrare questo processo, consideriamo una semplice immagine in bianco e nero composta da pixel rappresentati da una matrice. Possiamo quindi applicare un filtro, come un filtro 3x3 progettato per rilevare le linee verticali, all'immagine. Facendo scorrere il filtro sull'immagine, possiamo creare una mappa delle caratteristiche che indica il grado di sovrapposizione tra il filtro e le diverse sezioni dell'immagine.
Possiamo applicare più filtri a un'immagine per rilevare varie caratteristiche. Ogni filtro genera la propria mappa delle caratteristiche, permettendoci di rilevare linee, curve, forme e altro ancora. Queste mappe caratteristiche formano collettivamente il livello convoluzionale.
Congratulazioni! Ora comprendi il processo di convoluzione nelle reti neurali convoluzionali. Successivamente, discutiamo del max pooling.
Il max pooling è una tecnica utilizzata nelle CNN per eseguire il downsampling delle mappe delle caratteristiche ottenute dal livello convoluzionale. Il suo scopo è quello di ridurre le dimensioni spaziali delle mappe caratteristiche conservando le informazioni più importanti.
L'idea alla base del max pooling è quella di dividere la mappa delle caratteristiche in regioni non sovrapposte, spesso denominate finestre di pooling o regioni di pooling. Per ogni regione, viene mantenuto solo il valore massimo all'interno di tale regione, mentre gli altri valori vengono eliminati. Questo valore massimo viene quindi incluso nella mappa delle caratteristiche in pool.
Selezionando il valore massimo, il max pooling aiuta a preservare le caratteristiche più salienti dei dati di input. Fornisce inoltre un grado di invarianza di traduzione, il che significa che anche se la posizione di una caratteristica si sposta leggermente, il valore massimo ad essa associato sarà probabilmente ancora catturato.
Per illustrare questo processo, consideriamo un'operazione di pooling massimo 2x2 applicata a una mappa delle caratteristiche. Dividiamo la mappa delle caratteristiche in regioni 2x2 non sovrapposte e prendiamo il valore massimo da ciascuna regione per formare la mappa delle caratteristiche in pool. Questo esegue il downsampling delle dimensioni spaziali della mappa delle caratteristiche di un fattore 2.
Il max pooling può essere eseguito più volte in una CNN, portando a un'ulteriore riduzione delle dimensioni spaziali. Questo downsampling aiuta a ridurre la complessità computazionale della rete, rendendola più efficiente.
Una volta completata l'operazione di max pooling, il passaggio successivo consiste nell'appiattire le mappe delle funzionalità in pool. L'appiattimento implica la conversione delle mappe delle caratteristiche multidimensionali in un vettore unidimensionale. Questa trasformazione consente di connettere i dati a livelli completamente connessi, che sono i livelli standard nelle reti neurali tradizionali.
Il vettore appiattito funge da input per i livelli completamente connessi, dove la rete impara a estrarre rappresentazioni di alto livello ea fare previsioni basate su tali rappresentazioni. I livelli completamente connessi sono responsabili dell'incorporazione del contesto globale e delle decisioni complesse basate sulle caratteristiche estratte dai livelli convoluzionali.
Per riassumere il flusso di informazioni in una CNN:
Questo processo di estrazione delle caratteristiche, downsampling e processo decisionale consente alle CNN di catturare efficacemente le relazioni spaziali nei dati di input e fare previsioni accurate.
Ora che abbiamo una buona conoscenza delle reti neurali convoluzionali, approfondiamo il Q-learning convoluzionale profondo.
Il Q-learning convoluzionale profondo combina la potenza delle CNN con tecniche di apprendimento per rinforzo, in particolare il Q-learning, per risolvere compiti complessi. Q-learning è un tipo di algoritmo di apprendimento per rinforzo che consente a un agente di apprendere azioni ottimali in un ambiente interagendo con esso e ricevendo ricompense.
Nel contesto del Q-learning convoluzionale profondo, l'agente è tipicamente un agente artificiale, come un programma per computer, e l'ambiente è un'attività basata sulla visualizzazione, come giocare a un videogioco. L'agente osserva lo stato attuale del gioco (rappresentato come immagini) e intraprende azioni in base ai valori Q associati a ciascuna azione. I valori Q rappresentano le ricompense future attese per aver intrapreso un'azione specifica in un dato stato.
Per approssimare i valori Q, viene utilizzata una rete neurale convoluzionale profonda. La CNN prende lo stato corrente (immagine) come input e restituisce un valore Q per ogni possibile azione. I valori Q vengono quindi utilizzati per selezionare l'azione con la più alta ricompensa futura attesa, secondo una politica.
L'agente interagisce con l'ambiente intraprendendo azioni, ricevendo ricompense e aggiornando i valori Q in base alle ricompense osservate e ai valori Q previsti. Questo processo di interazione con l'ambiente e di aggiornamento dei valori Q viene ripetuto iterativamente per migliorare le capacità decisionali dell'agente.
La combinazione di reti neurali convoluzionali profonde e Q-learning consente all'agente di apprendere modelli visivi complessi e prendere decisioni basate su di essi. Questo approccio ha avuto successo in vari ambiti, tra cui i videogiochi, la guida autonoma e la robotica.
Utilizzo di Greedy Cross Validation per identificare rapidamente i modelli ottimali di Machine Learning
Utilizzo di Greedy Cross Validation per identificare rapidamente i modelli ottimali di Machine Learning
Saluti a tutti. Sono il dottor Soper e oggi vorrei discutere di una tecnica che ho sviluppato chiamata "Greedy Cross Validation". Questa tecnica funge da base per identificare in modo efficiente modelli di machine learning ottimali o quasi ottimali.
Cominciamo con una breve introduzione e una spiegazione del perché questo problema è di grande importanza. Quando si sviluppano soluzioni di machine learning, è consuetudine testare vari modelli per determinare quale offre le prestazioni migliori. Qui, il termine "modello" si riferisce a una combinazione specifica di un algoritmo di apprendimento automatico e dei valori scelti per i suoi parametri sintonizzabili.
I professionisti del machine learning spesso affrontano la sfida di testare centinaia o addirittura migliaia di modelli prima di decidere una scelta finale per un progetto di analisi o data science. Questo processo può essere dispendioso in termini di tempo, computazionalmente intensivo e costoso. Alcuni modelli avanzati di machine learning richiedono ore o addirittura giorni per l'addestramento.
Data la natura ad alta intensità di risorse del test di un gran numero di modelli, i ricercatori hanno cercato modi per identificare il modello con le migliori prestazioni il più rapidamente possibile. I metodi esistenti includono approcci bayesiani, metodi di discesa del gradiente, approcci evolutivi e formazione basata sulla popolazione, tra gli altri. Questi metodi mirano in genere a identificare le relazioni tra i parametri del modello e la metrica delle prestazioni, consentendo loro di esplorare regioni promettenti dello spazio di ricerca.
Contrariamente ai metodi esistenti, Greedy Cross Validation adotta un approccio distinto per accelerare l'identificazione del modello con le migliori prestazioni. Invece di concentrarsi sulla ricerca di regioni promettenti all'interno dello spazio di ricerca, Greedy Cross Validation si concentra sulla misurazione delle prestazioni del modello stesso come base per identificare rapidamente modelli di machine learning ottimali.
Un modello comprende parametri strutturali e algoritmici, denominati collettivamente iperparametri. I parametri strutturali includono fattori come il numero di livelli o nodi nascosti in una rete neurale, mentre i parametri algoritmici controllano il processo di apprendimento, come la dimensione del mini-batch o il tasso di apprendimento. Il compito di trovare la combinazione ottimale di impostazioni degli iperparametri per uno specifico problema di machine learning è noto come ottimizzazione degli iperparametri.
Per cogliere il concetto di Greedy Cross Validation, consideriamo un semplice esempio di ricerca di un modello ottimale attraverso l'ottimizzazione dell'iperparametro. In questo caso, abbiamo due iperparametri rappresentati sugli assi orizzontale e verticale. Ogni quadrato arancione rappresenta un modello specifico con la sua combinazione univoca di valori di iperparametri. La valutazione delle prestazioni di ciascun modello ci consente di identificare il modello migliore e un approccio comune a questo scopo è noto come "ricerca a griglia".
Ora, come stimiamo le prestazioni reali di un modello? La soluzione più comune consiste nel testare ogni modello utilizzando dati che non ha rilevato durante l'addestramento, un processo noto come "convalida incrociata k-fold". Ecco come funziona:
Le prestazioni complessive del modello vengono quindi calcolate come media dei valori delle prestazioni ottenuti da ciascuna valutazione di piegatura. Ciò garantisce una stima affidabile delle prestazioni del modello.
Ora che abbiamo compreso come funziona la convalida incrociata standard, possiamo esplorarne il ruolo nel processo generale di ottimizzazione degli iperparametri. Quando si valutano più modelli candidati utilizzando la convalida incrociata standard, ogni piega per un particolare modello aggiorna la nostra stima delle sue prestazioni. Dopo aver valutato tutte le pieghe per un modello, otteniamo la stima finale delle sue prestazioni complessive. Ripetendo questo processo per tutti i modelli, possiamo identificare il miglior candidato.
Al contrario, Greedy Cross Validation adotta un approccio diverso. Invece di valutare tutte le pieghe per ogni modello in sequenza, valuta in modo iterativo le pieghe per diversi modelli. La piega specifica da valutare successivamente viene scelta dinamicamente in base all'attuale prestazione media di ciascun modello candidato. Inizialmente, viene valutata una piega per ogni modello e le pieghe successive vengono scelte in base alle prestazioni dei modelli valutati finora.
L'idea chiave alla base di Greedy Cross Validation è dare la priorità alla valutazione dei modelli che mostrano promesse fin dall'inizio. In questo modo, possiamo identificare rapidamente i modelli che probabilmente funzioneranno bene e allocare loro più risorse computazionali. Questo approccio elimina la necessità di valutare tutte le pieghe per ogni singolo modello, risparmiando tempo e risorse computazionali.
Per implementare Greedy Cross Validation, seguiamo questi passaggi:
Selezionando dinamicamente la piega successiva da valutare in base alle prestazioni medie correnti dei modelli, Greedy Cross Validation può identificare rapidamente i modelli con le migliori prestazioni. Questo approccio ci consente di concentrare le risorse computazionali sui modelli più promettenti ignorando i modelli che difficilmente funzioneranno bene.
Uno dei vantaggi di Greedy Cross Validation è la sua capacità di gestire in modo efficiente un gran numero di modelli candidati. Invece di valutare in modo esaustivo tutti i modelli su tutte le pieghe, Greedy Cross Validation assegna in modo adattivo le priorità e valuta i modelli in base alle loro prestazioni, riducendo significativamente i requisiti computazionali complessivi.
È importante notare che Greedy Cross Validation non è un metodo garantito per trovare il modello migliore in assoluto. Come altre tecniche di ottimizzazione degli iperparametri, si basa sull'euristica e potrebbe non identificare sempre l'ottimo globale. Tuttavia, fornisce un approccio pratico ed efficiente per identificare rapidamente i modelli ad alte prestazioni, soprattutto quando si ha a che fare con un gran numero di candidati.
Greedy Cross Validation è una tecnica per accelerare l'ottimizzazione degli iperparametri nell'apprendimento automatico. Selezionando e valutando in modo adattivo i modelli in base alle loro prestazioni, consente di identificare in modo efficiente i modelli con le migliori prestazioni. Anche se potrebbe non garantire la ricerca del modello migliore in assoluto, offre una soluzione pratica per navigare in modo efficiente nello spazio di ricerca degli iperparametri.