Урок за изкуствени невронни мрежи (АНМ) с TensorFlow

⚡ Умно обобщение

Изкуствените невронни мрежи се учат, като прехвърлят входни данни през свързани слоеве, оценяват резултата с функция на загуба и коригират теглата с оптимизатор. Това ръководство изгражда такава в TensorFlow и класифицира MNIST цифри.

  • 🔘 Четири обекта: Слоеве, характеристики и етикети, функция за загуба и оптимизатор съставляват всяка изкуствена невронна мрежа.
  • ☑️ Роли на слоевете: Входните данни захранват скритите слоеве, а размерът на изходния слой съответства на броя на класовете за задачите по класификация.
  • Избор за активиране: ReLU връща нула за отрицателни стойности, позволявайки на мрежата да изучава нелинейни модели, които линейният модел пропуска.
  • 🧪 Преобуздаване на контроли: По-малките мрежи, наказанията за тегло на L1 или L2 и процентите на отпадане между 0.2 и 0.5 възстановяват генерализацията.
  • 🛠️ Шест стъпки за изграждане: Импортирайте MNIST, мащабирайте го, създайте колони с характеристики, дефинирайте DNNClassifier, обучете го и след това добавете регуларизация.
  • 📈 Измерен резултат: Скритите слоеве от 300 и 100 единици достигат точност от 0.9637143; регуларизираният вариант пада до 0.95057142.

Изкуствена невронна мрежа (ANN)

Какво е изкуствена невронна мрежа?

An Изкуствена невронна мрежа (ANN) е компютърна система, вдъхновена от биологични невронни мрежи, за създаване на изкуствени мозъци, базирани на колекция от свързани единици, наречени изкуствени неврони. Тя е проектирана да анализира и обработва информация по начина, по който го правят хората. Изкуствената невронна мрежа има възможности за самообучение, за да дава по-добри резултати с наличността на повече данни.

Диаграмата по-долу tracтова е едно пълно преминаване през такава мрежа, от суровите входни данни до оптимизатора, който коригира теглата.

Блок-схема на изкуствена невронна мрежа, показваща вход, два претеглени слоя, прогнозиране, функция на загуба и оптимизатор

Изкуствената невронна мрежа (ANN) се състои от четири основни обекта:

  • Слоя: Цялото обучение се случва на слоевете. Има 3 слоя: 1) Вход, 2) Скрит и 3) Изход.
  • Характеристика и етикет: Входни данни към мрежата (характеристики) и изходни данни от мрежата (етикети)
  • Функция на загубата: Метрика, използвана за оценка на ефективността на фазата на обучение
  • Оптимизатор: Подобрете обучението чрез актуализиране на знанията в мрежата

Невронната мрежа приема входните данни и ги изпраща в ансамбъл от слоеве. След това мрежата оценява производителността си с функция на загуба. Функцията на загуба дава на мрежата представа за пътя, който трябва да извърви, преди да овладее знанията. Мрежата подобрява тези знания с помощта на оптимизатор.

Ако погледнете фигурата по-горе, ще разберете основния механизъм.

Програмата приема някои входни стойности и ги изпраща в два напълно свързани слоя. Представете си, че имате математическа задача. Първото нещо, което правите, е да прочетете съответната глава, за да я решите. След това прилагате новите си знания към задачата. Има голяма вероятност да не получите много добър резултат. Същото е и за мрежата: първия път, когато види данните и направи прогноза, резултатът няма да съвпада перфектно с действителните данни.

За да подобри знанията си, мрежата използва оптимизатор. В тази аналогия, оптимизаторът може да се разглежда като човек, който препрочита главата. Чрез повторно четене получавате нови прозрения. По подобен начин мрежата използва оптимизатора, актуализира знанията си и тества тези нови знания, за да провери колко още трябва да научи. Програмата повтаря тази стъпка, докато не допусне най-малката възможна грешка.

В аналогията с математическата задача това означава, че четете главата от учебника многократно, докато не разберете напълно съдържанието на курса. Дори след многократно четене, ако продължавате да правите грешки, това означава, че сте достигнали капацитета на знанията на текущия материал. Трябва да използвате различен учебник или да тествате различен метод, за да подобрите резултата си. За невронната мрежа процесът е същият. Ако грешката спре да намалява и кривата на загубите стане плоска, текущата архитектура не може да научи нищо друго. Мрежата трябва да бъде по-добре оптимизирана, за да подобри знанията.

Тези четири обекта се съпоставят директно с компонентите, които конфигурирате, когато проектирате мрежа.

невронни мрежи Archiтекстура

Архитектурата на изкуствената невронна мрежа се състои от следните компоненти:

  • Слоеве
  • Функция за активиране
  • Функция на загуба
  • Optimizer

Слоеве

Слоят е мястото, където се осъществява цялото обучение. Вътре в слоя се намира произволен брой неврони, всеки от които има свои собствени тегла. Типичната невронна мрежа често се обработва от гъсто свързани слоеве (наричани още напълно свързани слоеве). Това означава, че всички входове са свързани с изхода.

Типичната невронна мрежа приема вектор от входни данни и скалар, който съдържа етикетите. Най-простата схема е двоична класификация само с два класа: 0 и 1.

Мрежата приема входен сигнал, изпраща го до всички свързани възли и изчислява сигнала с активираща функция. Номерираната диаграма по-долу показва един възел, така че можете да видите претеглената сума и стъпката на активиране поотделно.

Двуслойна мрежова диаграма с тегла от w11 до w22 и описание, показващо претеглената сума и активиращата функция вътре в един възел

Фигурата по-горе илюстрира тази идея. Първият слой съдържа входните стойности. Вторият слой, наречен скрит слой, получава претеглените входни данни от предишния слой.

  1. Първият възел са входните стойности.
  2. Невронът се разделя на входната част и активационната функция. Лявата част получава целия вход от предишния слой. Дясната част е сумата от входните данни, подадени към активационната функция.
  3. Изходна стойност, изчислена от скритите слоеве и използвана за прогнозиране. За класификация, тя е равна на броя класове. За регресия се прогнозира само една стойност.

Функция за активиране

Активационната функция на възел определя изхода, като се има предвид набор от входове. Необходима е активираща функция, за да може мрежата да изучава нелинейни модели. Често срещана активираща функция е ReLU, Rectified Linear Unit (Ректифицирана линейна единица). Функцията дава нула за всички отрицателни стойности.

Другите функции за активиране са:

  • Частично линейно
  • сигмоидно
  • танх
  • Спукан ReLU

Графиката по-долу показва защо ReLU е описан по този начин: кривата е плоска при нула за всеки отрицателен вход и след това се покачва линейно.

Графика на активиращата функция на ReLU R(z) = max(0, z), плоска при нула за отрицателни входове и линейна за положителни входове

Критичното решение, което трябва да вземете при изграждането на невронна мрежа, е:

  • Колко слоя в невронната мрежа
  • Колко скрити единици за всеки слой

Невронните мрежи с много слоеве и скрити единици могат да научат сложно представяне на данните, но правят изчисленията на мрежата много скъпи.

Функция на загуба

След като сте дефинирали скритите слоеве и функцията за активиране, трябва да посочите функцията за загуба и оптимизатора.

За двоична класификация е обичайна практика да се използва двоична функция за кръстосана ентропия. линейна регресия, използвате средноквадратичната грешка.

Функцията на загубите е важен показател за оценка на ефективността на оптимизатора. По време на обучението този показател ще бъде сведен до минимум. Трябва внимателно да изберете това количество в зависимост от вида на проблема, с който се справяте.

Optimizer

Функцията на загубата е мярка за производителността на модела. Оптимизаторът ще помогне за подобряване на теглата на мрежата, за да се намали загубата. Съществуват различни оптимизатори, но най-разпространеният е стохастичният градиентен спускащ се метод (Stochastic Gradient Descent).

Конвенционалните оптимизатори са:

  • 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. Картината по-долу представя мрежата с различни цветове.
  • Като цяло оранжевият цвят представлява отрицателни стойности, докато сините цветове показват положителните стойности.
  • Точките с данни имат едно и също представяне: сините са положителните етикети, а оранжевите - отрицателните.

Детска площадка в браузъра при първата итерация със случайни тегла, тегло -0.43 и загуба от теста 0.453

Във втория скрит слой линиите са оцветени според знака на теглата. Оранжевите линии носят отрицателни тегла, а сините - положителни.

Както можете да видите, в изходната картаping, мрежата прави доста грешки. Сега вижте как се държи мрежата след оптимизация.

Картината на примера за ИНН по-долу показва резултатите от оптимизираната мрежа. Първо, забелязвате, че мрежата успешно се е научила как да класифицира точките от данни. Сравнявайки я с предишната картинка, първоначалното тегло е било -0.43, докато след оптимизация се получава тегло от -0.95.

Четири панела за игрална площадка, показващи крайните тегла, със сини линии за положителни тегла и правилно класифицирани точки от данни

Идеята може да се обобщи за мрежи с повече скрити слоеве и неврони. Можете сами да експериментирате с настройките в TensorFlow Playground.

Ръководството по-долу изгражда същата идея в код върху реален набор от данни.

Как да тренирате невронна мрежа с TensorFlow

Ето стъпка по стъпка процеса за това как да се обучи невронна мрежа с TensorFlow ИНН, използваща DNNClassifier, естиматор на API.

Ще използваме набора от данни MNIST, за да обучим първата ви невронна мрежа. Обучение на невронна мрежа с TensorFlow не е много сложно. Стъпката за предварителна обработка изглежда точно както в предишните уроци. Ще продължите както следва:

  1. Импортирайте данните
  2. Трансформирайте данните
  3. Конструирайте тензора
  4. Изградете модела
  5. Обучете и оценете модела
  6. Подобрете модела

Бележка към версията: Кодът в това ръководство е насочен към TensorFlow 1.x Estimator API. Финалната версия на пакета 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, тъй като в обучителния набор има десет класа. Вече сте запознати със синтаксиса на обекта estimator. Аргументите feature_columns, n_classes и model_dir са абсолютно същите като в предишния урок. Аргументът hidden_units е новият: той контролира както броя на слоевете, така и броя на възлите, които всеки слой свързва с невронната мрежа. В кода по-долу има два скрити слоя, първият свързва 300 възела, а вторият - 100 възела.

За да изградите оценителя, използвайте tf.estimator.DNNClassifier със следните параметри:

  • feature_columns: Дефинирайте колоните, които ще се използват в мрежата
  • скрити_единици: Определете броя на скритите неврони
  • 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%. Можете да опитате различни стойности и да видите как те влияят на точността.

Въпроси и Отговори

Няма формула. Общоприетите правила са да се поддържат скрити неврони между входния и изходния размер или близо до две трети от входния слой плюс изхода. Повечето таблични задачи се нуждаят от един или два скрити слоя; започнете с малък и го увеличавайте, докато моделът не се напасне прекалено добре.

Не както е написано. tf.estimator беше премахнат в TensorFlow 2.16 и tf.estimator.inputs.numpy_input_fn вече не съществува. Или закачете TensorFlow 2.15, или преизградете мрежата със слоеве от tf.keras.layers.Dense от 300 и 100 единици и я обучете, използвайки model.fit().

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

Да. Копилот на GitHub автоматично довършва шаблонни формуляри, като например входни канали, стекове от слоеве и цикли за оценка, от кратък коментар. Третира изхода си като чернова: може да предложи премахнати API-та, като например fetch_mldata, така че проверявайте всяко извикване спрямо текущата документация, преди да го изпълните.

mldata.org беше затворен и scikit-научите fetch_mldata беше премахнато във версия 0.22. Вместо това използвайте fetch_openml('mnist_784', version=1). Той изтегля същите 70 000 ръкописни цифри и връща данни и целеви атрибути, така че останалата част от това ръководство остава непроменена.

ИНН свързва всяка единица в един слой с всяка единица в следващия, което е подходящо за таблични данни. конволюционна мрежа споделя малки филтри в изображението, докато повтаряща се мрежа пренася състоянието напред през последователност.

Базовият модел не беше прекалено напаснат, така че отпадането от 0.3 плюс L1 и L2 санкции от 0.01 до голяма степен премахнаха полезния капацитет. Точността падна от 0.9637143 на 0.95057142. Регуларизацията помага само когато разликата между резултатите от влака и теста е голяма.

Често срещаните приложения в производството включват разпознаване на изображения и реч, разбиране на естествен език, прогнозиране на търсенето, кредитно оценяване, откриване на измами и класиране на препоръки. Силата им е изучаването на нелинейни зависимости директно от сурови данни; слабостта им е ограничената обяснимост в сравнение с линейни или дървовидни модели.

Обобщете тази публикация с: