Я бы попытался объяснить, как 1D-Convolution применяется к данным последовательности. Я просто использую пример предложения, состоящего из слов, но, очевидно, оно не относится к текстовым данным, и то же самое относится и к другим данным последовательности и временным рядам.
Предположим, у нас есть предложение, состоящее из m
слов, где каждое слово было представлено с использованием вложения слов:
Теперь мы хотели бы применить к этим данным слой свертки 1D, состоящий из n
различных фильтров с размером ядра k
. Для этого из данных извлекаются скользящие окна длиной k
, а затем каждый фильтр применяется к каждому из этих извлеченных окон. Вот иллюстрация того, что происходит (здесь я предположил k=3
и удалил параметр смещения каждого фильтра для простоты):
Как вы можете видеть на рисунке выше, отклик каждого фильтра эквивалентен результату его точечного произведения (то есть поэлементному умножению и затем суммированию всех результатов) с извлеченным окном длины k
(т.е. * С 1023 * по (i+k-1)
слова в данном предложении). Кроме того, обратите внимание, что каждый фильтр имеет то же количество каналов, что и количество признаков (то есть размер вложения слов) обучающей выборки (следовательно, возможно выполнение точечного произведения). По сути, каждый фильтр обнаруживает наличие определенной особенности шаблона в локальном окне обучающих данных (например, существует ли пара конкретных слов в этом окне или нет). После того, как все фильтры были применены ко всем окнам длины k
, мы получили бы вывод, подобный этому, который является результатом свертки:
Как вы можете видеть, на рисунке есть m-k+1
окон, так как мы предположили, что padding='valid'
и stride=1
(поведение по умолчанию слоя Conv1D
в Keras). Аргумент stride
определяет, насколько окно должно сместиться (т.е. сдвинуться), чтобы извлечь следующее окно (например, в нашем примере выше, шаг 2 извлечет окна слов: (1,2,3), (3,4,5), (5,6,7), ...
вместо этого). Аргумент padding
определяет, должно ли окно целиком состоять из слов в обучающей выборке или должны быть отступы в начале и в конце; таким образом, ответ свертки может иметь ту же длину (то есть m
, а не m-k+1
), как обучающая выборка (например, в нашем примере выше, padding='same'
будет извлекать окна слов: (PAD,1,2), (1,2,3), (2,3,4), ..., (m-2,m-1,m), (m-1,m, PAD)
).
Вы можете проверить некоторые из вещей, которые я упомянул, используя Keras:
from keras import models
from keras import layers
n = 32 # number of filters
m = 20 # number of words in a sentence
k = 3 # kernel size of filters
emb_dim = 100 # embedding dimension
model = models.Sequential()
model.add(layers.Conv1D(n, k, input_shape=(m, emb_dim)))
model.summary()
Краткое описание модели:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_2 (Conv1D) (None, 18, 32) 9632
=================================================================
Total params: 9,632
Trainable params: 9,632
Non-trainable params: 0
_________________________________________________________________
Как видно, выходной слой свертки имеет форму (m-k+1,n) = (18, 32)
, а количество параметров (то есть весов фильтров) в слое свертки равно: num_filters * (kernel_size * n_features) + one_bias_per_filter = n * (k * emb_dim) + n = 32 * (3 * 100) + 32 = 9632
.