Aprile 2019

Volume 34 Numero 4

[Confidential computing di Azure]

Proteggi Machine Learning a più utenti con il Confidential computing di Azure

Dal Stefano Tempesta

La sicurezza è un requisito prioritario durante l'implementazione di soluzioni di business ospitate in un cloud pubblico, in particolare quando i dati sensibili e la proprietà intellettuale vengono archiviate come parte della soluzione stessa. Esistono procedure consigliate del settore già per la protezione dei dati inattivi e in transito, ma è anche necessario proteggere i dati da accessi non autorizzati quando è in uso. Azure computing riservati (bit.ly/2BxQkpp) fornisce un nuovo livello di crittografia e protezione dei dati durante l'elaborazione dei dati, uso di ambienti di esecuzione Trusted (TTEs). Tee vengono implementati all'hardware o software (hypervisor) di livello e specificare un processore protetto e lo spazio di memoria in cui il codice e dati eseguibili in isolamento completo da all'esterno delle applicazioni e sistemi. Tee assicurarsi che non è possibile visualizzare i dati o le operazioni all'interno dall'esterno, anche con un debugger. Assicurano anche che solo il codice autorizzato è consentito accedere ai dati. Se il codice viene modificato o manomesso, vengono negate le operazioni e l'ambiente è disabilitato. Il TEE Applica queste protezioni in tutta l'esecuzione del codice in esso contenuti.

SQL Server Always Encrypted con zone franche sicure

Nel mio articolo precedente, "Protezione di dati con Azure riservati Computing" (msdn.com/magazine/mt833273), ho presentato Azure computing riservatezza e il SDK di Enclave aperto per la compilazione di applicazioni software che vengono eseguite codice protetto e i dati in un ambiente di esecuzione affidabile. La stessa tecnologia è in uso per Database SQL di Azure e SQL Server. Si tratta di un miglioramento della funzionalità Always Encrypted, che assicura che i dati sensibili all'interno di un database SQL possono essere crittografati a tutte le volte senza compromettere la funzionalità di query SQL. Sempre crittografato con zone franche Secure fa tutto questo eseguendo delega calcoli sui dati riservati a un'enclave, in cui i dati sono in modo sicuro decrittografati ed elaborati. Disponibile con SQL Server 2019, la tecnologia di enclave adottato, denominata sicurezza basato su virtualizzazione (VBS), consente di isolare un'area di memoria nello spazio degli indirizzi di un processo utente-modalità che è completamente invisibile a tutti gli altri processi e al sistema operativo Windows di macchina. Gli amministratori di anche macchine non sono in grado di visualizzare la memoria dell'enclave. Figura 1illustra ciò che un amministratore verrebbe visualizzato quando si esplorano la memoria di enclave con un debugger (si noti contrassegna la domanda, anziché il contenuto effettivo della memoria).

Esplorazione di una virtualizzazione basato su Enclave di sicurezza con WinDbg
Figura 1 una virtualizzazione di esplorazione basato su Enclave di sicurezza con WinDbg

È illustrato il modo in cui la funzionalità avanzata di Always Encrypted Usa zone franche figura 2. L'istanza di SQL Server contiene un'enclave, caricata con il codice per eseguire la crittografia dei dati, nonché il codice implementa operazioni SQL. Prima di inviare una query al motore di SQL Server per l'elaborazione, il driver SQL usato dall'applicazione client invia le chiavi di crittografia all'enclave tramite un canale sicuro. Quando l'elaborazione delle query, il motore di SQL Server esegue queste operazioni direttamente all'interno dell'enclave, in cui i dati sono in modo sicuro decrittografati ed elaborati. Dati non oltrepassino mai l'enclave non crittografato.

Comunicazione con SQL Server è sempre crittografata con zone franche sicure
Figura 2 comunicazioni con SQL Server sono sempre crittografate con zone franche sicure

Non tutti i dati in una tabella di database richiede la crittografia. Colonne specifiche possono essere identificate per la protezione dei dati in un'enclave. Durante l'analisi di una query SQL, il motore di SQL Server determina se la query contiene qualsiasi operazione sui dati crittografati che richiedono l'uso dell'enclave protetta. Per le query in cui deve avvenire l'enclave protetta, il driver del client invia le chiavi di crittografia per le colonne della tabella specifico necessarie per le operazioni per l'enclave protetta e quindi invia la query per l'esecuzione con la query crittografata parametri. I dati contenuti nelle colonne protette identificato non viene mai esposto in chiaro di fuori dell'enclave. SQL Server decrittografa i dati contenuti in queste colonne solo all'interno dell'enclave protetta. Se la query contiene parametri nelle colonne protette, questi parametri vengono decrittografati anche all'interno dell'enclave prima dell'esecuzione di query.

Le colonne che contengono dati sensibili per la crittografia possono essere identificate con un'istruzione ALTER COLUMN. Questa istruzione viene eseguita all'interno dell'enclave. Non è necessario per spostare i dati all'esterno del database per la crittografia iniziale o per altre modifiche dello schema correlati alla crittografia. Ciò migliora notevolmente le prestazioni e affidabilità di tali operazioni e non richiede particolari strumenti lato client. Supponendo che si vuole proteggere l'età dei pazienti, contenuti nella colonna Age della tabella di database MedicalRecords, l'istruzione seguente consente di crittografare dati in tale colonna con l'algoritmo di crittografia AES-256:

ALTER TABLE [dbo].[MedicalRecords]
ALTER COLUMN [Age] [char](11)
ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1],
  ENCRYPTION_TYPE = Randomized,
  ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
GO

È possibile trovare una documentazione completa sulle funzionalità nuove e su come iniziare a usare Always Encrypted con zone franche Secure a aka.ms/AlwaysEncryptedwithSecureEnclaves.

Origini dei dati sensibili più parti

Oltre a SQL Server, è possibile che un esteso per applicazioni di Azure di elaborazione riservate in numerosi settori, tra cui finanziari, vendita al dettaglio, per enti pubblici e assistenza sanitaria. Le organizzazioni anche concorrenti possono trarre vantaggio dal pool i set di dati privati, training modelli di machine learning sui dati di aggregazione per ottenere una maggiore precisione della stima. Ad esempio, istituti di integrità è stato possibile collaborare condividendo i dati dei pazienti privati, come le sequenze di genomiche e record medici, per ottenere informazioni più dettagliate da machine learning in più set di dati, senza il rischio di dati vengano trasferiti ad altre organizzazioni. La presenza di più dati per il training su consente algoritmi di machine learning generare modelli migliori. Computing riservato può essere usato per la privacy: più entità sfruttare un comune servizio machine learning da eseguire sui dati aggregati. Anche se preferibile institutes integrità, in questo caso d'uso, non i propri set di dati devono essere condivisi con qualsiasi altra parte, possano ogni caricare i dati crittografati in un'enclave, eseguire attestazione remota, eseguire il codice di apprendimento e, infine, scaricare il modello di apprendimento automatico crittografato. Il modello può essere conservato anche all'interno dell'enclave per la valutazione sicura da tutte le entità, soggetto alle loro criteri di controllo di accesso concordata.

Figura 3 offre una panoramica di tale sistema. Ospedali più crittografano set di dati dei pazienti, ognuno con una chiave diversa. Gli ospedali distribuire un concordati algoritmo di machine learning in una enclave in un Data Center nel cloud e condividono le chiavi di dati con l'enclave. L'enclave elabora il set di dati di aggregazione e restituisce un modello di apprendimento automatico crittografato.

Proteggere più parti di Machine Learning
Figura 3 proteggere più parti di Machine Learning

In questo scenario, dati sensibili archiviati in un database di SQL Server con Always Encrypted con zone franche Secure è condiviso con un servizio di machine learning che viene eseguito in un TTE. Le organizzazioni usano il SDK di Apri Enclave (openenclave.io) per creare applicazioni di C o C++ portabile rispetto a tipi diversi di enclave. Con il SDK, sono inoltre sfruttare i vantaggi dell'enclave la creazione e la gestione, le primitive di sistema, il supporto di runtime e il supporto della libreria di crittografia usando un'API coerente e un'astrazione enclaving. Di machine learning i vantaggi dell'applicazione da combina più origini dati per produrre migliori training dei modelli. Come i dati sono protetto da SQL Server, è responsabilità del motore di SQL per eseguire l'autenticazione di machine learning enclave prima di condividere i dati con esso. Una volta effettuata questa attestazione, dati viene decrittografato e sarà visibile esclusivamente per il codice, di apprendimento automatico senza rivelare ad altre applicazioni, anche se in esecuzione nella stessa macchina virtuale o il servizio app oppure la piattaforma cloud di hosting.

Attestazione dell'enclave

L'enclave protetta all'interno del motore di SQL Server può accedere ai dati sensibili archiviati nelle colonne crittografate del database e le chiavi di crittografia di colonna corrispondente. Ma prima che un'applicazione può inviare una query SQL che include i calcoli enclave a SQL Server, è necessario verificare che l'enclave sia un'enclave originale basata su una determinata tecnologia, ovvero VBS, ad esempio, e il codice in esecuzione all'interno dell'enclave è stato firmato correttamente. Il processo di verifica dell'enclave viene chiamato l'attestazione dell'enclave e, nel caso di SQL Server, che implica il driver del client SQL usato dall'applicazione client per contattare un servizio di attestazione esterno. Le specifiche del processo di attestazione variano a seconda della tecnologia di enclave e il servizio di attestazione. Il processo di attestazione che supporta SQL Server per zone franche sicure VBS in SQL Server 2019 viene chiamato l'attestazione di runtime di Guard di sistema di Windows Defender, che Usa servizio sorveglianza Host (HGS) come un servizio di attestazione. È necessario configurare il servizio HGS nell'ambiente in uso e registrare il computer che ospita l'istanza di SQL Server nel servizio HGS. È anche necessario configurare le applicazioni client con una verifica di attestazione di HGS.

Per stabilire l'attendibilità tra le parti, zone franche VBS espongono un report di attestazione dell'enclave completamente firmato da una chiave univoca con VBS. Un servizio di attestazione Usa questo report per stabilire una relazione di trust tra un'applicazione client e un'enclave. L'attestazione comporta essenzialmente, il report dell'enclave, ovvero come prova dell'identità e l'integrità dell'applicazione TEE sia la prova di integrità della piattaforma (che include le misurazioni di host e TEE). La chiave univoca VBS viene usata per collegare i due perché viene usata per firmare il report e viene archiviata nelle misurazioni. HGS convalida le misurazioni di piattaforma e genera un certificato di integrità con la chiave in esso. Quindi il client convalida l'intero report utilizzando la chiave VBS, convalida la chiave VBS utilizzando il certificato di integrità e infine convalida inoltre il certificato di integrità rilasciato dal servizio HGS considera attendibile. Un'enclave Ottiene le chiavi per crittografare e decrittografare i dati tramite un tunnel sicuro stabilito per il driver del client e l'enclave stesso. Viene generata una chiave di sessione per la comunicazione tramite questo canale. Quindi, il driver client crittografa la chiave di crittografia di colonne con la chiave di sessione e segni e invia le query SQL che richiedono i calcoli enclave. Figura 4estende il protocollo di comunicazione di SQL Server Always Encrypted con zone franche sicura all'utilizzo di un servizio di attestazione.

Attestazione dell'enclave per un Database SQL Server
Attestazione dell'Enclave nella figura 4 per un Database SQL Server

Per usare Always Encrypted con zone franche protette, un'applicazione deve usare un driver client che supporta la funzionalità. In SQL Server 2019, le applicazioni devono utilizzare .NET Framework 4.6 o versione successiva e Provider di dati .NET Framework per SQL Server. Inoltre, le applicazioni .NET devono essere configurate con un provider di enclave protetta specifico per il tipo di enclave (ad esempio VBS) e il servizio di attestazione (ad esempio, HGS), in uso. I provider di enclave supportati sono forniti separatamente in un pacchetto NuGet, che è necessario integrare con l'applicazione. Un provider di enclave implementa la logica lato client per il protocollo di attestazione e per stabilire un canale sicuro con un'enclave protetta di un determinato tipo. Always Encrypted non è attualmente supportato in .NET Core.

È possibile trovare istruzioni dettagliate per la configurazione di SQL Server Always Encrypted con zone franche sicure usando SQL Server Management Studio (SSMS) dell'esercitazione bit.ly/2Xig9nr. L'esercitazione illustra l'installazione di un computer HGS per l'esecuzione di HGS per supportare l'attestazione chiave host e quindi la configurazione di SQL Server come host sorvegliato registrato con HGS usando l'attestazione chiave host. Si noti che lo scopo dell'esercitazione consiste nel creare un ambiente semplice solo a scopo di test. Attestazione chiave host è consigliato per utilizzarlo in ambienti di test. È consigliabile usare l'attestazione di modulo TPM (Trusted Platform) per gli ambienti di produzione. TPM è una tecnologia progettata per fornire funzioni di sicurezza basato su hardware. Un chip TPM è un processore di crittografia sicuro progettato specificamente per eseguire le operazioni di crittografia direttamente all'interno della CPU. Il chip include diversi meccanismi di sicurezza fisica per renderlo resistente alle manomissioni per le applicazioni software. Se si è interessati a conoscere ulteriori informazioni su come inizializzare HGS usando l'attestazione TPM e TPM, è possibile iniziare con bit.ly/2T3lVuN.

Per connettersi a un'istanza di SQL Server Always Encrypted, la stringa di connessione dell'applicazione client deve includere due parametri aggiuntivi:

  • Column Encryption Setting = abilitata
  • URL di attestazione enclave = https: / / < Your-HGS-Server > / attestazione

Ad esempio, la stringa di connessione per un'applicazione .NET sarà simile alla seguente impostazione:

<connectionStrings>
  <add name="DataConnection" connectionString="Data Source=.;
    Initial Catalog=[Database Name]; Integrated Security=true;
      Column Encryption Setting = Enabled;
        Enclave Attestation URL=https://[Your-HGS-Server]/Attestation" />
</connectionStrings>

Esecuzione di stime in Machine Learning

L'applicazione di machine learning che in questo articolo sto presentazione viene compilato con a ML.NET (dot.net/ml), un open source e multipiattaforma con framework di machine learning per .NET. Attualmente è ancora in fase di sviluppo, a ML.NET consente attività di machine learning, come la classificazione e regressione. Il framework espone anche le API per modelli di training, nonché i componenti di base, ad esempio le strutture di dati, trasformazioni e algoritmi di apprendimento automatico.

Per il caso d'uso sanitaria, l'applicazione implementa un'attività di classificazione multiclasse che classifica i pazienti in gruppi in base alla probabilità di apprendimento verrà sviluppato una malattia specifica (per rendere le cose meno i in questo caso, si farà riferimento a un una malattia generica anziché naming in modo specifico uno). Come anticipato nella descrizione di questo scenario di origine dati di più parti, integrità institutes condividere i set di dati crittografati, che contiene tutte le funzionalità necessarie per il training di un modello.

Il codice di apprendimento è un'API Web sviluppata in C#. Nella soluzione Visual Studio, aggiungere un riferimento al pacchetto Microsoft.ML NuGet. Questo pacchetto contiene la libreria a ML.NET e gli spazi dei nomi pertinenti da aggiungere all'applicazione:

using Microsoft.ML;
using Microsoft.ML.Core.Data;
using Microsoft.ML.Data;

La soluzione API Web implementa il metodo POST, solo che accetta un payload JSON che descrive un record mediche. La classe MedicalRecord nella soluzione, illustrata nella figura 5, identifica tutte le funzionalità dal motore a ML.NET. Il rischio è l'etichetta del set di dati; è il valore su cui si è in corso sottoposto a training.

Figura 5 la classe MedicalRecord

public class MedicalRecord
{
  public float Risk { get; set; }
  public int Age { get; set; }
  public int Sex { get; set; }                // 0 = Female, 1 = Male
  public bool Smoker { get; set; }
  public ChestPainType ChestPain { get; set; }
  public int BloodPressure { get; set; }      // In mm Hg on admission to
                                              // the hospital
  public int SerumCholestoral { get; set; }   // In mg/dl
  public bool FastingBloodSugar { get; set; } // True if > 120 mg/dl
  public int MaxHeartRate { get; set; }       // Maximum heart rate achieved
}
public enum ChestPainType
{
  TypicalAngina = 1,
  AtypicalAngina,
  NonAnginal,
  Asymptomatic
}

La richiesta di messaggio JSON presuppone che il formato seguente:

{
  "risk": 0.0,
  "age": 0,
  "sex": 0,
  "smoker": false,
  "chestPain": 0,
  "bloodPressure": 0,
  "serumCholestoral": 0,
  "fastingBloodSugar": false,
  "maxHeartRate": 0
}

La classe classificazione implementa l'attività di classificazione multiclasse che, dato un record mediche input e assegna tale paziente in una classe di rischio di Contraendo malattia. Questo processo sviluppa tramite i quattro passaggi seguenti:

  1. Creare un'istanza di un oggetto MLContext che rappresenta la classe del contesto a ML.NET.
  2. Training modello basato su set di dati cronologici disponibili in SQL Server (e protetto all'interno di una enclave).
  3. Valutare il modello.
  4. Assegnare un punteggio.

L'output viene restituito all'applicazione client (l'institute integrità) sotto forma di una risposta JSON:

{
  "score": 0.0,
  "accuracy": 0.0
}

Ma andiamo in ordine e descrivono ogni passaggio di machine learning di codice. Il primo passaggio consiste nel creare un'istanza di MLContext come parte della classe di classificazione, con un valore di inizializzazione casuale (valore di inizializzazione: 0) per ottenere risultati ripetibili e deterministici tra più sessioni di formazione. MLContext è l'oggetto di riferimento per l'accesso ai dati di origine e modelli con training, nonché il pertinenti di machine learning trasformatori e businesss:

public Classification()
{
  _context = new MLContext(seed: 0);
}
private MLContext _context;

Il passaggio successivo nel processo di apprendimento è training del modello, come illustrato nella figura 6. Questo è il passaggio che carica i dati dal database di SQL Server nell'enclave protetta. Viene creata una connessione a SQL Server usando la classe SqlConnection, che funziona internamente l'attestazione e la comunicazione con l'enclave tramite un canale sicuro.

Figura 6 Training del modello

public IEnumerable<MedicalRecord> ReadData(int split = 100)
{
  IEnumerable<MedicalRecord> medicalRecords = new List<MedicalRecord>();
  using (var connection = new SqlConnection(ConnectionString))
  {
    connection.Open();
    using (SqlCommand cmd = connection.CreateCommand())
    {
      cmd.CommandText = SqlQuery(split);
      using (SqlDataReader reader = cmd.ExecuteReader())
      {
        if (reader.HasRows)
        {
          while (reader.Read())
          {
            medicalRecords.Append(ReadMedicalRecord(reader));
          }
        }
      }
    }
  }
  return medicalRecords;
}

Si noti il parametro di divisione che è stato usato per selezionare una percentuale dei record dal database, utilizzando la funzionalità tablesample in SQL Server. Training e valutazione di un modello richiedono un subset di dati diverso come input. Una buona approssimazione consiste nell'allocare l'80% dei dati per il training, a seconda della qualità. Maggiore sarà la qualità dell'input, migliore sarà l'accuratezza della stima:

private static string SqlQuery(int split) =>
  $"SELECT [Age], [Sex], [Smoker], [ChestPain],
    [BloodPressure], [SerumCholestoral], [FastingBloodSugar],
      [MaxHeartRate] FROM [dbo].[MedicalRecords] tablesample({split} percent)";

Dati vengono quindi caricati nel contesto di Machine Learning corrente e un modello con Training viene ottenuto utilizzando un metodo che consente di stimare una destinazione usando un modello di classificazione multiclasse lineare Training con l'algoritmo Stochastic Dual Coordinate Ascent (SDCA), un processo per la risoluzione problemi di apprendimento supervisionato su larga scala. Volta provvederanno alla classificazione multiclasse viene aggiunto a una pipeline di formatori prima l'effettivo "adatta"; vale a dire, prima che si verifichi il training del modello. A ML.NET Trasforma i dati di utilizzo di una catena di processi che si applicano una trasformazione personalizzata prima di training o test.

Lo scopo della trasformazione nel metodo TrainModel, illustrato nella figura 7, sia ai dati di origine di etichetta che specifica il formato riconosce l'algoritmo di machine learning. Per portare a termine questa definizione delle funzionalità dei dati, la pipeline di trasformazione combina tutte le colonne di funzionalità nella colonna di funzionalità usando il metodo concatenato. Ma in precedenza, devo convertire qualsiasi dato non float per float i tipi di dati, come tutti gli strumenti di apprendimento a ML.NET prevedono funzionalità essere vettori di float.

Figura 7 ottenere un modello di Training

public void TrainModel(IDataSource<MedicalRecord> dataSource, Stream targetStream)
{
  IEnumerable<MedicalRecord> sourceData = dataSource.ReadData(80); 
    // 80% of records for training
  IDataView trainData = _context.Data.ReadFromEnumerable<MedicalRecord>(sourceData);
  // Convert each categorical feature into one-hot encoding independently
  var transformers = _context.Transforms.Categorical.OneHotEncoding(
    "MedicalRecordAge", nameof(MedicalRecord.Age))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSex", nameof(MedicalRecord.Sex)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSmoker", nameof(MedicalRecord.Smoker)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordChestPain", nameof(MedicalRecord.ChestPain)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordBloodPressure", nameof(MedicalRecord.BloodPressure)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSerumCholestoral", nameof(
        MedicalRecord.SerumCholestoral)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordFastingBloodSugar", nameof(
        MedicalRecord.FastingBloodSugar)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordMaxHeartRate", nameof(MedicalRecord.MaxHeartRate)));
  var processChain = _context.Transforms.Concatenate(DefaultColumnNames.Features,
      nameof(MedicalRecord.Age),
      nameof(MedicalRecord.Sex),
      nameof(MedicalRecord.Smoker),
      nameof(MedicalRecord.ChestPain),
      nameof(MedicalRecord.BloodPressure),
      nameof(MedicalRecord.SerumCholestoral),
      nameof(MedicalRecord.FastingBloodSugar),
      nameof(MedicalRecord.MaxHeartRate)
  ).AppendCacheCheckpoint(_context);
  var trainer =
    _context.MulticlassClassification.Trainers.StochasticDualCoordinateAscent(
      labelColumn: DefaultColumnNames.Label,
        featureColumn: DefaultColumnNames.Features);
  var pipeline = processChain.Append(trainer);
  var model = pipeline.Fit(trainData);
  _context.Model.Save(model, targetStream);
}

Tutte le funzionalità nel medico record sono essenzialmente le categorie e non i valori di float. Pertanto, prima concatenarle in una colonna di output singolo, applicare una trasformazione categorica per ognuna di esse utilizzando la funzione OneHotEncoding. Per impostazione predefinita, un algoritmo di apprendimento elabora solo le funzionalità della colonna di funzionalità. Il metodo AppendCacheCheckpoint alla fine vengono memorizzati nella cache i dati di origine, quando si scorrono i dati più volte utilizzando la cache, si potrebbero ottenere prestazioni migliori. I corsi di formazione effettivo si verifica quando si richiama il metodo appropriato nella pipeline di strumento di stima. Businesss apprendere dai dati e produrre un modello di machine learning. Il metodo appropriato restituisce un modello da utilizzare per ottenere previsioni attendibili. Modelli con training possono infine persistente un flusso, un utilizzo futuro.

Dopo il training del modello, la valutazione del modello è essenziale per assicurare la buona qualità del passaggio successivo, modello di punteggio, ovvero la stima del risultato. Valutazione dei dati stimati viene eseguita in un set di dati ottenuto come una trasformazione di dati di test dal modello con training, utilizzando una percentuale dei dati di origine (in questa percentuale 20 case), come illustrato nella figura 8. Il metodo Evaluate dell'oggetto MulticlassClassification definito nel contesto corrente a ML.NET calcola le metriche di qualità per il modello utilizzando il set di dati specificato. Restituisce un oggetto MultiClassClassifierMetrics contenente tutte le metriche calcolate da strumenti di valutazione della classificazione multiclasse. Nel mio esempio, si calcola l'accuratezza come una percentuale di stime corrette dalla quantità totale di record valutata. La metrica TopKAccuracy descrive il relativo numero di esempi in cui l'etichetta true è uno dei primi K prevista le etichette.

Figura 8, valutare il modello

public double EvaluateModel(IDataSource<MedicalRecord> dataSource,
  Stream modelStream)
{
  IEnumerable<MedicalRecord> sourceData = dataSource.ReadData(20); 
    // 20% of records for evaluation
  var testData =
    _context.Data.ReadFromEnumerable<MedicalRecord>(sourceData);
  var predictions = _context.Model.Load(modelStream).Transform(testData);
  var metrics = _context.MulticlassClassification.Evaluate(
    data: predictions, label: DefaultColumnNames.Label,
      score: DefaultColumnNames.Score,
        predictedLabel: DefaultColumnNames.PredictedLabel, topK: 0);
  return metrics.TopKAccuracy / metrics.TopK * 100.0 / sourceData.Count();
}

L'ultimo passaggio nell'API di classificazione è il modello di punteggio e generare una stima che identifica un rischio per una persona con i record medici specificato. Valutazione di un modello inizia dal caricamento del modello di dati sottoposti a training e salvato in precedenza, e quindi la creazione di un motore di stima rispetto a quello eseguito il training del modello. Nel metodo di punteggio, caricare il modello con training e quindi richiamare la funzione CreatePredictionEngine con i tipi di stima di record e i rischi medici (il MedicalRecord e RiskPrediction C# classi, rispettivamente). Il motore di stima genera un punteggio che identifica la classe del rischio di un incontro del paziente con il record mediche analizzato:

public double Score(MedicalRecord medicalRecord, Stream modelStream)
{
  ITransformer trainedModel = _context.Model.Load(modelStream);
  var predictionEngine = trainedModel.CreatePredictionEngine<MedicalRecord,
    RiskPrediction>(_context);
  var prediction = predictionEngine.Predict(medicalRecord);
  return prediction.Score;
}

L'oggetto RiskPrediction contiene il punteggio e sull'accuratezza attributi restituiti dal metodo Post dell'API Web. Per la proprietà di punteggio, ho aggiunto l'attributo ColumnName per indicare a ML.NET che si tratta di dove si desidera il valore scored generato dal metodo Predict del motore di stima di output:

public class RiskPrediction
{    [ColumnName("Score")]
  public double Score;
  public double Accuracy;
}

Infine, come illustrato nella figura 9, il metodo Post dell'API Web sanitaria elabora tutti questi passaggi in sequenza:

  1. Ottiene un oggetto MedicalRecord dalla relativa rappresentazione in formato JSON.
  2. Crea un'istanza di helper di classificazione, che usa a ML.NET per la classificazione multiclasse.
  3. Esegue il training e Salva il modello.
  4. Calcola l'accuratezza
  5. Consente di prevedere il rischio associato al record mediche fornito nell'input.

Figura 9 prevedere il rischio di un particolare Record medici

public IHttpActionResult Post(string medicalRecordJson)
{
  MedicalRecord medicalRecordObj =
    JsonConvert.DeserializeObject<MedicalRecord>(medicalRecordJson);
  Classification classification = new Classification();
  FileStream modelStream = new FileStream("[Path]", FileMode.Create);
  classification.TrainModel(new MedicalRecordDataSource(), modelStream);
  double accuracy = classification.EvaluateModel(
    new MedicalRecordDataSource(), modelStream);
  double score = classification.Score(medicalRecordObj, modelStream);
  RiskPrediction prediction = new RiskPrediction
  {
    Score = score,
    Accuracy = accuracy
  };
  return Json<RiskPrediction>(prediction);
}

Prendere in considerazione che questo codice ha un margine di miglioramento delle prestazioni nella memorizzazione nella cache di modelli con training per un uso futuro, ad esempio. Training del modello e la valutazione può essere ignorati quando si lavora con i modelli con training preliminare, producendo un miglioramento significativo delle prestazioni.

I miei test, provato a eseguire il processo di stima su singoli set di dati, ottenuto dall'integrità institutes, come ottenere una precisione Media del 90%. Ogni set di dati ha approssimativamente 100.000 record. Quando si combinano più set di dati in uno solo, accuratezza raggiunto 96 percento.

Conclusioni

In questo articolo, ho illustrato come un'applicazione di machine learning può produrre stime migliori sfruttando un ampio set di dati, raccogliendo i dati da diverse origini attendibili senza compromettere la riservatezza delle informazioni condivise tra tutte le parti coinvolti. Tale scopo, è necessario proteggere i dati in uso di machine learning codice all'interno di un enclave SQL Server Always Encrypted, che fa parte della tecnologia di elaborazione riservata Azure. La soluzione di machine learning consente di raccogliere set di dati da diverse origini protette e, grazie alla combinazione dei dati in un set di dati più grande, ottiene una maggiore precisione della stima sul modello con training.

È importante ricordare che computing riservati richiede il codice per l'esecuzione in un TEE. Nell'esempio presentato in questo articolo, il driver del client SQL è il intermediator con l'ambiente di esecuzione affidabile di SQL Server. Il codice a ML.NET, pertanto, può o potrebbe non essere eseguita all'interno di un TEE. In caso affermativo, viene definito un sicuro più parti di machine learning calcolo. Calcolo più parte implica che non esistono due o più parti del trust si escludono a vicenda con dati e/o codice che desiderano proteggere rispetto a altro. In questo contesto, le entità da eseguire calcoli combinarli per generare un output condiviso, senza perdita di tutti i dati sensibili. L'enclave agisce come un intermediator attendibile per il calcolo.

L'intera soluzione è disponibile in GitHub all'indirizzo bit.ly/2Exp78V.


Stefano Tempestaè un Microsoft Regional Director, MVP su intelligenza artificiale e applicazioni aziendali e membro del Consiglio di Blockchain. Partecipa regolarmente come oratore a conferenze IT internazionali, tra cui Microsoft Ignite e Tech Summit, interessi di Tempesta estendono blockchain e tecnologie correlate per intelligenza artificiale. Ha creato spazio Blogchain (blogchain.space), un blog sulle tecnologie della blockchain, scrive per MSDN Magazine e MS Dynamics e pubblica esperimenti di machine learning in Azure AI Gallery (Gallery.Azure.ai).

Grazie per i seguenti esperti tecnici Microsoft che ha esaminato in questo articolo: Gleb Krivosheev, Simon Leet
Simon Leet è Principal Engineer nel gruppo di prodotto di elaborazione riservate di Azure.