Алгоритмите за машинно обучение обикновено изискват тежки изчислителни и паметови ресурси във фазата на обучение, много повече от това, което типичният ограничен микроконтролер може да предложи. Дори базираните на сензори набори от данни днес варират някъде между няколкостотин мегабайта и няколко гигабайта. Няма начин да поберем тези EEPROM с размер kB на нашите малки микроконтролери, забравете да изпълнявате алгоритми върху тези набори от данни! Като се има предвид това, всяка надежда не е загубена. След обучението много традиционни алгоритми за машинно обучение се свеждат до прости параметри, които изискват прости аритметични и логически операции за извод. Те могат лесно да работят на микроконтролери в реално време.

В тази статия ще научим използването на нова библиотека, базирана на Python, наречена micro-learnкоято улеснява процеса на създаване на код за извод за Arduino и други микроконтролери за модели на машинно обучение, обучени с помощта на scikit-learn.

Анализ на ML алгоритми за ограничени устройства

Преди да преминем към практическите неща, нека да разгледаме накратко теорията (преминете към следващия раздел за урока за Arduino). Така че, както споменахме по-рано, обучението на модели за машинно обучение на малки микроконтролери е напълно изключено и не е необходимо само по себе си. Повечето практични ML/DL приложения в наши дни изискват GPU кутии за обучение, но изпълняват извода на обикновени машини в реално време. Ние ще направим нещо подобно.

Алгоритмите за машинно обучение, като опорна векторна машина (SVM), линеен/квадратичен дискриминантен анализ (LDA/QDA), логистична регресия, наивен метод на Гаус (GNB), дърво на решенията, линейна регресия и др. изискват значителни ресурси във фазата на обучение, но справедливо прости аритметични изчисления за извод. Нека да разгледаме подробно QDA. За други алгоритми можете да се обърнете към моята ACM хартия. QDA е квадратичен граничен класификатор на решение, който приема класовото условно разпределение на данните, P(X = x|Y = k), като многовариантна Гаус:

За нов вектор със засечени данни xₛ прогнозите се правят с помощта на правилото на Bayes:

По време на фазата на обучение на QDA, класът означава μₖ, ковариационните матрициΣₖи предходните класове P(Y = k)се научават от набора от данни . При внедряването на QDA на scikit-learn, след обучението (напасване), тези обучени параметри могат да бъдат достъпни от means_, covariance_ и priors_ съответно атрибути. Решаването на горните уравнения за набор от данни от двоичен клас води до следното правило за извод:

Тук c е следната сложно изглеждаща формула, която просто се свежда до една константа с плаваща запетая:

Σ⁻¹ = Σ₀⁻¹ - Σ₁⁻¹ е константа d×d матрица с плаваща запетая и w = 2Σ₁⁻¹μ₁ - 2Σ₀ ⁻¹μ₀ е константен d×1 вектор/масив с константа с плаваща запетая. Ясно е, че след обучението първо трябва да се изчислят тези константи чрез заместване на обучените параметри в горните формулировки и след това да се напише правилото за извод в C/C++ с тези константи, разтоварени. Нелека задача, нали? Какво ще стане, ако ви кажа, че има начин да генерирате кода за извод на Arduino чрез еднократно извикване на функция върху обучения scikit-learn модел? Е, това е мястото, където библиотеката за микро обучение идва!

Урок: Разтоварване на обучени ML модели към Arduino

Както беше посочено по-горе, micro-learn е библиотека на Python, която може да преобразува ML модел, обучен с помощта на scikit-learn, в код за извод на Arduino. Всички алгоритми за извод са оптимизирани за микроконтролери и изискват възможно най-малко аритметични изчисления. Операциите с деление са преобразувани в умножение, тъй като последното е много по-ефективно от изчислителна гледна точка. Имайте предвид, че всички алгоритми са точни, а не приблизителни. Към момента се поддържат шест двоични ML алгоритми:

  1. Перцептрон
  2. Линейна регресия (LR)
  3. Gaussian Naive Bayes (GNB)
  4. Линеен дискриминантен анализ (LDA)
  5. Квадратичен дискриминантен анализ (QDA)
  6. Поддържаща векторна машина (SVM) (линейно ядро)

Нека използваме практичен IoT „набор от данни“ за този урок. Това е набор от данни за откриване на заетост, който е събран чрез разполагане на Arduino с четири сензора: температура, влажност, светлина и CO₂ в малка стая. Повече подробности за настройката можете да намерите в тази хартия. Сега наборът от данни се състои от три файла: datatraining, datatest и datatest2. Ще използваме файла за обучение на данни, за да обучим ML модел и да го прехвърлим в Arduino, така че да можем да правим прогнози в реално време.

Първо, клонирайте/изтеглете библиотеката micro-learn(обърнете внимание на зависимостите на Python) и се уверете, че директорията microlearn е в пътя на вашия код IDE. За всички алгоритми, с изключение на тези с мащабен вариант като SVM, следвайте следната процедура за кодиране:

Това ще доведе до .ino файл със съответния код за извод, попълнен с всички обучени константи. Разделът с данни, разбира се, трябва да бъде кодиран ръчно, както е указано в коментарите в кода.

Процедурата за разтоварване на други ML алгоритми освен SVM е идентична. SVM обаче е алгоритъм с вариант на мащаба и също изисква обучен екземпляр на StandardScaler за извод.

И ето го! Просто, нали? Освен това, тъй като езикът за програмиране Arduino е производно на C/C++, можете директно да редактирате този изходен шаблон .ino и да го конвертирате също в общ .c или .cpp код. В момента библиотеката е ограничена до шест алгоритъма и двоична класификация. Скоро ще бъде добавена поддръжка за повече алгоритми и многокласова класификация!

Препратки

[1] За повече информация относно ограниченото машинно обучение и неговите практически случаи на употреба, можете да се обърнете към моя документ за ACM: https://dl.acm.org/doi/abs/10.1145/3341105.3373967

[2] Github repo: https://github.com/adarsh1001/micro-learn