Birleşik Öğrenim

Genel Bakış

Bu belge, TensorFlow'da uygulanan mevcut makine öğrenimi modelleriyle birleştirilmiş eğitim veya değerlendirme gibi birleştirilmiş öğrenme görevlerini kolaylaştıran arayüzleri tanıtmaktadır. Bu arayüzleri tasarlarken öncelikli hedefimiz, birleşik öğrenmenin kapalı alanda nasıl çalıştığına dair bilgiye ihtiyaç duymadan denemeler yapmayı ve uygulanan birleşik öğrenme algoritmalarını mevcut çeşitli model ve veriler üzerinde değerlendirmeyi mümkün kılmaktı. Platforma katkıda bulunmanızı öneririz. TFF, genişletilebilirlik ve birleştirilebilirlik göz önünde bulundurularak tasarlanmıştır ve katkılarınızı memnuniyetle karşılıyoruz; neler bulacağınızı görmek için heyecanlıyız!

Bu katmanın sunduğu arayüzler aşağıdaki üç temel bölümden oluşur:

  • Modeller . Mevcut modellerinizi TFF ile kullanmak üzere sarmanıza olanak tanıyan sınıflar ve yardımcı işlevler. Bir modeli sarmalamak, tek bir sarma işlevini çağırmak (örneğin, tff.learning.models.from_keras_model ) veya tam özelleştirilebilirlik için tff.learning.models.VariableModel arayüzünün bir alt sınıfını tanımlamak kadar basit olabilir.

  • Birleşik Hesaplama Oluşturucuları . Mevcut modellerinizi kullanarak eğitim veya değerlendirme için birleştirilmiş hesaplamalar oluşturan yardımcı işlevler.

  • Veri kümeleri . Birleştirilmiş öğrenme senaryolarını simüle etmek için Python'da indirebileceğiniz ve erişebileceğiniz hazır veri koleksiyonları. Her ne kadar birleşik öğrenme, merkezi bir konumdan kolayca indirilemeyen merkezi olmayan verilerle kullanılmak üzere tasarlanmış olsa da, araştırma ve geliştirme aşamalarında, özellikle geliştiriciler için yerel olarak indirilebilen ve işlenebilen verileri kullanarak ilk deneyleri yapmak genellikle uygundur. yaklaşımda yeni.

Bu arayüzler, tff.simulation altında gruplandırılmış araştırma veri kümeleri ve simülasyonla ilgili diğer yetenekler hariç, öncelikle tff.learning ad alanında tanımlanır. Bu katman, aynı zamanda bir çalışma zamanı ortamı da sağlayan Federe Çekirdek (FC) tarafından sunulan daha düşük seviyeli arayüzler kullanılarak uygulanır.

Devam etmeden önce, burada açıklanan kavramların çoğunu somut örneklerle tanıttıkları için öncelikle görüntü sınıflandırma ve metin oluşturma hakkındaki eğitimleri incelemenizi öneririz. TFF'nin nasıl çalıştığı hakkında daha fazla bilgi edinmek istiyorsanız, birleşik hesaplamaların mantığını ifade etmek ve TFF'nin mevcut uygulamasını incelemek için kullandığımız alt düzey arayüzlere giriş niteliğindeki özel algoritmalar eğitimine göz atmak isteyebilirsiniz. tff.learning arayüzleri.

Modeller

Mimari varsayımlar

Serileştirme

TFF, yazdığınız makine öğrenimi modeli kodunun, farklı yeteneklere sahip çok sayıda heterojen istemcide çalıştırılabileceği çeşitli dağıtılmış öğrenme senaryolarını desteklemeyi amaçlamaktadır. Spektrumun bir ucunda, bazı uygulamalarda bu istemciler güçlü veritabanı sunucuları olsa da, platformumuzun desteklemeyi amaçladığı birçok önemli kullanım, sınırlı kaynaklara sahip mobil ve gömülü cihazları içerir. Bu cihazların Python çalışma zamanlarını barındırabileceğini varsayamayız; Bu noktada varsayabileceğimiz tek şey, yerel bir TensorFlow çalışma zamanını barındırabilme kapasitesine sahip olmalarıdır. Dolayısıyla TFF'de yaptığımız temel mimari varsayım, model kodunuzun TensorFlow grafiği olarak serileştirilebilir olması gerektiğidir.

İstekli modu kullanmak gibi en yeni en iyi uygulamaları takip ederek TF kodunuzu geliştirebilirsiniz (ve geliştirmelisiniz). Ancak son kodun serileştirilebilir olması gerekir (örneğin istekli mod kodu için bir tf.function olarak sarılabilir). Bu, yürütme sırasında gerekli olan herhangi bir Python durumunun veya kontrol akışının (muhtemelen Autograph'ın yardımıyla) serileştirilmesini sağlar.

Şu anda TensorFlow, istekli mod TensorFlow'un serileştirilmesini ve seri durumdan çıkarılmasını tam olarak desteklememektedir. Bu nedenle, TFF'de serileştirme şu anda tüm kodun TFF'nin kontrol ettiği bir tf.Graph içinde oluşturulması gereken TF 1.0 modelini takip etmektedir. Bu, şu anda TFF'nin halihazırda oluşturulmuş bir modeli kullanamayacağı anlamına geliyor; bunun yerine, model tanımı mantığı, tff.learning.models.VariableModel değerini döndüren bağımsız değişkensiz bir işlevde paketlenir. Bu işlev daha sonra TFF tarafından modelin tüm bileşenlerinin serileştirilmesini sağlamak için çağrılır. Ayrıca, türü kesin olarak belirlenmiş bir ortam olan TFF, modelinizin giriş türünün spesifikasyonu gibi bir miktar ek meta veriye ihtiyaç duyacaktır.

Toplama

Çoğu kullanıcının Keras kullanarak modeller oluşturmasını önemle tavsiye ederiz; aşağıdaki Keras için Dönüştürücüler bölümüne bakın. Bu sarmalayıcılar, model güncellemelerinin toplanmasını ve model için tanımlanan ölçümleri otomatik olarak yönetir. Ancak genel bir tff.learning.models.VariableModel için toplamanın nasıl ele alındığını anlamak yine de yararlı olabilir.

Birleşik öğrenmede her zaman en az iki toplama katmanı vardır: yerel cihaz üzerinde toplama ve cihazlar arası (veya birleştirilmiş) toplama:

  • Yerel toplama . Bu düzeyde birleştirme, bireysel bir müşterinin sahip olduğu birden fazla örnek grubu genelinde birleştirmeyi ifade eder. Hem model yerel olarak eğitildikçe sırayla gelişmeye devam eden model parametreleri (değişkenler) hem de modelinizin tekrar yerel olarak güncelleyeceği hesapladığınız istatistikler (ortalama kayıp, doğruluk ve diğer ölçümler gibi) için geçerlidir. her bir müşterinin yerel veri akışı üzerinde yinelenirken.

    Bu düzeyde toplamanın gerçekleştirilmesi model kodunuzun sorumluluğundadır ve standart TensorFlow yapıları kullanılarak gerçekleştirilir.

    İşlemenin genel yapısı aşağıdaki gibidir:

    • Model ilk önce parti sayısı veya işlenen örnek sayısı, parti başına veya örnek başına kayıpların toplamı vb. gibi toplamları tutmak için tf.Variable s'yi oluşturur.

    • TFF, Model forward_pass yöntemini ardışık olarak sonraki müşteri verileri grupları üzerinde birden çok kez çalıştırır; bu, bir yan etki olarak çeşitli toplamları tutan değişkenleri güncellemenize olanak tanır.

    • Son olarak TFF, modelinizin topladığı tüm özet istatistikleri müşteri tarafından dışa aktarılacak kompakt bir metrik kümesi halinde derlemesine olanak sağlamak için Modelinizde report_local_unfinalized_metrics yöntemini çağırır. Burası, örneğin model kodunuzun, kayıpların toplamını, ortalama kaybı vb. dışa aktarmak için işlenen örneklerin sayısına bölebileceği yerdir.

  • Birleşik toplama . Bu düzeyde toplama, sistemdeki birden fazla istemci (cihaz) arasında toplama anlamına gelir. Yine, hem istemciler arasında ortalaması alınan model parametreleri (değişkenler) hem de yerel toplama sonucunda modelinizin dışa aktardığı ölçümler için geçerlidir.

    Bu seviyedeki toplulaştırmanın yapılması TFF'nin sorumluluğundadır. Ancak bir model yaratıcısı olarak bu süreci kontrol edebilirsiniz (bununla ilgili daha fazla bilgiyi aşağıda bulabilirsiniz).

    İşlemenin genel yapısı aşağıdaki gibidir:

    • Başlangıç ​​modeli ve eğitim için gereken parametreler, bir sunucu tarafından, bir eğitim veya değerlendirme turuna katılacak olan istemci alt kümesine dağıtılır.

    • Her istemcide, bağımsız ve paralel olarak, yukarıda açıklandığı gibi yeni bir model parametreleri kümesi (eğitim sırasında) ve yeni bir yerel metrik kümesi üretmek için model kodunuz yerel veri toplu akışında tekrar tekrar çağrılır (bu yereldir). toplama).

    • TFF, model parametrelerini ve yerel olarak dışa aktarılan ölçümleri sistem genelinde biriktirmek ve bir araya getirmek için dağıtılmış bir toplama protokolü çalıştırır. Bu mantık, TFF'nin kendi federe hesaplama dilini (TensorFlow'da değil) kullanarak bildirimsel bir şekilde ifade edilir. Toplama API'si hakkında daha fazla bilgi için özel algoritmalar eğitimine bakın.

Soyut arayüzler

Bu temel yapıcı + meta veri arayüzü, tff.learning.models.VariableModel arayüzü ile aşağıdaki gibi temsil edilir:

  • Yapıcı, forward_pass ve report_local_unfinalized_metrics yöntemleri, model değişkenlerini, ileri geçişi ve raporlamak istediğiniz istatistikleri buna göre oluşturmalıdır. Bu yöntemlerle oluşturulan TensorFlow'un yukarıda tartışıldığı gibi serileştirilebilir olması gerekir.

  • input_spec özelliğinin yanı sıra eğitilebilir, eğitilemez ve yerel değişkenlerinizin alt kümelerini döndüren 3 özellik meta verileri temsil eder. TFF bu bilgiyi, modelinizin parçalarını birleştirilmiş optimizasyon algoritmalarına nasıl bağlayacağınızı belirlemek ve oluşturulan sistemin doğruluğunun doğrulanmasına yardımcı olmak üzere dahili tür imzalarını tanımlamak için kullanır (böylece modeliniz, model tüketmek için tasarlanmıştır).

Buna ek olarak, tff.learning.models.VariableModel soyut arayüzü, bir metriğin sonlandırılmamış değerlerini ( report_local_unfinalized_metrics() tarafından döndürülen) alan ve kesinleştirilmiş metrik değerlerini döndüren bir metric_finalizers özelliğini ortaya çıkarır. Birleştirilmiş eğitim süreçlerini veya değerlendirme hesaplamalarını tanımlarken, istemciler arası bir ölçüm toplayıcı oluşturmak için metric_finalizers ve report_local_unfinalized_metrics() yöntemi birlikte kullanılacaktır. Örneğin, basit bir tff.learning.metrics.sum_then_finalize toplayıcı, önce istemcilerden gelen sonlandırılmamış metrik değerleri toplayacak ve ardından sunucudaki sonlandırıcı işlevlerini çağıracaktır.

Kendi özel tff.learning.models.VariableModel dosyanızı nasıl tanımlayacağınıza dair örnekleri, görüntü sınıflandırma eğitimimizin ikinci bölümünde ve ayrıca model_examples.py dosyasında test etmek için kullandığımız örnek modellerde bulabilirsiniz.

Keras için dönüştürücüler

TFF'nin ihtiyaç duyduğu bilgilerin neredeyse tamamı, tf.keras arayüzleri çağrılarak elde edilebilir; dolayısıyla bir Keras modeliniz varsa, bir tff.learning.models.VariableModel oluşturmak için tff.learning.models.from_keras_model güvenebilirsiniz.

TFF'nin sizden hâlâ bir kurucu (aşağıdaki gibi argümansız bir model işlevi) sağlamanızı istediğini unutmayın:

def model_fn():
  keras_model = ...
  return tff.learning.models.from_keras_model(keras_model, sample_batch, loss=...)

Modelin kendisine ek olarak, TFF'nin model girdinizin türünü ve şeklini belirlemek için kullandığı örnek bir veri kümesi de sağlarsınız. Bu, TFF'nin istemci cihazlarda gerçekten mevcut olacak veriler için modeli düzgün bir şekilde başlatabilmesini sağlar (çünkü serileştirilecek TensorFlow'u oluşturduğunuz sırada bu verilerin genel olarak mevcut olmadığını varsayıyoruz).

Keras sarmalayıcıların kullanımı , görüntü sınıflandırma ve metin oluşturma eğitimlerimizde gösterilmektedir.

Birleşik Hesaplama Oluşturucuları

tff.learning paketi, öğrenmeyle ilgili görevleri gerçekleştiren tff.Computation için çeşitli oluşturucular sağlar; Gelecekte bu tür hesaplamaların genişlemesini bekliyoruz.

Mimari varsayımlar

Uygulamak

Birleşik bir hesaplamayı çalıştırmanın iki farklı aşaması vardır.

  • Derleme : TFF ilk olarak birleştirilmiş öğrenme algoritmalarını tüm dağıtılmış hesaplamanın soyut serileştirilmiş bir temsili halinde derler . Bu, TensorFlow serileştirmesinin gerçekleştiği zamandır, ancak daha verimli yürütmeyi desteklemek için başka dönüşümler de meydana gelebilir. Derleyici tarafından yayılan serileştirilmiş gösterime birleştirilmiş hesaplama adını veriyoruz.

  • TFF'yi Yürüt, bu hesaplamaları yürütmenin yollarını sağlar. Şimdilik, yürütme yalnızca yerel bir simülasyon yoluyla desteklenmektedir (örneğin, simüle edilmiş merkezi olmayan verileri kullanan bir dizüstü bilgisayarda).

TFF'nin Birleşik Öğrenme API'si tarafından oluşturulan, birleşik model ortalamasını kullanan bir eğitim algoritması veya birleştirilmiş değerlendirme gibi birleştirilmiş bir hesaplama, bir dizi öğeyi içerir; bunların en önemlisi:

  • Model kodunuzun serileştirilmiş bir biçiminin yanı sıra, modelinizin eğitim/değerlendirme döngüsünü (optimizasyon araçları oluşturma, model güncellemelerini uygulama, tf.data.Dataset s üzerinde yineleme ve hesaplama ölçümleri gibi) yönlendirmek için Federal Öğrenme çerçevesi tarafından oluşturulan ek TensorFlow kodunun yanı sıra, ve birkaçını saymak gerekirse toplu güncellemenin sunucuya uygulanması).

  • İstemciler ve bir sunucu arasındaki iletişimin (genellikle istemci aygıtları arasında çeşitli toplama biçimleri ve sunucudan tüm istemcilere yayın yapma ) ve bu dağıtılmış iletişimin istemci-yerel veya sunucu-yerel yürütme ile nasıl serpiştirildiğinin bildirime dayalı bir spesifikasyonu TensorFlow kodunun.

Bu serileştirilmiş formda temsil edilen birleştirilmiş hesaplamalar, Python'dan farklı, platformdan bağımsız bir dahili dilde ifade edilir, ancak Birleşik Öğrenme API'sini kullanmak için bu temsilin ayrıntılarıyla ilgilenmenize gerek kalmayacaktır. Hesaplamalar Python kodunuzda tff.Computation türünde nesneler olarak temsil edilir; bunları çoğunlukla opak Python callable s olarak değerlendirebilirsiniz.

Eğitimlerde, bu birleştirilmiş hesaplamaları, sanki yerel olarak yürütülecek normal Python işlevleriymiş gibi çalıştıracaksınız. Ancak TFF, federe hesaplamaları yürütme ortamının çoğu yönünden bağımsız bir şekilde ifade edecek şekilde tasarlanmıştır; böylece bunlar, örneğin Android çalıştıran cihaz gruplarına veya bir veri merkezindeki kümelere potansiyel olarak dağıtılabilir. Yine bunun temel sonucu serileştirmeye ilişkin güçlü varsayımlardır. Özellikle aşağıda açıklanan build_... yöntemlerinden birini çağırdığınızda hesaplama tamamen serileştirilir.

Modelleme durumu

TFF işlevsel bir programlama ortamıdır, ancak birleşik öğrenmeye ilgi duyan birçok süreç durum bilgisi içerir. Örneğin, birden fazla birleşik model ortalaması alma turu içeren bir eğitim döngüsü, durum bilgisi olan bir süreç olarak sınıflandırabileceğimiz şeyin bir örneğidir. Bu süreçte, turdan tura gelişen durum, eğitilmekte olan model parametreleri kümesini ve muhtemelen optimize ediciyle ilişkili ek durumu (örneğin, bir momentum vektörü) içerir.

TFF işlevsel olduğundan, durum bilgisi olan süreçler TFF'de mevcut durumu girdi olarak kabul eden ve ardından güncellenmiş durumu çıktı olarak sağlayan hesaplamalar olarak modellenir. Durum bilgisi olan bir süreci tam olarak tanımlamak için, başlangıç ​​durumunun nereden geldiğinin de belirtilmesi gerekir (aksi takdirde süreci ön yükleyemeyiz). Bu, tff.templates.IterativeProcess yardımcı sınıfının tanımında yakalanır; 2 özellik sırasıyla initialize ve yinelemeye karşılık next .

Mevcut inşaatçılar

Şu anda TFF, birleştirilmiş eğitim ve değerlendirme için birleştirilmiş hesaplamalar üreten çeşitli oluşturucu işlevleri sunmaktadır. İki dikkate değer örnek şunları içerir:

Veri kümeleri

Mimari varsayımlar

Müşteri seçimi

Tipik birleştirilmiş öğrenme senaryosunda, potansiyel olarak yüz milyonlarca istemci cihazından oluşan büyük bir popülasyona sahibiz ve bunların yalnızca küçük bir kısmı herhangi bir anda aktif ve eğitim için uygun olabilir (örneğin, bu, tarifeli bir ağa değil, bir güç kaynağına takılı ve diğer durumlarda boşta). Genellikle eğitime veya değerlendirmeye katılabilecek müşteri grubu geliştiricinin kontrolü dışındadır. Ayrıca, milyonlarca müşteriyi koordine etmek pratik olmadığından, tipik bir eğitim veya değerlendirme turu, rastgele örneklenebilecek mevcut müşterilerin yalnızca bir kısmını içerecektir.

Bunun temel sonucu, birleştirilmiş hesaplamaların tasarım gereği kesin katılımcı grubundan habersiz bir şekilde ifade edilmesidir; tüm işlemler, anonim istemcilerden oluşan soyut bir grup üzerinde toplu işlemler olarak ifade edilir ve bu grup, bir eğitim turundan diğerine farklılık gösterebilir. Hesaplamanın somut katılımcılara ve dolayısıyla onların hesaplamaya besledikleri somut verilere fiilen bağlanması, hesaplamanın kendisinin dışında modellenir.

Birleşik öğrenme kodunuzun gerçekçi bir dağıtımını simüle etmek için genellikle şuna benzeyen bir eğitim döngüsü yazacaksınız:

trainer = tff.learning.algorithms.build_weighted_fed_avg(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  result = trainer.next(state, data_for_this_round)
  state = result.state

Bunu kolaylaştırmak için, simülasyonlarda TFF kullanılırken, birleştirilmiş veriler Python list olarak kabul edilir ve katılımcı istemci cihazı başına bir öğe, o cihazın yerel tf.data.Dataset temsil eder.

Soyut arayüzler

TFF, simüle edilmiş birleştirilmiş veri kümeleriyle çalışmayı standartlaştırmak amacıyla, istemci kümesinin numaralandırılmasına ve belirli bir veri kümesinin verilerini içeren bir tf.data.Dataset oluşturulmasına olanak tanıyan soyut bir tff.simulation.datasets.ClientData arabirimi sağlar. müşteri. Bu tf.data.Dataset , istek modunda oluşturulan birleştirilmiş hesaplamalara doğrudan girdi olarak beslenebilir.

Müşteri kimliklerine erişme yeteneğinin, yalnızca simülasyonlarda kullanılmak üzere veri kümeleri tarafından sağlanan bir özellik olduğu ve burada belirli müşteri alt kümelerinden gelen veriler üzerinde eğitim alma becerisinin gerekli olabileceği (örneğin, farklı istemcilerin günlük kullanılabilirliğini simüle etmek için) unutulmamalıdır. müşteri türleri). Derlenen hesaplamalar ve temel çalışma zamanı, herhangi bir istemci kimliği kavramını içermez . Belirli bir istemci alt kümesinden gelen veriler, örneğin tff.templates.IterativeProcess.next çağrısında girdi olarak seçildiğinde, istemci kimlikleri artık burada görünmez.

Mevcut veri setleri

Simülasyonlarda kullanılmak üzere tff.simulation.datasets.ClientData arayüzünü uygulayan veri kümeleri için tff.simulation.datasets ad alanını ayırdık ve görüntü sınıflandırmasını ve metin oluşturma eğitimlerini desteklemek için bunu veri kümeleriyle tohumladık. Kendi veri kümelerinizle platforma katkıda bulunmanızı teşvik etmek istiyoruz.