Архитектура CNN для слова / символа n-граммы
У меня есть задача маркировки последовательностей, и мне нравится создавать CNN, который будет принимать ввод фиксированного числа вложений (на основе символов или слов) и извлекать n-граммоподобные функции посредством свертки / объединения.
Ранее я не использовал свертку (для текста или иным образом), поэтому я не уверен, какая архитектура имеет больше смысла в этой настройке:
- Conv1D / MaxPool1D - извлечение n-грамм на этапе Conv имеет смысл, но что дает такое объединение? Это просто 1 измерение с максимальным значением вложения?
- Conv2D / MaxPool2D - хотя я видел это чаще в существующих подходах, факт свертки по размерам встраивания токенов для меня не имеет смысла.
Не могли бы вы поделиться своей интуицией по этому поводу?
1 ответ
Я только сделал маркировку последовательности в RNN (Recurrent Neural Networks) и классификацию изображений в CNN, но я думаю, что я могу, по крайней мере, описать, что делают первая и вторая установки:
Conv1D / MaxPool1D: свертка примет вложение и свернет их вокруг фильтра, который в данном случае представляет собой n X n X 1. Это затем создаст матрицу n/2 X n/2 X 1, которая теперь более сложна, чем вход.
Позвольте мне описать, что я имею в виду здесь. Если у вас есть изображение в оттенках серого, которое имеет размер 6 × 6 пикселей (из-за оттенков серого это будет только 1 слой, в котором RGB будет иметь 3 слоя), и вы свернете это с помощью фильтра (ядра), который
[[1, 0, -1], [1, 0, -1], [1, 0, -1]]
Тогда на выходе будет изображение 3 X 3 X 1, и пиксели теперь не представляют значение серой шкалы, а вместо этого считают, что в этой позиции есть вертикальная линия из-за 0 среднего столбца и 1 с каждой стороны.Затем Max Pool возьмет эти 3 X 3 X 1, возьмет квадрат f размера и отправит этот квадрат через новое изображение с s шагами. Так что в этом примере скажите f = 2 и s = 2. Тогда у нас есть квадрат 2 X 2, проходящий через это изображение. Результатом будет 2 X 2 X 1 с
[[максимум левого верхнего 2 квадрата, максимум правого верхнего квадрата и 0], [максимум нижнего левого квадрата, максимум нижнего правого квадрата и ноль]]
Затем это матрица 2 × 2, в которой значения ячеек показывают высокий или низкий шанс наличия вертикальных полос на исходном изображении в этих положениях.
Теперь, чтобы поместить это во встроенные последовательности, это может означать, что если у вас есть слова со значением, скажем, m переменных, то у вас будет матрица n X m X 1. Затем вам нужно будет убедить это с помощью матрицы af X f, чтобы создать более сложную матрицу, которая затем будет проходить через последовательность максимального пула с квадратом (или окном) f X f и шагом s. Тогда это могут быть слова, на которые больше всего влияет определенная переменная в зависимости от того, как вы настроили свой фильтр.
Conv2D / MaxPool2D: это то же самое, что и выше, но теперь у вас есть матрица n X m X 2. Все остальные шаги будут такими же, за исключением того, что теперь ваш фильтр будет представлять собой матрицу f X f X 2, а ваши выходные данные будут (если мы продолжим из нашего примера) матрицей 2 X 2 X 2, а не матрицей 2 X 2 X 1. Это может иметь несколько разных эффектов. Вы можете скопировать матрицу n X m X 1 и получить ее копию во втором измерении, а затем иметь 2 разных размера для фильтра, которые, в свою очередь, могли бы дать более практическое понимание в конце, показывая переменные, которые не только макс. в 1, но 2 категории переменных.
Я надеюсь, что это помогло в некотором роде.