top of page
Team I.A. Italia

Apprendimento per rinforzo ( Reinforcement learning )

Una semplice guida all'apprendimento per rinforzo per un principiante assoluto. l'articolo include definizioni con esempi, applicazioni reali, concetti chiave e vari tipi di risorse di apprendimento.


Apprendimento per rinforzo ( Reinforcement learning )
Apprendimento per rinforzo ( Reinforcement learning )

Introduzione all' apprendimento per rinforzo

L'apprendimento per rinforzo è un'area del Machine Learning. Si tratta di intraprendere un'azione adeguata per massimizzare la ricompensa in una situazione particolare. Viene utilizzato da vari software e macchine per trovare il miglior comportamento o percorso possibile da intraprendere in una situazione specifica. L'apprendimento per rinforzo differisce dall'apprendimento supervisionato in modo che nell'apprendimento supervisionato i dati di addestramento hanno la chiave di risposta con sé, quindi il modello viene addestrato con la risposta corretta stessa mentre nell'apprendimento per rinforzo non c'è risposta ma l'agente di rinforzo decide cosa fare per svolgere il compito assegnato. In assenza di un set di dati di addestramento, è destinato a imparare dalla sua esperienza.


Esempio: il problema è il seguente: abbiamo un agente e una ricompensa, con molti ostacoli nel mezzo. L'agente dovrebbe trovare il miglior percorso possibile per raggiungere la ricompensa. Il problema seguente spiega il problema più facilmente.

Apprendimento per rinforzo ( Reinforcement learning )
Apprendimento per rinforzo ( Reinforcement learning )

L'immagine sopra mostra il robot, il diamante e il fuoco. L'obiettivo del robot è ottenere la ricompensa che è il diamante ed evitare gli ostacoli che vengono lanciati. Il robot impara provando tutti i percorsi possibili e quindi scegliendo il percorso che gli dà la ricompensa con il minor numero di ostacoli. Ogni passo giusto darà al robot una ricompensa e ogni passo sbagliato sottrarrà la ricompensa del robot. La ricompensa totale verrà calcolata quando raggiunge la ricompensa finale che è il diamante.


Punti principali nell'apprendimento per rinforzo :

Prendi questo esempio come una base da cui partire, durante l'articolo approfondiremo tutti i punti.

  • Input: l'input dovrebbe essere uno stato iniziale da cui partirà il modello

  • Output: ci sono molti possibili output in quanto vi sono una varietà di soluzioni per un problema particolare

  • Formazione: la formazione si basa sull'input, il modello restituirà uno stato e l'utente deciderà di premiare o punire il modello in base al suo output.

  • Il modello continua a imparare.

  • La soluzione migliore viene decisa in base alla ricompensa massima.


Tipi di apprendimento per rinforzo:

Esistono due tipi di rinforzo:

Positivo Il rinforzo positivo è definito come quando un evento, si verifica a causa di un particolare comportamento, aumenta la forza e la frequenza del comportamento. In altre parole, ha un effetto positivo sul comportamento. I vantaggi dell'apprendimento per rinforzo sono:

  • Massimizza le prestazioni

  • Sostieni il cambiamento per un lungo periodo di tempo

  • Troppo Rinforzo può portare a un sovraccarico di stati che può diminuire i risultati

Negativo Il rinforzo negativo è definito come il rafforzamento del comportamento perché una condizione negativa viene fermata o evitata. Vantaggi dell'apprendimento per rinforzo:

  • Aumenta il comportamento

  • Fornire sfida a uno standard minimo di prestazioni

  • Fornisce solo abbastanza per soddisfare il comportamento minimo



Cos'è l'apprendimento per rinforzo?

L'apprendimento per rinforzo (RL) è un modello di apprendimento automatico in cui l'agente impara da tentativi ed errori per raggiungere l'obiettivo. È un algoritmo orientato all'obiettivo in cui un agente riceve una ricompensa quando esegue l'azione corretta. Questi premi aiutano gli agenti a navigare in un ambiente complesso per raggiungere l'obiettivo finale. Proprio come un bambino che impara a camminare da solo per tentativi ed errori. Allo stesso modo, una macchina impara a svolgere compiti complessi senza l'intervento umano.

L'apprendimento per rinforzo è abbastanza diverso da altri algoritmi di apprendimento automatico. Impara dall'ambiente e ottiene prestazioni migliori rispetto agli esseri umani. Mentre i modelli di apprendimento supervisionato e non supervisionato dipendono dai dati esistenti raccolti dagli esseri umani e sono limitati all'intelligenza umana. Ad esempio, AlphaGo di Deepmind ha imparato da solo varie strategie per sconfiggere il campione del mondo del gioco da tavolo Go.


Come funziona l'apprendimento per rinforzo?

Prendiamo un esempio di un gioco di Mario. All'inizio del gioco l'agente (Mario) è allo stato zero, in base al suo stato l'agente eseguirà un'azione. In questo caso, Mario andrà avanti. Ora l'agente è in un nuovo stato (nuovo frame). L'agente riceverà una ricompensa poiché è sopravvissuto andando avanti. L'agente continuerà a fare mosse fino a quando non avrà terminato la fase o non sarà morto nel processo. L'obiettivo principale dell'apprendimento per rinforzo è massimizzare la raccolta delle ricompense adottando misure minime.

Apprendimento per rinforzo ( Reinforcement learning )
Apprendimento per rinforzo ( Reinforcement learning )


Vantaggi dell'apprendimento per rinforzo

L'apprendimento per rinforzo è applicabile a un'ampia gamma di problemi complessi che non possono essere affrontati con altri algoritmi di apprendimento automatico.

Apprendimento per rinforzo ( Reinforcement learning )
Apprendimento per rinforzo ( Reinforcement learning )

L'apprendimento per rinforzo è più vicino all'intelligenza artificiale generale (AGI), poiché possiede la capacità di cercare un obiettivo a lungo termine esplorando varie possibilità in modo autonomo. Alcuni dei vantaggi dell'apprendimento per rinforzo includono:

  • Si concentra sul problema nel suo insieme. Gli algoritmi di apprendimento automatico convenzionali sono progettati per eccellere in sottoattività specifiche, senza una nozione del quadro generale. L'apprendimento per rinforzo, invece, non divide il problema in sottoproblemi; funziona direttamente per massimizzare la ricompensa a lungo termine. Ha uno scopo ovvio, comprende l'obiettivo ed è in grado di scambiare ricompense a breve termine con benefici a lungo termine.

  • Non necessita di una fase di raccolta dati separata. Nell'apprendimento per rinforzo, i dati di addestramento vengono ottenuti tramite l'interazione diretta dell'agente con l'ambiente. I dati di addestramento sono l'esperienza dell'agente di apprendimento, non una raccolta separata di dati che devono essere forniti all'algoritmo. Ciò riduce notevolmente l'onere per il supervisore responsabile del processo di formazione.

  • Funziona in ambienti dinamici e incerti. Gli algoritmi di apprendimento per rinforzo sono intrinsecamente adattivi e costruiti per rispondere ai cambiamenti nell'ambiente. Nell'apprendimento per rinforzo, il tempo conta e l'esperienza che l'agente raccoglie non è distribuita in modo indipendente e identico (iid), a differenza degli algoritmi di apprendimento automatico convenzionali.


Applicazioni dell'apprendimento per rinforzo:

Al momento, le applicazioni di machine learning sono limitate a una singola attività e dipendono dai dati esistenti. Ma in futuro tutto questo cambierà, combineremo l'apprendimento per rinforzo con visione artificiale, traduzione automatica e vari tipi di modelli per ottenere prestazioni sovrumane, ad esempio:

  1. Auto a guida autonoma : viaggiare diventa più sicuro e veloce

  2. Automazione del settore : gestione del magazzino

  3. Trading e finanza : previsione del prezzo delle azioni

  4. NLP (Natural Language Processing) : sintesi del testo, risposta alle domande e traduzione automatica

  5. Sanità : individuazione e cura efficaci delle malattie

  6. Engineering : ottimizzare la produzione su larga scala

  7. Sistemi di raccomandazione: notizie migliori, film e consigli sui prodotti.

  8. Gioco : migliorare i livelli di gioco per ottimizzare il coinvolgimento dei giocatori

  9. Marketing e pubblicità : identifica le persone e indirizzale con annunci in base alle esigenze.

  10. Robotica : esecuzione di compiti complessi e ripetitivi.


Componenti dell'apprendimento per rinforzo :

Ci sono così tante cose da imparare sull'apprendimento per rinforzo prima di iniziare a costruirne una nostra. In questa sezione, impareremo i componenti chiave dell'apprendimento per rinforzo e come ogni componente interagisce tra loro.

  • Agente : può essere un personaggio del gioco, un robot o un'auto. Un agente è un algoritmo che esegue un'azione. Nella vita reale l'agente è un essere umano.

  • Azione (A) : è un insieme di tutte le possibili mosse che un agente può eseguire. Ad esempio, Mario può saltare, spostarsi a sinistra, a destra e chinarsi.

  • Fattore di sconto : le ricompense future sono ridotte, quindi vale meno di un'azione immediata per imporre un edonismo a breve termine all'agente.

  • Ambiente: è un mondo che interagisce con gli agenti. In Mario, l'ambiente è la mappa. Prende lo stato corrente e l'azione dell'agente come input e restituisce la ricompensa e lo stato successivo.

  • Stato (S) : è come una cornice. Quando un agente esegue un'azione, lo stato viene modificato dal frame corrente al frame successivo in un gioco di Mario. Lo stato attuale e successivo è fornito dall'ambiente.

  • Ricompensa (R) : è un feedback o un premio assegnato a un agente in base all'azione precedente. Può essere positivo se l'agente ha completato l'attività e negativo se non riesce. I premi possono anche essere immediati e ritardati.

  • Politica (?) : è una strategia che gli agenti dipendenti per ottenere le ricompense più alte possibili in base allo stato e all'azione. In parole semplici, definisce come un agente agirà in base allo stato corrente.

  • Valore (V) : è un rendimento atteso a lungo termine con uno sconto.

  • Traiettoria : è una sequenza di stati e azioni influenzate da quegli stati.

  • Episodio : un ciclo completo di un agente, dall'inizio alla fine. Ad esempio, Mario inizia dall'inizio e, quando la fase corrente è completata, il primo episodio è completato. L'episodio è completato anche quando Mario muore.

  • Sfruttare : intraprendere l'azione migliore per massimizzare la raccolta di ricompense.

  • Esplora l'azione casuale intrapresa per esplorare l'ambiente senza considerare le ricompense.

Apprendimento per rinforzo ( Reinforcement learning )
Apprendimento per rinforzo ( Reinforcement learning )

Algoritmi di apprendimento per rinforzo :

Piuttosto che fare riferimento a un algoritmo specifico , il campo dell'apprendimento per rinforzo è costituito da diversi algoritmi che adottano approcci leggermente diversi. Le differenze sono dovute principalmente alle loro strategie per esplorare i loro ambienti.

  • Stato-azione-ricompensa-stato-azione (SARSA). Questo algoritmo di apprendimento per rinforzo inizia fornendo all'agente ciò che è noto come una politica . La politica è essenzialmente una probabilità che le dice le probabilità di determinate azioni che si traducono in ricompense o stati benefici.

  • Q-learning. Questo approccio all'apprendimento per rinforzo adotta l'approccio opposto. L'agente non riceve alcuna politica, il che significa che la sua esplorazione del suo ambiente è più autodiretta.

  • Deep Q-Reti. Questi algoritmi utilizzano le reti neurali oltre alle tecniche di apprendimento per rinforzo. Utilizzano l'esplorazione dell'ambiente autodiretto dell'apprendimento per rinforzo. Le azioni future si basano su un campione casuale di azioni benefiche passate apprese dalla rete neurale.



In che modo l'apprendimento per rinforzo è diverso dall'apprendimento supervisionato e non supervisionato?

L'apprendimento per rinforzo è considerato il ramo a sé stante dell'apprendimento automatico, sebbene abbia alcune somiglianze con altri tipi di apprendimento automatico, che si suddividono nei seguenti quattro domini:

  1. Apprendimento supervisionato. Nell'apprendimento supervisionato, gli algoritmi si addestrano su un corpo di dati etichettati. Gli algoritmi di apprendimento supervisionato possono apprendere solo gli attributi specificati nel set di dati. Le applicazioni comuni dell'apprendimento supervisionato sono i modelli di riconoscimento delle immagini. Questi modelli ricevono una serie di immagini etichettate e imparano a distinguere gli attributi comuni dei moduli predefiniti.

  2. Apprendimento senza supervisione. Nell'apprendimento non supervisionato, gli sviluppatori liberano gli algoritmi su dati completamente privi di etichetta. L'algoritmo apprende catalogando le proprie osservazioni sulle caratteristiche dei dati senza che gli venga detto cosa cercare.

  3. Apprendimento semi-supervisionato. Questo metodo adotta un approccio di mezzo. Gli sviluppatori inseriscono un set relativamente piccolo di dati di addestramento etichettati, nonché un corpus più ampio di dati senza etichetta. L'algoritmo viene quindi incaricato di estrapolare ciò che apprende dai dati etichettati ai dati non etichettati e trarre conclusioni dall'insieme nel suo insieme.

  4. Insegnamento rafforzativo. Questo richiede un approccio completamente diverso. Situa un agente in un ambiente con parametri chiari che definiscono l'attività benefica e l'attività non benefica e un obiettivo generale da raggiungere. È simile in qualche modo all'apprendimento supervisionato in quanto gli sviluppatori devono dare agli algoritmi obiettivi chiaramente specificati e definire ricompense e punizioni. Ciò significa che il livello di programmazione esplicita richiesta è maggiore rispetto all'apprendimento non supervisionato. Ma, una volta impostati questi parametri, l'algoritmo funziona da solo, rendendolo molto più autodiretto rispetto agli algoritmi di apprendimento supervisionato. Per questo motivo, le persone a volte si riferiscono all'apprendimento per rinforzo come a una branca dell'apprendimento semisupervisionato, ma in verità è spesso riconosciuto come un tipo a sé stante di apprendimento automatico.



Librerie Python per l'apprendimento per rinforzo


1. KerasRL

KerasRL è unalibreria Python di Deep Reinforcement Learning . Implementa alcuni algoritmi RL all'avanguardia e si integra perfettamente con lalibreria di Deep Learning Keras .

Inoltre, KerasRL funziona immediatamente con OpenAI Gym . Ciò significa che puoi valutare e giocare con diversi algoritmi abbastanza facilmente.

Per installare KerasRL usa semplicemente un comando pip:

pip install keras-rl

Vediamo se KerasRL soddisfa i criteri:

  1. Numero di algoritmi SOTA RL implementati

Ad oggi KerasRL ha implementato i seguenti algoritmi:

  • Deep Q-Learning ( DQN ) e suoi miglioramenti ( Doppio e Duello )

  • Gradiente di policy deterministico profondo ( DDPG )

  • DQN continuo ( CDQN o NAF )

  • Metodo dell'entropia incrociata ( CEM )

  • SARSA profonda

Come avrai notato, a KerasRL mancano due agenti importanti: metodi Actor-Critic e Proximal Policy Optimization (PPO).Docume.ntazione ufficiale, disponibilità di tutorial ed esempi. Il codice è facile da leggere ed è pieno di commenti, il che è abbastanza utile. Tuttavia, la documentazione sembra incompleta poiché manca la spiegazione dei parametri e dei tutorial. Inoltre, gli esempi pratici lasciano molto a desiderare.

  • Codice leggibile e facile da personalizzare

Molto facile. Tutto quello che devi fare è creare un nuovo agente seguendo l'esempio e quindi aggiungerlo a rl.agents .

  • Numero di ambienti supportati

KerasRL è stato creato per funzionare solo con OpenAI Gym . Pertanto è necessario modificare l'agente se si desidera utilizzare qualsiasi altro ambiente.

  • Supporto per strumenti di registrazione e monitoraggio

Il supporto degli strumenti di registrazione e monitoraggio non è implementato.

  • Caratteristica dell'ambiente vettorizzato

Include una funzione di ambiente vettorizzato.

  • Aggiornamenti regolari

La libreria sembra non essere più mantenuta in quanto gli ultimi aggiornamenti risalgono a più di un anno fa. Per riassumere, KerasRL ha una buona serie di implementazioni. Sfortunatamente, mancano punti preziosi come strumenti di visualizzazione, nuove architetture e aggiornamenti. Probabilmente dovresti usare un'altra libreria.



2. Pyqlearning

Pyqlearning è una libreria Python per implementare RL. Si concentra su Q-Learning e Deep Q-Network multi-agente. Pyqlearning fornisce componenti per i progettisti, non per scatole nere all'avanguardia per gli utenti finali. Pertanto, questa libreria è difficile da usare. Puoi usarlo per progettare l'algoritmo di ricerca delle informazioni, ad esempio GameAI o web crawler.


Per installare Pyqlearning è sufficiente utilizzare un comando pip:

pip installa pyqlearning

Vediamo se Pyqlearning soddisfa i criteri:

  • Numero di algoritmi SOTA RL implementati

Ad oggi Pyqlearning ha implementato i seguenti algoritmi:

  • Deep Q-Learning ( DQN ) e suoi miglioramenti ( Epsilon Greedy e Boltzmann )

Come avrai notato, Pyqlearning ha un solo agente importante. La libreria lascia molto a desiderare.

  • Documentazione ufficiale, disponibilità di tutorial ed esempi

Pyqlearning ha un paio di esempi per vari compiti e due tutorial con Maze Solving e il gioco di evasione degli inseguimenti di Deep Q-Network . Puoi trovarli nella documentazione ufficiale . La documentazione sembra incompleta in quanto si concentra sulla matematica e non sulla descrizione e sull'utilizzo della libreria.

  • Codice leggibile e facile da personalizzare

Pyqlearning è una libreria open source. Il codice sorgente può essere trovato su Github . Il codice manca di commenti. Può essere un compito complicato personalizzarlo. Tuttavia, i tutorial potrebbero aiutare.

  • Numero di ambienti supportati

Poiché la libreria è agnostica, è relativamente facile aggiungerla a qualsiasi ambiente.

  • Supporto per strumenti di registrazione e monitoraggio

L'autore utilizza un semplice pacchetto di registrazione nei tutorial. Pyqlearning non supporta altri strumenti di registrazione e monitoraggio, ad esempio TensorBoard .

  • Caratteristica dell'ambiente vettorizzato

Pyqlearning non supporta la funzionalità dell'ambiente vettorizzato.

  • Aggiornamenti regolari

La biblioteca è mantenuta. L'ultimo aggiornamento è stato effettuato due mesi fa. Tuttavia, il processo di sviluppo sembra essere lento. Per riassumere, Pyqlearning lascia molto a desiderare. Non è una libreria che utilizzerai comunemente. Quindi, probabilmente dovresti usare qualcos'altro.



3. Tensorforce

Tensorforce è una libreria Deep RL open source basata sul framework Tensorflow di Google. È semplice nel suo utilizzo e ha il potenziale per essere una delle migliori librerie di apprendimento per rinforzo .

Tensorforce ha scelte di progettazione chiave che lo differenziano dalle altre librerie RL:

  • Design modulare basato sui componenti: le implementazioni delle funzionalità, soprattutto, tendono ad essere il più generalmente applicabili e configurabili possibile.

  • Separazione dell'algoritmo RL e dell'applicazione: gli algoritmi sono indipendenti dal tipo e dalla struttura degli input (stati/osservazioni) e degli output (azioni/decisioni), nonché dall'interazione con l'ambiente dell'applicazione.


Per installare Tensorforce usa semplicemente un comando pip:

pip install tensorforce

Vediamo se Tensorforce soddisfa i criteri:

  • Numero di algoritmi SOTA RL implementati

Ad oggi, Tensorforce ha implementato il seguente set di algoritmi:

  • Deep Q-Learning ( DQN ) e suoi miglioramenti ( Doppio e Duello )

  • Gradiente della politica vaniglia ( PG )

  • Gradiente di policy deterministico profondo ( DDPG )

  • DQN continuo ( CDQN o NAF )

  • Attore critico ( A2C e A3C )

  • Ottimizzazione della politica della regione di fiducia ( TRPO )

  • Ottimizzazione delle politiche prossimali ( PPO )

Come avrai notato, Tensorforce non ha implementato l' implementazione Soft Actor Critic ( SAC ). Oltre a questo è perfetto.

  • Documentazione ufficiale, disponibilità di tutorial ed esempi

È abbastanza facile iniziare a utilizzare Tensorforce grazie alla varietà di semplici esempi e tutorial. La documentazione ufficiale sembra completa e comoda da navigare.

  • Codice leggibile e facile da personalizzare

Tensorforce trae vantaggio dal suo design modulare. Ogni parte dell'architettura, ad esempio reti, modelli, corridori è distinta. Pertanto, puoi modificarli facilmente. Tuttavia, il codice manca di commenti e questo potrebbe essere un problema.

  • Numero di ambienti supportati

Tensorforce funziona con più ambienti, ad esempio OpenAI Gym , OpenAI Retro e DeepMind Lab . Ha anche documentazione per aiutarti a collegarti ad altri ambienti.

  • Supporto per strumenti di registrazione e monitoraggio

La libreria supporta TensorBoard e altri strumenti di registrazione/tracciamento.

  • Caratteristica dell'ambiente vettorizzato

Tensorforce supporta la funzionalità dell'ambiente vettorizzato.

  • Aggiornamenti regolari

Tensorforce viene aggiornato regolarmente. L'ultimo aggiornamento risale a poche settimane fa. Per riassumere, Tensorforce è un potente strumento RL. È aggiornato e contiene tutta la documentazione necessaria per iniziare a lavorarci.





Qual è il futuro dell'apprendimento per rinforzo?

Negli ultimi anni sono stati compiuti progressi significativi nell'area dell'apprendimento per rinforzo profondo. L'apprendimento per rinforzo profondo utilizza reti neurali profonde per modellare la funzione del valore (basata sul valore) o la politica dell'agente (basata sulla politica) o entrambi (critico dell'attore). Prima del successo diffuso delle reti neurali profonde, è stato necessario progettare funzionalità complesse per addestrare un algoritmo di apprendimento per rinforzo. Ciò significava una ridotta capacità di apprendimento, limitando l'ambito dell'apprendimento per rinforzo ad ambienti semplici.


Con il deep learning, i modelli possono essere costruiti utilizzando milioni di pesi addestrabili, liberando l'utente dalla noiosa progettazione delle funzionalità. Le funzionalità rilevanti vengono generate automaticamente durante il processo di formazione, consentendo all'agente di apprendere le politiche ottimali in ambienti complessi. Tradizionalmente, l'apprendimento per rinforzo viene applicato a un'attività alla volta.


Ogni attività viene appresa da un agente di apprendimento per rinforzo separato e questi agenti non condividono la conoscenza. Questo rende l'apprendimento di comportamenti complessi, come guidare un'auto, inefficiente e lento. I problemi che condividono una fonte di informazioni comune, hanno una struttura sottostante correlata e sono interdipendenti possono ottenere un enorme aumento delle prestazioni consentendo a più agenti di lavorare insieme. Più agenti possono condividere la stessa rappresentazione del sistema addestrandoli contemporaneamente, consentendo di sfruttare i miglioramenti nelle prestazioni di un agente da parte di un altro.


A3C (Asynchronous Advantage Actor-Critic) è uno sviluppo entusiasmante in quest'area, in cui le attività correlate vengono apprese contemporaneamente da più agenti. Questo scenario di apprendimento multi-tasking sta avvicinando l'apprendimento per rinforzo all'AGI, dove un meta-agente impara a imparare.

Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page