Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
Nebo v .NET 10+:
dotnet package add Microsoft.ML.Probabilistic.Compiler
Návrh modelu
Příklad používá zápasy stolního tenisu nebo stolního fotbalu, které se hrají v kanceláři. Máte účastníky a výsledek každého zápasu. 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 poraženého. 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 matchování v nejúspěšně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
Hra | Vítěz | Ztroskotanec |
---|---|---|
1 | 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ěte si, že existuje také hráč nula, protože i seznamy porovnání v kanceláři jsou pro nás vývojáře založeny na 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}");
}
}
}
}
Spuštění aplikace
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 je řazen o něco výše než hráč 4 podle 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.