Как слой свертки Keras 1d работает с вложениями слов - проблема классификации текста? (Фильтры, размер ядра и весь гиперпараметр) - PullRequest
0 голосов
/ 16 сентября 2018

В настоящее время я разрабатываю инструмент классификации текста с использованием Keras. Это работает (работает нормально, и я получил точность проверки до 98,7), но я не могу понять, как именно слой 1D-свертки работает с текстовыми данными.

Какие гиперпараметры мне следует использовать?

У меня есть следующие предложения (входные данные):

  • Максимальное количество слов в предложении: 951 (если оно меньше - добавляются отступы)
  • Размер словарного запаса: ~ 32000
  • Количество предложений (для обучения): 9800
  • embedding_vecor_length: 32 (сколько отношений каждое слово имеет в вложениях слов)
  • batch_size: 37 (для этого вопроса не имеет значения)
  • Количество ярлыков (классов): 4

Это очень простая модель (я сделал более сложные структуры, но, как ни странно, она работает лучше - даже без использования LSTM):

model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

Мой главный вопрос: какие гиперпараметры я должен использовать для слоя Conv1D?

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))

Если у меня есть следующие входные данные:

  • Максимальное количество слов: 951
  • Размер вложения: 32

Означает ли это, что filters=32 будет сканировать только первые 32 слова, полностью отбрасывая остальные (с kernel_size=2)? И я должен установить фильтры на 951 (максимальное количество слов в предложении)?

Примеры на изображениях:

Так, например, это входные данные: http://joxi.ru/krDGDBBiEByPJA

Это первый шаг конвульсионного слоя (шаг 2): http://joxi.ru/Y2LB099C9dWkOr

Это второй шаг (шаг 2): http://joxi.ru/brRG699iJ3Ra1m

А если filters = 32, слой повторяет это 32 раза? Я прав? Поэтому я не буду произносить 156-е слово в предложении, и, таким образом, эта информация будет потеряна?

1 Ответ

0 голосов
/ 16 сентября 2018

Я бы попытался объяснить, как 1D-Convolution применяется к данным последовательности. Я просто использую пример предложения, состоящего из слов, но, очевидно, оно не относится к текстовым данным, и то же самое относится и к другим данным последовательности и временным рядам.

Предположим, у нас есть предложение, состоящее из m слов, где каждое слово было представлено с использованием вложения слов:

Input data

Теперь мы хотели бы применить к этим данным слой свертки 1D, состоящий из n различных фильтров с размером ядра k. Для этого из данных извлекаются скользящие окна длиной k, а затем каждый фильтр применяется к каждому из этих извлеченных окон. Вот иллюстрация того, что происходит (здесь я предположил k=3 и удалил параметр смещения каждого фильтра для простоты):

Filters

Как вы можете видеть на рисунке выше, отклик каждого фильтра эквивалентен результату его точечного произведения (то есть поэлементному умножению и затем суммированию всех результатов) с извлеченным окном длины k (т.е. * С 1023 * по (i+k-1) слова в данном предложении). Кроме того, обратите внимание, что каждый фильтр имеет то же количество каналов, что и количество признаков (то есть размер вложения слов) обучающей выборки (следовательно, возможно выполнение точечного произведения). По сути, каждый фильтр обнаруживает наличие определенной особенности шаблона в локальном окне обучающих данных (например, существует ли пара конкретных слов в этом окне или нет). После того, как все фильтры были применены ко всем окнам длины k, мы получили бы вывод, подобный этому, который является результатом свертки:

filters response

Как вы можете видеть, на рисунке есть 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.

...