Перейти к основному содержимому

Свёртка для последовательностей

Операция свёртки

Пусть x=[x1,x2,...xD]x=[x_1,x_2,...x_D] - обрабатываемая последовательность значений. Например, это может быть последовательность температур прибора, снимаемая каждые 10 секунд.

Свёртка (convolution) обладает параметрами:

  • K=[K(n),K(n+1),...K(n1),K(n)]R2n+1K=[K(-n),K(-n+1),...K(n-1),K(n)]\in\mathbb{R}^{2n+1} (ядро свёртки, convolution kernel, обычно нечётное по размеру, но может быть и чётным)

  • смещение bRb\in\mathbb{R}.

Выходом операции свёртки будет тоже последовательность yy с элементами, считаемыми по формуле

yj=i=nnK(i)xj+i+b,j=n+1,...Dn.y_j = \sum_{i=-n}^{n} K(i)x_{j+i}+b,\quad j=n+1,...D-n.

Таким образом, свёртка генерирует последовательность, каждый элемент которой получается одним и тем же линейным преобразованием с 2n+22n+2 параметрами.

Рассмотрим пример вычисления свёртки для следующих данных:

Тогда выходной ряд будет строится следующим образом:

Примеры свёрток

Рассмотрим частные виды свёрток. У всех смещение будет браться равным нулю.

  • K=[15,15,15,15,15]K=[\frac{1}{5},\frac{1}{5},\frac{1}{5},\frac{1}{5},\frac{1}{5}]: отвечает равномерному усреднению, сглаживает временной ряд.

  • K=[0.1,0.2,0.4,0.2,0.1]K=[0.1,0.2,0.4,0.2,0.1]: неравномерное усреднение, сглаживает временной ряд, но у центральных элементов вклад больше.

  • K=[1,0,+1]K=[-1,0,+1]: вычисляет разностную производную Δxj=xj+1xj1\Delta x_j = x_{j+1}-x_{j-1}, т.е. скорость изменения наблюдаемой величины.

  • K=[+1,2,+1]K=[+1,-2,+1]: вычисляет разностную вторую производную Δxj=(xj+1xj)(xjxj1)\Delta x_j = (x_{j+1}-x_j)-(x_j-x_{j-1}), т.е. скорость изменения скорости наблюдаемой величины.

Автоматическая настройка

Раньше параметры свёрток подбирались вручную. Но если есть обучающая выборка, то лучше будет работать свёртка с автоматически настраиваемыми параметрами ядра и смещения, что в общем случае и делают.

Свойства свёртки

Свёртка извлекает один и тот же линейный признак в каждой позиции локально относительно этой позиции. Таким образом, свёртка обеспечивает свойство эквивариантности к сдвигу (translation equivariance). Это проиллюстрировано ниже, где слева показан линейный слой обычного многослойного персептрона, а справа - операция свёртки:

Как видим, свёртка предполагает существенно меньшее количество связей (sparse connections), что обеспечивает более быстрое вычисление и требует меньшее число параметров. Дополнительное уменьшение параметров обеспечивается общностью весов (parameter sharing). На рисунке справа одинаковые веса обозначены одним цветом.

Свёртку можно применять к входным данным разной длины, причем число оцениваемых параметров будет одним и тем же - 2n+22n+2.

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

Также можно обратить внимание, что выходная последовательность получается короче на 2n2n, чем входная, поскольку ядро свёртки упирается в начало и конец входной временной последовательности.

Обработка динамического временного ряда

Обработка динамического временного ряда специфична тем, что наблюдения x1,x2,...xtx_1,x_2,...x_t поступают последовательно, а будущие наблюдения еще неизвестны, когда нужно формировать выход yty_t. Для такого рода данных свёртке разрешается смотреть только на последние располагаемые nn наблюдений:

yt=i=0n1K(i)xti+b,y_t=\sum_{i=0}^{n-1} K(i)x_{t-i}+b,

а у самой свёртки остаются только n+1n+1 параметров K=[K(0),...K(n1)]K=[K(0),...K(n-1)] и bb. Пример действия такой свёртки показан ниже:

Извлечение нелинейных признаков

Наслаивая свёртки друг на друга, можем извлекать более сложные признаки с расширенной областью видимости (receptive field), т.е. зависящими от более широкой окрестности значений, как показано ниже (красным цветом):

На каждом слое действует свёртка со своими индивидуальными параметрами.

Нелинейные признаки

Чтобы извлекаемые признаки получались нелинейными, после каждой свёртки применяют нелинейную функцию активации (иначе суперпозиция линейных операций снова даст линейную операцию).

Чтобы извлекаемые признаки получались более выразительными, на каждом слое применяют не одну, а сразу несколько свёрток (каждая-со своими параметрами).

yj1=i=nnK1(i)xj+i+b1yj2=i=nnK2(i)xj+i+b2yjM=i=nnKM(i)xj+i+bM\begin{align*} y^1_j &= \sum_{i=-n}^{n} K^1(i)x_{j+i}+b^1 \\ y^2_j &= \sum_{i=-n}^{n} K^2(i)x_{j+i}+b^2 \\ \cdots \\ y^M_j &= \sum_{i=-n}^{n} K^M(i)x_{j+i}+b^M \end{align*}

Тогда последующая свёртка будет определяться как локальная линейная комбинация результатов всех свёрток предыдущего слоя:

zj=s=1Mi=nnK(i)yj+is+bz_j=\sum_{s=1}^M \sum_{i=-n}^n K(i)y^s_{j+i}+b