Aracılığıyla paylaş


ML.NET'daki yenilikler

Uyarı

Bu makale devam eden bir çalışmadır.

ML.NET API'sinin tüm sürüm notlarını dotnet/machinelearning deposunda bulabilirsiniz.

Yeni derin öğrenme görevleri

ML.NET 3.0, aşağıdaki derin öğrenme görevleri için destek eklendi:

  • Nesne algılama (TorchSharp tarafından desteklenir)
  • Adlandırılmış varlık tanıma (NER)
  • Soru yanıtlama (QA)

Bu eğitmenler Microsoft.ML.TorchSharp paketine dahildir. Daha fazla bilgi için bkz. ML.NET 3.0 Duyuruları.

Otomatik Makine Öğrenimi (AutoML)

ML.NET 3.0'da AutoML süpürücü tümce benzerliği, soru yanıtlama ve nesne algılama görevlerini destekleyecek şekilde güncelleştirildi. AutoML hakkında daha fazla bilgi için bkz. ML.NET Otomatik Makine Öğrenmesi (AutoML) API'sini kullanma.

Ek belirteç desteği

Belirteç oluşturma, yapay zeka modelleri için doğal dil metninin ön işlemesinde temel bir bileşendir. Belirteç oluşturucular, bir metin dizesini genellikle belirteç olarak adlandırılan daha küçük, daha yönetilebilir bölümlere ayırmakla sorumludur. Azure OpenAI gibi hizmetleri kullanırken, maliyeti daha iyi anlamak ve bağlamı yönetmek için belirteç oluşturucuları kullanabilirsiniz. Şirket içinde barındırılan veya yerel modellerle çalışırken belirteçler bu modellere sağlanan girişlerdir. Microsoft.ML.Tokenizers kitaplığında belirteç oluşturma hakkında daha fazla bilgi için bkz. ML.NET 2.0 Duyuruları.

Microsoft.ML.Tokenizers paketi açık kaynaklı, platformlar arası bir belirteç oluşturma kitaplığı sağlar. ML.NET 4.0'da kitaplık aşağıdaki yollarla geliştirilmiştir:

  • Geliştirilmiş API'ler ve mevcut işlevler.
  • Tiktoken desteği eklendi.
  • Llama model için belirteç desteği eklendi.
  • CodeGen Codegen-350M-mono ve phi-2 gibi modellerle uyumlu belirteç oluşturucu eklendi.
  • EncodeToIds örneklerini kabul eden ve normalleştirmeyi ve önceden belirlemeyi özelleştirmenize olanak sağlayan aşırı yüklemeler eklendi.
  • Bu kitaplıkların kapsadığı senaryoları ele almak için DeepDev TokenizerLib ve SharpToken topluluklarla yakından çalıştı. Eğer DeepDev veya SharpToken kullanıyorsanız, Microsoft.ML.Tokenizers adresine geçiş yapmanızı öneririz. Diğer ayrıntılar için bkz. geçiş kılavuzu.

Aşağıdaki örnekler, Tiktoken metin belirleyicisinin nasıl kullanılacağını göstermektedir.

Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-4");
string text = "Hello, World!";

// Encode to IDs.
IReadOnlyList<int> encodedIds = tokenizer.EncodeToIds(text);
Console.WriteLine($"encodedIds = {{{string.Join(", ", encodedIds)}}}");
// encodedIds = {9906, 11, 4435, 0}

// Decode IDs to text.
string? decodedText = tokenizer.Decode(encodedIds);
Console.WriteLine($"decodedText = {decodedText}");
// decodedText = Hello, World!

// Get token count.
int idsCount = tokenizer.CountTokens(text);
Console.WriteLine($"idsCount = {idsCount}");
// idsCount = 4

// Full encoding.
IReadOnlyList<EncodedToken> result = tokenizer.EncodeToTokens(text, out string? normalizedString);
Console.WriteLine($"result.Tokens = {{'{string.Join("', '", result.Select(t => t.Value))}'}}");
// result.Tokens = {'Hello', ',', ' World', '!'}
Console.WriteLine($"result.Ids = {{{string.Join(", ", result.Select(t => t.Id))}}}");
// result.Ids = {9906, 11, 4435, 0}

// Encode up to number of tokens limit.
int index1 = tokenizer.GetIndexByTokenCount(
    text,
    maxTokenCount: 1,
    out string? processedText1,
    out int tokenCount1
    ); // Encode up to one token.
Console.WriteLine($"tokenCount1 = {tokenCount1}");
// tokenCount1 = 1
Console.WriteLine($"index1 = {index1}");
// index1 = 5

int index2 = tokenizer.GetIndexByTokenCountFromEnd(
    text,
    maxTokenCount: 1,
    out string? processedText2,
    out int tokenCount2
    ); // Encode from end up to one token.
Console.WriteLine($"tokenCount2 = {tokenCount2}");
// tokenCount2 = 1
Console.WriteLine($"index2 = {index2}");
// index2 = 12

Aşağıdaki örnekler, Llama metin belirleyicisinin nasıl kullanılacağını göstermektedir.

// Create the Tokenizer.
string modelUrl = @"https://huggingface.co/hf-internal-testing/llama-llamaTokenizer/resolve/main/llamaTokenizer.model";
using Stream remoteStream = File.OpenRead(modelUrl);
Tokenizer llamaTokenizer = LlamaTokenizer.Create(remoteStream);

string text = "Hello, World!";

// Encode to IDs.
IReadOnlyList<int> encodedIds = llamaTokenizer.EncodeToIds(text);
Console.WriteLine($"encodedIds = {{{string.Join(", ", encodedIds)}}}");
// encodedIds = {1, 15043, 29892, 2787, 29991}

// Decode IDs to text.
string? decodedText = llamaTokenizer.Decode(encodedIds);
Console.WriteLine($"decodedText = {decodedText}");
// decodedText = Hello, World!

// Get token count.
int idsCount = llamaTokenizer.CountTokens(text);
Console.WriteLine($"idsCount = {idsCount}");
// idsCount = 5

// Full encoding.
IReadOnlyList<EncodedToken> result = llamaTokenizer.EncodeToTokens(text, out string? normalizedString);
Console.WriteLine($"result.Tokens = {{'{string.Join("', '", result.Select(t => t.Value))}'}}");
// result.Tokens = {'<s>', '▁Hello', ',', '▁World', '!'}
Console.WriteLine($"result.Ids = {{{string.Join(", ", result.Select(t => t.Id))}}}");
// result.Ids = {1, 15043, 29892, 2787, 29991}

// Encode up 2 tokens.
int index1 = llamaTokenizer.GetIndexByTokenCount(text, maxTokenCount: 2, out string? processedText1, out int tokenCount1);
Console.WriteLine($"tokenCount1 = {tokenCount1}");
// tokenCount1 = 2
Console.WriteLine($"index1 = {index1}");
// index1 = 6

// Encode from end up to one token.
int index2 = llamaTokenizer.GetIndexByTokenCountFromEnd(text, maxTokenCount: 1, out string? processedText2, out int tokenCount2);
Console.WriteLine($"tokenCount2 = {tokenCount2}");
// tokenCount2 = 1
Console.WriteLine($"index2 = {index2}");
// index2 = 13

Aşağıdaki örneklerde belirteç oluşturucunun nasıl kullanılacağı gösterilmektedir CodeGen .

string phi2VocabPath = "https://huggingface.co/microsoft/phi-2/resolve/main/vocab.json?download=true";
string phi2MergePath = "https://huggingface.co/microsoft/phi-2/resolve/main/merges.txt?download=true";
using Stream vocabStream = File.OpenRead(phi2VocabPath);
using Stream mergesStream = File.OpenRead(phi2MergePath);

Tokenizer phi2Tokenizer = CodeGenTokenizer.Create(vocabStream, mergesStream);
IReadOnlyList<int> ids = phi2Tokenizer.EncodeToIds("Hello, World");

Aşağıdaki örnek, belirteç oluşturucu ile Span<char> nasıl kullanılacağını ve kodlama çağrılarında normalleştirmeyi veya önceden belirteçlemeyi nasıl devre dışı bırakılacağını gösterir.

ReadOnlySpan<char> textSpan = "Hello World".AsSpan();

// Bypass normalization.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);

// Bypass pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);

BPE belirteç oluşturucusunda bayt düzeyi desteği

artık BpeTokenizer bayt düzeyinde kodlamayı destekleyerek DeepSeek gibi modellerle uyumluluğu sağlıyor. Bu geliştirme, sözlüğü UTF-8 bayt olarak işler. Ayrıca, yeni BpeOptions tür belirteç oluşturucu yapılandırmasını basitleştirir.

BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);

LightGBM eğitmeni için belirleyici seçenek

LightGBM eğitmenleri artık belirleyici eğitim seçeneklerini ortaya çıkararak aynı verilerle ve rastgele tohumla tutarlı sonuçlar elde edilmesini sağlıyor. Bu seçenekler arasında deterministic, force_row_wiseve force_col_wisebulunur.

LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
    Deterministic = true,
    ForceRowWise = true
});

Model Oluşturucusu (Visual Studio uzantısı)

Model Oluşturucusu, ML.NET 3.0 sürümünü kullanacak şekilde güncelleştirildi. Model Builder sürüm 17.18.0, soru yanıtlama (QA) ve adlandırılmış varlık tanıma (NER) senaryoları eklendi.

Model Builder sürüm notlarının tümünü dotnet/machinelearning-modelbuilder deposunda bulabilirsiniz.

Ayrıca bakınız