Infer.NET Olasılığa Dayalı Programlama

Merhabalar;
Bu yazımda Infer.Net ve Olasılığa dayalı programlama nedir bunu anlatmaya çalışacak ve Microsoft tarafından verilen bir örnek üzerinden kod incelemesi yapacağım.

Olasılığa dayalı programlama; gerçek işlemlerin istatistiksel modellerini oluşturmamızı sağlar.

Infer.NET Yapay zeka alanında Microsoft’un son teknolojilerinden bir tanesi. Model tabanlı makine öğrenme için platform bağımsız açık kaynak bir framework.

Peki model tanımlı derken ne demek istiyoruz? Sorununuzu varolan bir makine öğrenme algoritmasını kullanmak yerine tanımladığınız modelden kendi makine öğrenme algoritmasını oluşturarak çözmenizi sağlar.

Model tabanlı makine öğrenme, gerçek zamanlı veriler, heterojen veriler, yetersiz veriler, etiketsiz veriler ve eksik parçaları olan veriler gibi belirli veri özelliklerine sahip sorunlara da doğal olarak uygulanır. Model tabanlı makine öğrenmesi hakkında daha fazla bilgi edinmek istiyorsanız, Infer.NET ekibinin konuyla ilgili hazırladığı güzel bir e-kitap burada mevcut.
http://mbmlbook.com/

Infer.NET’te modeller olasılığa dayalı programlama kullanılarak tanımlanır. Gerçek dünyadaki işlemleri makinelerin anlayabileceği bir dilde tanımlamak için kullanılan güçlü bir kavramdır. Infer.NET, olasılığa dayalı programlama ile yüksek performans ve ölçeklenebilirlik sağlar, örneğin,
petabytes veri içeren bilgileri otomatik olarak milyarlarca web sayfasından ayıklayan bir sistemde kullanılmıştır.

Örnek;

Öncelikle bir .NET Core Console uygulaması oluşturarak
Microsoft.ML.Probabilistic.Compiler nuget paketini projemize dahil ediyoruz.

Visual Studio kullanmayıp, console üzerinden de proje oluşturarak projemizi oluşturabiliriz bunun için;

dotnet new console -o InferNet_Demo
cd InderNet_Demo
dotnet add package Microsoft.ML.Probabilistic.Compiler

Yapacağımız örnekte, takımlarımız ve birbirleri ile yaptıkları maçlarda kazanan ve kaybeden verileri mevcut, Takımın performansını bu verilerden çıkarmak istiyoruz.

MaçKazananKaybeden
1.Takım 0 Takım 1
2Takım 0 Takım 3
3Takım 0 Takım 4
4 Takım 1 Takım 2
5 Takım 3 Takım 1
6 Takım 4 Takım 2

Yukarıda ki örnekte 3 ve 4 numaralı takımların birer maç kazandıkları ve birer maçta kaybettiklerini görüyoruz, olasılığa dayalı programlama kullanarak performanslarını ölçütüğümüzde sonuç ne çıkacak beraber inceleyelim.

Program.cs içeriğimiz;

using System;
using System.Linq;
using Microsoft.ML.Probabilistic;
using Microsoft.ML.Probabilistic.Distributions;
using Microsoft.ML.Probabilistic.Models;

namespace Infer.NET_Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 6 maçta kazananlar ve kaybedenler
            var winnerData = new[] { 0, 0, 0, 1, 3, 4 };
            var loserData = new[] { 1, 3, 4, 2, 1, 2 };

            // İstatistiksel modeli, olasılığa dayalı bir program olarak tanımlıyoruz
            var game = new Range(winnerData.Length);
            var player = new Range(winnerData.Concat(loserData).Max() + 1);
            var playerSkills = Variable.Array<double>(player);
            playerSkills[player] = Variable.GaussianFromMeanAndVariance(6, 9).ForEach(player);

            var winners = Variable.Array<int>(game);
            var losers = Variable.Array<int>(game);

            using (Variable.ForEach(game))
            {
                // Takım performanslarının gürültülü(noisy) sonuçlarını alıyoruz
                var winnerPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[winners[game]], 1.0);
                var loserPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[losers[game]], 1.0);

                // Kazananların performansının daha iyi olduğunu öğretiyoruz
                Variable.ConstrainTrue(winnerPerformance > loserPerformance);
            }

            // Verileri modele ekliyoruz
            winners.ObservedValue = winnerData;
            losers.ObservedValue = loserData;

            // Run inference
            var inferenceEngine = new InferenceEngine();
            var inferredSkills = inferenceEngine.Infer<Gaussian[]>(playerSkills);

            // The inferred skills are uncertain, which is captured in their variance
            var orderedPlayerSkills = inferredSkills
        .Select((s, i) => new { Player = i, Skill = s })
        .OrderByDescending(ps => ps.Skill.GetMean());

            foreach (var playerSkill in orderedPlayerSkills)
            {
                Console.WriteLine($"Takım {playerSkill.Player} skill: {playerSkill.Skill}");
            }
        }
    }
}

Sonuç:

Compiling model…done.
Iterating:
………|………|………|………|………| 50
Takım 0 skill: Gaussian(9.517, 3.926)
Takım 3 skill: Gaussian(6.834, 3.892)
Takım 4 skill: Gaussian(6.054, 4.731)
Takım 1 skill: Gaussian(4.955, 3.503)
Takım 2 skill: Gaussian(2.639, 4.288)

Sonuçlarda 3 ve 4 numaralı takımlara bakarsak, 1 ve 2’nin üzerinde. Takım 1 ise 2’nin üzerinde çünkü bir maçta onu yenmiş.

Projeye Github adresimden ulaşabilirsiniz.

Exit mobile version