существуетУстановка среды глубокого обученияВ этой статье мы создали базовую среду для кодирования. Теперь вы можете официально писать код. Наша цель сегодня — смоделировать линейную регрессию и найти линейную функцию, которая лучше всего соответствует данным, путем настройки параметров (наклон k и b).
советы: весь код делается в блокноте jupyter
Переменные автоматического дифференцирования
Во-первых, представить pytorch и включенный пакет переменных автоматической дифференциации.autograd
Для чего используется эта автоматическая дифференциальная переменная?
Короче говоря, он "обрабатывает" операции тензоров. При использовании автоматических дифференциальных переменных для выполнения операций он фактически строит вычислительный граф.
Например, мы определяем две переменные, одна тензорная, а другая переменная автоматического дифференцирования.
Значение require_grad = True, представляющее эту дифференциальную переменную可反向传播
Переменная метода тензора может использоваться практически, и у переменной есть много собственных уникальных методов, таких как обратное распространение (назад), значение градиента (grad()) входной величины и так далее. Мы объясним связанные методы далее в примерах позже.
Что нам нужно знать сейчас, так это то, что все параметры, которые должны быть скорректированы нейронной сетью, должны иметь свойство «обратного распространения градиента», поэтому их нужно определять как автоматические дифференциальные переменные при их определении.
Давайте определим еще одну переменную, torch.linspace(0, 10) для создания 100-мерного вектора, поровну разделенного на пороге [0, 10], как показано на рисунке Xia.
Затем мы выполняем двухэтапную операцию над этой переменной
-
x + 2 получает новую переменную y
-
y квадрат, а затем возьмите среднее значение, чтобы получить переменную z
Вышеупомянутый процесс описан математически, что может быть выражено в виде следующей составной функции.
Если есть какое-либо числовое колебание z, мы можем использовать математические методы, чтобы найти аналитическое решение частной производной x, то есть числовое колебание, соответствующее x.
И этот процесс в нейронной сети — обратное распространение градиента. Числовое колебание целевого значения будет иметь градиентное изменение независимой переменной.
В pytorch это еще проще, вам нужна только команда backword(), Независимо от того, насколько сложна работа функции посередине, вы можете напрямую получить градиент в независимой переменной.
Нейронные сети по сути являются сложными функциональными операциями, промежуточные сложные операции мы передаем машине, чтобы можно было больше сосредоточиться на изучении «комбинации функций», то есть алгоритмов.
Подходящая линейная регрессия
Поняв наиболее важный механизм обратного распространения нейронной сети, давайте попробуем выполнить простую подгонку.
1. Генерация данных
Сначала мы моделируем некоторые дискретные точки. Генерирует нормально распределенные случайные точки в интервале [0-1] с помощью метода randn, который получает параметр количества поколений
После настройки мы рисуем эти точки, и здесь используется сторонняя библиотека.matplotlib.pyplot
,Официальная документация здесь, предыдущая статья также привела вас к его установке. Представьтесь прямо здесь и нарисуйте картинку
Результат рисования такой
2. Напишите тело модели
Этот график линейный, и мы можем сделать его линейной функцией вида y = k * x + b.
Тогда наша цель — найти набор k и b, чтобы окончательная функция первого порядка была наиболее близкой к данным.
Начальные k и b могут быть сгенерированы случайным образом.Обратите внимание, что они должны быть установлены как дифференциальные переменные, чтобы можно было получить их градиенты.
Затем установите скорость обучения. Скорость обучения — это гиперпараметр, который обычно можно установить равным 0,0001. Слишком большое приведет к неточным результатам, а слишком маленькое потребует большего количества операций. Конкретное значение может быть скорректировано в соответствии с тренировочной ситуацией.
Теперь начните вводить часть обучающего кода, начнем с кода
Каждый шаг в коде четко прокомментирован, и здесь я сосредоточусь на объяснении нескольких ключевых моментов:
-
Команда expand_as() является операцией изменения размерности.Операция умножения матриц требует изменения размерности и должна соответствовать размерностям двух перемножаемых матриц.
-
Функция потерь:Функция потерь - большой вопрос.Это "разница" между прогнозируемым значением и реальным значением.Здесь выбирается простейшая функция потерь, то есть реальное значение и прогнозируемое значение вычитаются напрямую, и чтобы избежать положительного и отрицательного влияния числа, снова выполните операцию возведения в квадрат. Окончательное значение потерь должно быть 0-мерным действительным числом, и в нашем процессе вычисления используются все тензоры, поэтому мы, наконец, берем среднее значение после добавления каждого бита, то есть torch.mean((predictions - y) ** 2)
-
Значение переменной автоматического дифференцирования необходимо получить с помощью x.data().
-
После каждого получения новых k и b не забывайте очищать градиенты k и b
Каждый раунд обучения мы будем получать новый набор k и b, Когда мы наблюдаем, что тенденция к уменьшению потерь постепенно становится меньше, это означает, что модель почти обучена, В это время k и b - это значения, которые мы хотеть. Затем мы можем попытаться нарисовать эту одноразовую функцию, чтобы увидеть эффект.
На данный момент нам нужно представить пакет вычислений numby и пакет рисования matplotlib.
Видно, что окончательная функция первого порядка в основном согласуется с данными
В следующий раз я напишу реальный процесс обучения нейронной сети, более сложный и интересный~
Быть в курсе
использованная литература