Руководство по машинному обучению и анализу данных от А до Я.
Сообщите нам, если вас интересует разработка программного обеспечения для блокчейн и финтех, или просто скажите Привет в Pharos Production Inc.
В предыдущих двух статьях мы рассмотрели базовую теорию DNN - градиентный спуск, прямое и обратное распространение ошибки и еще несколько. На этот раз мы реализуем всю эту теорию с помощью Python.
Этот материал основан на Udacity Self-Driving Car Engineer Nanodegree - совершенно потрясающем учебном материале. Я очень рекомендую записаться на их курсы прямо сейчас. PS: Нет, мне не заплатили :)
Подготовить
Начнем с импортированных библиотек и подготовки данных. Мы будем использовать numpy, Boston House-price Dataset (регрессия) из SciKitLearn и пару для утилит переупорядочивания данных - перемешать и пересчитать.
SKLearn уже приготовил для нас два набора:
- ‘data’ - данные для изучения
- ‘target’ - цели регрессии
Затем мы нормализуем данные - приводим значения к условно общему масштабу. Мы используем здесь стандартный балл, потому что популяция известна, она хорошо работает для нормально распределенных популяций.
Затем мы берем объекты из массива. X_.shape показывает (506, 13). Итак, у нас есть 13 функций и 506 обучающих выборок. Также мы определяем 10 перцептронов в скрытом слое. Затем мы должны инициализировать веса со случайным равномерным распределением значений и смещения нулями. W и b с индексом 1 - это веса и смещения между входным и скрытым слоем, с индексом 2 - между скрытым слой и вывод.
Затем мы определяем входные данные и объединяем их в словарь. Кроме того, мы должны определить гиперпараметры нашей сети, где m - это количество выборок, а steps_per_epoch - количество раз, когда мы выполняем пакетную выборку входных данных. данные в расчете на каждую эпоху.
Определим основные операции. Все они мы рассмотрели в предыдущих статьях. Итак, все они известны, кроме топологической_сортировки. Топологическая сортировка, ну, предполагая, что все операции выполняются как Направленный ациклический граф и операции сортировки по порядку в соответствии с алгоритмом Кана.
Последняя часть представляет собой самостоятельный расчет. Мы запускаем несколько эпох каждый раз при вычислении потерь и новых весов и смещений. Мы случайным образом разбиваем образцы на партии. Затем запустите прямое и обратное распространение, вычислите стохастический градиентный спуск, а затем потери . С каждым разом потеря становится все меньше и меньше.
Стохастический градиентный спуск
Его реализация довольно проста.
Прямое и обратное распространение
Мы определяем прямые и обратные свойства в каждом узле, поэтому они различны для каждой операции. Например, прямая опора не реализована во входном узле.
Топологическая сортировка
Алгоритм Кана:
- Инициализировать отсортированный список пустым, а счетчик - 0
- Вычислить степени всех узлов
- Хранить все узлы со степенью 0 в очереди
- Пока очередь не пуста
- Возьмите узел U и поместите его в отсортированный список. Увеличьте счетчик.
- Для всех ребер (U, V) уменьшите степень V и поместите V в очередь, если обновленная степень равна 0.
- Если счетчик не равен количеству узлов, происходит цикл.
Среднеквадратичная ошибка
Сигмоид (логистическая функция)
Линейное преобразование
Входной узел
Посмотри. Входной узел не имеет прямого метода, потому что вперед нечего делать, но обратный метод содержит градиенты.
Узел
И последний - родительский класс всех узлов. Он содержит интерфейс для всех дочерних классов. Мы инициализируем каждый класс списком входов, пустым значением и пустыми выходными узлами. Когда мы связываем узел со входами, мы перебираем их, добавляя текущий узел к их выходам.
Сделанный
Вы можете найти весь исходный код в нашем Github Repo.
Спасибо за чтение!