Упрощение и улучшение прямого распространения

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

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

Масштабируйте и центрируйте свои данные

Одна из проблем, с которой вы сталкиваетесь с числовыми данными, заключается в том, что значения не одинаково масштабируются между категориями. Одним из классических примеров являются данные о состоянии здоровья — шкала, используемая для измерения артериального давления, представляет собой числа от десятков до сотен (надеюсь…) с диапазоном от 60 до 200, тогда как если вы измеряете что-то вроде калия в кровотоке , вы можете измерить в граммах примерно от 0,16 до 0,20. Если вы вводите эти числа необработанными в алгоритм машинного обучения, потому что он вычисляет продукты, значения артериального давления превзойдут значения калия, даже если небольшое отклонение в калии может быть более значительным, чем большее отклонение в кровяном давлении.

Чтобы исправить это и поставить эти две переменные на одно игровое поле, мы делаем две вещи — сначала центрируем, а затем масштабируем наши данные.

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

Для bp среднее значение равно 130, поэтому мы вычитаем его из каждого значения. Для калия среднее значение равно 0,19, поэтому мы снова вычитаем его из каждого значения. Это дает нам центрированные значения следующим образом:

Масштабирование данных означает деление значений на их стандартное отклонение. В этом случае наше стандартное отклонение для bp = 10, а для калия = 0,01. Разделение всего приводит к следующим масштабированным и центрированным значениям:

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

Умножение матриц упрощает математику

Еще когда я знакомился со стандартным персептроном, я узнал о трюке, который можно использовать для упрощения массовых вычислений y = w*x + b, а затем математически показал, как он работает. Давайте еще раз взглянем на нашу простую нейронную сеть:

Обратите внимание, что вся выполняемая математика — это просто итерация w*x + b. Давайте создадим некоторые фиктивные данные, а затем несколько случайных весов, которые мы могли бы применить для первого раунда:

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

Итак, теперь все, что нам нужно сделать, чтобы учесть все веса и смещения, — это просто умножить наш вектор весов на наши значения данных. Мы можем использовать матричное умножение, чтобы выполнить это одним махом, как w.T @ x (мы должны переставить наш весовой вектор, чтобы получить правильные числа для нашего скалярного произведения), и в этой модифицированной форме это будет идентично решение для выполнения каждого умножения и установки смещения от руки.

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

— — — — — — —

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