Автоматический кодер CNN со слоем Embedding (300D GloveVec) для предложения по 10-15 слов не работает из-за заполнения - PullRequest
0 голосов
/ 04 января 2019

Используя предварительную подготовку GloveVector из Стэнфорда, чтобы получить осмысленное представление каждого слова, но я хочу представления для предложения, содержащего 5-15 слов, чтобы я мог использовать косинусное сходство для сопоставления при получении нового предложения.Я устанавливаю 15 слов (фиксированный размер) каждого предложения и применяю слой для встраивания, тогда новая форма ввода будет иметь размеры 15 X 300 (если у меня меньше 15 слов, тогда дополненные значения составляют 15 слов (одна случайная униформа)распределение вектора 300D)

Ниже приведены формы моей сети

  1. [Нет, 15] - Вложение необработанных входных данных и дополнение (1) идентификаторов
  2. [Нет,15, 300, 1], --input
  3. [None, 8, 150, 128], - conv 1
  4. [None, 4, 75, 64], - conv 2
  5. [None, 2, 38, 32], - conv 3
  6. [None, 1, 19, 16], - conv 4
  7. [None, 1, 10, 4] - conv 5
  8. [Нет, 50] --------- Скрытая форма (новые значимые представления) ------
  9. [Нет, 1, 10, 4] - кодированный вход для de-conv
  10. [Нет, 1, 19, 16], - conv_trans 5
  11. [Нет, 2, 38, 32], - conv_trans 4
  12. [Нет, 4, 75, 64], - conv_trans 3
  13. [Нет, 8, 150, 128], - conv_trans 2
  14. [Нет, 15, 300, 1] - conv_trans 1 - дляфункция потерь с входными данными

Я пробовал модель CNN с вложенным слоем в tenorflow

    self._inputs = tf.placeholder(dtype=tf.int64, shape=[None, self.sent_len], name='input_x') #(?,15)
    losses = []
    # lookup layer
    with tf.variable_scope('embedding') as scope:
        self._W_emb = _variable_on_cpu(name='embedding', shape=[self.vocab_size, self.emb_size], initializer=tf.random_uniform_initializer(minval=-1.0, maxval=1.0))
        # assigned pretrained embedding here, so initializer would be overrided
        sent_batch = tf.nn.embedding_lookup(params=self._W_emb, ids=self._inputs)
        sent_batch = tf.expand_dims(sent_batch, -1)

    self._x = sent_batch
    encoder = []
    shapes = []
    current_input = sent_batch
    shapes.append(current_input.get_shape().as_list())
    for layer_i, n_output in enumerate(n_filters[1:]):
        with tf.variable_scope('Encode_conv-%d' % layer_i) as scope:
            n_input = current_input.get_shape().as_list()[3]
            W, wd = _variable_with_weight_decay('W-%d' % layer_i, shape=[filter_size,filter_size,n_input,n_output],
                                                initializer=tf.random_uniform_initializer(minval=-1.0, maxval=1.0), wd=self.l2_reg)
            losses.append(wd)
            biases = _variable_on_cpu('bias-%d' % layer_i, shape=[n_output], initializer=tf.constant_initializer(0.00))
            encoder.append(W)
            output = tf.nn.relu(tf.add(tf.nn.conv2d(current_input, W, strides=[1, 2, 2, 1], padding='SAME'), biases), name=scope.name)
            current_input = output
            shapes.append(output.get_shape().as_list())
    #z = current_input
    original_shape = current_input.get_shape().as_list()
    flatsize = original_shape[1]*original_shape[2]*original_shape[3]
    height,width,channel = original_shape[1]*1,original_shape[2]*1,original_shape[3]*1
    current_input = tf.reshape(current_input,[-1,flatsize])

    with tf.variable_scope('Encode_Z-%d' % layer_i) as scope:
        W_en, wd_en = _variable_with_weight_decay('W', shape=[current_input.get_shape().as_list()[1], outsize],
                                                initializer=tf.truncated_normal_initializer(stddev=0.05),
                                                wd=self.l2_reg)
        losses.append(wd_en)
        biases_en = _variable_on_cpu('bias', shape=[outsize],initializer=tf.constant_initializer(0.00))
        self._z = tf.nn.relu(tf.nn.bias_add(tf.matmul(current_input, W_en), biases_en)) # Compressed representation (?,50)

    with tf.variable_scope('Decode_Z-%d' % layer_i) as scope:
        W_dc, wd_dc = _variable_with_weight_decay('W', shape=[self._z.get_shape().as_list()[1], current_input.get_shape().as_list()[1]],
                                        initializer=tf.truncated_normal_initializer(stddev=0.05), wd=self.l2_reg)
        losses.append(wd_dc)
        biases_dc = _variable_on_cpu('bias', shape=[current_input.get_shape().as_list()[1]],initializer=tf.constant_initializer(0.00))

        current_input = tf.nn.relu(tf.nn.bias_add(tf.matmul(self._z, W_dc), biases_dc))
        current_input = tf.reshape(current_input,[-1,height,width,channel])
    encoder.reverse()
    shapes.reverse()
    for layer_i, shape in enumerate(shapes[1:]):
        with tf.variable_scope('Decode_conv-%d' % layer_i) as scope:
            W = encoder[layer_i]
            b = _variable_on_cpu('bias-%d' % layer_i, shape=[W.get_shape().as_list()[2]], initializer=tf.constant_initializer(0.00))
            hh,ww,cc =  shape[1], shape[2], shape[3]
            output = tf.nn.relu(tf.add( tf.nn.conv2d_transpose(current_input, W, [tf.shape(sent_batch)[0],hh,ww,cc],strides=[1, 2, 2, 1],padding='SAME'), b),name=scope.name)
            current_input = output
    self._y = current_input
    # loss
    with tf.variable_scope('loss') as scope:
        cross_entropy_loss = tf.reduce_mean(tf.square(current_input - sent_batch))
        losses.append(cross_entropy_loss)
        self._total_loss = tf.add_n(losses, name='total_loss')

    opt = tf.train.AdamOptimizer(0.0001)
    grads = opt.compute_gradients(self._total_loss)
    self._train_op = opt.apply_gradients(grads)

Но результаты неэффективны, потому что косинус сходства ниже двух предложений равен 0,9895 после полученияскрытое сжатое представление сверху модели.

  1. Функциональные нарушения полиморфноядерных нейтрофилов
  2. Неуточненный перелом черепа, последствия '

А если я возьму предложенияс 2-5 словами, и сходство возрастает до 0,9999 (подозрение на то, что проблема была вызвана большим количеством значений заполнения по умолчанию с таким же равномерным распределением из встраиваемых поисков)

Ниже может быть полезна информация,

  1. Всего 10 000 обучающих образцов с 10 эпохами
  2. Используемые активации Relu
  3. Функция потери MSE
  4. Оптимизаторы Адама
  5. Ниже приведено распределение слов по более чемвсе предложение [1]

И, наконец, кто-нибудь может подсказать, что идет не так?а сам подход не хорош, чтобы продолжить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...