В нашей прошлой статье мы говорили об основах PyTorch и Deep Learning, теперь давайте немного углубимся.

Краткое содержание:

1- Вспоминая основы глубокого обучения
2- Создание базовой модели с использованием собственных классов PyTorch
3- Создание многослойной модели
4- Использование графического процессора
5- Выводы
6 - Использованная литература

1. Запоминание основ глубокого обучения

Модель

У модели есть параметры, такими параметрами являются веса и предвзятости. Параметры выполняют операции с вводом.

Линейный слой — один из самых основных слоев, которые могут быть в модели. Это уравнение линейного слоя:

Для линейного слоя размер весов равен (target_matrix_size X input_matrix_size), а смещение — целевой размер.

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

Функция потери

Одной из наиболее часто используемых функций потерь в глубоком обучении является MSE (среднеквадратичная ошибка).

Оптимизатор

Зачем нам оптимизировать модель?

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

Чтобы улучшить модель, мы используем потери для расчета производных потерь по параметрам, потому что, когда мы получаем тангенс графика потерь, мы можем настроить модель так, чтобы тангенс был меньше, и тогда мы будем иметь меньшие потери.

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

Если градиент положительный:

  • небольшое увеличение значения элемента веса увеличит потери
  • уменьшение значения элемента веса уменьшит потерю

Если элемент градиента отрицательный:

  • небольшое увеличение значения элемента веса уменьшит потерю
  • небольшое уменьшение значения элемента веса увеличит потери

Обучение модели

И, наконец, для обучения модели мы должны выполнить 5 шагов:

  1. Делать предсказания
  2. Рассчитать потери
  3. Рассчитать градиенты
  4. Отрегулируйте веса и смещения
  5. Сбросить параметры град

И в основном эти 5 шагов повторяются пару раз для обучения модели.

2. Создание базовой модели с использованием собственных классов PyTorch

Во-первых: давайте импортируем данные.

В этой модели мы собираемся использовать набор данных MNIST, то есть набор данных, содержащий 60 000 изображений рукописных чисел от 0 до 9.

Мы создадим набор данных и загрузчик данных, который будет загружать данные пакетами изображений в модель, потому что, если мы загрузим все изображения в модель одновременно … ну, возможно, ваш компьютер не справится с большим объемом данных в памяти

Во-вторых: мы создадим базовую модель, но с использованием модуля класса PyTorch для моделей.

Если вы не очень разбираетесь в курсах по Python, рекомендую прочитать эту страницу: https://www.w3schools.com/python/python_classes.asp

Итак, в модель войдет тензор размера (batch_size, 1, 28, 28) и будет возвращен тензор вида (batch_size, 10), т.к. входное изображение будет числом между 0–9, и модель должна вернуть массив вероятностей того, какое число должно быть на входе. Бывший:

[0.1, 0.034, 0.34, -0.2, 0.04, 0.1, 0.02, 0.04, -0.1, 0.5]

Этот массив говорит, что входное число должно быть 9, потому что самая большая вероятность равна 0,5, и нам просто нужно самое большоечисло индекс, и наш индекс в данном случае равен 9

Третье: Итак, теперь мы можем преобразовать числа массива в вероятности. Мы будем использовать простое уравнение под названием Softmax.

Четвертое. Давайте определим функцию точность для проверки производительности модели.

Затем нам нужно определить функцию потерь и оптимизатор.

Для функции потерь мы собираемся использовать Cross Entropy, потому что точность велика для нас, людей, чтобы увидеть, сколько работает модель, но для компьютера точность не показывает разницы. между предсказаниями и целями.

Это не дифференцируемая функция. torch.max и == являются прерывистыми и недифференцируемыми операциями, поэтому мы не можем использовать точность для вычисления градиентов относительно весов и предубеждения.

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

Пояснение взято с: https://jovian.ai/aakashns/03-logistic-regression

Мы просто выбираем номер индекса выходного массива, равный целевому, и применяем логарифм. Если вероятность близка к 1, более близкой к 0 будет убыток, если вероятности близко к 0, больше будет убыток, потому что мы умножаем результат на -1.

Мы просто взяли среднее значение перекрестной энтропии.

И нам не нужно передавать данные в функцию softmax перед перекрестной энтропией.

Для оптимизатора мы просто используем SGD, который мы изучили в предыдущей статье (градиентный спуск).

Пятое: В заключение давайте обучим модель.

Просто выполните 5 шагов, описанных в предыдущей статье.

Точность модели составит 90 % в более или менее 30 эпохах.

Мы можем улучшить ее, добавив в модель скрытый слой для изучения нелинейности.

3. Создание многослойной модели

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

Мы будем использовать активацию ReLU для модели. ReLU просто принимает значения больше или равно 0, а отрицательные значения устанавливают на 0.

Я рекомендую вам прочитать эту статью, чтобы узнать больше о том, когда использовать функцию активации: https://machinelearningmastery.com/choose-an-activation-function-for-deep-learning/

Хороший скрытый размер — от 32 до 256 параметров. Вы можете выбрать размер, зависит от вашей модели.

Теперь, если мы обучим модель, модель получит точность на 90% быстрее, чем раньше. Но время работы нашей модели во время обучения медленнее, чем раньше. Это потому, что компьютер требует больше вычислений.

Итак, давайте воспользуемся GPU, чтобы ускорить обучение.

4. Использование графического процессора

Сначала нам нужно получить графический процессор, если он есть на компьютере.

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

Затем мы передаем модель графическому процессору, просто используя .to(device).

model = MNISTmodel(in_size, hidden_size, out_size).to(device)

И мы настраиваем цикл обучения, чтобы добавить тензоры в GPU в начале.

Чтобы передать тензоры в GPU, мы передаем их в CUDA, потому что CUDA — это платформа для разработчиков на GPU.

Теперь давайте снова обучим модель, чтобы увидеть производительность.

Как видите, обучение идет быстрее, чем раньше.

Вот полный код:

5. Вывод

Перекрестная энтропия хороша для нашей модели, потому что мы имеем дело с вероятностями, и MSE в этом случае не будет работать очень хорошо.

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

В следующей статье мы улучшим эту модель, используя сверточные слои.

6. Ссылки