Kümeleme* (Ensembling), AutoML/DL ve Google AdaNet’i Sunar…

Sümeyra Bedir
Deep Learning Türkiye
4 min readDec 3, 2018

Son zamanlarda sıkça duymaya başladık AutoML/DL kavramını. En basit karşılığıyla, makine öğrenmesi veya derin öğrenme adımlarının bazılarının otomatikleştirilmesinden bahsediyoruz…

Sizin de bir makine öğrenmesi problemini çözmeye çalışırken mesela doğru algoritmayı seçme aşamasında ya da algoritmayı belirlediniz ama modelin hiperparametrelerini belirlemeye çalışırken, saatlerce fazladan zaman kaybettiğinizi düşündüğünüz ve çok yakın bir gelecekte bunların ve daha fazlasının otomatikleştirileceğini hissettiğiniz oldu mu?… O zaman sizin için de iyi haberler gelmeye devam ediyor diyebiliriz…

Ensembling (Kümeleme) Nedir?

En basit haliyle bahsedeceğim Ensembling (Kümeleme) yöntemi, iyi sonuçlar veren iki ya da daha fazla modelin tahmin değerlerinin ağırlıklı ortalamasını alarak bir tahmin modeli oluşturmak olarak tanımlanabilir. Daha karmaşık kümeleme yöntemleri için şuraya bir göz atabilirsiniz.

Kümeleme yöntemleri, tahmin algoritmaları içeren makine öğrenmesi uygulamalarında iyi sonuçlar verebildiği gibi, karmaşık yapay sinir ağları uygulamalarında da iyi bir performans sunabiliyor. Kaggle yarışmalarının yeri geldiğinde can simidi ve de meşhur Netflix ödülünde de kullanıldığı bilinen bu yöntemde önemli olan soru şu;

Hangi modellerin, hangi ağırlıklarda ortalamasını alırsam daha iyi bir model elde ederim?

Çok basit bir makine öğrenmesi örneğiyle; varsayalım ki M1 ve M2 olmak üzere iki ayrı modeliniz olsun (Bunları ağırlıklı ortalama ile kümelediğinizde belki daha başarılı bir model elde edebileceğinize inandığınız modeller… Daha burada bile, önseziler devreye girince, zor bir işle karşılaştığımız çok açık aslında). M1 modelinin tahmin değerleri sütunu t1 ve M2 modelinin tahmin değerleri sütunu t2 olsun. En basit kümeleme aşağıdaki gibi olacaktır;

t = (t1 + t2)/2

Burada t1 ve t2 değerlerinin her birinin ağırlıkları 0.5 olarak alınmış oldu. Ama belki örneğin şu şekilde alsaydık, model daha başarılı olabilirdi kim bilir;

t = t1*0.9 + t2*0.1

Burada iki değil de daha fazla model aldığımızı ve dolayısıyla daha fazla ağırlık ihtimali ile karşı karşıya kalacağımızı düşünürsek, biri bizim yerimize bu işi yapsa gerçekten fena olmazdı…

İşte Google’ın Ekim ayı sonunda açık kaynak olarak kullanıma sunduğu TensorFlow tabanlı AdaNet, bizim için tam olarak da bunun gibi ve bundan daha karmaşık kümeleme işlemlerini gerçekleştirmek üzere tasarlanmış bir framework.

Aşağıdaki görsel, AdaNet’in bir yapay sinir ağı modeli için her bir iterasyonda “Loss” değerini hesaplayarak en iyi modelleri kümeleme için seçmesi işlemini açıklıyor;

Adanet: En Iyi Modellerin Kümeleme Için Seçilmesi [2]

AdaNet’i bir de biz deneyelim…

Şimdi, lafı çok uzatmadan AdaNet’in bizim için işleri nasıl kolaylaştırdığını MNIST veriseti (el yazısı ile yazılmış rakamlar) üzerinde deneyerek görelim (Fashion-MNIST ve Boston Housing verisetleri için de örneklere referanslardan ulaşabilirsiniz).

Öncelikle aşağıdaki komutlarla, eğer yüklü değilseler, TensorFlow ve AdaNet kütüphanelerini yüklememiz gerekiyor;

!pip install adanet
!pip install tensorflow

Sonra aşağıdaki şekilde kütüphanelerimizden kullanacağımız ögeleri alıyor ve herhangi bir rastgele başlangıç sayısı belirliyoruz;

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import functoolsimport adanet
from adanet.examples import simple_dnn
import tensorflow as tf
# rastgele baslangic sayisi
RANDOM_SEED = 42

Kendi tarayıcınız üzerinde çalıştığınız bir Jupyter notebook dosyasında aşağıdaki komutla kolayca MNIST verisetini alabilirsiniz;

(x_train, y_train), (x_test, y_test) = (
tf.keras.datasets.mnist.load_data())

Aşağıdaki ön işlem komutları verisetimizin ögelerini girdi olarak kullanabilmemiz için gerekecek;

Sınıflandırmayı bildiğiniz üzere 10 tane rakam üzerinden yapacağız;

NUM_CLASSES = 10

Yine ilerde kullanmak üzere aşağıdaki tanımları yapıyoruz;

# Gradyanlar hesaplanirken her mini-batch uzerinde ortalama loss hesaplanacak.
loss_reduction = tf.losses.Reduction.SUM_OVER_BATCH_SIZE
# `Head`, her bir `Estimator` icin loss function ve metrikleri tanimliyor.
head = tf.contrib.estimator.multi_class_head(
NUM_CLASSES, loss_reduction=loss_reduction)
# Bazi `Estimator`lar girdi ozelliklerini anlamak icin ozellik sutunlari kullaniyor.
feature_columns = [tf.feature_column.numeric_column(FEATURES_KEY, shape=[28, 28, 1])
]
# Estimator konfigurasyonu
config = tf.estimator.RunConfig(
save_checkpoints_steps=50000,
save_summary_steps=50000,
tf_random_seed=RANDOM_SEED)

Öncelikle basit bir lineer modeli aşağıdaki şekilde eğitelim;

Bu işlem sonucunda varsayılan değerler kullanarak oluşturduğumuz lineer modelimizin yaklaşık %92.58 doğruluk değeri elde ettiğini görüyoruz.

Bakalım, AdaNet’in simple_dnn modelini kullanarak daha iyi bir sonuç elde edebilecek miyiz?

Yukarıda yaptığımız ön hazırlıklar sayesinde aşağıdaki birkaç adımla AdaNet simple_dnn modelini MNIST için eğitebiliyoruz;

AdaNet’in simple_dnn modeli, varsayılan değerlerle, başarımı %95.7'ye çıkardı bile.

Bir adım daha ileri giderek, basit bir evrişimsel sinir ağı modelini verisetimiz üzerinde eğitmeye çalışalım. Bunun için AdaNet’in adanet.subnetwork.Builder ve adanet.subnetwork.Generator sınıflarını kullanmamız gerekecek. Orjinalinden biraz değiştirerek oluşturduğum SimpleCNNBuilder ve SimpleCNNGenerator sınıfları için, örneğimin Jupyter notebook üzerindeki haline gitmenizi tavsiye edeceğim;

Bu sınıfları tanımladıktan sonra, basit CNN modelimizi MNIST verisetimiz üzerinde aşağıdaki şekilde eğitiyoruz;

Ve çok da yorulmadan, MNIST için yaklaşık %98.69 başarım elde etmiş olduk.

Kodları kendiniz uygulayarak, çıktılara baktığınızda, AdaNet’in sizin için yaptığı en uygun kümeleme yöntemini bulma işlemini oturduğunuz yerden adım adım izleyebilirsiniz.

Keyifli seyirler!

Referanslar

[1] C. Cortes, X. Gonzalvo , V. Kuznetsov, M. Mohri ve S. Yang, “ AdaNet: Adaptive Structural Learning of Artificial Neural Networks”, Proceedings of Machine Learning Research 2017, http://proceedings.mlr.press/v70/cortes17a/cortes17a.pdf

[2] C. Weill, “Introducing AdaNet: Fast and Flexible AutoML with Learning Guarantees”, https://ai.googleblog.com/2018/10/introducing-adanet-fast-and-flexible.html, Ekim 2018.

[3]https://github.com/tensorflow/adanet/blob/v0.1.0/adanet/examples/tutorials/customizing_adanet.ipynb

*Kümeleme olarak çevirmeyi tercih ettiğim “ensembling” fiil çekiminin dilimizde ne yazık ki tam bir karşılığı bence yok. Literatürde “Ensemble learning” haliyle, “Topluluk öğrenmesi”, “Sınıfların birleştirilmesi” şeklinde rastlıyoruz. Tarifini metinde yapmaya çalıştığım kavram için akademik değil de sade bir karşılık aradığımdan bu olmasa “ortaya karışık” tabirini kullanacaktım ;)

--

--

Sümeyra Bedir
Deep Learning Türkiye

PhD in Mathematics. Algebraic Coding Theorist. A mom of twins. Interested in #coding, #music, #datascience, #AI