En mi modelo, uso incrustaciones pre-entrenadas de GloVe. Deseo mantenerlos no entrenables para disminuir la cantidad de parámetros del modelo y evitar el sobreajuste. Sin embargo, tengo un símbolo especial cuya incrustación quiero entrenar.
Usando la capa de incrustación provista, solo puedo usar el parámetro 'entrenable' para establecer la capacidad de entrenamiento de todas las incrustaciones de la siguiente manera:
embedding_layer = Embedding(voc_size, emb_dim, weights=[embedding_matrix], input_length=MAX_LEN, trainable=False)¿Existe una solución a nivel de Keras para entrenar solo un subconjunto de incrustaciones?
Tenga en cuenta:
Encontré una buena solución, inspirada en las dos capas de incrustaciones de Keith.
Idea principal:
Asigne los tokens especiales (y el OOV) con las ID más altas. Genere una 'oración' que contenga solo fichas especiales, rellenada con 0 en cualquier otro lugar. Luego aplique incrustaciones no entrenables a la oración 'normal' e incrustaciones entrenables a los tokens especiales. Por último, agregue ambos.
Funciona bien para mí.
# Normal embs - '+2' for empty token and OOV token embedding_matrix = np.zeros((vocab_len + 2, emb_dim)) # Special embs special_embedding_matrix = np.zeros((special_tokens_len + 2, emb_dim)) # Here we may apply pre-trained embeddings to embedding_matrix embedding_layer = Embedding(vocab_len + 2, emb_dim, mask_zero = True, weights = [embedding_matrix], input_length = MAX_SENT_LEN, trainable = False) special_embedding_layer = Embedding(special_tokens_len + 2, emb_dim, mask_zero = True, weights = [special_embedding_matrix], input_length = MAX_SENT_LEN, trainable = True) valid_words = vocab_len - special_tokens_len sentence_input = Input(shape=(MAX_SENT_LEN,), dtype='int32') # Create a vector of special tokens, eg: [0,0,1,0,3,0,0] special_tokens_input = Lambda(lambda x: x - valid_words)(sentence_input) special_tokens_input = Activation('relu')(special_tokens_input) # Apply both 'normal' embeddings and special token embeddings embedded_sequences = embedding_layer(sentence_input) embedded_special = special_embedding_layer(special_tokens_input) # Add the matrices embedded_sequences = Add()([embedded_sequences, embedded_special])No he encontrado una buena solución como una máscara para la capa de incrustación. Pero esto es lo que he querido probar:
Eso le daría una solución con una pequeña cantidad de parámetros gratuitos asignados a esas incrustaciones.