Udostępnij za pośrednictwem


Tworzenie aplikacji do listy dopasowania gry za pomocą Infer.NET i programowania probabilistycznego

Ten przewodnik z instrukcjami zawiera informacje o programowaniu probabilistycznym przy użyciu Infer.NET. Programowanie probabilistyczne to podejście do uczenia maszynowego, w którym modele niestandardowe są wyrażane jako programy komputerowe. Umożliwia włączenie wiedzy o domenie w modelach i sprawia, że system uczenia maszynowego jest bardziej czytelny. Obsługuje również wnioskowanie online — proces uczenia się w miarę nadejścia nowych danych. Infer.NET jest używany w różnych produktach firmy Microsoft na platformie Azure, xbox i Bing.

Co to jest programowanie probabilistyczne?

Programowanie probabilistyczne umożliwia tworzenie modeli statystycznych procesów rzeczywistych.

Wymagania wstępne

  • Lokalne środowisko programistyczne.

    Ten przewodnik z instrukcjami oczekuje, że masz maszynę, której możesz użyć do programowania. Samouczek platformy .NET Hello World w ciągu 10 minut zawiera instrukcje dotyczące konfigurowania lokalnego środowiska deweloperskiego w systemach macOS, Windows lub Linux.

Tworzenie aplikacji

Otwórz nowy wiersz polecenia i uruchom następujące polecenia:

dotnet new console -o myApp
cd myApp

Polecenie dotnet tworzy aplikację new typu console. Parametr -o tworzy katalog o nazwie myApp , w którym aplikacja jest przechowywana i wypełnia ją wymaganymi plikami. Polecenie cd myApp umieszcza Cię w nowo utworzonym katalogu aplikacji.

Instalowanie pakietu Infer.NET

Aby użyć Infer.NET, należy zainstalować Microsoft.ML.Probabilistic.Compiler pakiet. W wierszu polecenia uruchom następujące polecenie:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Projektowanie modelu

W przykładzie użyto tenisa stołowego lub meczów foosball rozgrywanych w biurze. Masz uczestników i wynik każdego meczu. Chcesz wywnioskować umiejętności zawodnika z tych danych. Załóżmy, że każdy gracz ma zwykle rozproszone ukryte umiejętności, a ich dana wydajność meczu jest hałaśliwą wersją tej umiejętności. Dane ograniczają wydajność zwycięzcy, aby był większy niż wydajność przegranego. Jest to uproszczona wersja popularnego modelu TrueSkill , który obsługuje również zespoły, rysowanie i inne rozszerzenia. Zaawansowana wersja tego modelu jest używana do dopasowywania w najlepiej sprzedających się tytułach gier Halo i Gears of War.

Musisz wyświetlić listę wywnioskowanych umiejętności zawodników, a także ich wariancję — miarę niepewności wokół umiejętności.

Przykładowe dane wyników gry

Gra Zwycięzca Przegrany
1 Gracz 0 Gracz 1
2 Gracz 0 Gracz 3
3 Gracz 0 Gracz 4
100 Gracz 1 Gracz 2
5 Gracz 3 Gracz 1
6 Gracz 4 Gracz 2

Przyjrzyjmy się bliżej przykładowym danym, zauważysz, że gracze 3 i 4 mają jedną wygraną i jedną porażkę. Zobaczmy, jak wyglądają rankingi przy użyciu programowania probabilistycznego. Zwróć również uwagę, że istnieje zero graczy, ponieważ nawet listy dopasowania biura są zero oparte na nas deweloperów.

Pisanie kodu

Po zaprojektowaniu modelu nadszedł czas, aby wyrazić go jako program probabilistyczny przy użyciu interfejsu API modelowania Infer.NET. Otwórz Program.cs plik w ulubionym edytorze tekstów i zastąp całą jego zawartość następującym kodem:

namespace myApp

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

    class Program
    {

        static void Main(string[] args)
        {
            // The winner and loser in each of 6 samples games
            var winnerData = new[] { 0, 0, 0, 1, 3, 4 };
            var loserData = new[] { 1, 3, 4, 2, 1, 2 };

            // Define the statistical model as a probabilistic program
            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))
            {
                // The player performance is a noisy version of their skill
                var winnerPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[winners[game]], 1.0);
                var loserPerformance = Variable.GaussianFromMeanAndVariance(playerSkills[losers[game]], 1.0);

                // The winner performed better in this game
                Variable.ConstrainTrue(winnerPerformance > loserPerformance);
            }

            // Attach the data to the model
            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($"Player {playerSkill.Player} skill: {playerSkill.Skill}");
            }
        }
    }
}

Uruchamianie aplikacji

W wierszu polecenia uruchom następujące polecenie:

dotnet run

Wyniki

Wyniki powinny być podobne do następujących:

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

W wynikach zwróć uwagę, że gracz 3 plasuje się nieco wyżej niż gracz 4 zgodnie z naszym modelem. To dlatego, że zwycięstwo gracza 3 nad graczem 1 jest bardziej znaczące niż zwycięstwo gracza 4 nad graczem 2 - należy pamiętać, że gracz 1 pokona gracza 2. Gracz 0 jest mistrzem!

Kontynuuj naukę

Projektowanie modeli statystycznych jest umiejętnością własną. Zespół Microsoft Research Cambridge napisał bezpłatną książkę online, która daje delikatne wprowadzenie do artykułu. W rozdziale 3 tej książki bardziej szczegółowo omówiono model TrueSkill. Po utworzeniu modelu można przekształcić go w kod, korzystając z obszernej dokumentacji w witrynie internetowej Infer.NET.

Następne kroki

Zapoznaj się z repozytorium Infer.NET GitHub, aby kontynuować naukę i znaleźć więcej przykładów.