Інтернет і технології / Інше · 29 Вересня, 2022

Python AI: Як побудувати нейронну мережу і робити прогнози

Огляд штучного інтелекту

Простіше кажучи, мета використання ШІ полягає в тому, щоб змусити комп’ютери мислити так само, як і люди. Це може здатися чимось новим, але ця ідея народилася ще в 1960-х роках.

Уявіть, що вам потрібно написати програму Python, яка використовує ШІ для вирішення проблеми судоку. Спосіб зробити це – написати умовні твердження і протестувати обмеження, щоб побачити, чи можна розмістити номер в кожній позиції.

Машинне навчання (ML) і глибоке навчання (DL) також є підходами до вирішення проблем. Відмінність цих методів від скрипта Python полягає в тому, що ML і DL використовують навчальні дані замість жорстко закодованих правил, але всі вони можуть бути використані для вирішення завдань за допомогою ШІ. У наведених нижче розділах ви дізнаєтеся більше про те, чим відрізняються ці два методи.

Машинне навчання

Машинне навчання – це техніка, в якій ви навчаєте систему для вирішення проблеми замість явного програмування правил. Повертаючись до прикладу Судоку в попередньому розділі, щоб вирішити проблему з машинним навчанням, вам доведеться зібрати дані з вирішених ігор судоку і навчити статистичну модельСтатистичні моделі – це математично формалізовані способи апроксимації поведінки явища.

Поширеним завданням машинного навчання є контрольоване навчання, в якому у вас є набір даних з вхідними і відомими виходами. Завдання полягає в тому, щоб використовувати цей набір даних для навчання моделі, яка передбачає правильний вихід на основі вхідних даних. На зображенні нижче показано робочий процес навчання моделі з використанням навчання за допомогою вчителя:

Об’єднання навчальних даних з алгоритмом машинного навчання створює модель. Потім ви можете використовувати цю модель для прогнозування нових даних.

Примітка. scikit-learn — це популярна бібліотека машинного навчання Python, яка надає різноманітні алгоритми навчання за допомогою вчителя та без нагляду. Щоб дізнатися більше про це, перегляньте розділ Розділення набору даних за допомогою train_test_split() з scikit-learn .

Мета контрольованих навчальних завдань – робити прогнози для нових, невидимих даних. Для цього ви припускаєте, що ці невидимі дані слідують за розподілом ймовірностей, подібним до розподілу навчального набору даних. Якщо цей розподіл зміниться в майбутньому, вам потрібно знову тренувати свою модель, використовуючи новий навчальний набір даних.

Розробка функцій

Проблеми прогнозування ускладнюються, коли ви використовуєте різні типи даних як вхідні дані. Проблема судоку відносно проста, тому що ви маєте справу безпосередньо з цифрами. Що робити, якщо ви хочете навчити модель прогнозувати настрій в реченні? Або що робити, якщо у вас є зображення, і ви хочете знати, чи показує воно кота?

Інша назва введення – функція, а функціональне проектування – процес вилучення функцій з необроблених даних. Працюючи з різними типами даних, вам потрібно знайти способи представлення цих даних, щоб отримати з них значущу інформацію.

Прикладом техніки розвитку ознак є лематизація, при якій ви прибираєте відмінювання слів в реченні. Наприклад, флективні форми дієслова “дивитися”, такі як “слідкувати”, “спостерігати” і “помічати”, будуть скорочені до їх леми або основної форми: “дивитися”.

Якщо використовувати масиви для зберігання кожного слова корпусу, то, застосувавши лематизації, вийде менш розріджена матриця. Це може підвищити продуктивність деяких алгоритмів машинного навчання. На наступному зображенні показаний процес лематизації та представлення за допомогою моделі мішка зі словами:

По-перше, флективна форма кожного слова зводиться до його леми. Потім підраховується кількість входжень цього слова. В результаті виходить масив, що містить кількість входжень кожного слова в тексті.

Глибоке навчання

Глибоке навчання – це методика, в якій ви дозволяєте нейронній мережі самостійно визначати, які функції важливі, замість того, щоб застосовувати методи проектування функцій. Це означає, що при глибокому навчанні ви можете обійти процес розробки функцій.

Відсутність необхідності мати справу з розробкою функцій – це добре, тому що процес ускладнюється, оскільки набори даних ускладнюються. Наприклад, як би ви витягли дані, щоб передбачити настрій людини із зображення її обличчя? З нейронними мережами вам не доведеться турбуватися про це, оскільки мережі можуть самі вивчати функції. У наступних розділах ви заглибитеся в нейронні мережі, щоб краще зрозуміти, як вони працюють.

Нейронні мережі: основні поняття

Нейронна мережа – це система, яка вчиться робити прогнози, виконуючи наступні дії:

  1. Отримуємо вхідні дані
  2. Складаємо прогноз
  3. Порівняння прогноза з бажаним результатом
  4. Налаштування його внутрішнього стану для правильного прогнозування наступного разу

Векторишари та лінійна регресія є одними з будівельних блоків нейронних мереж. Дані зберігаються у вигляді векторів, а в Python ви зберігаєте ці вектори в масивах. Кожен рівень трансформує дані, що надходять з попереднього рівня. Ви можете думати про кожен рівень як про крок розробки функцій, оскільки кожен рівень витягує певне представлення даних, отриманих раніше.

Одна цікава річ у рівнях нейронних мереж полягає в тому, що одні й ті ж обчислення можуть витягувати інформацію з будь-яких даних. Це означає, що не має значення, чи використовуєте ви дані зображення або текстові дані. Процес вилучення значущої інформації та вивчення моделі глибокого навчання однаковий для обох сценаріїв.

На зображенні нижче можна побачити приклад мережевої архітектури з двома рівнями:

Кожен рівень перетворює дані, отримані з попереднього рівня, застосовуючи деякі математичні операції.

Процес навчання нейронної мережі

Навчання нейронної мережі – це як процес проб і помилок. Уявіть, що ви вперше граєте в дартс. У своєму першому кидку ви намагаєтеся вразити центральну точку цілі. Зазвичай перший кидок роблять просто для того, щоб зрозуміти, як висота і швидкість вашої руки впливають на результат. Якщо ви бачите, що дротик знаходиться вище центральної точки, ви налаштовуєте руку, щоб кинути її трохи нижче, і так далі.

Ось кроки, щоб спробувати потрапити в центр мішені дартсу:

Зверніть увагу, що ви продовжуєте оцінювати помилку, спостерігаючи, де приземлився дротик (крок 2). Ви продовжуєте, поки нарешті не дійдете до центру цілі.

З нейронними мережами процес дуже схожий: ви починаєте з випадкових ваг і векторів зміщення, робите прогноз, порівнюєте його з бажаним результатом, і коригуєте вектори для більш точного прогнозу в наступний раз. Процес триває до тих пір, поки різниця між прогнозом і правильними цілями не стане мінімальною.

Знання того, коли припинити навчання і яку точність поставити перед собою, є важливим аспектом навчання нейронних мереж, головним чином за рахунок сценаріїв перепідготовки та недонавчання.

Вектори і вага

Робота з нейронними мережами полягає у виконанні операцій з векторами. Ви представляєте вектори у вигляді багатовимірних масивів. Вектори корисні при глибокому навчанні головним чином через одну конкретну операцію: точковий добуток. Скалярний добуток двох векторів говорить вам, наскільки вони схожі за напрямком, і масштабується до величини двох векторів.

Основними векторами всередині нейронної мережі є вектори ваги і переміщення. Грубо кажучи, ви хочете, щоб ваша нейронна мережа перевірила, чи схожий вхід на інші входи, які вона вже бачила. Якщо нові входи аналогічні раніше переглянутим входам, вихід буде аналогічним. Ось як ви отримуєте результат прогнозу.

Модель лінійної регресії

Регресія використовується, коли потрібно оцінити зв’язок між залежною змінною і двома або більше незалежними зміннимиЛінійна регресія – це метод, який використовується, коли ви апроксимуєте зв’язок між змінними як лінійну. Метод датується дев’ятнадцятим століттям і є найпопулярнішим методом регресії.

Примітка. Лінійна залежність – це зв’язок, в якій існує пряма залежність між незалежною змінною і залежною змінною.

Моделюючи зв’язок між змінними як лінійну, можна виразити залежну змінну у вигляді зваженої суми пояснювальних змінних. Таким чином, кожна незалежна змінна буде помножена на вектор з ім’ям . Крім ваг і пояснювальних змінних, ви також додаєте ще один вектор: зміщення . Він встановлює результат, коли всі інші пояснювальні змінні дорівнюють нулю. weight

Як реальний приклад того, як побудувати модель лінійної регресії, уявіть, що ви хочете навчити модель прогнозувати ціну будинку виходячи з площі і віку будинку. Ви вирішили змоделювати цей зв’язок за допомогою лінійної регресії. Наступний блок коду показує, як можна записати модель лінійної регресії для заданої задачі в псевдокоді:

price = (weights_area * area) + (weights_age * age) + bias

У наведеному вище прикладі є дві ваги. Процес навчання складається з коригування ваг і зміщення, щоб модель могла передбачити правильне значення ціни. Для цього потрібно розрахувати похибку прогнозу і відповідно оновити ваги. weights_areaweights_age

Це основи того, як працює механізм нейронної мережі. Тепер прийшов час подивитися, як застосувати ці поняття за допомогою Python.

Python AI: починаємо будувати свою першу нейронну мережу

Першим кроком в побудові нейронної мережі є генерація виходу з входу. Ви зробите це, створивши зважену суму змінних. Перше, що вам потрібно зробити, це представити вхідні дані за допомогою Python і NumPy.

Обгортання вхідних даних нейронної мережі за допомогою NumPy

Ви будете використовувати NumPy для представлення векторів введення мережі у вигляді масивів. Але перш ніж використовувати NumPy, непогано пограти з векторами в чистому Python, щоб краще зрозуміти, що відбувається.

У цьому першому прикладі у вас є вхідний вектор і два інших вагових вектора. Мета – знайти, яка з шкал більше схожа на вхідну з урахуванням напрямку і величини. Ось як виглядають вектори, якщо їх намалювати:

weights_2 більше схожий на вхідний вектор, оскільки вказує в одному напрямку, і величина також схожа. Отже, як визначити, які вектори схожі за допомогою Python?

По-перше, ви визначаєте три вектори, один для входу і два інших для ваг. Далі ви розраховуєте, наскільки схожі і . Для цього ви будете використовувати точковий добуток. Оскільки всі вектори є двовимірними векторами, ось кроки для цього: input_vectorweights_1

  1. Помножте перший індекс на перший індекс. input_vectorweights_1
  2. Помножте другий індекс на другий індекс. input_vectorweights_2
  3. Підведіть підсумки обох множень.

Ви можете використовувати консоль IPython або блокнот Jupyter, щоб слідувати інструкціям. Хороша практика полягає в тому, щоб створювати нове віртуальне середовище щоразу, коли ви починаєте новий проект Python, тому вам слід зробити це спочатку. venv. поставляється з Python версії 3.3 і вище і зручний для створення віртуального середовища.

$ python -m venv ~/.my-env
$ source ~/.my-env/bin/activate

Використовуючи вищеописані команди, ви спочатку створюєте віртуальне середовище, потім активуєте йогг. Тепер прийшов час встановити консоль IPython за допомогою pip. Оскільки вам також знадобляться NumPy та Matplotlib, непогано також встановити їх:

(my-env) $ python -m pip install ipython numpy matplotlib
(my-env) $ ipython

Тепер ви готові почати кодування. Це код для обчислення точкового добутку :input_vectorweights_1

In [1]: input_vector = [1.72, 1.23]
In [2]: weights_1 = [1.26, 0]
In [3]: weights_2 = [2.17, 0.32]

In [4]: # Computing the dot product of input_vector and weights_1
In [5]: first_indexes_mult = input_vector[0] * weights_1[0]
In [6]: second_indexes_mult = input_vector[1] * weights_1[1]
In [7]: dot_product_1 = first_indexes_mult + second_indexes_mult

In [8]: print(f"The dot product is: {dot_product_1}")
Out[8]: The dot product is: 2.1672

Продовження статті буде пізніше…