Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Эта статья находится в процессе написания.
Все заметки о выпуске API ML.NET можно найти в репозитории dotnet/machinelearning.
Новые задачи глубокого обучения
ML.NET 3.0 добавлена поддержка следующих задач глубокого обучения:
- Обнаружение объектов (поддерживается TorchSharp)
- Распознавание именованных сущностей (NER)
- Ответы на вопросы (QA)
Эти обучающие средства включены в пакет Microsoft.ML.TorchSharp . Дополнительные сведения см. в разделе "Объявление ML.NET 3.0".
AutoML (автоматизированное машинное обучение)
В ML.NET 3.0 средство очистки AutoML было обновлено для поддержки сходства предложений, ответа на вопросы и задачи обнаружения объектов. Дополнительные сведения об AutoML см. в статье "Использование API автоматического машинного обучения (AutoML) ML.NET.
Дополнительная поддержка токенизатора
Маркеризация является основным компонентом предварительной обработки текста естественного языка для моделей искусственного интеллекта. Маркеризаторы отвечают за разбиение строки текста на меньшие, более управляемые части, часто называемые маркерами. При использовании таких служб, как Azure OpenAI, можно использовать маркеризаторы, чтобы лучше понять затраты и управлять контекстом. При работе с самоуправляемыми или локальными моделями токены представляют собой входные данные, предоставляемые этим моделям. Дополнительные сведения о токенизации в библиотеке Microsoft.ML.Tokenizers см. в разделе "Объявление о ML.NET 2.0".
Пакет Microsoft.ML.Tokenizers предоставляет библиотеку межплатформенной токенизации с открытым кодом. В ML.NET 4.0 библиотека была улучшена следующим образом:
- Усовершенствованные API и существующие функциональные возможности.
- Добавлена поддержка
Tiktoken
. - Добавлена поддержка токенизатора
Llama
для модели. - Добавлен токенизатор
CodeGen
, который совместим с моделями, такими как codegen-350M-mono и phi-2. - Добавлены перегрузки
EncodeToIds
, которые принимают экземплярыSpan<char>
и дают возможность настраивать процессы нормализации и претокенизации. - Тесно сотрудничали с DeepDev
TokenizerLib
иSharpToken
сообществами, чтобы охватывать сценарии, охватываемые этими библиотеками. Если вы используетеDeepDev
илиSharpToken
, мы рекомендуем перейти наMicrosoft.ML.Tokenizers
. Дополнительные сведения см. в руководстве по миграции.
В следующих примерах показано, как использовать средство токенизатора Tiktoken
текста.
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
В следующих примерах показано, как использовать средство токенизатора Llama
текста.
// 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
В следующих примерах показано, как использовать 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");
В следующем примере показано, как использовать маркеризатор с Span<char>
и как отключить нормализацию или предварительную токенизацию при вызовах кодирования.
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
Теперь поддерживается BpeTokenizer кодировка на уровне байтов, обеспечивая совместимость с моделями, такими как DeepSeek. Это улучшение преобразует лексику в виде байтов UTF-8. Кроме того, новый BpeOptions
тип упрощает настройку токенизатора.
BpeOptions bpeOptions = new BpeOptions(vocabs);
BpeTokenizer tokenizer = BpeTokenizer.Create(bpeOptions);
Опция с детерминированным результатом для обучения LightGBM
Теперь тренеры LightGBM предоставляют варианты детерминированного обучения, обеспечивая согласованные результаты с теми же данными и случайными начальными значениями. К этим параметрам относятся deterministic
, force_row_wise
и force_col_wise
.
LightGbmBinaryTrainer trainer = ML.BinaryClassification.Trainers.LightGbm(new LightGbmBinaryTrainer.Options
{
Deterministic = true,
ForceRowWise = true
});
Построитель моделей (расширение Visual Studio)
Конструктор моделей был обновлен, чтобы использовать релиз ML.NET 3.0. Построитель моделей версии 17.18.0 добавил ответы на вопросы (QA) и сценарии распознавания именованных сущностей (NER).
Все заметки о выпуске конструктора моделей можно найти в репозитории dotnet/machinelearning-modelbuilder.