Как выбрать размер ввода и номер узла для скрытого слоя для RNN, используемого для классификации текста? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу создать классификатор электронной почты, который для каждого электронного письма должен угадывать правильную категорию (тему электронного письма).Я использую RNN, в частности использую встраивание, LSTM-блок и выпадение.

Структура моей сети:

sentence_indices = Input(shape=input_shape, dtype=np.int32)
emb_dim = 300 # embedding di 300 parole in italiano
# Create the embedding layer pretrained with GloVe Vectors (≈1 line)
embedding_layer =  pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)

# Propagate sentence_indices through your embedding layer, you get back the 
embeddings
embeddings = embedding_layer(sentence_indices)   

# Propagate the embeddings through an LSTM layer with 128-dimensional hidden state
# Be careful, the returned output should be a batch of sequences.
X = LSTM(512, return_sequences=True)(embeddings)
# Add dropout with a probability of 0.5
X = Dropout(0.15)(X)
# Propagate X trough another LSTM layer with 256-dimensional hidden state
# Be careful, the returned output should be a single hidden state, not a batch of sequences.
X = LSTM(256)(X)
# Add dropout with a probability of 0.5
X = Dropout(0.15)(X)
# Propagate X through a Dense layer with softmax activation to get back a 
batch of 5-dimensional vectors.
X = Dense(num_activation, activation='softmax')(X)
# Add a softmax activation
# X =  Activation('softmax')(X)

# Create Model instance which converts sentence_indices into X.
model = Model(sentence_indices, X)

sequentialModel = Sequential(model.layers)

RMS = optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=None, decay=0.0)
model.compile(loss='categorical_crossentropy', optimizer=RMS, metrics=['accuracy'])

1) Я использую в качестве входных данных 300 слов из электронного письма, и так как я использую пакет, мне пришлось использовать отступы.В данный момент я использую правый отступ вместо левого, но производительность кажется похожей.Средняя длина составляет 410 слов, а максимальное число - 1000, а минимальное - 70. Странно то, что при увеличении размера ввода я получаю худшую производительность с точки зрения точности.Есть объяснение этому?Почему, если я дам больше информации, я получу более высокую производительность?

2) Я пытаюсь использовать слой LSTM с размером 512, а следующий уровень - LSTM с размером 256, и я получил худшую производительность с точки зрения точности по сравнению спредыдущий тест с первым LSTM = 256 и вторым LSTM = 128. Почему у меня это снижение производительности?Это может зависеть от неправильного выбора скорости обучения [я использую lr = 0,01]?

* edit1: я прочитал о практическом наборе для выбора номера узла: (#input + #output) * 2/3.Этот маршрут действителен для каждого скрытого слоя или только для первого?Существует ли какая-то руля даже для других слоев?

3) Я использую вложения слов, потому что для этого мне нужно меньше образцов для каждой категории.Однако, если у меня есть несколько образцов для определенной категории, я должен использовать одни и те же образцы больше раз, или это бесполезно?Есть способ компенсировать это отсутствие выборок?

4) В LSTM есть последовательность возврата полей и состояние возврата, для которых лучше использовать?Полезно ли вставлять этот параметр в мой слой LSTM?

спасибо заранее.

...