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

Стохастический градиентный спуск –

Как Артур Сэмюэл упомянул описание машинного обучения

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

Вместо того, чтобы пытаться найти сходство между изображением и идеальным изображением (как показано в Часть I), мы могли бы вместо этого посмотреть на каждый отдельный пиксель и придумать набор весов для каждого. , так что самые высокие веса связаны с теми пикселями, которые с наибольшей вероятностью будут черными для определенной категории.

Например, пиксели в правом нижнем углу вряд ли будут активированы для 7, поэтому они должны иметь низкий вес для 7, но они, вероятно, будут активированы для 8, поэтому они должны иметь высокий вес для 7. 8.

Это может быть представлено как функция и набор значений веса для каждой возможной категории — например, вероятность быть числом 8:

def pr_eight(x,w): return (x*w).sum()

Здесь мы предполагаем, что x — это изображение, представленное в виде вектора, другими словами, со всеми строками, сложенными встык в одну длинную строку. И мы предполагаем, что веса являются вектором w. Если у нас есть эта функция, то нам просто нужно как-то обновить веса, чтобы сделать их немного лучше. При таком подходе мы можем повторять этот шаг несколько раз, делая веса все лучше и лучше, пока они не станут настолько хороши, насколько мы можем их сделать. Мы хотим найти определенные значения для вектора w, которые приводят к тому, что результат нашей функции будет высоким для тех изображений, которые на самом деле являются восьмерками, и низкими для тех изображений, которые не являются таковыми. Поиск лучшего вектора w — это способ поиска лучшей функции для распознавания восьмерок.

Функция потерь/затрат количественно определяет расстояние между реальным и прогнозируемым значением цели. Для задачи регрессии наиболее популярной функцией потерь является сумма квадратов ошибок.

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

Градиент, оцененный в любой точке, представляет собой направление наибольшего подъема по этой холмистой местности. Таким образом, мы обновляем параметры в отрицательном направлении градиента, что называется градиентным спуском.

https://www.khanacademy.org/math/multivariable-calculus/applications-of-multivariable-derivatives/optimizing-multivariable-functions/a/what-is-gradient-descent

Таким образом, цель градиентного спуска состоит в том, чтобы минимизировать заданную функцию потерь/затрат путем итеративного выполнения следующих двух шагов:

  1. Вычислить градиент (наклон)
  2. Сделайте шаг в направлении, противоположном градиенту

Пакетный градиентный спуск — в этом методе обновление весов рассчитывается на основе всех выборок в обучающем наборе. С очень большим набором данных с миллионами точек данных запуск пакетного градиентного спуска может быть довольно затратным в вычислительном отношении.

Стохастический градиентный спуск — здесь веса обновляются постепенно для каждой обучающей выборки. SGD выбирает случайный экземпляр в обучающем наборе на каждом шаге и вычисляет градиенты только на основе этого единственного экземпляра. Обычно он быстрее достигает сходимости из-за более частых обновлений веса. Функция стоимости будет прыгать вверх и вниз, уменьшаясь только в среднем. Со временем он будет очень близок к минимуму, но как только он достигнет его, он будет продолжать прыгать, никогда не останавливаясь. Эта случайность хороша для выхода из локального минимума, но плоха тем, что она никогда не достигает минимума. Один из способов решить эту проблему — ввести скорость обучения. Шаги начинаются большими, затем становятся все меньше и меньше, позволяя алгоритму установить глобальный минимум.

Итак, возвращаясь к Рисунку -1, шаги таковы:

  1. Инициализировать случайные веса
  2. Для каждого изображения используйте эти веса, чтобы предсказать, выглядит ли оно как 3 или 7.
  3. На основе этих прогнозов вычислить, насколько хороша модель (ее потери)
  4. Рассчитайте градиент, который измеряет для каждого веса, как изменение этого веса изменит потери.
  5. Шаг (изменение) всех весов на основе этого расчета
  6. Перейти к шагу — 2 и повторить процесс
  7. Повторяйте, пока не решите остановить процесс обучения.

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

PyTorch может автоматически вычислять производную с помощью метода «requires_grad_()». Метод «backward()» относится к обратному распространению, то есть к процессу вычисления производной каждого слоя.

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

Скорость обучения –

Хотя градиент указывает нам направление, в котором мы должны двигаться, связанная с ним величина по умолчанию может просто заставить нас выйти за пределы минимума в ландшафте ошибок или приближаться к нему бесконечно медленно. Скорость обучения определяет размер шагов при обновлении весов. Если скорость обучения слишком мала, алгоритму придется пройти много итераций, чтобы достичь минимума функции потерь, что займет больше времени. И если он слишком высок, вы можете продолжать прыгать через долину, а не расходиться.

Чтобы обновить веса на основе скорости обучения —

w -= w.grad * lr

Сквозной пример SGD —

Шаг 1: Инициализируйте веса/параметры

Шаг 2: Рассчитайте прогнозы

Шаг 3: Рассчитайте потери

Шаг 4: Рассчитайте градиенты

Шаг 5: шаги/обновление весов

Шаг 6: Повторите процесс

Шаг 7: Остановитесь

Сигмовидная –

Сигмовидная функция всегда выводит число от 0 до 1. Она используется для двоичной классификации, а для многоклассовой классификации вы можете использовать Softmax.

Sigmoid — Выводит P(целевой класс | x) в [0, 1]

def sigmoid(x): return 1/(1+torch.exp(-x))

Модель нейронной сети –

Пример трехслойной нейронной сети с двумя слоями скрытых элементов

Функции активации –

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

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

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

SGD и мини-партии –

Как упоминалось ранее, мы могли бы рассчитать потери для всего набора данных и взять их в среднем (пакетный градиентный спуск), или мы могли бы рассчитать их для одного элемента данных (стохастический градиентный спуск), и оба подхода не идеальны. Поэтому вместо этого мы можем рассчитать средние потери для нескольких элементов данных за раз. Это называется мини-партией. Количество элементов данных в мини-пакете называется размером пакета. Больший размер пакета означает, что вы получите более точную и стабильную оценку градиентов вашего набора данных из функции потерь, но это займет больше времени, и вы будете обрабатывать меньше мини-пакетов за эпоху.

Добавление нелинейности –

Добавление нескольких линейных слоев не улучшит производительность модели. Это связано с тем, что в линейной модели в каждом слое, когда мы умножаем вещи и суммируем их несколько раз, это эквивалентно одному слою с разными параметрами. Таким образом, добавление нелинейной функции (также называемой функцией активации, как показано выше на рисунке — Sigmoid, ReLu, Tanh) между линейными слоями разделяет слои и позволяет слою учиться самостоятельно.

Почему глубоко –

Почему мы используем более глубокую модель?

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

Простая модель нейронной сети для полного набора данных MNIST

Сессия чтения -

https://youtu.be/ZSammVUWYqc