Как устанавливаются параметры для конфигурации в моделях, основанных на внимании? - PullRequest
0 голосов
/ 16 апреля 2019

В конфиге есть несколько параметров, особенно когда я изменяю max_len, hidden_size или embedding_size.

config = {
    "max_len": 64,
    "hidden_size": 64,
    "vocab_size": vocab_size,
    "embedding_size": 128,
    "n_class": 15,
    "learning_rate": 1e-3,
    "batch_size": 32,
    "train_epoch": 20
}

Я получаю ошибку:

"ValueError: Невозможно передать значение формы (32, 32) для тензора 'Placeholder: 0', который имеет форму '(?, 64)'"

График тензорного потока, приведенный ниже, - вот что у меня есть проблема в понимании. Есть ли способ понять, какие относительные параметры max_len, hidden_size или embedding_size должны быть установлены, чтобы избежать ошибки, которую я получаю выше?

        embeddings_var = tf.Variable(tf.random_uniform([self.vocab_size, self.embedding_size], -1.0, 1.0),
                                     trainable=True)
        batch_embedded = tf.nn.embedding_lookup(embeddings_var, self.x)
        # multi-head attention
        ma = multihead_attention(queries=batch_embedded, keys=batch_embedded)
        # FFN(x) = LN(x + point-wisely NN(x))
        outputs = feedforward(ma, [self.hidden_size, self.embedding_size])
        outputs = tf.reshape(outputs, [-1, self.max_len * self.embedding_size])
        logits = tf.layers.dense(outputs, units=self.n_class)

        self.loss = tf.reduce_mean(
            tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=self.label))
        self.prediction = tf.argmax(tf.nn.softmax(logits), 1)

        # optimization
        loss_to_minimize = self.loss
        tvars = tf.trainable_variables()
        gradients = tf.gradients(loss_to_minimize, tvars, aggregation_method=tf.AggregationMethod.EXPERIMENTAL_TREE)
        grads, global_norm = tf.clip_by_global_norm(gradients, 1.0)

        self.global_step = tf.Variable(0, name="global_step", trainable=False)
        self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
        self.train_op = self.optimizer.apply_gradients(zip(grads, tvars), global_step=self.global_step,
                                                       name='train_step')
        print("graph built successfully!")

1 Ответ

1 голос
/ 16 апреля 2019

max_len - длина самого длинного предложения / документа токена в вашем учебном наборе.Это второе измерение вашего входного тензора (первое является пакетным).

Каждое предложение будет дополнено до этой длины.Модели внимания должны иметь заранее заданное самое длинное предложение, так как каждый токен будет иметь соответствующий вес.

hidden_size - это размер скрытой ячейки RNN, для нее можно задать все, что будет выводиться на каждом временном шаге.

embedding_size определяет размерность представления токена (например, 300 является стандартным для word2vec, 1024 для встраивания BERT и т. Д.).

...