Sdílet prostřednictvím


Vytvoření aplikace seznamu zápasů s Infer.NET a pravděpodobnostickým programováním

Tento návod vás seznámí s pravděpodobnostickým programováním pomocí Infer.NET. Pravděpodobnostní programování je přístup strojového učení, při kterém se vlastní modely vyjadřují jako počítačové programy. Umožňuje začlenit do modelů znalosti domény a systém strojového učení je interpretovatelný. Podporuje také online odvozování – proces učení při příchodu nových dat. Infer.NET se používá v různých produktech Microsoftu v Azure, Xboxu a Bingu.

Co je pravděpodobnostní programování?

Pravděpodobnostní programování umožňuje vytvářet statistické modely reálných procesů.

Požadavky

  • Místní vývojové prostředí.

    Tento návod očekává, že budete mít počítač, který můžete použít pro vývoj. Kurz .NET Hello World za 10 minut obsahuje pokyny k nastavení místního vývojového prostředí v systémech macOS, Windows nebo Linux.

Vytvoření aplikace

Otevřete nový příkazový řádek a spusťte následující příkazy:

dotnet new console -o myApp
cd myApp

Příkaz dotnet vytvoří new aplikaci typu console. Parametr -o vytvoří adresář s názvem myApp , ve kterém je vaše aplikace uložená, a naplní ji požadovanými soubory. Příkaz cd myApp vás umístí do nově vytvořeného adresáře aplikace.

Instalace balíčku Infer.NET

Pokud chcete použít Infer.NET, musíte balíček nainstalovat Microsoft.ML.Probabilistic.Compiler . Na příkazovém řádku spusťte následující příkaz:

dotnet add package Microsoft.ML.Probabilistic.Compiler

Návrh modelu

Příklad příkladu používá stolní tenis nebo foosball zápasy, které se hrají v kanceláři. Máte účastníky a výsledek každé shody. Chcete odvodit dovednosti hráče z těchto dat. Předpokládejme, že každý hráč má obvykle distribuovanou latentní dovednost a jejich výkon zápasu je hlučná verze této dovednosti. Data omezují výkon vítěze tak, aby byl větší než výkon vítěze. Jedná se o zjednodušenou verzi oblíbeného modelu TrueSkill , který podporuje také týmy, losování a další rozšíření. Pokročilá verze tohoto modelu se používá pro tvorbu zápasů v nejprodávanějších herních titulech Halo a Gears of War.

Musíte uvést odvozené dovednosti hráčů spolu s jejich rozptylem – míra nejistoty v oblasti dovedností.

Ukázková data výsledku hry

Herní Vítěz Loser
0 Hráč 0 Hráč 1
2 Hráč 0 Hráč 3
3 Hráč 0 Hráč 4
4 Hráč 1 Hráč 2
5 Hráč 3 Hráč 1
6 Hráč 4 Hráč 2

Při bližším pohledu na ukázková data si všimnete, že hráči 3 a 4 mají jednu výhru i jednu ztrátu. Pojďme se podívat, jak vypadají hodnocení pomocí pravděpodobnostních programování. Všimnětesich seznamů, ale i počet hráčů je nulový, protože vývojáři jsou rovna nule.

Napsat nějaký kód

Při návrhu modelu je čas ho vyjádřit jako pravděpodobnostní program pomocí rozhraní API pro modelování Infer.NET. Otevřete Program.cs v oblíbeném textovém editoru a nahraďte veškerý jeho obsah následujícím kódem:

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}");
            }
        }
    }
}

Spusťte aplikaci

Na příkazovém řádku spusťte následující příkaz:

dotnet run

Výsledky

Výsledky by měly být podobné následujícímu:

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)

Ve výsledcích si všimněte, že hráč 3 řadí mírně vyšší než hráč 4 podle našeho modelu. Je to proto, že vítězství hráče 3 nad hráčem 1 je důležitější než vítězství hráče 4 nad hráčem 2 – všimněte si, že hráč 1 porazí hráče 2. Hráč 0 je celkový šampión!

Pokračovat ve studiu

Navrhování statistických modelů je dovednost sama o sobě. Tým Microsoft Research Cambridge napsal bezplatnou online knihu, která poskytuje jemný úvod do článku. Kapitola 3 této knihy podrobněji popisuje model TrueSkill. Jakmile máte model na paměti, můžete ho transformovat na kód pomocí rozsáhlé dokumentace na webu Infer.NET.

Další kroky

Projděte si úložiště Infer.NET GitHubu a pokračujte ve studiu a vyhledejte další ukázky.