Подходит ли мой код для использования слоев пакетной нормализации в тензорном потоке?

У меня есть два входа: qi_pos & qi_neg одинаковой формы. Они должны быть обработаны двумя слоями mlp и, наконец, получить два результата, которые действуют как оценка. Вот мои коды:

  self.mlp1_pos  =    nn_layers.full_connect_(qi_pos,        256, activation='relu', use_bn = None, keep_prob=self.keep_prob,  name = 'deep_mlp_1')
  self.mlp2_pos  =    nn_layers.full_connect_(self.mlp1_pos, 128,  activation='relu', use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_2')
  self.pos_pair_sim = nn_layers.full_connect_(self.mlp2_pos,  1,  activation=None, use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_3')
  tf.get_variable_scope().reuse_variables()
  self.mlp1_neg  =    nn_layers.full_connect_(qi_neg,        256, activation='relu', use_bn = None, keep_prob=self.keep_prob,  name = 'deep_mlp_1')
  self.mlp2_neg  =    nn_layers.full_connect_(self.mlp1_neg, 128,  activation='relu', use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_2')
  self.neg_pair_sim = nn_layers.full_connect_(self.mlp2_neg,  1,  activation=None, use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_3')

Я использую слой BN для нормализации узлов в скрытых слоях:

def full_connect_(inputs, num_units, activation=None, use_bn = None, keep_prob = 1.0, name='full_connect_'):
  with tf.variable_scope(name):
    shape = [inputs.get_shape()[-1], num_units]
    weight = weight_variable(shape)
    bias = bias_variable(shape[-1])
    outputs_ = tf.matmul(inputs, weight) + bias
    if use_bn:
        outputs_ = tf.contrib.layers.batch_norm(outputs_, center=True, scale=True, is_training=True,decay=0.9,epsilon=1e-5, scope='bn')
    if activation=="relu":
      outputs = tf.nn.relu(outputs_)
    elif activation == "tanh":
      outputs = tf.tanh(outputs_)
    elif activation == "sigmoid":
      outputs = tf.nn.sigmoid(outputs_)
    else:
      outputs = outputs_
    return  outputs

   with tf.name_scope('predictions'):
      self.sim_diff = self.pos_pair_sim - self.neg_pair_sim # shape = (batch_size, 1)
      self.preds = tf.sigmoid(self.sim_diff) # shape = (batch_size, 1)
      self.infers = self.pos_pair_sim

Ниже приведено определение потери. Кажется, все в порядке.

with tf.name_scope('predictions'):
  sim_diff = pos_pair_sim - neg_pair_sim
  predictions = tf.sigmoid(sim_diff)
  self.infers = pos_pair_sim
## loss and optim
with tf.name_scope('loss'):
  self.loss = nn_layers.cross_entropy_loss_with_reg(self.labels, self.preds)
  tf.summary.scalar('loss', self.loss)

Я не уверен, правильно ли я использовал слои BN. Я имею в виду, что параметры BN получены из скрытых единиц из двух отдельных частей, которые основаны на тензорах qi_pos и qi_neg в качестве входных данных. В любом случае, кто-нибудь может помочь проверить это?


person yanachen    schedule 08.11.2017    source источник


Ответы (1)


Ваш код мне кажется нормальным, проблем с применением БН в разных ветках сети нет. Но я хотел бы упомянуть здесь несколько замечаний:

  • Гиперпараметры BN довольно стандартны, поэтому я обычно не устанавливаю вручную decay, epsilon и renorm_decay. Это не означает, что вы не должны их менять, в большинстве случаев это просто не нужно.

  • Вы применяете BN до функции активации, однако есть свидетельства того, что она работает лучше, если применяется после активации. См., например, это обсуждение. Еще раз, это не означает, что это ошибка, просто еще одна архитектура для рассмотрения.

person Maxim    schedule 08.11.2017
comment
Спасибо. Кстати, обязательно ли использовать BN в моей сети? На самом деле моя сеть имеет только три слоя, а входные данные представляют собой встраивания коротких предложений. Я слышал, что BN обычно используется в компьютерной версии сети, так как параметры сети очень большие и плотные. - person yanachen; 09.11.2017
comment
Это глубокий вопрос, на него нет универсального ответа. BN может ухудшить скорость сходимости (как правило, задачи RNN и RL). Также возможно, что данные настолько хорошо нормализованы, что BN не имеет большого значения, хотя и не бесплатно с точки зрения вычислений. Если есть только 3 слоя и данные хорошо предварительно обработаны, я обычно рассматриваю один или ни одного BN, а затем перехожу к изучению моей модели. Это может закончиться несколькими BN, но не тем дизайном, с которого я бы начал. - person Maxim; 09.11.2017