Підручник зі штучних нейронних мереж (ШНМ) за допомогою TensorFlow
⚡ Розумний підсумок
Штучні нейронні мережі навчаються, пропускаючи вхідні дані через пов'язані шари, оцінюючи результат за допомогою функції втрат та коригуючи ваги за допомогою оптимізатора. У цьому посібнику створено одну з них у TensorFlow та класифіковано цифри MNIST.
Що таке штучна нейронна мережа?
An Штучна нейронна мережа (ШНМ) — це комп’ютерна система, натхненна біологічними нейронними мережами, для створення штучного мозку на основі сукупності пов’язаних одиниць, які називаються штучними нейронами. Вона розроблена для аналізу та обробки інформації так само, як це роблять люди. Штучна нейронна мережа має можливості самонавчання, щоб отримувати кращі результати, оскільки доступно більше даних.
Діаграма нижче tracце один повний прохід через таку мережу, від необроблених вхідних даних до оптимізатора, який коригує ваги.
Штучна нейронна мережа (ШНМ) складається з чотирьох основних об’єктів:
- Шари: Усе навчання відбувається на шарах. Існує 3 шари: 1) вхідний, 2) прихований та 3) вихідний.
- Функція та етикетка: Вхідні дані в мережу (ознаки) та вихідні дані з мережі (мітки)
- Функція втрат: Метрика, що використовується для оцінки ефективності фази навчання
- оптимізатор: Покращуйте навчання, оновлюючи знання в мережі
Нейронна мережа бере вхідні дані та завантажує їх у ансамбль шарів. Потім мережа оцінює свою продуктивність за допомогою функції втрат. Функція втрат дає мережі уявлення про шлях, який їй потрібно пройти, перш ніж вона опанує знання. Мережа покращує ці знання за допомогою оптимізатора.
Якщо ви подивитеся на малюнок вище, ви зрозумієте основний механізм.
Програма приймає деякі вхідні значення та передає їх на два повністю зв'язані шари. Уявіть, що у вас є математична задача. Перше, що ви робите, це читаєте відповідний розділ, щоб її розв'язати. Потім ви застосовуєте свої нові знання до задачі. Існує висока ймовірність, що ви отримаєте не дуже хороший результат. Те саме стосується мережі: коли вона вперше бачить дані та робить прогноз, результат не буде ідеально відповідати фактичним даним.
Щоб покращити свої знання, мережа використовує оптимізатор. У цій аналогії оптимізатор можна розглядати як перечитування розділу. Перечитуючи, ви отримуєте нові знання. Аналогічно, мережа використовує оптимізатор, оновлює свої знання та тестує ці нові знання, щоб перевірити, скільки їй ще потрібно вивчити. Програма повторює цей крок, доки не зробить найменшу можливу помилку.
В аналогії з математичною задачею це означає, що ви перечитуєтесь розділом підручника багато разів, доки повністю не зрозумієте зміст курсу. Навіть після багаторазового прочитання, якщо ви продовжуєте робити помилки, це означає, що ви досягли ємності знань з поточного матеріалу. Вам потрібно використовувати інший підручник або протестувати інший метод, щоб покращити свій бал. Для нейронної мережі це той самий процес. Якщо зниження помилок перестає зменшуватися, а крива втрат стає плоскою, поточна архітектура не може навчитися нічому іншому. Мережа має бути краще оптимізована для покращення знань.
Ці чотири об'єкти безпосередньо відображаються на компонентах, які ви налаштовуєте під час проектування мережі.
Нейронна мережа Archiтектура
Архітектура штучної нейронної мережі складається з таких компонентів:
- Шари
- Функція активації
- Функція втрат
- Оптимізатор
Шари
Шар — це місце, де відбувається все навчання. Усередині шару знаходиться довільна кількість нейронів, кожен з яких має власні ваги. Типова нейронна мережа часто обробляється щільно зв'язаними шарами (також званими повністю зв'язаними шарами). Це означає, що всі входи з'єднані з виходом.
Типова нейронна мережа приймає вектор вхідних даних та скаляр, який містить мітки. Найпростіша схема — це бінарна класифікація лише з двома класами: 0 та 1.
Мережа приймає вхідний сигнал, надсилає його всім підключеним вузлам та обчислює сигнал за допомогою функції активації. Наведена нижче пронумерована діаграма розгортає окремий вузол, щоб ви могли окремо бачити зважену суму та крок активації.
Наведений вище малюнок ілюструє цю ідею. Перший шар містить вхідні значення. Другий шар, який називається прихованим шаром, отримує зважені вхідні дані від попереднього шару.
- Перший вузол – це вхідні значення.
- Нейрон розкладається на вхідну частину та функцію активації. Ліва частина отримує всі вхідні дані з попереднього шару. Права частина є сумою вхідних даних, переданих у функцію активації.
- Вихідне значення, обчислене з прихованих шарів та використане для прогнозування. Для класифікації воно дорівнює кількості класів. Для регресії прогнозується лише одне значення.
Функція активації
Функція активації вузла визначає вихідний сигнал за заданим набором вхідних даних. Вам потрібна функція активації, щоб мережа могла вивчати нелінійні шаблони. Поширеною функцією активації є ReLU, випрямлена лінійна одиниця. Функція повертає нуль для всіх від'ємних значень.
Інші функції активації:
- Покусково-лінійний
- Сигмоїдний
- Танх
- Діряве ReLU
Графік нижче показує, чому ReLU описується саме так: крива є плоскою в нулі для кожного негативного вхідного значення та після цього лінійно зростає.
Важливим рішенням, яке необхідно прийняти під час побудови нейронної мережі, є:
- Скільки шарів у нейронної мережі
- Скільки прихованих одиниць для кожного шару
Нейронні мережі з великою кількістю шарів та прихованих одиниць можуть вивчити складне представлення даних, але вони роблять обчислення мережі дуже дорогими.
Функція втрат
Після визначення прихованих шарів і функції активації потрібно вказати функцію втрат і оптимізатор.
Для бінарної класифікації поширеною практикою є використання бінарної перехресної функції втрат ентропії. лінійна регресія, ви використовуєте середньоквадратичну похибку.
Функція втрат є важливим показником для оцінки продуктивності оптимізатора. Під час навчання ця метрика буде мінімізована. Необхідно ретельно підбирати цю кількість залежно від типу проблеми, з якою ви маєте справу.
Оптимізатор
Функція втрат є мірою продуктивності моделі. Оптимізатор допоможе покращити ваги мережі, щоб зменшити втрати. Існують різні оптимізатори, але найпоширенішим є стохастичний градієнтний спуск.
Звичайні оптимізатори:
- Momentum оптимізація
- Прискорений градієнт Нестерова
- АдаГрад
- Оптимізація Адама
ArchiСама лише текстура не гарантує придатності моделі для використання.
Обмеження нейронної мережі
Нижче наведено обмеження нейронної мережі:
Переобладнання
Поширеною проблемою складної нейронної мережі є складність узагальнення на невидимі дані. Нейронна мережа з великою кількістю ваг може дуже добре ідентифікувати конкретні деталі в наборі даних, але це часто призводить до перенавчання. Якщо дані незбалансовані в межах груп (тобто в деяких групах недостатньо даних), мережа буде дуже добре навчатися під час навчання, але не зможе узагальнювати такі шаблони на невидимі дані.
Існує компроміс у навчання за допомогою машини між оптимізацією та узагальненням.
- Оптимізація моделі вимагає пошуку найкращих параметрів, які мінімізують втрати навчального набору.
- Однак узагальнення показує, як модель поводиться для невидимих даних.
Щоб запобігти захопленню моделлю певних деталей або небажаних закономірностей навчальних даних, можна використовувати різні методи. Найкращий метод — мати збалансований набір даних з достатньою кількістю даних. Мистецтво зменшення перенавчання називається регуляризацією. Три методи, наведені нижче, є загальноприйнятими відправними точками.
| Техніка | Що це обмежує | Типові налаштування в цьому посібнику |
|---|---|---|
| Розмір мережі | Кількість шарів та прихованих одиниць | Два приховані шари, 300 та 100 одиниць |
| Регуляризація ваг L1 / L2 | Величина вагових коефіцієнтів | l1_сила_регуляризації та l2_сила_регуляризації, що дорівнює 0.01 |
| Викинути | Частка вимкнених одиниць на крок навчання | відсів 0.3 |
Розмір мережі
Відомо, що нейронна мережа з надто великою кількістю шарів та прихованих вузлів є дуже складною. Простий спосіб зменшити складність моделі – зменшити її розмір. Немає єдиної найкращої практики для визначення кількості шарів. Потрібно почати з невеликої кількості шарів і збільшувати розмір, доки не знайдете модель, яка повністю відповідає вимогам.
Нормалізація ваги
Стандартний метод запобігання перенавчанню полягає у додаванні обмежень до ваг мережі. Обмеження змушує ваги мережі приймати лише малі значення. Обмеження додається до функції втрат похибки. Існує два види регуляризації:
- L1 (Ласо): вартість пропорційна абсолютному значенню вагових коефіцієнтів.
- L2 (Гребень): вартість пропорційна квадрату значення вагових коефіцієнтів.
Викинути
Випадіння – це дивний, але корисний метод. Мережа з випаданням означає, що деякі пристрої будуть випадковим чином вимкнені під час кроку навчання, тому їхній вихідний сигнал стане нульовим. Уявіть, що у вас є масив ваг [0.1, 1.7, 0.7, -0.9]. Якщо в нейронній мережі є випадіння, вона стане [0.1, 0, 0, -0.9] з випадково розподіленим 0. Параметром, який контролює випадіння, є частота випадінь. Частота визначає, скільки пристроїв вимкнено. Частота між 0.2 та 0.5 є поширеним явищем.
Невеликий інтерактивний приклад спрощує перегляд навчального циклу.
Приклад нейронної мережі в TensorFlow
Ось приклад роботи штучної нейронної мережі, який показує, як нейронна мережа працює над типовою задачею класифікації. Є два входи, x1 та x2, кожен з яких має випадкове значення. Вихід – це бінарний клас. Метою є класифікація мітки на основі двох ознак. Для виконання цього завдання архітектура нейронної мережі визначається наступним чином:
- Два прихованих шару
- Перший шар складається з чотирьох повністю з’єднаних нейронів
- Другий шар складається з двох повністю з’єднаних нейронів
- Функція активації є ReLU.
- Додайте регулярізацію L2 зі швидкістю навчання 0.003
Мережа оптимізуватиме ваги протягом 180 епох з розміром пакета 10. У анімації прикладу ШНМ нижче ви можете побачити, як ваги змінюються з часом і як мережа покращує карту класифікації.ping.
По-перше, мережа присвоює випадкові значення всім вагам.
- З використанням випадкових ваг, тобто без оптимізації, втрати на виході становлять 0.453. На зображенні нижче мережа представлена різними кольорами.
- Загалом помаранчевий колір представляє негативні значення, тоді як синій колір показує позитивні значення.
- Точки даних мають однакове представлення: сині – це позитивні позначки, а помаранчеві – негативні.
Усередині другого прихованого шару лінії забарвлені відповідно до знаку ваг. Помаранчеві лінії несуть від'ємні ваги, а сині – додатні.
Як бачите, на вихідній картіping, мережа робить досить багато помилок. Тепер подивіться, як мережа поводиться після оптимізації.
На зображенні прикладу штучної нейронної мережі нижче показано результати оптимізованої мережі. Перш за все, ви помічаєте, що мережа успішно навчилася класифікувати точки даних. Порівнюючи це з попереднім зображенням, початкова вага становила -0.43, тоді як після оптимізації вага становить -0.95.
Цю ідею можна узагальнити для мереж з більшою кількістю прихованих шарів та нейронів. Ви можете самостійно експериментувати з налаштуваннями в Ігровий майданчик TensorFlow.
У наведеному нижче покроковому посібнику та сама ідея реалізується в коді на реальному наборі даних.
Як навчити нейронну мережу за допомогою TensorFlow
Ось покроковий процес навчання нейронної мережі за допомогою TensorFlow ШНМ з використанням оцінювача API DNNClassifier.
Ми використаємо набір даних MNIST для навчання вашої першої нейронної мережі. Навчання нейронної мережі с TensorFlow не дуже складно. Крок попередньої обробки виглядає точно так само, як і в попередніх навчальних посібниках. Ви будете діяти наступним чином:
- Імпортуйте дані
- Перетворіть дані
- Побудуйте тензор
- Побудуйте модель
- Тренуйтеся та оцінюйте модель
- Удосконалити модель
Примітка до версії: Код у цьому покроковому посібнику орієнтований на API оцінювача TensorFlow 1.x. Фінальний реліз пакета tf-estimator постачався з TensorFlow 2.15, а tf.estimator було видалено в TensorFlow 2.16. Щоб виконати ці кроки в поточному релізі, або закріпіть TensorFlow 2.15, або перебудуйте ту саму двошарову мережу за допомогою tf.keras.layers.Dense та model.fit().
Крок 1) Імпортуйте дані
Перш за все, вам потрібно імпортувати необхідну бібліотеку. Ви можете імпортувати набір даних MNIST за допомогою scikit-вчитися як показано в прикладі нейронної мережі TensorFlow нижче.
Набір даних MNIST – це набір даних, який найчастіше використовується для тестування нових методів або алгоритмів. Це колекція зображень розміром 28×28 пікселів, кожне з яких показує рукописну цифру від 0 до 9. Комітет глибоких згорткових мереж, навчених з використанням пружних спотворень, зменшив похибку тестування до 0.27 відсотка.
import numpy as np import tensorflow as tf np.random.seed(1337)
В оригінальному покроковому посібнику файли MNIST завантажувалися вручну та вказувалися fetch_mldata на цю папку.
from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original') print(mnist.data.shape) print(mnist.target.shape)
Примітка API: mldata.org більше не доступний онлайн, а fetch_mldata було видалено у scikit-learn версії 0.22. У поточній інсталяції замініть виклик вище на fetch_openml('mnist_784', version=1), який завантажує ті самі 70 000 цифр та надає ідентичні дані та атрибути цілі.
Після цього ви розділяєте дані та отримуєте форму обох наборів даних.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Крок 2) Перетворення даних
У попередньому посібнику ви дізналися, що потрібно трансформувати дані, щоб обмежити вплив викидів. У цьому посібнику з нейронних мереж ви трансформуватимете дані за допомогою скалера min-max. Формула така:
(X-min_x)/(max_x - min_x)
scikit-learn вже має функцію для цього: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Крок 3) Побудувати тензор
Тепер ви знайомі зі способом створення тензори у TensorFlow. Ви можете перетворити набір поїздів на числовий стовпець.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Крок 4) Побудуйте модель
Архітектура нейронної мережі містить 2 приховані шари з 300 одиницями для першого шару та 100 одиницями для другого. Ці значення отримані з досвіду, а не з формули. Ви можете налаштувати їх та побачити, як вони впливають на точність мережі.
Для побудови моделі використовується оцінювач DNNClassifier. Вам потрібно встановити кількість класів на 10, оскільки в навчальному наборі десять класів. Ви вже знайомі з синтаксисом об'єкта оцінювача. Аргументи feature_columns, n_classes та model_dir точно такі ж, як і в попередньому посібнику. Аргумент hidden_units є новим: він контролює як кількість шарів, так і кількість вузлів, які кожен шар підключає до нейронної мережі. У наведеному нижче коді є два приховані шари, перший з'єднує 300 вузлів, а другий - 100 вузлів.
Щоб побудувати оцінювач, використовуйте tf.estimator.DNNClassifier із такими параметрами:
- стовпці_функцій: Визначте стовпці для використання в мережі
- приховані_одиниці: Визначте кількість прихованих нейронів
- n_класів: Визначте кількість класів для прогнозування
- каталог_моделі: Визначте шлях TensorBoard
estimator = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
n_classes=10,
model_dir = '/train/DNN')
Крок 5) Навчіть і оцініть модель
Ви можете використовувати функцію введення NumPy для навчання моделі та її оцінки.
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)
вихід:
{'accuracy': 0.9637143,
'average_loss': 0.12014342,
'loss': 1682.0079,
'global_step': 1000}
Поточна архітектура забезпечує точність оцінювального набору приблизно 96 відсотків.
Крок 6) Покращення моделі
Ви можете спробувати вдосконалити модель, додавши параметри регуляризації.
Тут оцінювач використовує оптимізатор Proximal AdaGrad з коефіцієнтом відсіву 0.3 та силами L1 та L2, встановленими на 0.01. У нейронній мережі TensorFlow ви звертаєтесь до оптимізатора через об'єкт train, за яким йде ім'я оптимізатора. TensorFlow постачає вбудований API для оптимізатора Proximal AdaGrad.
Щоб додати регуляризацію до глибокої нейронної мережі, можна використовувати tf.train.ProximalAdagradOptimizer з такими параметрами:
- Швидкість навчання: швидкість_навчання
- L1-регуляризація: l1_сила_регуляризації
- L2-регуляризація: l2_сила_регуляризації
estimator_imp = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
dropout=0.3,
n_classes = 10,
optimizer=tf.train.ProximalAdagradOptimizer(
learning_rate=0.01,
l1_regularization_strength=0.01,
l2_regularization_strength=0.01
),
model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000)
estimator_imp.evaluate(eval_input,steps=None)
вихід:
{'accuracy': 0.95057142,
'average_loss': 0.17318928,
'loss': 2424.6499,
'global_step': 2000}
Значення, обрані для зменшення перенавчання, не покращили точність моделі. Ваша перша модель мала точність 96%, тоді як модель з регуляризатором L2 має точність 95%. Ви можете спробувати різні значення та подивитися, як вони впливають на точність.






