2016-03-25 19 views
4

Dekoderden örneklenen çıktılar üretmek için seq2seq'i bir öznitelikle, yani her bir adımda üretmeye çalışıyorum, çıktı kayıtlarının argmax'ını önceki durumdan almak yerine, bunlardan örnek almalıyım logit dağıtımına ve sonraki adım için girdi olarak kullanın.Örneklenmiş kod çözücü çıkışları ile seq2seq uygulanması

Etrafa bir şeyler kazandıktan sonra, seq2seq.py dosyasındaki loop_function öğesini başlamak için umut verici bir yer olarak buldum.

def _extract_sample_and_embed(embedding, output_projection=None, 
          update_embedding=True): 
    def loop_function(prev, _): 
     if output_projection is not None: 
      prev = nn_ops.xw_plus_b(prev, output_projection[0], output_projection[1]) 
     prev_symbol = math_ops.sample(prev) #<------- Need this op but it does not exist ? 
     emb_prev = embedding_ops.embedding_lookup(embedding, prev_symbol) 
     if not update_embedding: 
      emb_prev = array_ops.stop_gradient(emb_prev) 
     return emb_prev 
    return loop_function 

Sonra ben seq2seq_embedding_with_attention modelinde bu döngü fonksiyon jeneratörü kullanın: I (argmax katıştırma + özlerinin dosyasında birinden değiştirilmiş) şöyle bir döngü işlevini yazmak zorunda gibi görünüyor. Bununla birlikte, tensörün içinde bir tensörden gelen örneklere ihtiyacım var, bu yüzden kendi yazmam gerekecek mi? Bunu nasıl yaparım?

    rehberlik ararken
  1. , ben tensorflow/tensorflow/piton/ops içinde/orada bir referanstır candidate_sampling_ops bulundu:

     from tensorflow.python.ops import gen_candidate_sampling_ops 
    

    ama yapamıyorum bu dosyayı bul. Sanırım bir yerden otomatik olarak üretiliyor. nerede? aşağıdaki gibi

cevap

4

Şu anda the gumbel max trick for directe distributions ile, bunu da yapabilirsiniz: Ayrıca şu anda bu konuda bir discussion Tensorflows üzerinde sorun izleyicide yoktur

def batch_gumbel_max_sample(a, max_gumbel_noise = 1.0): 
    matrix_U = -1.0*tf.log(-1.0*tf.log(tf.random_uniform(tf.shape(a), 
          minval = 0.0, maxval = max_gumbel_noise))) 
    return tf.argmax(tf.sub(a, matrix_U), dimension = 1) 

. Sanırım er ya da geç Tensorflow'a bir çok işlevli örnek fonksiyonu eklenecektir. LeavesBreathe da bence tamamen doğru olmadığını Github sayfasında bir eser etrafında yayınlanmıştır: bugün aynı sorun karşılamak

def batch_sample_with_temperature(a, temperature=1.0): 
'''this function is like sample_with_temperature except it can handle batch input a of [batch_size x logits] 
    this function takes logits input, and produces a specific number from the array. This is all done on the gpu 
    because this function uses tensorflow 
    As you increase the temperature, you will get more diversified output but with more errors (usually gramatical if you're 
     doing text) 
args: 
    Logits -- this must be a 2d array [batch_size x logits] 
    Temperature -- how much variance you want in output 
returns: 
    Selected number from distribution 
''' 

''' 
Equation can be found here: https://en.wikipedia.org/wiki/Softmax_function (under reinforcement learning) 
    Karpathy did it here as well: https://github.com/karpathy/char-rnn/blob/4297a9bf69726823d944ad971555e91204f12ca8/sample.lua''' 
'''a is [batch_size x logits]''' 
with tf.op_scope([a,temperature], "batch_sample_with_temperature"): 

    exponent_raised = tf.exp(tf.div(a, temperature)) #start by reduction of temperature, and get rid of negative numbers with exponent 
    matrix_X = tf.div(exponent_raised, tf.reduce_sum(exponent_raised, reduction_indices = 1)) #this will yield probabilities! 
    matrix_U = tf.random_uniform(tf.shape(a), minval = 0, maxval = 1) 
    final_number = tf.argmax(tf.sub(matrix_X, matrix_U), dimension = 1) #you want dimension = 1 because you are argmaxing across rows. 

return final_number 
+0

çok teşekkürler! Bu işe yarıyor. – thesilverbail

+0

Evet, ayrıca seq2seq'de çalışmamı sağladım, ayrıca çıkış_adıma geri döndüğünüz jetonları da yaymanız gerektiğini unuttu. Bu fonksiyon seçimlerde rastgelelik getirir - ama yine de Gumbel hilesini doğru bir şekilde uyguladığı konusunda ikna olmadım. Gumbel gürültüsü doğrudan 'a'ya uygulanmamalıdır mu? Ve shouldlog (−log (Uniform (0,1)) olmamalıdır? – shapecatcher

+0

Cevabımı kullanarak son kullanmadığım kod ile güncelledim. Bu benim görüşüme göre doğru Gumbel max trick. Daha iyi sonuçlar üretir.Kullanılan rastgele miktarını (sıcaklığa benzer şekilde) kontrol etmek için max_gumbel_noise parametresini kullanabilirsiniz. – shapecatcher

1

ve benim çözümdür:
prev_symbol = squeeze(multinomial(prev, 1), axis=1) doğrultusunda prev_symbol = math_ops.sample(prev) değiştirin

İşlev tf.multinomial() örneklerini çok terimli bir dağıtımdan çizer. Girdi olarak [batch_size, num_classes] ve 0-D skaler "num_samples" ile 2-D Tensor "logits" aldı. Ve çizilen şekillerden bir örnek çıktı [batch_size, num_samples].

Bu arada, math_ops.sample() şekil [batch_size] örneklerini çıkarır, bu nedenle boyutu azaltmak için tf.squeeze() gerekir.

Bu uygulama daha basittir.