Современная математика глубокого обученияобъяснение для тех, кто не занимается математикой

Проектирование нейросети

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

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

6.1 Смотреть на соседние элементы

Свёрточные нейронные сети · стр. статьи 45–46

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

Переместите один и тот же фильтр из двух чисел (1, −1) по условным значениям (3, 2, 4). В каждом окне перемножьте соответствующие элементы и сложите их.

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

Упрощённая модель

yi=w1xi+w2xi+1y_i=w_1x_i+w_2x_{i+1}
y1=3−2=1,y2=2−4=−2y_1=3-2=1,\quad y_2=2-4=-2
function neighboringDifferences(values) {
  return { outputs: [values[0] - values[1], values[1] - values[2]] };
}
const result = neighboringDifferences([3, 2, 4]);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 45

Сканируйте изображение

Условный пример

Исследуйте

Переместите окно из трёх пикселей, чтобы получить отклик 4.

Нажмите на рисунок или используйте кнопки

Движущийся сканер111555Последнее − первое = 0
Положение окна
0

Положение: 0; Сейчас: 1 · 1 · 1; Результат: 0

Переместим один и тот же фильтр [1, −1] по значениям [3, 2, 4]. В первой позиции вычисляем 1×3 − 1×2 = 1, во второй — 1×2 − 1×4 = −2. Фильтр используется повторно вместо изучения новой пары весов в каждой позиции.

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

6.2 Остаточные связи между слоями

Остаточные нейронные сети · стр. статьи 46–47

Во время обучения сигнал настройки проходит назад через слои. Каждый слой умножает его на множитель, описывающий влияние слоя. Например, сигнал 1 при трёх умножениях на 0.5 становится 0.5, затем 0.25 и 0.125. Множители меньше 1 могут сделать сигнал крошечным, а множители больше 1 — огромным. В обоих случаях ранние слои трудно настроить.

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

Поправьте температуру

Условный пример

Исследуйте

Предскажите показание после поправки 2.

Нажмите на рисунок или используйте кнопки

До3°C−+Два пути+СохранитьДобавить 2°CПосле??
Прежнее показание (°C)
3

Начальное значение: 3 °C; Поправка: 2 °C

В остаточном слое статьи активированная поправка добавляется к предыдущему слою. В примере возьмём прежнее значение 3 и поправку 1.

Выход — исходный вход с добавленной поправкой.

Формула из статьи

Φˉ(ℓ)(x,θ)=ϱ(Φ(ℓ)(x,θ))+Φˉ(ℓ−1)(x,θ)\bar\Phi^{(\ell)}(x,\theta)=\varrho(\Phi^{(\ell)}(x,\theta))+\bar\Phi^{(\ell-1)}(x,\theta)
3+ReLU⁡(1)=43+\operatorname{ReLU}(1)=4
function residualBlock(value, correction) {
  const activated = Math.max(0, correction);
  return { input: value, correction: activated, output: value + activated };
}
const result = residualBlock(3, 1);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 47 (6.2)

Здесь Φ с чертой — выход остаточного слоя, ℓ — номер слоя, Φ — вычисленная поправка до активации, ρ — функция активации, а θ содержит параметры. В примере ReLU сохраняет 1, поэтому 3 + 1 = 4.

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

6.3 Разбор и восстановление

Фреймлеты и U-образные сети · стр. статьи 47–49

При уменьшении изображения можно потерять мелкие, но важные детали. U-образная сеть сначала сжимает информацию, а затем восстанавливает изображение. Её длинные связи могут передавать более ранние детали для восстановления.

Найдите среднее условных значений пикселей 2 и 4 и сохраните половину их разности. Используйте обе части для восстановления входов.

Сохранив среднее и половину разности, можно восстановить 2 и 4.

Пример расчёта

a=(x1+x2)/2,d=(x1−x2)/2,(x1,x2)=(a+d,a−d)a=(x_1+x_2)/2,\quad d=(x_1-x_2)/2,\quad (x_1,x_2)=(a+d,a-d)
a=3,d=−1,(a+d,a−d)=(2,4)a=3,\quad d=-1,\quad (a+d,a-d)=(2,4)
function splitAndReconstruct(first, second) {
  const average = (first + second) / 2;
  const detail = (first - second) / 2;
  const reconstructed = [average + detail, average - detail];
  return { average, detail, reconstructed };
}
const result = splitAndReconstruct(2, 4);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 48

Восстановите детали плитки

Условный пример

Исследуйте

Восстановите 1, 3, 1, 3 из грубого ряда 2, 2, 2, 2.

Нажмите на рисунок или используйте кнопки

Исходная ткань1 · 3 · 1 · 3Грубая миниатюра2 · 2 · 2 · 2Выбранная деталь0 · 0 · 0 · 0 → 2 · 2 · 2 · 2Выбранная деталь1 · -1 · 1 · -1 → 3 · 1 · 3 · 1Выбранная деталь-1 · 1 · -1 · 1 → 1 · 3 · 1 · 3
Узор деталей

Детали: Без деталей; Результат: 2 · 2 · 2 · 2; Цель: 1 · 3 · 1 · 3

Для пикселей 2 и 4 среднее равно (2 + 4)/2 = 3, а половина разности — (2 − 4)/2 = −1. Сохранив оба значения, можно восстановить 3 − 1 = 2 и 3 + 1 = 4. Одно среднее дало бы два значения 3 и потеряло контраст.

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

В U-Net пропускающие связи переносят полезные ранние признаки через путь сжатия. Точность восстановления зависит от фильтров и архитектуры, а не просто от изображения в форме буквы U.

6.4 Общая шкала для сравнения чисел

Нормализация по пакету · стр. статьи 49–50

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

Возьмём пакет из чисел 1 и 3. Сначала найдём среднее. Затем измерим разброс: возведём отклонения от среднего в квадрат, усредним квадраты и извлечём квадратный корень.

Вычитаем среднее группы, затем делим на меру её разброса.

Определение / правило статьи

μ=1m∑ixi,σ=1m∑i(xi−μ)2,zi=xi−μσ\mu=\frac1m\sum_i x_i,\quad \sigma=\sqrt{\frac1m\sum_i(x_i-\mu)^2},\quad z_i=\frac{x_i-\mu}{\sigma}
μ=2,σ=1,(z1,z2)=(−1,1)\mu=2,\quad \sigma=1,\quad (z_1,z_2)=(-1,1)
function normalizeBatch(values) {
  if (values.length === 0) throw new Error('Пакет не может быть пустым.');
  let total = 0;
  for (const value of values) total += value;
  const mean = total / values.length;
  let squaredTotal = 0;
  for (const value of values) squaredTotal += (value - mean) ** 2;
  const spread = Math.sqrt(squaredTotal / values.length);
  if (spread === 0) throw new Error('Разброс пакета должен быть ненулевым.');
  const normalized = [];
  for (const value of values) normalized.push((value - mean) / spread);
  return { mean, spread, normalized };
}
const result = normalizeBatch([1, 3]);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 49

Сравните температуры

Условный пример

Исследуйте

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

Нажмите на рисунок или используйте кнопки

Показания температуры2°C4°C6°CСреднее ?−+Относительно среднего↓Ниже=На уровне среднего↑Выше?
Третье показание (°C)
6

Сейчас: 2 · 4 · 6 °C; Третье показание: 6 °C

Среднее равно (1 + 3)/2 = 2. Вычитаем его из каждого числа: разности равны −1 и +1. Возводим их в квадрат и усредняем: ((−1)² + 1²)/2 = 1. Корень из 1 равен 1 — это мера разброса, стандартное отклонение. Вычитаем 2 и делим на этот разброс: получаем [−1, 1].

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

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

6.5 Удаление связей

Разреженные нейронные сети и прореживание · стр. статьи 50–52

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

В этом условном примере результат — сумма трёх весов, умноженных на входы. Удалите малый вес и сравните полученный выход с исходным.

После обнуления одного веса выход меняется на 0.1 для данного входа.

Пример расчёта

y=∑iwixi,удалить при ∣wi∣<τy=\sum_i w_ix_i,\quad \text{удалить при }|w_i|<\tau
y=2+0.1+1=3.1,ypruned=2+1=3y=2+0.1+1=3.1,\quad y_{\rm pruned}=2+1=3
function pruneWeights(weights, cutoff) {
  if (!(cutoff >= 0)) throw new Error('Порог не может быть отрицательным.');
  let original = 0;
  let pruned = 0;
  for (const weight of weights) {
    original += weight;
    if (Math.abs(weight) >= cutoff) pruned += weight;
  }
  return { original, pruned };
}
const result = pruneWeights([2, 0.1, 1], 0.2);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 51

Удалите признаки на картинке

Условный пример

Исследуйте

Оставьте только самый сильный положительный признак.

Нажмите на рисунок или используйте кнопки

Признаки изображения000Уши · усы · круглые ушиОценка кошки0
Оставленные признаки

Выбрано: нет; Оставленные веса: нет; Результат: 0

Для условного входа, где все признаки равны 1, вклады 2, 0.1 и 1 дают в сумме 3.1. Удаление вклада 0.1 даёт 3, всего на 0.1 меньше для этого входа. Но на других входах эффект удаления связи может измениться.

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

Иллюстрация разреженных связей посвящена удалению весов. Это отличается от описаний разреженных шаблонов, которые встретятся в главе 7.

6.6 Помним предыдущие шаги

Рекуррентные нейронные сети · стр. статьи 52

Фотография — это один набор пикселей. Слова предложения или удары колокола поступают в определённом порядке. Иногда следующий ответ должен зависеть от предыдущего.

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

Запомните звонок

Условный пример

Исследуйте

Прочитайте первые три сигнала и предскажите память.

Нажмите на рисунок или используйте кнопки

1: звонокПамять: —2: тишинаПамять: —3: звонокПамять: —4: звонокПамять: —
Прочитанные сигналы
0

Прочитано сигналов: 0; Начальное значение:

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

Во второе состояние переносится половина первого.

Упрощённая модель

ht=12ht−1+xth_t=\tfrac12 h_{t-1}+x_t
h0=0,x1=x2=1:h1=1,h2=1.5h_0=0,\quad x_1=x_2=1:\quad h_1=1,\quad h_2=1.5
function recurrentStep(first, memory, nextInput) {
  const second = memory * first + nextInput;
  return { first, second };
}
const result = recurrentStep(1, 0.5, 1);

Выберите изменение. Предскажите результат и запустите код.

Результат:
Включите JavaScript, чтобы запустить пример.

Подробнее в разделе понятий стр. статьи 52

Начнём с состояния 0. Если звонок добавляет 1, а старое состояние делится пополам, первый шаг даёт 0/2 + 1 = 1. При втором звонке получаем 1/2 + 1 = 1.5. Число 1.5 несёт информацию об обоих шагах.

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

Изменение связей сети влияет на то, какую информацию она повторно использует, сохраняет или теряет. Следующий вопрос: какие признаки она учится выделять?

Проверьте себя по главе

1. Как фильтр находит одинаковые границы в разных частях изображения?

2. Что объединяет остаточный блок?

3. Что удаляет прореживание?

Независимое учебное объяснение статьи Современная математика глубокого обучения — Юлиус Бернер, Филипп Грос, Гитта Кутиниок, Филипп Петерсен. В примерах используются вымышленные числа, если не указан источник измеренных данных.