Підручник зі штучної нейронної мережі з прикладами ШНМ TensorFlow

Що таке штучна нейронна мережа?

An Штучна нейронна мережа (ANN) — це комп’ютерна система, натхненна біологічними нейронними мережами, для створення штучного мозку на основі колекції зв’язаних одиниць, які називаються штучними нейронами. Він призначений для аналізу та обробки інформації як люди. Штучна нейронна мережа має здатність до самонавчання, що дає кращі результати, коли доступно більше даних.

Штучна нейронна мережа
Штучна нейронна мережа

Штучна нейронна мережа (ШНМ) складається з чотирьох основних об’єктів:

  • Шари: все навчання відбувається в шарах. Існує 3 рівні: 1) вхідний, 2) прихований і 3) вихідний
  • Функція та етикетка: вхідні дані в мережу (функції) і вихід з мережі (мітки)
  • Функція втрат: показник, який використовується для оцінки ефективності фази навчання
  • Оптимізатор: покращити навчання шляхом оновлення знань у мережі

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

Якщо ви подивитеся на малюнок вище, ви зрозумієте основний механізм.

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

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

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

Нейронна мережа Archiтектура

Штучна нейронна мережа Archiструктура складається з наступних компонентів:

  • Шари
  • Функція активації
  • Функція втрат
  • Оптимізатор

Шари

У шарі відбувається все навчання. Усередині шару є нескінченна кількість ваг (нейронів). Типова нейронна мережа часто обробляється щільно зв’язаними шарами (також званими повністю зв’язаними шарами). Це означає, що всі входи підключені до виходу.

Типова нейронна мережа приймає вектор вхідних даних і скаляр, який містить мітки. Найзручнішим налаштуванням є двійкова класифікація лише з двома класами: 0 і 1.

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

Нейронна мережа Archiтектура
Нейронна мережа Archiтектура

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

  1. Перший вузол - це вхідні значення
  2. Нейрон розкладається на вхідну частину і функцію активації. Ліва частина отримує всі дані попереднього шару. Права частина - це сума вхідних даних, що переходять у функцію активації.
  3. Вихідне значення обчислюється з прихованих шарів і використовується для прогнозування. Для класифікації він дорівнює номеру класу. Для регресії передбачається лише одне значення.

Функція активації

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

Функція активації

Інші функції активації:

  • Покусково-лінійний
  • Сигмоїдний
  • Танх
  • Дірявий Релу

Важливим рішенням, яке необхідно прийняти під час побудови нейронної мережі, є:

  • Скільки шарів у нейронної мережі
  • Скільки прихованих одиниць для кожного шару

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

Функція втрат

Після визначення прихованих шарів і функції активації потрібно вказати функцію втрат і оптимізатор.

Для двійкової класифікації звичайною практикою є використання двійкової крос-ентропійної функції втрат. У лінійній регресії ви використовуєте середню квадратичну помилку.

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

Оптимізатор

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

Звичайні оптимізатори:

  • Momentum оптимізація,
  • Прискорений градієнт Нестерова,
  • АдаГрад,
  • Оптимізація Адама

Обмеження нейронної мережі

Нижче наведено обмеження нейронної мережі:

Переобладнання

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

У машинному навчанні існує компроміс між оптимізацією та узагальненням.

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

Однак узагальнення показує, як модель поводиться для невидимих ​​даних.

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

Розмір мережі

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

Нормалізація ваги

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

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

Нейронна мережа в TensorFlow

Мережа оптимізує вагу протягом 180 епох із розміром партії 10. У прикладі відео ANN нижче ви можете побачити, як змінюються ваги та як мережа покращує відображення класифікації.

По-перше, мережа присвоює випадкові значення всім вагам.

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

Нейронна мережа в TensorFlow

Усередині другого прихованого шару лінії пофарбовані відповідно до знака ваг. Помаранчеві лінії присвоюють негативні ваги, а сині – позитивні

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

На малюнку прикладу ШНМ нижче показано результати оптимізованої мережі. Перш за все, ви помічаєте, що мережа успішно навчилася класифікувати точку даних. Ви можете бачити на малюнку раніше; початкова вага становила -0.43, тоді як після оптимізації це призводить до ваги -0.95.

Нейронна мережа в TensorFlow

Цю ідею можна узагальнити для мереж із більшою кількістю прихованих шарів і нейронів. Ви можете пограти в link.

Як навчити нейронну мережу за допомогою TensorFlow

Ось крок за кроком процес навчання нейронної мережі за допомогою TensorFlow ANN за допомогою інструмента оцінки API DNNClassifier.

Ми використаємо набір даних MNIST для навчання вашої першої нейронної мережі. Навчання нейронної мережі с TensorFlow не дуже складний. Етап попередньої обробки виглядає так само, як і в попередніх уроках. Ви будете діяти наступним чином:

  • Крок 1. Імпортуйте дані
  • Крок 2: Перетворення даних
  • Крок 3: Побудуйте тензор
  • Крок 4: Побудуйте модель
  • Крок 5: Навчіть і оцініть модель
  • Крок 6: Покращення моделі

Крок 1) Імпортуйте дані

Перш за все, вам потрібно імпортувати необхідну бібліотеку. Ви можете імпортувати набір даних MNIST за допомогою scikit learn, як показано в прикладі нейронної мережі TensorFlow нижче.

Набір даних MNIST – це набір даних, який зазвичай використовується для тестування нових методів або алгоритмів. Цей набір даних — це колекція зображень розміром 28 × 28 пікселів із рукописними цифрами від 0 до 9. Наразі найменша помилка в тесті становить 0.27 відсотка з комітетом із 7 згорткових нейронних мереж.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

Ви можете тимчасово завантажити scikit learn за цією адресою. Скопіюйте та вставте набір даних у зручну папку. Щоб імпортувати дані в python, ви можете використати fetch_mldata з scikit learn. Вставте шлях до файлу в 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)

Після цього ви імпортуєте дані та отримуєте форму обох наборів даних.

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) Перетворення даних

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

(X-min_x)/(max_x - min_x)

У Scikit learns вже є функція для цього: 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. Ви можете додати кількість шарів до аргументів feature_columns. Потрібно встановити кількість занять 10, оскільки в навчальному наборі десять занять. Ви вже знайомі з синтаксисом об’єкта оцінювача. Стовпці функцій аргументів, кількість класів і model_dir точно такі ж, як і в попередньому посібнику. Новий аргумент hidden_unit контролює кількість шарів і кількість вузлів для підключення до нейронної мережі. У наведеному нижче коді є два прихованих шари: перший з’єднує 300 вузлів, а другий – 100 вузлів.

Щоб побудувати оцінювач, використовуйте tf.estimator.DNNClassifier із такими параметрами:

  • feature_columns: Визначте стовпці для використання в мережі
  • hidden_units: Визначте кількість прихованих нейронів
  • n_classes: визначте кількість класів для прогнозування
  • model_dir: Визначте шлях 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) Покращення моделі

Ви можете спробувати вдосконалити модель, додавши параметри регуляризації.

Ми будемо використовувати оптимізатор Адама з коефіцієнтом відсіву 0.3, L1 від X і L2 від y. У TensorFlow Neural Network ви можете керувати оптимізатором за допомогою об’єктів, наступних за назвою оптимізатора. TensorFlow це вбудований API для оптимізатора Proximal AdaGrad.

Щоб додати регулярізацію до глибокої нейронної мережі, ви можете використовувати tf.train.ProximalAdagradOptimizer із наступним параметром

  • Швидкість навчання: learning_rate
  • L1 регулярізація: l1_regularization_strength
  • L2 регулярізація: l2_regularization_strength
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%. Ви можете спробувати з іншими значеннями та побачити, як це вплине на точність.

Підсумки

У цьому підручнику ви дізнаєтеся, як створити нейронну мережу. Нейронна мережа вимагає:

  • Кількість прихованих шарів
  • Кількість повністю підключених вузлів
  • Функція активації
  • Оптимізатор
  • Кількість класів

У TensorFlow ANN ви можете навчити нейронну мережу для проблеми класифікації за допомогою:

  • tf.estimator.DNNClassifier

Кошторисник вимагає вказати:

  • feature_columns=feature_columns,
  • приховані_одиниці=[300, 100]
  • n_класів=10
  • model_dir

Ви можете вдосконалити модель, використовуючи різні оптимізатори. У цьому підручнику ви дізналися, як використовувати оптимізатор Adam Grad зі швидкістю навчання та додати елемент керування, щоб запобігти переобладнанню.