Как сверточные сети работают с текстами
Что проверяют
Понимаете ли вы, что делает свёртка с последовательностью слов, какой тензор у неё на входе и откуда берётся вектор фиксированной длины. Следом обычно спрашивают, чем CNN уступают RNN и трансформерам и где их имеет смысл применять сейчас.
Как отвечать
Текст превращается в матрицу: каждая строка это эмбеддинг токена размерности d, число строк равно числу токенов. Свёртка одномерная: фильтр ширины k накрывает k соседних токенов и всю глубину эмбеддинга, а потом сдвигается по оси последовательности. По сути это обучаемый детектор n-грамм: фильтр ширины 3 реагирует на определённые тройки слов.
Классическая схема для классификации:
- несколько ширин фильтров: например 3, 4 и 5, по сотне фильтров каждой ширины, чтобы ловить фразы разной длины;
- нелинейность: ReLU после свёртки;
- max pooling по времени: от каждого фильтра берётся максимум по всей последовательности. Так текст любой длины превращается в вектор фиксированного размера;
- полносвязный слой и softmax на выходе.
В PyTorch это nn.Conv1d(in_channels=emb_dim, out_channels=100, kernel_size=3). Вход он ждёт в форме (batch, channels, length), поэтому тензор (batch, length, emb_dim) после слоя эмбеддингов нужно транспонировать.
Сильные стороны: все позиции считаются параллельно, модель небольшая и быстрая. Слабая: поле восприятия растёт линейно с числом слоёв, дальние зависимости видны плохо. Отчасти это лечат расширенными (dilated) свёртками, но в задачах понимания текста сейчас лидируют трансформеры. CNN остаются уместны для быстрых классификаторов при ограниченных ресурсах и для признаков на уровне символов.
Где спотыкаются
Описывают двумерную свёртку по матрице, как по картинке, с маленьким квадратным ядром. У координат эмбеддинга нет соседства, как у пикселей, и фильтр, который видит только часть из них, обычно смысла не имеет.
Забывают про паддинг. Батч выравнивают по длине служебными токенами, и без маски они участвуют в пулинге и искажают результат.
Утверждают, что такая сеть учитывает порядок слов во всём тексте. Порядок виден только внутри окна фильтра, после max pooling позиция теряется, и модель ближе к мешку n-грамм, чем к RNN.