javascript42
Главная
Все учебники
Блог
Учебник Synaptic
Введение в нейронные сети и библиотеку Synaptic
Что такое искусственные нейронные сети
Биологические основы и математическая абстракция
Обзор существующих JavaScript-библиотек для машинного обучения
Место Synaptic среди других инструментов
Установка и настройка окружения
Подключение библиотеки в браузере и Node.js
Первая нейронная сеть за пять минут
Архитектура библиотеки Synaptic
Общая структура модулей
Класс Neuron и его роль в системе
Класс Layer как контейнер нейронов
Класс Network как основная единица работы
Класс Trainer и его связь с Network
Класс Architect и предустановленные топологии
Внутренние зависимости между модулями
Принципы расширяемости архитектуры
Нейроны
Создание нейрона и базовые свойства
Типы нейронов: input, hidden, output
Функции активации и их математическое описание
Sigmoid, Tanh, ReLU и другие функции активации в Synaptic
Создание и регистрация пользовательской функции активации
Синаптические веса и их инициализация
Bias-нейрон и его влияние на обучение
Самоактивация и рекуррентные связи на уровне нейрона
Метод activate и метод propagate
Вычисление ошибки и градиента в отдельном нейроне
Связи и синапсы
Класс Connection и его свойства
Установка связи между нейронами вручную
Вес соединения, ID и служебные поля
Группы соединений и gate-связи
Gating: модуляция передачи сигнала
Self-connections и рекуррентность на уровне связей
Удаление и изменение связей в процессе работы
Визуализация карты связей
Слои
Создание слоя с заданным числом нейронов
Методы слоя: activate, propagate, project, gate
Типы проекций: full, one-to-one, all-to-all
Проекция слоя на другой слой
Gate-проекции между слоями
Настройка начальных весов при проекции
Доступ к отдельным нейронам слоя
Сериализация и восстановление слоя
Сети
Создание сети из слоёв вручную
Метод Network.activate и прямое распространение
Метод Network.propagate и обратное распространение
Параметры обратного распространения: rate, target
Доступ к весам сети и их ручное изменение
Метод Network.optimize и оптимизация кода
Клонирование сети
Скрещивание двух сетей
Автономный режим работы сети
Метод Network.standalone и экспорт вычислений
Сериализация сети в JSON и восстановление
Метод Network.worker для Web Workers
Предустановленные архитектуры
Класс Architect и его назначение
Perceptron: многослойный персептрон
LSTM: долгая краткосрочная память
GRU: управляемый рекуррентный блок
Liquid: сеть с жидкостным состоянием
Hopfield: сеть Хопфилда
Narx: нелинейная авторегрессионная сеть
Создание собственной архитектуры через Architect
Алгоритмы обучения
Обучение с учителем и без учителя
Стохастический градиентный спуск
Метод backpropagation в деталях
Параметр learning rate: выбор и стратегии
Momentum и его влияние на сходимость
Регуляризация: L1, L2 и их реализация
Dropout и устойчивость к переобучению
Методы инициализации весов
Условия остановки обучения
Класс Trainer
Создание объекта Trainer
Метод Trainer.train и его параметры
Формат обучающей выборки
Параметры объекта options: rate, iterations, error, shuffle, log, cost
Функции стоимости: CROSS_ENTROPY, MSE, BINARY
Метод Trainer.trainAsync и асинхронное обучение
Метод Trainer.test и оценка на тестовой выборке
Встроенные тесты Trainer: XOR, AND, discrete sequence recall, appending, corxor, timingTask
Построение обучающего цикла вручную без Trainer
Рекуррентные сети и работа с последовательностями
Основы рекуррентности в Synaptic
Ячейка LSTM: входной, забывающий и выходной вентиль
Создание LSTM-сети через Architect.LSTM
Настройка глубины и ширины LSTM
Обучение на временных рядах
Обработка текстовых последовательностей символ за символом
Проблема затухающего и взрывного градиента
GRU как упрощённая альтернатива LSTM
Narx-сеть и лаговые входы
Практика: предсказание следующего символа
Практика: предсказание числового ряда
Настройка и оптимизация обучения
Диагностика процесса обучения по ошибке
Выбор функции активации под задачу
Подбор архитектуры под размер задачи
Стратегии изменения learning rate в процессе
Нормализация входных данных
Батч-обучение и мини-батч
Перемешивание выборки и его влияние
Ранняя остановка обучения
Проблема локальных минимумов
Воспроизводимость: фиксация начальных весов
Работа с данными
Подготовка входных данных для нейронной сети
Нормализация и стандартизация числовых признаков
Кодирование категориальных переменных
One-hot encoding вручную на JavaScript
Разбивка на обучающую, валидационную и тестовую выборки
Работа с временными рядами: скользящее окно
Загрузка данных из CSV в браузере
Загрузка данных из CSV в Node.js
Обработка пропусков и аномальных значений
Сохранение и загрузка моделей
Формат JSON-представления сети
Метод network.toJSON и его содержимое
Метод Network.fromJSON и восстановление
Сохранение модели в файл в Node.js
Загрузка модели из файла в Node.js
Хранение модели в localStorage браузера
Частичное сохранение и горячая замена весов
Версионирование моделей
Интеграция с браузерным окружением
Подключение Synaptic через CDN и npm
Сборка с webpack и Browserify
Запуск обучения в Web Worker
Передача модели между главным потоком и Worker
Визуализация процесса обучения в реальном времени
Отображение весов и активаций в DOM
Интерактивный демо-интерфейс для нейронной сети
Интеграция с Node.js окружением
Установка через npm и подключение
Скрипт командной строки для обучения модели
Сохранение и чтение модели через fs
Работа с потоками данных в Node.js
Параллельное обучение нескольких сетей через child_process
Экспорт обученной модели для использования в браузере
Продвинутые возможности библиотеки
Метод Network.optimize: что происходит внутри
Построение нестандартных топологий вручную
Сети с несколькими входами и несколькими выходами
Совместное использование весов между слоями
Замораживание весов отдельных слоёв
Создание ансамбля нейронных сетей
Реализация attention-механизма вручную
Эволюционные алгоритмы и нейроэволюция на базе Synaptic
Neuroevolution of Augmenting Topologies: идеи и реализация
Отладка и тестирование
Типичные ошибки при построении архитектуры
Проверка связей и весов до начала обучения
Отслеживание градиентов во время обучения
Обнаружение взрывного градиента
Логирование состояния сети
Написание unit-тестов для нейронной сети
Проверка корректности backpropagation
Инструменты профилирования в Node.js и браузере
Производительность
Ограничения Synaptic по производительности
Сравнение с нативными Float32Array реализациями
Оптимизация горячих путей в коде сети
Метод standalone как способ ускорения инференса
Использование Web Workers для параллельных вычислений
Векторизация вычислений вручную
Когда Synaptic достаточно, а когда нужен TensorFlow.js
Практические задачи
Решение задачи XOR
Классификация точек на плоскости
Распознавание рукописных цифр на упрощённом наборе
Предсказание временного ряда
Обнаружение аномалий
Простой генератор текста посимвольно
Автоэнкодер для сжатия данных
Задача восстановления паттернов сетью Хопфилда
Балансировка шеста: управляющая сеть с подкреплением вручную
Математические основы
Линейная алгебра для нейронных сетей
Скалярное произведение и матричное умножение
Производная и частная производная
Цепное правило дифференцирования
Градиентный спуск: геометрическая интерпретация
Функции активации и их производные
Функции потерь и их производные
Инициализация весов: метод Xavier и He
Статистические основы оценки качества модели