Таблица 1.2
(продолжение)
Глава 1. Глубокое обучение и JavaScript
53
мер,
float32
или
int32
) и форма. Форма определяет размер тензора по каждому
измерению. Например, форма двумерного тензора может быть
[128,
256]
, а трехмер
ного —
[10,
20,
128]
. Данные, превращенные в тензор с конкретным типом и формой,
можно подать на вход любого слоя, принимающего данные этого типа и формы, вне
зависимости от их исходного смысла. Таким образом, тензоры играют роль общего
языка, понятного всем моделям глубокого обучения.
Но почему именно тензоры? Из предыдущего раздела мы узнали, что основной
объем вычислений, необходимых для работы глубокой нейронной сети, производит
ся в виде массовопараллельных операций, обычно на GPU, что означает выполне
ние одной и той же вычислительной операции над множеством элементов данных.
Тензоры играют роль контейнеров для организации данных в структуры, удобные
для параллельной обработки. Совершенно очевидно, что при сложении тензора A
формы
[128,
128]
с тензором Б формы
[128,
128]
необходимо выполнить 128
×
128
независимых друг от друга операций сложения.
А что же насчет
flow
? Представьте себе, что тензор — жидкость, переносящая
данные. В TensorFlow данные «текут» через
граф
— структуру данных, состоящую
из связанных между собой математических операций
(узлов)
. Как демонстрирует
рис. 1.7, узел может представлять собой последовательные слои нейронной сети.
Все узлы получают на входе тензоры и возвращают тензоры. «Тензорная жидкость»
преобразуется в различные формы и значения по мере того, как «течет» по графу
TensorFlow. Это соответствует преобразованию представлений, то есть основной
задаче нейронных сетей, как мы упоминали в предыдущих разделах. С помощью
TensorFlow специалисты по машинному обучению могут создавать любые виды
нейронных сетей: от неглубоких до очень глубоких, от сверточных нейронных сетей
для машинного зрения до рекуррентных нейронных сетей (RNN) для задач преоб
разования последовательностей в последовательности. Графовые структуры данных
можно сериализовать и развертывать на множестве различных типов устройств, от
мейнфреймов до мобильных телефонов.
TensorFlow по своей сути сделан очень универсальным и гибким: операции
могут быть любыми четко определенными математическими функциями, а не
только слоями нейронных сетей. В частности, они могут быть низкоуровневыми
математическими операциями наподобие сложения и умножения тензоров — как
раз теми операциями, которые происходят
внутри
слоя нейронной сети. Благодаря
этому специалисты по глубокому обучению и исследователи могут свободно опи
сывать произвольные новые операции для глубокого обучения. Впрочем, для мно
гих занимающихся глубоким обучением подобные низкоуровневые манипуляции
не стоят свеч. Они приводят к тому, что код становится раздутым и подверженным
ошибкам, а также удлиняют цикл разработки. Большинство специалистов по глу
бокому обучению применяют лишь несколько конкретных типов слоев (например,
свертку, субдискретизацию или плотные слои, как вы увидите в следующих главах).
Создавать новые типы слоев им приходится очень редко. Здесь уместна аналогия
с LEGO. В конструкторах LEGO насчитывается всего несколько видов кирпичиков.
Собирающему конструктор не нужно думать, как сделать кирпичик LEGO. Чего
нельзя сказать о таких игрушках, как, скажем, пластилин PlayDoh, которые можно
сравнить с низкоуровневым API TensorFlow. Тем не менее существует комбина
торно большое число способов соединения кирпичиков, а значит, и практически
54
Do'stlaringiz bilan baham: |