Проектирование нейросети
До сих пор мы представляли простые сети, где каждый слой соединён со следующим. В реальных задачах помогает более продуманная организация связей.
Попробуем шесть идей: смотреть на маленькие участки, сохранять прежнее значение через обходной путь, возвращать детали картинки, приводить числа к общему масштабу, убирать связи и передавать информацию по последовательности. Каждая меняет способ вычисления.
6.1 Смотреть на соседние элементы
Свёрточные нейронные сети · стр. статьи 45–46
Соседние пиксели могут составлять небольшой участок границы. Фильтр — короткий список весов для нескольких соседних значений яркости. Он умножает каждое значение на соответствующий вес и складывает результаты.
Переместите один и тот же фильтр из двух чисел (1, −1) по условным значениям (3, 2, 4). В каждом окне перемножьте соответствующие элементы и сложите их.
Упрощённая модель
function neighboringDifferences(values) {
return { outputs: [values[0] - values[1], values[1] - values[2]] };
}
const result = neighboringDifferences([3, 2, 4]);Выберите изменение. Предскажите результат и запустите код.
Сканируйте изображение
Условный примерИсследуйте
Переместите окно из трёх пикселей, чтобы получить отклик 4.
Нажмите на рисунок или используйте кнопки
Вычтите первый пиксель окна из последнего.
Положение: 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.
Нажмите на рисунок или используйте кнопки
Прибавьте 2 к прежнему показанию.
Начальное значение: 3 °C; Поправка: 2 °C
В остаточном слое статьи активированная поправка добавляется к предыдущему слою. В примере возьмём прежнее значение 3 и поправку 1.
Формула из статьи
function residualBlock(value, correction) {
const activated = Math.max(0, correction);
return { input: value, correction: activated, output: value + activated };
}
const result = residualBlock(3, 1);Выберите изменение. Предскажите результат и запустите код.
Здесь Φ с чертой — выход остаточного слоя, ℓ — номер слоя, Φ — вычисленная поправка до активации, ρ — функция активации, а θ содержит параметры. В примере ReLU сохраняет 1, поэтому 3 + 1 = 4.
Прямой путь также позволяет сигналу настройки проходить назад, минуя последовательность поправок. Статья связывает множество малых обновлений с описанием движения через вычисления за короткие промежутки времени один за другим. Прямая связь может помочь, но не гарантирует лёгкого обучения.
6.3 Разбор и восстановление
Фреймлеты и U-образные сети · стр. статьи 47–49
При уменьшении изображения можно потерять мелкие, но важные детали. U-образная сеть сначала сжимает информацию, а затем восстанавливает изображение. Её длинные связи могут передавать более ранние детали для восстановления.
Найдите среднее условных значений пикселей 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);Выберите изменение. Предскажите результат и запустите код.
Восстановите детали плитки
Условный примерИсследуйте
Восстановите 1, 3, 1, 3 из грубого ряда 2, 2, 2, 2.
Нажмите на рисунок или используйте кнопки
Сравните знаки деталей в каждой позиции.
Детали: Без деталей; Результат: 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. Сначала найдём среднее. Затем измерим разброс: возведём отклонения от среднего в квадрат, усредним квадраты и извлечём квадратный корень.
Определение / правило статьи
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]);Выберите изменение. Предскажите результат и запустите код.
Сравните температуры
Условный примерИсследуйте
Предскажите, будет ли третье показание ниже среднего, равно ему или выше него.
Нажмите на рисунок или используйте кнопки
Сравните его со средним чисел 2, 4 и третьего показания.
Сейчас: 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
Большие сети могут содержать связи, мало влияющие на конкретный выход. Прореживание обнуляет некоторые веса, чтобы нужно было сохранять меньше связей.
В этом условном примере результат — сумма трёх весов, умноженных на входы. Удалите малый вес и сравните полученный выход с исходным.
Пример расчёта
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);Выберите изменение. Предскажите результат и запустите код.
Удалите признаки на картинке
Условный примерИсследуйте
Оставьте только самый сильный положительный признак.
Нажмите на рисунок или используйте кнопки
Сравните веса 1, 0,4 и −0,2.
Выбрано: нет; Оставленные веса: нет; Результат: 0
Для условного входа, где все признаки равны 1, вклады 2, 0.1 и 1 дают в сумме 3.1. Удаление вклада 0.1 даёт 3, всего на 0.1 меньше для этого входа. Но на других входах эффект удаления связи может измениться.
Статья доказывает, что при заданных предположениях очень широкую двухслойную сеть ReLU можно приблизить значительно более разреженной, если скорректировать некоторые сохранённые выходные веса. Гарантия касается близости к выходу исходной сети, а не автоматической правильности относительно истинных меток.
Иллюстрация разреженных связей посвящена удалению весов. Это отличается от описаний разреженных шаблонов, которые встретятся в главе 7.
6.6 Помним предыдущие шаги
Рекуррентные нейронные сети · стр. статьи 52
Фотография — это один набор пикселей. Слова предложения или удары колокола поступают в определённом порядке. Иногда следующий ответ должен зависеть от предыдущего.
Рекуррентная сеть хранит состояние — число или набор чисел с информацией о предыдущих входах. При поступлении следующего входа сеть обновляет состояние по одному и тому же правилу.
Запомните звонок
Условный примерИсследуйте
Прочитайте первые три сигнала и предскажите память.
Нажмите на рисунок или используйте кнопки
Новая память = старая ÷ 2 + сигнал.
Прочитано сигналов: 0; Начальное значение:
Для последовательности, отличной от задания, представим колокол, который даёт 1 при каждом звонке. На каждом шаге предыдущее состояние делится пополам и добавляется текущий звонок.
Упрощённая модель
function recurrentStep(first, memory, nextInput) {
const second = memory * first + nextInput;
return { first, second };
}
const result = recurrentStep(1, 0.5, 1);Выберите изменение. Предскажите результат и запустите код.
Начнём с состояния 0. Если звонок добавляет 1, а старое состояние делится пополам, первый шаг даёт 0/2 + 1 = 1. При втором звонке получаем 1/2 + 1 = 1.5. Число 1.5 несёт информацию об обоих шагах.
Для обучения повторяющегося правила сеть посылает сигнал настройки назад через шаги. Многократное умножение может сделать сигнал крошечным или огромным, и ранние шаги трудно настроить. Это называют затухающими и взрывающимися градиентами. Некоторые сети используют вентили для управления сохранённой информацией; состояние не является совершенной памятью.
Изменение связей сети влияет на то, какую информацию она повторно использует, сохраняет или теряет. Следующий вопрос: какие признаки она учится выделять?
Проверьте себя по главе
Независимое учебное объяснение статьи Современная математика глубокого обучения — Юлиус Бернер, Филипп Грос, Гитта Кутиниок, Филипп Петерсен. В примерах используются вымышленные числа, если не указан источник измеренных данных.