Esplora tecniche avanzate per l'ottimizzazione degli iperparametri con l'ottimizzazione automatica dei modelli di Amazon SageMaker | Servizi Web di Amazon

Esplora tecniche avanzate per l'ottimizzazione degli iperparametri con l'ottimizzazione automatica dei modelli di Amazon SageMaker | Servizi Web di Amazon

La creazione di soluzioni di machine learning (ML) ad alte prestazioni si basa sull'esplorazione e sull'ottimizzazione dei parametri di training, noti anche come iperparametri. Gli iperparametri sono le manopole e le leve che utilizziamo per regolare il processo di formazione, come il tasso di apprendimento, la dimensione del batch, la forza della regolarizzazione e altri, a seconda del modello specifico e dell'attività da svolgere. L'esplorazione degli iperparametri implica la variazione sistematica dei valori di ciascun parametro e l'osservazione dell'impatto sulle prestazioni del modello. Sebbene questo processo richieda ulteriori sforzi, i vantaggi sono significativi. L'ottimizzazione degli iperparametri (HPO) può portare a tempi di addestramento più rapidi, una migliore accuratezza del modello e una migliore generalizzazione a nuovi dati.

Continuiamo il nostro viaggio dal post Ottimizza gli iperparametri con l'ottimizzazione automatica dei modelli di Amazon SageMaker. In precedenza abbiamo esplorato l'ottimizzazione di un singolo lavoro, visualizzato i risultati dell'algoritmo integrato di SageMaker e appreso l'impatto di particolari valori di iperparametri. Oltre a utilizzare HPO come ottimizzazione una tantum alla fine del ciclo di creazione del modello, possiamo anche utilizzarlo in più passaggi in modo conversazionale. Ogni lavoro di ottimizzazione ci aiuta ad avvicinarci a una buona prestazione, ma inoltre apprendiamo anche quanto il modello sia sensibile a determinati iperparametri e possiamo utilizzare questa comprensione per informare il successivo lavoro di ottimizzazione. Possiamo rivedere gli iperparametri e i loro intervalli di valori in base a ciò che abbiamo imparato e quindi trasformare questo sforzo di ottimizzazione in una conversazione. E nello stesso modo in cui noi, professionisti del machine learning, accumuliamo conoscenza durante queste corse, Ottimizzazione automatica del modello (AMT) di Amazon SageMaker con l'avvio a caldo è possibile mantenere queste conoscenze acquisite nei lavori di ottimizzazione precedenti anche per il lavoro di ottimizzazione successivo.

In questo post, eseguiamo più lavori HPO con un algoritmo di training personalizzato e diverse strategie HPO come l'ottimizzazione bayesiana e la ricerca casuale. Mettiamo anche in atto le partenze a caldo e confrontiamo visivamente le nostre prove per perfezionare l’esplorazione spaziale iperparametrica.

Concetti avanzati di SageMaker AMT

Nelle sezioni successive, esamineremo più da vicino ciascuno dei seguenti argomenti e mostreremo come SageMaker AMT può aiutarti a implementarli nei tuoi progetti ML:

  • Utilizza il codice di formazione personalizzato e il popolare framework ML Scikit-learn in SageMaker Training
  • Definire metriche di valutazione personalizzate in base ai log per la valutazione e l'ottimizzazione
  • Eseguire l'HPO utilizzando una strategia appropriata
  • Utilizza gli avvii a caldo per trasformare una singola ricerca di iperparametri in un dialogo con il nostro modello
  • Utilizza tecniche di visualizzazione avanzate utilizzando la nostra libreria di soluzioni per confrontare due strategie HPO e ottimizzare i risultati dei lavori

Sia che tu stia utilizzando gli algoritmi integrati utilizzati nel nostro primo post o il tuo codice di formazione, SageMaker AMT offre un'esperienza utente fluida per l'ottimizzazione dei modelli ML. Fornisce funzionalità chiave che ti consentono di concentrarti sul problema ML in questione tenendo traccia automaticamente delle prove e dei risultati. Allo stesso tempo, gestisce automaticamente l’infrastruttura sottostante per te.

In questo post ci allontaniamo dall'algoritmo integrato di SageMaker e utilizziamo codice personalizzato. Usiamo una foresta casuale da SkLearn. Ma ci atteniamo alla stessa attività e set di dati ML del nostro primo post, che rileva le cifre scritte a mano. Copriamo il contenuto del taccuino Jupyter 2_advanced_tuning_with_custom_training_and_visualizing.ipynb e ti invitiamo a richiamare il codice fianco a fianco per leggere oltre.

Immergiamoci più a fondo e scopriamo come possiamo utilizzare il codice di training personalizzato, distribuirlo ed eseguirlo, esplorando allo stesso tempo lo spazio di ricerca degli iperparametri per ottimizzare i nostri risultati.

Come creare un modello ML ed eseguire l'ottimizzazione degli iperparametri

Come si presenta un tipico processo per la creazione di una soluzione ML? Sebbene esistano molti casi d’uso possibili e una grande varietà di attività di ML, suggeriamo il seguente modello mentale per un approccio graduale:

  1. Comprendi il tuo scenario ML a portata di mano e seleziona un algoritmo in base ai requisiti. Ad esempio, potresti voler risolvere un'attività di riconoscimento di immagini utilizzando un algoritmo di apprendimento supervisionato. In questo post continuiamo a utilizzare lo scenario di riconoscimento delle immagini scritte a mano e lo stesso set di dati del nostro primo post.
  2. Decidi quale implementazione dell'algoritmo in SageMaker Training desideri utilizzare. Esistono varie opzioni, interne a SageMaker o esterne. Inoltre, devi definire quale metrica sottostante si adatta meglio alla tua attività e per cui desideri ottimizzare (come precisione, punteggio F1 o ROC). SageMaker supporta quattro opzioni a seconda delle tue esigenze e risorse:
    • Utilizzare un modello preaddestrato tramite JumpStart di Amazon SageMaker, che puoi utilizzare immediatamente o semplicemente perfezionarlo.
    • Utilizza uno degli algoritmi integrati per l'addestramento e la messa a punto, come XGBoost, come abbiamo fatto nel nostro post precedente.
    • Addestra e ottimizza un modello personalizzato basato su uno dei principali framework come Scikit-learn, TensorFlow o PyTorch. AWS fornisce una selezione di immagini Docker predefinite a questo scopo. Per questo post utilizziamo questa opzione, che ti consente di sperimentare rapidamente eseguendo il tuo codice su un'immagine contenitore predefinita.
    • Porta la tua immagine Docker personalizzata nel caso in cui desideri utilizzare un framework o un software che non sia altrimenti supportato. Questa opzione richiede il massimo sforzo, ma offre anche il massimo grado di flessibilità e controllo.
  3. Addestra il modello con i tuoi dati. A seconda dell'implementazione dell'algoritmo del passaggio precedente, ciò può essere semplice come fare riferimento ai dati di addestramento ed eseguire il processo di addestramento o fornire inoltre un codice personalizzato per l'addestramento. Nel nostro caso, utilizziamo del codice di formazione personalizzato in Python basato su Scikit-learn.
  4. Applica l'ottimizzazione degli iperparametri (come una "conversazione" con il tuo modello ML). Dopo l'addestramento, in genere desideri ottimizzare le prestazioni del tuo modello trovando la combinazione di valori più promettente per gli iperparametri del tuo algoritmo.

A seconda dell'algoritmo ML e delle dimensioni del modello, l'ultimo passaggio dell'ottimizzazione degli iperparametri potrebbe rivelarsi una sfida più grande del previsto. Le seguenti domande sono tipiche per i professionisti del machine learning in questa fase e potrebbero suonarti familiari:

  • Che tipo di iperparametri hanno un impatto sul mio problema di machine learning?
  • Come posso cercare in modo efficace un enorme spazio di iperparametri per trovare i valori con le migliori prestazioni?
  • In che modo la combinazione di determinati valori di iperparametri influenza la mia metrica delle prestazioni?
  • I costi contano; come posso utilizzare le mie risorse in modo efficiente?
  • Che tipo di esperimenti di tuning sono utili e come posso confrontarli?

Non è facile rispondere a queste domande, ma c’è una buona notizia. SageMaker AMT ti prende il lavoro pesante e ti consente di concentrarti sulla scelta della giusta strategia HPO e delle gamme di valori che desideri esplorare. Inoltre, la nostra soluzione di visualizzazione facilita l'analisi iterativa e il processo di sperimentazione per trovare in modo efficiente valori di iperparametri con buone prestazioni.

Nelle sezioni successive, creeremo da zero un modello di riconoscimento delle cifre utilizzando Scikit-learn e mostreremo tutti questi concetti in azione.

Panoramica della soluzione

SageMaker offre alcune funzionalità molto utili per addestrare, valutare e ottimizzare il nostro modello. Copre tutte le funzionalità di un ciclo di vita ML end-to-end, quindi non abbiamo nemmeno bisogno di lasciare il nostro notebook Jupyter.

Nel nostro primo post, abbiamo utilizzato l'algoritmo integrato di SageMaker XGBoost. A scopo dimostrativo, questa volta passiamo a un classificatore Random Forest perché possiamo quindi mostrare come fornire il proprio codice di addestramento. Abbiamo optato per fornire il nostro script Python e utilizzare Scikit-learn come framework. Ora, come esprimiamo che vogliamo utilizzare uno specifico framework ML? Come vedremo, SageMaker utilizza un altro servizio AWS in background per recuperare un'immagine del contenitore Docker precostruita per l'addestramento:Registro dei contenitori Amazon Elastic (Amazon ECR).

Tratteremo i seguenti passaggi in dettaglio, inclusi frammenti di codice e diagrammi per collegare i punti. Come accennato in precedenza, se ne hai la possibilità, apri il notebook ed esegui le celle di codice passo dopo passo per creare gli artefatti nel tuo ambiente AWS. Non esiste modo migliore di apprendimento attivo.

  1. Per prima cosa caricare e preparare i dati. Noi usiamo Servizio di archiviazione semplice Amazon (Amazon S3) per caricare un file contenente i dati delle nostre cifre scritte a mano.
  2. Successivamente, preparare lo script di training e le dipendenze del framework. Forniamo il codice di training personalizzato in Python, facciamo riferimento ad alcune librerie dipendenti ed effettuiamo un test.
  3. Per definire le metriche degli obiettivi personalizzati, SageMaker ci consente di definire un'espressione regolare per estrarre le metriche di cui abbiamo bisogno dai file di registro del contenitore.
  4. Addestra il modello utilizzando il framework scikit-learn. Facendo riferimento a un'immagine contenitore predefinita, creiamo un oggetto Estimator corrispondente e passiamo il nostro script di training personalizzato.
  5. AMT ci consente di provare varie strategie HPO. Ci concentreremo su due di essi per questo post: ricerca casuale e ricerca bayesiana.
  6. Scegli tra le strategie HPO di SageMaker.
  7. Visualizza, analizza e confronta i risultati dell'ottimizzazione. Il nostro pacchetto di visualizzazione ci consente di scoprire quale strategia funziona meglio e quali valori di iperparametri offrono le migliori prestazioni in base alle nostre metriche.
  8. Continuare l'esplorazione dello spazio degli iperparametri e avviare a caldo i processi HPO.

AMT si occupa del dimensionamento e della gestione dell'infrastruttura di calcolo sottostante su cui eseguire i vari lavori di ottimizzazione Cloud di calcolo elastico di Amazon (Amazon EC2). In questo modo, non dovrai impegnarti a fornire istanze, gestire eventuali problemi relativi al sistema operativo e all'hardware o aggregare file di registro per conto tuo. L'immagine del framework ML viene recuperata da Amazon ECR e gli artefatti del modello, inclusi i risultati dell'ottimizzazione, vengono archiviati in Amazon S3. Tutti i log e le metriche vengono raccolti in Amazon Cloud Watch per un comodo accesso e ulteriori analisi, se necessario.

Prerequisiti

Poiché questa è la continuazione di una serie, se ne consiglia la lettura, ma non necessariamente obbligatoria il nostro primo post su SageMaker AMT e HPO. Oltre a ciò, è utile una familiarità di base con i concetti di ML e la programmazione Python. Ti consigliamo inoltre di seguire ogni passaggio del file quaderno di accompagnamento dal nostro repository GitHub durante la lettura di questo post. Il notebook può essere eseguito indipendentemente dal primo, ma necessita di codice dalle sottocartelle. Assicurati di clonare l'intero repository nel tuo ambiente come descritto nel file README.

Sperimentare con il codice e utilizzare le opzioni di visualizzazione interattiva migliora notevolmente la tua esperienza di apprendimento. Quindi, per favore, dai un'occhiata.

Caricare e preparare i dati

Come primo passo, ci assicuriamo che il file sia scaricato dati in cifre di cui abbiamo bisogno per la formazione è accessibile a SageMaker. Amazon S3 ci consente di farlo in modo sicuro e scalabile. Fate riferimento al notebook per il codice sorgente completo e sentitevi liberi di adattarlo con i vostri dati.

sm_sess = sagemaker.session.Session(boto_session=boto_sess, sagemaker_client=sm)
BUCKET = sm_sess.default_bucket()
PREFIX = 'amt-visualize-demo'
s3_data_url = f's3://{BUCKET}/{PREFIX}/data'
digits = datasets.load_digits()
digits_df = pd.DataFrame(digits.data)
digits_df['y'] = digits.target
digits_df.to_csv('data/digits.csv', index=False)
!aws s3 sync data/ {s3_data_url} —exclude '*' —include 'digits.csv'

I digits.csv il file contiene dati ed etichette sulle funzionalità. Ogni cifra è rappresentata da valori di pixel in un'immagine 8×8, come illustrato dall'immagine seguente per la cifra 4.
Set di dati di cifre da Scikit-learn

Preparare lo script di training e le dipendenze del framework

Ora che i dati sono archiviati nel nostro bucket S3, possiamo definire il nostro script di training personalizzato basato su Scikit-learn in Pitone. SageMaker ci offre la possibilità di fare semplicemente riferimento al file Python in un secondo momento per l'addestramento. Eventuali dipendenze come le librerie Scikit-learn o pandas possono essere fornite in due modi:

  • Possono essere specificati esplicitamente in a requirements.txt filetto
  • Sono preinstallati nell'immagine del contenitore ML sottostante, fornita da SageMaker o creata su misura

Entrambe le opzioni sono generalmente considerate metodi standard per la gestione delle dipendenze, quindi potresti già averne familiarità. SageMaker supporta una varietà di framework ML in un ambiente gestito pronto all'uso. Ciò include molti dei framework di data science e ML più popolari come PyTorch, TensorFlow o Scikit-learn, come nel nostro caso. Non usiamo un ulteriore requirements.txt file, ma sentiti libero di aggiungere alcune librerie per provarlo.

Il codice della nostra implementazione contiene un metodo chiamato fit(), che crea un nuovo classificatore per l'attività di riconoscimento delle cifre e lo addestra. A differenza del nostro primo post in cui utilizzavamo l'algoritmo XGBoost integrato di SageMaker, ora utilizziamo un RandomForestClassifier fornito dalla libreria ML sklearn. La chiamata del fit() Il metodo sull'oggetto classificatore avvia il processo di addestramento utilizzando un sottoinsieme (80%) dei nostri dati CSV:

def fit(train_dir, n_estimators, max_depth, min_samples_leaf, max_features, min_weight_fraction_leaf): digits = pd.read_csv(Path(train_dir)/'digits.csv') Xtrain, Xtest, ytrain, ytest = train_test_split(digits.iloc[:, :-1], digits.iloc[:, -1], test_size=.2) m = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_leaf=min_samples_leaf, max_features=max_features, min_weight_fraction_leaf=min_weight_fraction_leaf) m.fit(Xtrain, ytrain) predicted = m.predict(Xtest) pre, rec, f1, _ = precision_recall_fscore_support(ytest, predicted, pos_label=1, average='weighted') print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}') return m

Vedi lo script completo nel nostro taccuino Jupyter su GitHub.

Prima di avviare le risorse del contenitore per l'intero processo di formazione, hai provato a eseguire direttamente lo script? Questa è una buona pratica per garantire rapidamente che il codice non contenga errori di sintassi, verificare tempestivamente le dimensioni corrispondenti delle strutture dati e altri errori.

Esistono due modi per eseguire il codice localmente. Innanzitutto, puoi eseguirlo subito nel notebook, il che ti consente anche di utilizzare il debugger Python pdb:

# Running the code from within the notebook. It would then be possible to use the Python Debugger, pdb.
from train import fit
fit('data', 100, 10, 1, 'auto', 0.01)

In alternativa, esegui lo script train dalla riga di comando nello stesso modo in cui potresti volerlo utilizzare in un contenitore. Ciò supporta anche l'impostazione di vari parametri e la sovrascrittura dei valori predefiniti secondo necessità, ad esempio:

!cd src && python train.py --train ../data/ --model-dir /tmp/ --n-estimators 100

Come output, puoi vedere i primi risultati delle prestazioni del modello in base alla precisione delle metriche oggettive, al richiamo e al punteggio F1. Per esempio, pre: 0.970 rec: 0.969 f1: 0.969.

Non male per un allenamento così veloce. Ma da dove vengono questi numeri e cosa ne facciamo?

Definire le metriche degli obiettivi personalizzati

Ricorda, il nostro obiettivo è addestrare e ottimizzare completamente il nostro modello in base alle metriche oggettive che consideriamo rilevanti per il nostro compito. Poiché utilizziamo uno script di formazione personalizzato, dobbiamo definire esplicitamente tali parametri per SageMaker.

Il nostro script emette la precisione delle metriche, il richiamo e il punteggio F1 durante l'allenamento semplicemente utilizzando il file print funzione:

print(f'pre: {pre:5.3f} rec: {rec:5.3f} f1: {f1:5.3}')

L'output standard viene acquisito da SageMaker e inviato a CloudWatch come flusso di log. Per recuperare i valori metrici e utilizzarli successivamente in SageMaker AMT, dobbiamo fornire alcune informazioni su come analizzare tale output. Possiamo raggiungere questo obiettivo definendo istruzioni di espressioni regolari (per ulteriori informazioni, fare riferimento a Monitora e analizza i processi di formazione utilizzando le metriche di Amazon CloudWatch):

metric_definitions = [ {'Name': 'valid-precision', 'Regex': r'pre:s+(-?[0-9.]+)'}, {'Name': 'valid-recall', 'Regex': r'rec:s+(-?[0-9.]+)'}, {'Name': 'valid-f1', 'Regex': r'f1:s+(-?[0-9.]+)'}] 

Esaminiamo insieme la prima definizione di metrica nel codice precedente. SageMaker cercherà l'output nel registro che inizia con pre: ed è seguito da uno o più spazi bianchi e poi da un numero che vogliamo estrarre, motivo per cui utilizziamo le parentesi tonde. Ogni volta che SageMaker trova un valore del genere, lo trasforma in un parametro CloudWatch con quel nome valid-precision.

Addestra il modello utilizzando il framework Scikit-learn

Dopo aver creato il nostro script di formazione train.py e istruire SageMaker su come monitorare i parametri all'interno di CloudWatch, definiamo a Estimatore di SageMaker oggetto. Avvia il processo di training e utilizza il tipo di istanza specificato. Ma come può questo tipo di istanza essere diverso da quello eseguito su an Amazon Sage Maker Studio notebook acceso e perché? SageMaker Studio esegue i tuoi processi di training (e inferenza) su istanze di calcolo separate rispetto al tuo notebook. Ciò ti consente di continuare a lavorare sul tuo notebook mentre i lavori vengono eseguiti in background.

Il parametro framework_version si riferisce alla versione Scikit-learn che utilizziamo per il nostro lavoro di formazione. In alternativa possiamo passare image_uri Vai all’email estimator. Puoi verificare se il tuo framework preferito o la libreria ML è disponibile come file immagine Docker SageMaker precostruita e usarlo così com'è o con estensioni.

Inoltre, possiamo eseguire lavori di formazione SageMaker su istanze Spot EC2 impostando use_spot_instances a True. Sono istanze di capacità di riserva che possono risparmiare fino al 90% dei costi. Queste istanze forniscono flessibilità su quando vengono eseguiti i processi di formazione.

estimator = SKLearn( 'train.py', source_dir='src', role=get_execution_role(), instance_type= 'ml.m5.large', instance_count=1, framework_version='0.23-1', metric_definitions=metric_definitions, # Uncomment the following three lines to use Managed Spot Training # use_spot_instances= True, # max_run= 60 * 60 * 24, # max_wait= 60 * 60 * 24, hyperparameters = {'n-estimators': 100, 'max-depth': 10, 'min-samples-leaf': 1, 'max-features': 'auto', 'min-weight-fraction-leaf': 0.1}
)

Dopo aver configurato l'oggetto Estimator, iniziamo l'addestramento chiamando il file fit() funzione, fornendo il percorso al set di dati di addestramento su Amazon S3. Possiamo utilizzare questo stesso metodo per fornire dati di convalida e test. Impostiamo il wait parametro True quindi possiamo utilizzare il modello addestrato nelle celle di codice successive.

estimator.fit({'train': s3_data_url}, wait=True)

Definire gli iperparametri ed eseguire processi di ottimizzazione

Finora abbiamo addestrato il modello con un set di valori di iperparametri. Ma quei valori erano buoni? Oppure potremmo cercarne di migliori? Usiamo il Classe HyperparameterTuner per eseguire una ricerca sistematica nello spazio degli iperparametri. Come cerchiamo questo spazio con il sintonizzatore? I parametri necessari sono il nome della metrica dell'obiettivo e il tipo di obiettivo che guideranno l'ottimizzazione. La strategia di ottimizzazione è un altro argomento chiave per il sintonizzatore perché definisce ulteriormente lo spazio di ricerca. Di seguito sono riportate quattro diverse strategie tra cui scegliere:

  • Ricerca a griglia
  • Ricerca casuale
  • Ottimizzazione bayesiana (impostazione predefinita)
  • Iperbanda

Descriviamo ulteriormente queste strategie e ti forniamo alcune indicazioni per sceglierne una più avanti in questo post.

Prima di definire ed eseguire il nostro oggetto tuner, ricapitoliamo la nostra comprensione dal punto di vista dell'architettura. Abbiamo trattato la panoramica dell'architettura di SageMaker AMT in il nostro ultimo post e ne riproponiamo qui per comodità un estratto.

Architettura di ottimizzazione automatica dei modelli di Amazon SageMaker

Possiamo scegliere quali iperparametri vogliamo ottimizzare o lasciare statici. Per gli iperparametri dinamici, forniamo hyperparameter_ranges che può essere utilizzato per ottimizzare gli iperparametri sintonizzabili. Poiché utilizziamo un classificatore Random Forest, abbiamo utilizzato gli iperparametri del file Documentazione Scikit-learn Random Forest.

Limitiamo inoltre le risorse con il numero massimo di lavori di formazione e lavori di formazione paralleli che il sintonizzatore può utilizzare. Vedremo come questi limiti ci aiutano a confrontare tra loro i risultati delle varie strategie.

tuner_parameters = { 'estimator': estimator, 'base_tuning_job_name': 'random', 'metric_definitions': metric_definitions, 'objective_metric_name': 'valid-f1', 'objective_type': 'Maximize', 'hyperparameter_ranges': hpt_ranges, 'strategy': 'Random', 'max_jobs': n, # 50 'max_parallel_jobs': k # 2 } 

Simile a quello dello stimatore fit funzione, iniziamo un lavoro di ottimizzazione chiamando il sintonizzatore fit:

random_tuner = HyperparameterTuner(**tuner_parameters)
random_tuner.fit({'train': s3_data_url}, wait=False)

Questo è tutto ciò che dobbiamo fare per consentire a SageMaker di eseguire i lavori di formazione (n=50) in background, ciascuno utilizzando un diverso set di iperparametri. Esploreremo i risultati più avanti in questo post. Ma prima, iniziamo un altro lavoro di messa a punto, questa volta applicando la strategia di ottimizzazione bayesiana. Confronteremo visivamente entrambe le strategie dopo il loro completamento.

tuner_parameters['strategy'] = 'Bayesian'
tuner_parameters['base_tuning_job_name'] = 'bayesian'
bayesian_tuner = HyperparameterTuner(**tuner_parameters)
bayesian_tuner.fit({'train': s3_data_url}, wait=False)

Tieni presente che entrambi i processi di ottimizzazione possono essere eseguiti in parallelo perché SageMaker orchestra le istanze di calcolo richieste indipendentemente l'una dall'altra. Ciò è molto utile per i professionisti che sperimentano approcci diversi allo stesso tempo, come facciamo qui.

Scegli tra le strategie HPO di SageMaker

Quando si tratta di ottimizzare le strategie, con SageMaker AMT hai alcune opzioni: ricerca su griglia, ricerca casuale, ottimizzazione bayesiana e iperbanda. Queste strategie determinano il modo in cui gli algoritmi di ottimizzazione automatica esplorano gli intervalli specificati di iperparametri.

La ricerca casuale è piuttosto semplice. Seleziona casualmente combinazioni di valori dagli intervalli specificati e può essere eseguito in modo sequenziale o parallelo. È come lanciare freccette con gli occhi bendati, sperando di colpire il bersaglio. Abbiamo iniziato con questa strategia, ma con un’altra i risultati miglioreranno?

L'ottimizzazione bayesiana adotta un approccio diverso rispetto alla ricerca casuale. Considera la cronologia delle selezioni precedenti e sceglie i valori che probabilmente produrranno i migliori risultati. Se vuoi imparare dalle esplorazioni precedenti, puoi raggiungere questo obiettivo solo eseguendo un nuovo lavoro di ottimizzazione dopo quelli precedenti. Ha senso, vero? In questo modo, l'ottimizzazione bayesiana dipende dalle esecuzioni precedenti. Ma vedi quale strategia HPO consente una maggiore parallelizzazione?

Iperbanda è interessante! Utilizza una strategia multi-fedeltà, il che significa che alloca dinamicamente le risorse ai lavori di formazione più promettenti e blocca quelli che hanno prestazioni inferiori. Pertanto, Hyperband è computazionalmente efficiente con le risorse, imparando da precedenti lavori di formazione. Dopo aver interrotto le configurazioni con prestazioni inferiori, viene avviata una nuova configurazione i cui valori vengono scelti in modo casuale.

A seconda delle tue esigenze e della natura del tuo modello, puoi scegliere tra ricerca casuale, ottimizzazione bayesiana o iperbanda come strategia di ottimizzazione. Ognuno ha il proprio approccio e vantaggi, quindi è importante considerare quale funziona meglio per la tua esplorazione del machine learning. La buona notizia per i professionisti del machine learning è che è possibile selezionare la migliore strategia HPO confrontando visivamente l'impatto di ciascuna sperimentazione sulla metrica oggettiva. Nella sezione successiva, vediamo come identificare visivamente l’impatto delle diverse strategie.

Visualizza, analizza e confronta i risultati dell'ottimizzazione

Quando i nostri lavori di messa a punto sono completi, diventa emozionante. Quali risultati forniscono? Che tipo di incremento puoi aspettarti sulla nostra metrica rispetto al tuo modello base? Quali sono gli iperparametri più performanti per il nostro caso d'uso?

Un modo rapido e semplice per visualizzare i risultati HPO è visitare la console SageMaker. Sotto Lavori di ottimizzazione degli iperparametri, possiamo vedere (per processo di ottimizzazione) la combinazione di valori di iperparametri che sono stati testati e hanno fornito le migliori prestazioni misurate dalla nostra metrica oggettiva (valid-f1).

Metriche per i processi di ottimizzazione degli iperparametri

È tutto ciò di cui hai bisogno? In qualità di professionista del ML, potresti non solo essere interessato a questi valori, ma sicuramente voler saperne di più sul funzionamento interno del tuo modello per esplorarne tutto il potenziale e rafforzare la tua intuizione con feedback empirico.

Un buon strumento di visualizzazione può aiutarti notevolmente a comprendere il miglioramento apportato da HPO nel tempo e ottenere feedback empirico sulle decisioni di progettazione del tuo modello ML. Mostra l'impatto di ogni singolo iperparametro sulla metrica oggettiva e fornisce indicazioni per ottimizzare ulteriormente i risultati dell'ottimizzazione.

Usiamo il amtviz pacchetto di visualizzazione personalizzato per visualizzare e analizzare i lavori di ottimizzazione. È semplice da usare e fornisce funzionalità utili. Dimostriamo i suoi vantaggi interpretando alcuni grafici individuali e infine confrontando la ricerca casuale con l'ottimizzazione bayesiana.

Innanzitutto, creiamo una visualizzazione per la ricerca casuale. Possiamo farlo chiamando visualize_tuning_job() da amtviz e passando il nostro primo oggetto tuner come argomento:

from amtviz import visualize_tuning_job
visualize_tuning_job(random_tuner, advanced=True, trials_only=True)

Vedrai un paio di grafici, ma procediamo per gradi. Il primo grafico a dispersione dell'output è simile al seguente e ci fornisce già alcuni indizi visivi che non riconosceremmo in nessuna tabella.

Risultati del processo di ottimizzazione degli iperparametri

Ogni punto rappresenta la prestazione di un lavoro di formazione individuale (il nostro obiettivo valid-f1 sull'asse y) in base al suo tempo di inizio (asse x), prodotto da un insieme specifico di iperparametri. Pertanto, esaminiamo le prestazioni del nostro modello man mano che progredisce nel corso della durata del lavoro di ottimizzazione.

La linea tratteggiata evidenzia il miglior risultato riscontrato finora e indica il miglioramento nel tempo. I migliori due lavori di formazione hanno ottenuto un punteggio F1 di circa 0.91.

Oltre alla linea tratteggiata che mostra il progresso cumulativo, vedi una tendenza nel grafico?

Probabilmente no. E questo è previsto, perché stiamo visualizzando i risultati della strategia HPO casuale. Ogni processo di training è stato eseguito utilizzando un set di iperparametri diverso ma selezionato casualmente. Se continuassimo il nostro lavoro di messa a punto (o ne eseguissimo un altro con la stessa impostazione), probabilmente vedremmo risultati migliori nel tempo, ma non possiamo esserne sicuri. La casualità è una cosa complicata.

I grafici successivi ti aiutano a valutare l'influenza degli iperparametri sulle prestazioni complessive. Vengono visualizzati tutti gli iperparametri, ma per brevità ci concentriamo su due di essi: n-estimators ed max-depth.

Dettagli sui processi iperparametrici

I nostri due principali lavori di formazione stavano utilizzando n-estimators di circa 20 e 80, e max-depth rispettivamente di circa 10 e 18. I valori esatti degli iperparametri vengono visualizzati tramite descrizione comando per ciascun punto (lavoro di training). Sono anche evidenziati dinamicamente in tutti i grafici e ti offrono una visione multidimensionale! Hai visto che? Ogni iperparametro viene tracciato rispetto alla metrica oggettiva, come un grafico separato.

Ora, che tipo di intuizioni otteniamo? n-estimators?

In base al grafico a sinistra, sembra che intervalli di valori molto bassi (sotto 10) forniscano più spesso risultati scarsi rispetto a valori più alti. Pertanto, valori più alti possono aiutare il tuo modello a funzionare meglio: interessante.

Al contrario, la correlazione di max-depth iperparametro rispetto alla nostra metrica oggettiva è piuttosto basso. Non possiamo dire chiaramente quali intervalli di valori abbiano il rendimento migliore da una prospettiva generale.

In sintesi, la ricerca casuale può aiutarti a trovare un insieme di iperparametri con buone prestazioni anche in un periodo di tempo relativamente breve. Inoltre, non è sbilanciato verso una buona soluzione ma offre una visione equilibrata dello spazio di ricerca. L'utilizzo delle risorse, tuttavia, potrebbe non essere molto efficiente. Continua a eseguire lavori di training con iperparametri in intervalli di valori noti per fornire scarsi risultati.

Esaminiamo i risultati del nostro secondo lavoro di ottimizzazione utilizzando l'ottimizzazione bayesiana. Possiamo usare amtviz per visualizzare i risultati nello stesso modo in cui abbiamo fatto finora per il sintonizzatore di ricerca casuale. Oppure, ancora meglio, possiamo sfruttare la capacità della funzione per confrontare entrambi i lavori di ottimizzazione in un unico set di grafici. Abbastanza utile!

visualize_tuning_job([random_tuner, bayesian_tuner], advanced=True, trials_only=True)

Lavoro di ottimizzazione degli iperparametri Bayesiano VS casuale

Ora ci sono più punti perché visualizziamo i risultati di tutti i lavori di training sia per la ricerca casuale (punti arancioni) che per l'ottimizzazione bayesiana (punti blu). Sul lato destro puoi vedere un grafico della densità che visualizza la distribuzione di tutti i punteggi F1. La maggior parte dei lavori di formazione ha ottenuto risultati nella parte alta della scala F1 (oltre 0.6): questo è positivo!

Qual è il punto chiave qui? Il grafico a dispersione mostra chiaramente i vantaggi dell'ottimizzazione bayesiana. Fornisce risultati migliori nel tempo perché può imparare dalle esecuzioni precedenti. Ecco perché abbiamo ottenuto risultati significativamente migliori utilizzando il metodo bayesiano rispetto a quello casuale (0.967 contro 0.919) con lo stesso numero di processi di addestramento.

C'è ancora di più che puoi fare con amtviz. Approfondiamo.

Se dai a SageMaker AMT l'istruzione di eseguire un numero maggiore di lavori per l'ottimizzazione, vedere molte prove contemporaneamente può creare confusione. Questo è uno dei motivi per cui abbiamo reso questi grafici interattivi. È possibile fare clic e trascinare su ogni grafico a dispersione degli iperparametri per ingrandire determinati intervalli di valori e perfezionare l'interpretazione visiva dei risultati. Tutti gli altri grafici vengono aggiornati automaticamente. È piuttosto utile, vero? Guarda i grafici successivi come esempio e provalo tu stesso sul tuo quaderno!

Funzionalità di visualizzazione del lavoro di ottimizzazione degli iperparametri

In qualità di massimalista di ottimizzazione, potresti anche decidere che l'esecuzione di un altro processo di ottimizzazione degli iperparametri potrebbe migliorare ulteriormente le prestazioni del tuo modello. Ma questa volta è possibile esplorare un intervallo più specifico di valori degli iperparametri perché si sa già (approssimativamente) dove aspettarsi risultati migliori. Ad esempio, puoi scegliere di concentrarti su valori compresi tra 100 e 200 per n-estimators, come mostrato nel grafico. Ciò consente ad AMT di concentrarsi sui lavori di formazione più promettenti e aumenta l'efficienza della messa a punto.

Riassumendo, amtviz fornisce un ricco set di funzionalità di visualizzazione che ti consentono di comprendere meglio l'impatto degli iperparametri del tuo modello sulle prestazioni e di consentire decisioni più intelligenti nelle attività di ottimizzazione.

Continuare l'esplorazione dello spazio degli iperparametri e avviare a caldo i processi HPO

Abbiamo visto che AMT ci aiuta a esplorare in modo efficiente lo spazio di ricerca degli iperparametri. Ma cosa succede se abbiamo bisogno di più cicli di messa a punto per migliorare in modo iterativo i nostri risultati? Come accennato all'inizio, vogliamo stabilire un ciclo di feedback sull'ottimizzazione: la nostra "conversazione" con il modello. Dobbiamo ricominciare da capo ogni volta?

Esaminiamo il concetto di esecuzione di a processo di ottimizzazione degli iperparametri con avvio a caldo. Non avvia nuovi lavori di ottimizzazione da zero, riutilizza ciò che è stato appreso nelle precedenti esecuzioni HPO. Questo ci aiuta a essere più efficienti con i tempi di ottimizzazione e le risorse di calcolo. Possiamo ripetere ulteriormente i nostri risultati precedenti. Per utilizzare gli avviamenti a caldo, creiamo a WarmStartConfig e specificare warm_start_type as IDENTICAL_DATA_AND_ALGORITHM. Ciò significa che modifichiamo i valori degli iperparametri ma non modifichiamo i dati o l'algoritmo. Diciamo ad AMT di trasferire le conoscenze precedenti al nostro nuovo lavoro di ottimizzazione.

Facendo riferimento ai nostri precedenti lavori di ottimizzazione bayesiana e di ottimizzazione della ricerca casuale come parents, possiamo usarli entrambi per l'avvio a caldo:

warm_start_config = WarmStartConfig(warm_start_type=WarmStartTypes.IDENTICAL_DATA_AND_ALGORITHM, parents=[bayesian_tuner_name, random_tuner_name])
tuner_parameters['warm_start_config'] = warm_start_config

Per verificare i vantaggi derivanti dall'utilizzo degli avviamenti a caldo, fare riferimento ai grafici seguenti. Questi sono generati da amtviz in modo simile a quello fatto in precedenza, ma questa volta abbiamo aggiunto un altro lavoro di messa a punto basato su un avvio a caldo.

Avvio a caldo del processo di ottimizzazione degli iperparametri

Nel grafico a sinistra, possiamo osservare che i nuovi lavori di ottimizzazione si trovano principalmente nell'angolo in alto a destra del grafico della metrica delle prestazioni (vedi punti contrassegnati in arancione). La partenza a caldo ha effettivamente riutilizzato i risultati precedenti, motivo per cui questi punti dati sono tra i migliori risultati per il punteggio F1. Questo miglioramento si riflette anche nel grafico della densità a destra.

In altre parole, AMT seleziona automaticamente insiemi promettenti di valori di iperparametri in base alle conoscenze acquisite da prove precedenti. Questo è mostrato nel grafico successivo. Ad esempio, l'algoritmo testerebbe un valore basso per n-estimators meno spesso perché è noto che producono punteggi F1 scarsi. Non sprechiamo risorse in questo senso, grazie alle partenze calde.

Lavori visualizzati per l'ottimizzazione degli iperparametri

ripulire

Per evitare di incorrere in costi indesiderati quando hai finito di sperimentare con HPO, devi rimuovere tutti i file nel tuo bucket S3 con il prefisso amt-visualize-demo e anche chiudere le risorse di SageMaker Studio.

Esegui il seguente codice sul tuo notebook per rimuovere tutti i file S3 da questo post:

!aws s3 rm s3://{BUCKET}/amt-visualize-demo --recursive

Se si desidera conservare i set di dati o gli artefatti del modello, è possibile modificare il prefisso nel codice a amt-visualize-demo/data cancellare solo i dati o amt-visualize-demo/output per eliminare solo gli artefatti del modello.

Conclusione

Abbiamo imparato come l'arte di creare soluzioni ML implica l'esplorazione e l'ottimizzazione degli iperparametri. La regolazione di manopole e leve è un processo impegnativo ma gratificante che porta a tempi di addestramento più rapidi, maggiore precisione del modello e soluzioni ML complessivamente migliori. La funzionalità AMT di SageMaker ci aiuta a eseguire più processi di ottimizzazione e ad avviarli a caldo e fornisce punti dati per ulteriori revisioni, confronti visivi e analisi.

In questo post abbiamo esaminato le strategie HPO che utilizziamo con SageMaker AMT. Abbiamo iniziato con la ricerca casuale, una strategia semplice ma efficace in cui gli iperparametri vengono campionati casualmente da uno spazio di ricerca. Successivamente, abbiamo confrontato i risultati con l’ottimizzazione bayesiana, che utilizza modelli probabilistici per guidare la ricerca di iperparametri ottimali. Dopo aver identificato una strategia HPO adeguata e buoni intervalli di valori degli iperparametri attraverso le prove iniziali, abbiamo mostrato come utilizzare gli avvii a caldo per semplificare i futuri lavori HPO.

È possibile esplorare lo spazio di ricerca degli iperparametri confrontando i risultati quantitativi. Abbiamo suggerito il confronto visivo fianco a fianco e fornito il pacchetto necessario per l'esplorazione interattiva. Facci sapere nei commenti quanto ti è stato utile nel tuo percorso di ottimizzazione degli iperparametri!


Circa gli autori

Uemit YoldasUmit Yoldas è un Senior Solutions Architect presso Amazon Web Services. Lavora con clienti aziendali in tutti i settori in Germania. Il suo obiettivo è tradurre i concetti di intelligenza artificiale in soluzioni del mondo reale. Al di fuori del lavoro, gli piace trascorrere del tempo con la famiglia, assaporare il buon cibo e perseguire la forma fisica.

Elina LesykElina Lesyk è un Solutions Architect con sede a Monaco. Il suo focus è sui clienti aziendali del settore dei servizi finanziari. Nel tempo libero, puoi trovare Elina che crea applicazioni con intelligenza artificiale generativa in alcuni incontri IT, che porta avanti una nuova idea su come risolvere rapidamente il cambiamento climatico o che corre nella foresta per prepararsi a una mezza maratona con una tipica deviazione dal programma pianificato.

Campo MarianoMariano Campi è un Principal Solutions Architect presso Amazon Web Services. Lavora con banche e compagnie assicurative in Germania sull'apprendimento automatico. Nel tempo libero Mariano ama fare escursioni con la moglie.

Timestamp:

Di più da Apprendimento automatico di AWS