GradientTape — мощный объект, способный даже вычислять градиенты второго порядка, то есть градиенты градиентов. Например, градиент положения объекта относительно времени — это скорость объекта, а градиент второго порядка — его ускорение.
Данная терминология пришла из поисковых и рекомендательных систем (рис. 11.7). Представьте, что вы вводите запрос «собаки на пляже» для выбора фотографий из вашей коллекции. Каждая фотография в вашей базе данных описывается набором ключевых слов — «кошка», «собака», «вечеринка» и т.д. Будем называть их ключами. Поисковая система сначала сравнивает запрос с ключами в базе данных. Совпадение со словом «собака» дает оценку соответствия 1, а отсутствие совпадения со словом «кошка» дает оценку соответствия 0. Затем она ранжирует ключи по величине соответствия (релевантности) и возвращает фотографии, связанные с лучшими N совпадениями в порядке убывания релевантности.
Концептуально именно так работает механизм внимания в архитектуре Transformer. У вас есть исходная последовательность, характеризующая искомое, — запрос. Есть совокупность знаний, из которых извлекается информация — значения. Каждому значению соответствует ключ, описывающий значение в формате, пригодном для сравнения с запросом. Вы просто сопоставляете запрос с ключами и возвращаете взвешенную сумму значений.
Шаг 1 — нужно вычислить оценки релевантности между вектором слова station и каждым другим словом в предложении. Это наши оценки внимания. В качестве меры силы связи слов мы будем использовать простое скалярное произведение их векторов. Это очень эффективная с вычислительной точки зрения функция расстояния, широко применявшаяся для оценки силы связи векторных представлений слов задолго до появления архитектуры Transformer. На практике данные оценки также могут подвергаться масштабированию и обработке функцией softmax, но все это лишь детали реализации.
Шаг 2 — вычисляем сумму всех векторов слов в предложении, взвешенных нашими оценками релевантности. Слова, тесно связанные со словом station, будут вносить больший вклад в сумму (включая само слово station), а нерелевантные слова почти ничего не дадут. Получившийся вектор — новое представление для station: представление, учитывающее окружающий контекст. В частности, оно включает часть вектора train (поезд), уточняя, что, по сути, речь идет о train station («вокзал»).
Тот же процесс можно повторить для каждого слова в предложении и создать новую последовательность векторов, кодирующих это предложение
Шаг 1 — нужно вычислить оценки релевантности между вектором слова station и каждым другим словом в предложении. Это наши оценки внимания. В качестве меры силы связи слов мы будем использовать простое скалярное произведение их векторов. Это очень эффективная с вычислительной точки зрения функция расстояния, широко применявшаяся для оценки силы связи векторных представлений слов задолго до появления архитектуры Transformer. На практике данные оценки также могут подвергаться масштабированию и обработке функцией softmax, но все это лишь детали реализации.
Шаг 2 — вычисляем сумму всех векторов слов в предложении, взвешенных нашими оценками релевантности. Слова, тесно связанные со словом station, будут вносить больший вклад в сумму (включая само слово station), а нерелевантные слова почти ничего не дадут. Получившийся вектор — новое представление для station: представление, учитывающее окружающий контекст. В частности, оно включает часть вектора train (поезд), уточняя, что, по сути, речь идет о train station («вокзал»).
Тот же процесс можно повторить для каждого слова в предложении и создать новую последовательность векторов, кодирующих это предложение
Краткие итоги главы • Тензоры образуют основу современных систем машинного обучения. Они бывают разных видов в зависимости от типа (dtype), ранга (rank) и формы (shape).
• Числовыми тензорами можно манипулировать с помощью тензорных операций (таких как сложение, тензорное произведение или поэлементное умножение), каждая из которых имеет геометрическую интерпретацию. Вообще, все в глубоком обучении имеет геометрическую интерпретацию.
• Модели глубокого обучения состоят из цепочек простых тензорных операций, параметризованных весами, которые сами являются тензорами. Веса модели — это место, где хранятся накопленные «знания».
• Обучение означает поиск комбинации параметров модели, минимизирующих функцию потерь для данного набора обучающих данных и соответствующих им целей.
• Обучение происходит путем извлечения пакетов случайных образцов данных и их целей и вычисления градиента параметров модели с учетом потерь в пакете. Затем параметры модели немного смещаются (величина смещения определяется скоростью обучения) в направлении, противоположном направлению градиента. Это называется стохастическим градиентным спуском на небольших пакетах.
• Процесс обучения становится возможным благодаря тому, что все тензорные операции в нейронных сетях являются дифференцируемыми и, следовательно, позволяют применять цепное правило для вывода функции градиента, отображающей текущие параметры и текущий пакет данных в значение градиента. Это называется обратным распространением ошибки.
• В последующих главах вам часто будут встречаться два ключевых понятия — функции потерь и оптимизаторы. Они должны быть определены до передачи данных в модель.
• Функция потерь — это величина, которую требуется свести к минимуму в ходе обучения, поэтому она должна представлять собой меру успеха для решаемой вами задачи.
• Оптимизатор определяет точный способ использования градиента потерь для изменения параметров: например, это может быть оптимизатор RMSProp, реализующий градиентный спуск с импульсом, и др.
В настоящее время нейронные сети конструируются с использованием современных фреймворков, поддерживающих автоматическое дифференцирование (таких как TensorFlow). Автоматическое дифференцирование основано на применении графов вычислений, подобных тем, что вы видели выше, и позволяет извлекать градиенты произвольных последовательностей дифференцируемых тензорных операций, не выполняя при этом никакой дополнительной работы, кроме записи прямого прохода. Когда я создавал свои первые нейронные сети на C в 2000-х, мне приходилось писать реализацию градиентов вручную. Теперь благодаря современным инструментам автоматического дифференцирования нет необходимости самостоятельно реализовывать обратное распространение. Считайте, что вам повезло!
В настоящее время нейронные сети конструируются с использованием современных фреймворков, поддерживающих автоматическое дифференцирование (таких как TensorFlow). Автоматическое дифференцирование основано на применении графов вычислений, подобных тем, что вы видели выше, и позволяет извлекать градиенты произвольных последовательностей дифференцируемых тензорных операций, не выполняя при этом никакой дополнительной работы, кроме записи прямого прохода. Когда я создавал свои первые нейронные сети на C в 2000-х, мне приходилось писать реализацию градиентов вручную. Теперь благодаря современным инструментам автоматического дифференцирования нет необходимости самостоятельно реализовывать обратное распространение. Считайте, что вам повезло!
В настоящее время нейронные сети конструируются с использованием современных фреймворков, поддерживающих автоматическое дифференцирование (таких как TensorFlow). Автоматическое дифференцирование основано на применении графов вычислений, подобных тем, что вы видели выше, и позволяет извлекать градиенты произвольных последовательностей дифференцируемых тензорных операций, не выполняя при этом никакой дополнительной работы, кроме записи прямого прохода. Когда я создавал свои первые нейронные сети на C в 2000-х, мне приходилось писать реализацию градиентов вручную. Теперь благодаря современным инструментам автоматического дифференцирования нет необходимости самостоятельно реализовывать обратное распространение. Считайте, что вам повезло!