Свёртка для последовательностей
Операция свёртки
Пусть - обрабатываемая последовательность значений из чисел. Например, это может быть последовательность температур прибора, сни маемых каждые 10 секунд.
Свёртка (convolution) обладает параметрами:
-
(ядро свёртки, convolution kernel, обычно нечётное по размеру, но может быть и чётным),
-
смещение .
Выходом операции свёртки будет последовательность с элементами, считаемыми по формуле
Таким образом, свёртка генерирует последовательность, каждый элемент которой получается за счёт одного и того же линейного преобразования с параметрами.
Рассмотрим пример вычисления свёртки для следующих данных:
Тогда выходной ряд будет строиться следующим образом:
Примеры свёрток
Рассмотрим частные виды свёрток. У всех смещение будет браться равным нулю.
-
: отвечает равномерному усреднению, сглаживает временной ряд.
-
: неравномерное усреднение, сглаживающее временной ряд, когда у центральных элементов вклад больше.
-
: вычисляет разностную производную , т.е. скорость изменения наблюдаемой величины.
-
: вычисляет разностную вторую производную , т.е. скорость изменения скорости наблюдаемой величины.
Раньше параметры свёрток подбирались вручную. Но если есть обучающая выборка, то эффективнее будет работать свёртка с автоматически настраиваемыми параметрами ядра и смещения - так операция будет лучше соответствовать данным и решаемой задаче.
Свойства свёртки
Свёртка извлекает один и тот же линейный признак в каждой позиции локально относительно позиции. Таким образом, свёртка обеспечивает свойство эквивариантности к сдвигу (translation equivariance). Это проиллюстрировано ниже, где слева показан линейны й слой обычного многослойного персептрона, а справа - операция свёртки:
Как видим, свёртка предполагает существенно меньшее количество связей (sparse connections), что обеспечивает более быстрое вычисление и требует меньшего числа параметров. Дополнительное уменьшение параметров обеспечивается общностью весов (parameter sharing). На рисунке справа одинаковые веса обозначены одним цветом.
Свёртку можно применять к входным данным разной длины, причем число оцениваемых параметров будет одним и тем же - .
На многопроцессорных вычислительных устройствах, таких как видеокарта, вычисления производятся не по следовательно один за другим, а параллельно, поэтому свёртка, вычисляемая независимо для разных позиций, считается очень быстро за счёт параллелизации.
Также стоит обратить внимание, что выходная последовательность получается короче на , чем входная, поскольку ядро свёртки упирается в начало и конец входной временной последовательности.
Обработка динамического временного ряда
Обработка динамического временного ряда специфична тем, что наблюдения поступают последовательно, а будущие наблюдения ещё неизвестны, когда нужно формировать выход . Для такого рода данных свёртке разрешается смотреть только на последние располагаемые наблюдений:
а у самой свёртки остаются только параметров и . Пример действия такой свёртки показан ниже:
Такая свёртка может применяться для прогнозирования будущих элементов временного ряда.
Извлечение сложных нелинейных признаков
Наслаивая свёртки друг на друга, можем извлекать более сложные признаки с расширенной областью видимости (receptive field), т.е. зависящими от более широкой окрестности значений, как показано ниже красным цветом:
На каждом слое действует свёртка со своими индивидуальными параметрами.
Чтобы извлекаемые признаки получались нелинейными, после каждой свёртки применяют нелинейную функцию активации (иначе суперпозиция линейных операций снова даст линейную операцию).
Суперпозиция свёрток с операциями нелинейности приводит к иерархичности признаковых представлений входной последовательности - более высокие слои будут извлекать более сложные признаки, зависящие от более широкой окрестности данных.
Чтобы извлечь более разнообразные признаки, на каждом слое применяют не одну, а сразу несколько свёрток (каждая - со своими параметрами):
Тогда каждая свёртка следующего (более высокого) слоя будет определяться как локальная линейная комбинация результатов всех свёрток предыдущего слоя, выполняющая уже двумерную операцию:
Графически это проиллюстрировано ниже: