Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве рассказывается о вероятностном программировании с помощью Infer.NET. Вероятностное программирование — это подход машинного обучения, в котором пользовательские модели выражаются как компьютерные программы. Он позволяет включить знания домена в модели и сделать систему машинного обучения более интерпретируемой. Он также поддерживает онлайн-вывод — процесс обучения по мере поступления новых данных. Infer.NET используется в различных продуктах в Microsoft в Azure, Xbox и Bing.
Что такое вероятностное программирование?
Вероятностное программирование позволяет создавать статистические модели реальных процессов.
Предпосылки
Локальная среда разработки.
В этом руководстве предполагается, что у вас есть компьютер, который можно использовать для разработки. Руководство по .NET Hello World за 10 минут содержит инструкции по настройке локальной среды разработки в macOS, Windows или Linux.
Создание приложения
Откройте новую командную строку и выполните следующие команды:
dotnet new console -o myApp
cd myApp
Команда dotnet
создает new
приложение типа console
. Параметр -o
создает каталог с именем myApp
, в котором хранится приложение, и заполняет его необходимыми файлами. Команда cd myApp
помещает вас в только что созданный каталог приложений.
Установка пакета Infer.NET
Чтобы использовать Infer.NET, необходимо установить Microsoft.ML.Probabilistic.Compiler
пакет. В командной строке выполните следующую команду:
dotnet add package Microsoft.ML.Probabilistic.Compiler
Или в .NET 10+:
dotnet package add Microsoft.ML.Probabilistic.Compiler
Проектирование модели
В качестве примера используются матчи по настольному теннису или настольному футболу, которые проводятся в офисе. У вас имеется информация об участниках и исходе каждого матча. Вы хотите определить навыки игрока из этих данных. Предположим, что у каждого игрока есть скрытый навык с нормальным распределением, а их результаты в матчах являются шумной версией этого навыка. Данные ограничивают результаты победителя, чтобы они были выше результатов проигравшего. Это упрощенная версия популярной модели TrueSkill, которая также поддерживает команды, ничьи и другие расширения. Продвинутая версия этой модели используется для подбора игроков в самых продаваемых игровых тайтлах Halo и Gears of War.
Вы должны перечислить выводимые навыки игрока, а также их дисперсию - меру неопределенности вокруг навыков.
Примеры данных результата игры
Игра | Победитель | Проигравший |
---|---|---|
1 | Игрок 0 | Игрок 1 |
2 | Игрок 0 | Проигрыватель 3 |
3 | Игрок 0 | Проигрыватель 4 |
4 | Игрок 1 | Проигрыватель 2 |
5 | Проигрыватель 3 | Игрок 1 |
6 | Проигрыватель 4 | Проигрыватель 2 |
С более подробным взглядом на примеры данных вы заметите, что игроки 3 и 4 оба имеют одну победу и одну потерю. Давайте посмотрим, как выглядят рейтинги с помощью вероятностного программирования. Учтите, что также есть игрок номер ноль, так как даже списки выравнивания офисов начинаются с нуля для нас, разработчиков.
Напишите код
Спроектировав модель, пришло время выразить ее как вероятностную программу с помощью API моделирования Infer.NET. Откройте Program.cs
в избранном текстовом редакторе и замените все его содержимое следующим кодом:
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}");
}
}
}
}
Запуск приложения
В командной строке выполните следующую команду:
dotnet run
Результаты
Результаты должны быть похожи на следующие:
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)
В результатах обратите внимание, что согласно модели игрок 3 занимает немного более высокое место, чем игрок 4. Это связано с тем, что победа игрока 3 над игроком 1 является более значительной, чем победа игрока 4 над игроком 2 - обратите внимание, что игрок 1 бьет игрока 2. Игрок 0 является общим чемпионом!
Продолжайте обучение
Проектирование статистических моделей — это особый навык само по себе. Команда Microsoft Research Cambridge написала бесплатную онлайн-книгу, которая дает мягкое введение в статью. Глава 3 этой книги подробно описывает модель TrueSkill. Получив модель, вы можете преобразовать ее в код с помощью обширной документации на веб-сайте Infer.NET.
Дальнейшие действия
Ознакомьтесь с репозиторием Infer.NET GitHub, чтобы продолжить обучение и найти дополнительные примеры.