"Машинное обучение"

Руководство PyTorch для начинающих

Обзор основных концепций проектирования нейронных сетей Pytorch

Это первое сообщение из серии руководств по построению моделей глубокого обучения с помощью Pytorch. Ниже представлена ​​полная серия:

  1. Руководство по Pytorch для начинающих (этот пост)
  2. Понять тензорные размерности в моделях DL
  3. CNN и художественные визуализации
  4. Гиперпараметрическая настройка с Optuna
  5. Перекрестная проверка K-сгиба
  6. Сверточный автоэнкодер
  7. Автоэнкодер с шумоподавлением
  8. Вариационный автоэнкодер

Цель этой серии - сделать Pytorch более интуитивно понятным и доступным с помощью примеров реализации. В Интернете есть множество руководств по использованию Pytorch для построения многих типов сложных моделей, но в то же время это может сбивать с толку, потому что при переходе от учебника к другому всегда есть небольшие различия. В этой серии я хочу начать с самых простых тем к более сложным.

Вступление

Pytorch - это фреймворк глубокого обучения, разработанный исследовательской лабораторией искусственного интеллекта Facebook в 2016 году. Он широко известен благодаря приложениям, ориентированным на компьютерное зрение. Более того, он отличается простотой, мощной поддержкой графического процессора и реализованными алгоритмами глубокого обучения. Благодаря этим функциям это также одна из наиболее часто используемых библиотек в академических исследованиях.

В Интернете есть много руководств по Pytorch, а на веб-сайте Pytorch - много документации. Но слишком много информации может сбить с толку и привести к потере много времени. Моя цель - показать обзор основных функций и классов, доступных в Pytorch, а также несколько примеров. В этом руководстве я легко и интуитивно покажу темы, которые полезно знать, прежде чем приступить к построению нейронной сети.

Содержание:

  1. Тензор
  2. Умножение матриц
  3. От Pytorch к NumPy и наоборот
  4. Дифференциация в Автограде
  5. Однослойная нейронная сеть k
  6. Простая нейронная сеть

1. Тензор

тензор - это объект Pytorch, представляющий многомерный массив. Действительно, он похож на массив NumPy. Чтобы лучше понять основные функции построения тензоров, я также сделаю примеры с использованием Numpy, чтобы показать, что логика такая же.

Numpy и Pytorch используют множество похожих функций для создания матриц:

  • randn для создания случайных матриц
  • zeros для построения матриц, заполненных нулями
  • ones для возврата матриц с единицами

Исключение составляет функция, строящая матрицы идентичности. Pytorch использует функцию eye, а NumPy - функцию identity.

2. Умножение матриц

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

В NumPy функции dot и matmul используются для произведения между двумя матрицами. Существует также оператор @ в качестве альтернативы, если вы не хотите использовать функции.

Pytorch имеет ту же функцию matmul, что и NumPy. Другая возможность - это torch.mm функция. Разница между ними в том, что torch.mm не поддерживает трансляцию.

В случае поэлементного умножения NumPy использует multiply, а Pytorch использует простой оператор*

3. С Pytorch на NumPy и наоборот

Массив Nupy можно преобразовать в тензор с помощью функции from_numpy. Обратную операцию можно выполнить с помощью функции numpy.

4. Дифференциация в Автограде.

Производная составляет фундаментальный аспект нейронных сетей. Действительно, алгоритм градиентного спуска использует производные для изучения модели. Цель этого алгоритма - минимизировать функцию потерь J. Затем значения параметров будут изменяться до тех пор, пока мы не получим оптимальное значение J. Известное правило обновления этого метода:

w = w - скорость обучения * dJ (w) / dw

b = b - скорость обучения * dJ (b) / db

Это правило ускоряет или замедляет обучение в зависимости от двух характеристик: скорости обучения и производной функции потерь по рассматриваемому параметру, w или b. Я хочу сосредоточиться на концепции производной.

Что это значит?

Он представляет собой наклон функции. Когда значение производной велико, функция быстро меняется, а когда оно близко к 0, функция не меняется, и это может быть проблемой при обучении в контексте нейронных сетей. В этом примере я сравнил прямую, параболу и гиперболу.

Прямая линия имеет небольшую производную по сравнению с параболой и гиперболой, которые вместо этого имеют высокие значения. Можно заметить, что значение параболы в 4 раза больше значения прямой линии, а значение гиперболы в 3 раза превышает значение параболы, поэтому она изменяется в три раза быстрее, чем парабола.

5. Один слой нейронной сети.

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

Например, если у нас есть входной вектор с одной строкой и 10 столбцами, у нас будет 10 нейронов.

Математически это выглядит так:

z = w₁ x₁ + … + w₁₀ x₁₀ + b

y = a(z) = a(w₁ x₁ + … + w₁₀ x₁₀ + b)

В коде я создал входной вектор с помощью функции matmul, которая используется для создания матриц, заполненных случайными числами из нормального распределения со средним значением 0 и дисперсией 1.

Взвешенная матрица будет иметь тот же размер, что и входные данные, но с другими значениями. Смещение состоит из единственного значения нормального распределения. Мы можем использовать matmul для умножения матриц между входами и весами, затем мы можем применить функцию активации sigm (называемую сигмоидом), чтобы отображать любое значение от 0 до 1.

Код возвращает ошибку. Очень часто при обучении нейронной сети возникают ошибки такого типа. Это связано с тем, что количество столбцов входных данных не равно количеству строк w1. Чтобы решить проблему, нам нужно изменить форму гирь. В Pytorch есть три способа сделать это:

  • w1.reshape(10,1) возвращает новый тензор с теми же данными, что и w1, но с формой (10,1)
  • w1.view(10,1) возвращает новый тензор с теми же данными, что и w1, и другой формы (10,1).
  • w1.resize_(10,1) возвращает тот же тензор другой формы (10,1)

6. Простая нейронная сеть.

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

Рассматриваемая ниже архитектура имеет один выходной слой, два скрытых слоя и один выходной уровень. Как и раньше, мы получаем входные данные, веса, смещение с помощью функции randn. Вместо того, чтобы делать вычисления только для одного слоя, мы делаем это для каждого слоя.

Ниже я покажу, как определить класс, который определяет Сеть и наследуется от nn.Module. Полностью связанные слои построены через nn.Linear(in_features,ou_features). Первый аргумент - это количество единиц ввода, а второй аргумент - количество единиц вывода.

Заключительные мысли:

Я надеюсь, что это руководство помогло вам лучше понять Pytorch благодаря общему обзору.

Иногда бывает так легко заблокировать при программировании, и, вероятно, потому, что некоторые вещи были непонятны или смотрели слишком быстро, не имея времени на то, чтобы хорошо их запомнить. Код Github находится здесь.

Спасибо за прочтение. Хорошего дня!