ML.NET یک چارچوب یادگیری ماشینی متنباز و چندپلتفرمی است که برای توسعهدهندگان NET. طراحی شده است. این چارچوب امکان یکپارچهسازی مدلهای سفارشی یادگیری ماشینی در برنامههای NET. را فراهم میآورد. اکنون، نسخه 3.0 ML.NET با ویژگیهای جدید و بهبودهای فراوان منتشر شده است.
در این نسخه جدید، سناریوهای یادگیری عمیق توسعه یافتهاند و شامل قابلیتهای نوین در زمینههایی چون تشخیص اشیاء، شناسایی نامهای موجودیتها، و پاسخگویی به سؤالات هستند. این پیشرفتها مدیون همکاری و ادغام با مدلهای TorchSharp و ONNX است. علاوه بر این، ما ادغام خود را با آخرین نسخه LightGBM نیز بهروزرسانی کردهایم.
در زمینه پردازش دادهها، سناریوهای مربوط به این بخش با لیست طولانی از بهبودها و رفع اشکالات در DataFrame، به همراه ویژگیهای جدید برای همکاری IDataView، بهطور قابل توجهی ارتقاء یافتهاند. مراحل کلیدی مانند بارگذاری، بررسی، تبدیل، و تصویرسازی دادهها اکنون بسیار قدرتمندتر شدهاند.
این پست تنها برخی جنبههای مهم از انتشار ML.NET 3.0 را برجسته میکند. برای مطالعه لیست کامل بهروزرسانیها، میتوانید به یادداشتهای انتشار مراجعه کنید.
یادگیری عمیق
در طول سال گذشته، همه ما شاهد شتاب گرفتن پیشرفت در سناریوها و تواناییهای یادگیری عمیق بودهایم. با ML.NET 3.0، شما میتوانید از بسیاری از این پیشرفتها در برنامههای NET. خود استفاده کنید.
تشخیص اشیاء
تشخیص اشیاء یک موضوع مهم در حوزه بینایی کامپیوتر است که از طبقهبندی تصویر فراتر میرود. این فرایند نه تنها دستهبندی اشیاء موجود در تصاویر را انجام میدهد، بلکه موقعیت دقیق آنها را نیز تعیین میکند. تشخیص اشیاء به خصوص هنگامی کاربردی است که تصاویر حاوی چندین شیء از انواع مختلف باشند.
امسال، ما این قابلیت را در ML.NET Model Builder معرفی کردیم. قابلیتهای تشخیص اشیاء مبتنی بر APIهای TorchSharp هستند که در ML.NET 3.0 تحت شماره PR #6605 معرفی شدند.
در پشت پرده، API تشخیص اشیاء از برخی از جدیدترین تکنیکهای تحقیقاتی مایکروسافت بهرهمند است و توسط معماری شبکه عصبی مبتنی بر Transformer و ساخته شده با TorchSharp پشتیبانی میشود.
تشخیص اشیاء در بسته Microsoft.ML.TorchSharp نسخه 3.0.0 و در فضاهای نام Microsoft.ML.TorchSharp و Microsoft.ML.TorchSharp.AutoFormerV2 قرار دارد.
var chain = new EstimatorChain<ITransformer>();
var filteredPipeline = chain. Append(
mlContext.Transforms.Text.TokenizeIntoWords(labelColumnName, separators: [',']),
TransformerScope.Training
)
.Append(
mlContext.Transforms.Conversion.MapValueToKey(labelColumnName),
TransformerScope.Training
)
.Append(
mlContext.Transforms.Text.TokenizeIntoWords(boundingBoxColumnName, separators: [',']),
TransformerScope.Training
)
.Append(
mlContext.Transforms.Conversion.ConvertType(boundingBoxColumnName),
TransformerScope.Training
)
.Append(mlContext.Transforms.LoadImages("Image", imageFolder, "ImagePath"))
.Append(
mlContext.MulticlassClassification.Trainers.ObjectDetection(
labelColumnName, predictedLabelColumnName, scoreColumnName,
boundingBoxColumnName, predictedBoundingBoxColumnName,
imageColumnName, maxEpoch
)
)
.Append(mlContext.Transforms.Conversion.MapKeyToValue(predictedLabelColumnName));
var options = new ObjectDetectionTrainer.Options()
{
LabelColumnName = labelColumnName,
BoundingBoxColumnName = boundingBoxColumnName,
ScoreThreshold = .5,
MaxEpoch = maxEpoch,
LogEveryNStep = 1,
};
var pipeline = mlContext.Transforms.Text.TokenizeIntoWords(labelColumnName, separators: [','])
.Append(mlContext.Transforms.Conversion.MapValueToKey(labelColumnName))
.Append(mlContext.Transforms.Text.TokenizeIntoWords(boundingBoxColumnName, separators: [',']))
.Append(mlContext.Transforms.Conversion.ConvertType(boundingBoxColumnName))
.Append(mlContext.Transforms.LoadImages("Image", imageFolder, "ImagePath"))
.Append(mlContext.MulticlassClassification.Trainers.ObjectDetection(options))
.Append(mlContext.Transforms.Conversion.MapKeyToValue(predictedLabelColumnName));
var model = pipeline.Fit(data);
var idv = model.Transform(data);
var metrics = ML.MulticlassClassification.EvaluateObjectDetection(
idv, idv.Schema[2], idv.Schema[boundingBoxColumnName], idv.Schema[predictedLabelColumnName],
idv.Schema[predictedBoundingBoxColumnName], idv.Schema[scoreColumnName]
);
به نام نهاد شناسایی و پاسخ به سؤال
پردازش زبان طبیعی (NLP) یکی از متداولترین نیازهای ماشینلرنینگ در نرمافزارها است. در این حوزه، دو موضوع مهم پیشرفت عبارتند از پاسخدهی به سوالات (QA) و تشخیص نامگذاری شدهها (NER). هر دوی این قابلیتها در نسخهی 3.0 ML.NET فعال شدهاند، که این امر با بهرهگیری از ویژگیهای دستهبندی متن RoBERTa ممکن شده است، ویژگیهایی که پیشتر در ML.NET 2.0 معرفی شده بودند.
آموزشدهندههای مربوط به NER و QA هر دو در بستهی Microsoft.ML.TorchSharp نسخهی 3.0.0 و در فضای نام Microsoft.ML.TorchSharp قرار گرفتهاند.
/ QA trainer
var chain = new EstimatorChain<ITransformer>();
var estimatorQA = chain.Append(mlContext.MulticlassClassification.Trainers.QuestionAnswer(
contextColumnName, questionColumnName, trainingAnswerColumnName,
answerIndexColumnName, predictedAnswerColumnName, scoreColumnName,
topK, batchSize, maxEpochs, architecture, validationSet
));
// NER trainer
var estimatorNER = chain.Append(mlContext.Transforms.Conversion.MapValueToKey("Label", keyData))
.Append(mlContext.MulticlassClassification.Trainers.NameEntityRecognition(
labelColumnName, outputColumnName, sentence1ColumnName,
batchSize, maxEpochs, architecture, validationSet
))
.Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumn));
شتابدهی آموزش با استفاده از Intel oneDAL در ML.NET
کمی پس از انتشار ML.NET 2.0، ما خبر دادیم که در قالب اولین پیشنمایش ML.NET 3.0، شتابدهی سختافزاری آموزش را با استفاده از Intel oneDAL فراهم کردهایم. Intel oneDAL، که بخشی از کتابخانه تحلیل دادههای Intel oneAPI است، یک کتابخانه برای تسریع فرآیند تحلیل دادهها و یادگیری ماشین است. این کتابخانه با ارائه بلوکهای الگوریتمی بهینهسازی شده برای تمام مراحل فرآیند تحلیل دادهها، به افزایش سرعت کمک میکند. Intel oneDAL از گسترشهای SIMD (Single Instruction, Multiple Data) در معماریهای ۶۴ بیتی بهره میبرد، که در پردازندههای Intel و AMD موجود است.
یادگیری ماشین خودکار (AutoML)
یادگیری ماشین خودکار (AutoML) فرآیندی است که یادگیری ماشین را بر روی دادهها بهطور خودکار اعمال میکند. AutoML تجربهای مشابه آنچه در Model Builder و CLI ML.NET ارائه میشود را فراهم میکند. در ML.NET 3.0، تجربه AutoML با چندین قابلیت جدید تقویت شده است. AutoML Sweeper اکنون از قابلیتهای شباهت جملات، پاسخگویی به سوالات، و تشخیص اشیاء پشتیبانی میکند. عضو جامعه، Antti "Andy" Törrönen (@torronen)، پیادهسازی نام ستون کلید نمونهبرداری (SamplingKeyColumnName) را انجام داده است که از طریق SetDataset میتوان برای تعیین راحتتر نام کلید نمونهبرداری استفاده کرد. تنظیمکننده AutoZero هم اکنون در آزمایشهای BinaryClassification قابل استفاده است و حداکثر تعداد مدلهای مورد استفاده برای یک آزمایش میتواند از طریق ExperimentSettings.MaxModel مشخص شود.
همچنین، با تشکر از عضو جامعه Andras Fuchs (@andrasfuchs)، نظارت مداوم منابع اکنون از طریق AutoML.IMonitor فراهم شده است. این امکان پایش تقاضای حافظه، استفاده از حافظه مجازی، و فضای دیسک باقیمانده را فراهم میکند. با این نظارت، آزمایشهای طولانیمدت میتوانند از طریق پیادهسازی سفارشی IMonitor کنترل شوند تا از خرابیها و شکستهای آزمایش جلوگیری شود.
در بخش دیگری از متن که به بهروزرسانیهای قابل توجه DataFrame در .NET و معرفی Tensor Primitives در .NET 8 میپردازد، چنین آمده است: "این نسخه شامل فهرست طولانی از بهروزرسانیهای قابل توجه برای DataFrame است، بسیاری از این بهروزرسانیها توسط عضو جامعه، الکسی اسمیرنوف (@asmirnov82) انجام شدهاند. ما از مشارکتهای الکسی قدردانی میکنیم و مطمئنیم که شما نیز از آنها قدردانی خواهید کرد. برای فعال کردن تبدیلهای بیشتر IDataView <-> DataFrame، پشتیبانی از انواع ستون String و VBuffer اضافه شده است. مقادیر String به عنوان ReadOnlyMemory<char> مدیریت میشوند و نوع ستون VBufferDataFrameColumn<T> از تمام پردازشهای پشتیبان پشتیبانی میکند. ستونها اکنون میتوانند بیش از 2 گیگابایت داده را ذخیره کنند، که قبلاً این محدودیت برداشته شده است. دادههای ستون تاریخ Apache Arrow Date64 نیز اکنون شناسایی میشوند.
سناریوهای بارگذاری داده برای DataFrame در ML.NET 3.0 توسعه یافتهاند. اکنون امکان وارد کردن دادهها از پایگاههای داده SQL و صادر کردن آنها وجود دارد، که این امکان توسط عضو جامعه، آندری فابر (@andrei-faber) فراهم شده است. این کار با استفاده از ADO.NET انجام میشود که از تعداد زیادی از پایگاههای داده سازگار با SQL پشتیبانی میکند. همچنین، به عنوان بخشی از این پیادهسازی، امکان بارگذاری دادهها از هر مجموعه IEnumerable و صادر کردن دادهها به System.Data.DataTable نیز فراهم شده است. حالا، دادهها میتوانند از یک DataFrame به DataFrame دیگری پیوست شوند، در صورتی که نامهای ستونهای آنها مطابقت داشته باشند، که این محدودیت قبلی در ترتیب ستونها را کاهش میدهد. همچنین، دادههای جدا شده با ویرگول که از طریق DataFrame.LoadCsv بارگذاری میشوند اکنون میتوانند نامهای ستون تکراری را مدیریت کنند، با گزینهای برای تغییر نام ستونهای تکراری.
بسیاری از بهبودها و اصلاحات دیگر نیز در DataFrame انجام شدهاند. عملکرد ریاضی در سناریوهای کپی کردن ستون و مقایسه باینری بهبود یافته است. کنترل مقادیر null در هنگام انجام عملیات ریاضی نیز بهبود یافته، که نیاز به گامهای کمتری برای تبدیل و پاکسازی دادهها دارد. علاوه بر این، بهبودهایی در ابزارهای عیبیابی ایجاد شدهاند که خروجی خواناتری برای ستونها با نامهای طولانی فراهم میکنند.
تجزیه و تحلیل تنسور، که مخفف System.Numerics.Tensors.TensorPrimitives است، مجموعهای جدید از APIها است که پشتیبانی از عملیات تنسور را معرفی میکند. به عنوان بخشی از .NET 8، تیم ما بسته جدید System.Numerics.Tensors را منتشر کرده است که تجزیه و تحلیل تنسور را معرفی میکند. APIهای تجزیه و تحلیل تنسور گام بعدی در تکامل عددی برای AI در .NET هستند، که بر مومنتوم سختافزار داخلی و ریاضیات عمومی ساخته شدهاند.
در حالی که ادغام با تجزیه و تحلیل تنسور صرفاً یک جزئیات پیادهسازی است که بر روی سطح سطح عمومی ML.NET تأثیر نمیگذارد، اما بهبودهای قابل توجهی در عملکرد را به ارمغان میآورد. نتایج بنچمارک زیر پیشرفتها را در هدفگذاری .NET 8 نشان میدهد.
روش | طول آرایه | میانگین – اصلی | میانگین – جدید | % سریعتر |
---|---|---|---|---|
AddScalarU | 512 | 25.30 نانوثانیه | 20.32 نانوثانیه | 25% |
Scale | 512 | 19.91 نانوثانیه | 19.29 نانوثانیه | 3% |
ScaleSrcU | 512 | 27.58 نانوثانیه | 20.74 نانوثانیه | 33% |
ScaleAddU | 512 | 28.46 نانوثانیه | 29.05 نانوثانیه | — |
AddScaleU | 512 | 29.74 نانوثانیه | 28.59 نانوثانیه | 4% |
AddScaleSU | 512 | 345.92 نانوثانیه | 327.68 نانوثانیه | 6% |
AddScaleCopyU | 512 | 34.01 نانوثانیه | 27.03 نانوثانیه | 26% |
AddU | 512 | 29.80 نانوثانیه | 26.71 نانوثانیه | 12% |
AddSU | 512 | 325.32 نانوثانیه | 349.46 نانوثانیه | — |
MulElementWiseU | 512 | 33.92 نانوثانیه | 27.29 نانوثانیه | 24% |
Sum | 512 | 36.57 نانوثانیه | 34.34 نانوثانیه | 6% |
SumSqU | 512 | 37.50 نانوثانیه | 39.34 نانوثانیه | -5% |
SumSqDiffU | 512 | 41.23 نانوثانیه | 43.38 نانوثانیه | — |
SumAbsU | 512 | 43.74 نانوثانیه | 39.27 نانوثانیه | 11% |
SumAbsDiffU | 512 | 47.23 نانوثانیه | 37.48 نانوثانیه | 26% |
MaxAbsU | 512 | 42.30 نانوثانیه | 43.26 نانوثانیه | — |
MaxAbsDiffU | 512 | 46.94 نانوثانیه | 47.73 نانوثانیه | — |
DotU | 512 | 50.34 نانوثانیه | 43.20 نانوثانیه | 17% |
DotSU | 512 | 212.19 نانوثانیه | 213.18 نانوثانیه | — |
Dist2 | 512 | 55.48 نانوثانیه | 47.43 نانوثانیه | 17% |
در جزئیات بیشتر و نتایج بنچمارک فریمورک .NET در درخواست کششی dotnet/machinelearning#6875 که این ادغام را معرفی کرد، اطلاعات دقیقی ارائه شده است. علاوه بر مزایای عملکردی، ما از فرصت ادغام برای آزمایش شکل API، کاربردپذیری، عملکردیت، و صحت APIهای TensorPrimitives استفاده کردیم. این کار اثبات کرد که APIها میتوانند سناریوهای ML.NET را برآورده سازند، که گام ارزشمندی برای خارج کردن بسته System.Numerics.Tensors از نسخه پیشنمایش و ارائه نسخه پایدار 8.0.0 بود.
بعدی چیست؟ با اتمام انتشارات .NET 8 و ML.NET 3.0، ما بر روی برنامههایمان برای .NET 9 و ML.NET 4.0 کار میکنیم. اما خیلی زودتر از آن، میتوانید انتظار داشته باشید که Model Builder و ML.NET CLI برای استفاده از انتشار ML.NET 3.0 بهروزرسانی شوند.
ما میدانیم که به گسترش سناریوها و ادغامهای یادگیری عمیق ادامه خواهیم داد، و میدانیم که به بهبودهای DataFrame ادامه خواهیم داد. ما به گسترش APIهای موجود در System.Numerics.Tensors ادامه داده و آنها را در ML.NET ادغام خواهیم کرد. برای طرحهای دقیقتر ML.NET 4.0 با ما همراه باشید.
برای شروع و منابع بیشتر برای آموزش درباره ML.NET، Model Builder، و ML.NET CLI به Microsoft Learn مراجعه کنید. اگر با هرگونه مشکلات، درخواستهای ویژگی، یا بازخوردی مواجه شدید، لطفا یک مسئله در ریپو ML.NET ثبت کنید. به جامعه دیسکورد ML.NET یا کانال #machine-learning در دیسکورد توسعهدهندگان .NET بپیوندید. هر دو چهارشنبه دیگر ساعت 10 صبح به وقت اقیانوس آرام به Machine Learning .NET Community Standup گوش دهید. برای آموزش مقدماتی یادگیری ماشین با Ml.NET دوره رایگان ما را مشاهده نمایید.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید