다음을 통해 공유


Infer.NET 및 확률적 프로그래밍을 사용하여 게임 일치 목록 앱 만들기

이 방법 가이드에서는 Infer.NET 사용하는 확률적 프로그래밍에 대해 설명합니다. 확률 프로그래밍은 사용자 지정 모델이 컴퓨터 프로그램으로 표현되는 기계 학습 접근 방식입니다. 이를 통해 모델에 도메인 지식을 통합할 수 있으며 기계 학습 시스템을 보다 쉽게 해석할 수 있습니다. 또한 온라인 유추를 지원합니다. 새 데이터가 도착할 때 학습하는 프로세스입니다. Infer.NET Azure, Xbox 및 Bing의 Microsoft에서 다양한 제품에 사용됩니다.

확률적 프로그래밍이란?

확률적 프로그래밍을 사용하면 실제 프로세스의 통계 모델을 만들 수 있습니다.

필수 조건

  • 로컬 개발 환경.

    이 사용 설명서에서는 개발에 사용할 수 있는 컴퓨터가 필요합니다. 10분 안에 .NET 자습서 Hello World에는 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 모두 1승 1패를 기록하게 됩니다. 확률적 프로그래밍을 사용하여 순위가 어떻게 표시되는지 살펴보겠습니다. 또한 Office 매치 목록은 개발자가 0부터 시작하도록 설정했기 때문에 플레이어 0이 있습니다.

일부 코드 작성

모델을 디자인한 후에는 Infer.NET 모델링 API를 사용하여 확률적 프로그램으로 표현해야 합니다. 즐겨 찾는 텍스트 편집기에서 열고 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보다 약간 높은 순위를 다는 것을 알 수 있습니다. 플레이어 1을 통해 플레이어 3의 승리가 플레이어 2를 통해 플레이어 4의 승리보다 더 중요하기 때문입니다 - 플레이어 1이 플레이어 2를 친다는 점에 유의하십시오. 플레이어 0은 전체 챔피언입니다!

학습 유지

통계 모델을 디자인하는 것은 그 자체로 기술입니다. Microsoft Research Cambridge 팀은 무료 온라인 책을 작성했으며, 이 책은 이 기사에 대한 부드러운 소개를 제공합니다. 이 책의 3장에서는 TrueSkill 모델에 대해 자세히 설명합니다. 모델을 염두에 두고 나면 Infer.NET 웹 사이트의 광범위한 설명서를 사용하여 코드로 변환할 수 있습니다.

다음 단계

계속 학습하고 더 많은 샘플을 찾으려면 Infer.NET GitHub 리포지토리를 확인하세요.