Попытка обучить модель, используя контрастную потерю, но потеря одинакова во все эпохи - PullRequest
0 голосов
/ 02 июня 2019

Я тренирую модель для ранжирования ответов на вопросы с использованием контрастных потерь.

Моя модель принимает пакет вопросов и соответствующие Истинные ответы.Например, если я укажу размер пакета 5, это означает, что в пакете будет 5 вопросов и 5 правильных ответов.Будет 1 правильный ответ, а остальные 4 ответа будут считаться ложными ответами на конкретный вопрос.

Функция потери: L = max (0, m − s (q, A +) + max (s (q, Ai−)))

embedding_size = 100
vocab_size = len(word_to_idx.keys())
num_units = 100
batch_size=5
Margin = 20
tf.reset_default_graph()

# takes input if batch_size is 5, input_data shape will be 10
# First 5 rows hold question vector, remaining 5 hold answer vectors
# Correct answer for question at index 0 will be at index 5
input_data = tf.placeholder(dtype=tf.int64,shape=[None,100])

embedding_matrix = embeddings = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embedding_matrix, input_data)

with tf.name_scope("Encoder"):
    encoder_lstm_cell = tf.nn.rnn_cell.LSTMCell(num_units)
    a_, b_ = tf.nn.dynamic_rnn(cell=encoder_lstm_cell,inputs=embed,dtype=tf.float32)

    value = tf.transpose(a_, [1, 0, 2])
    last = tf.gather(value, int(value.get_shape()[0]) - 1)

    # to calculate the similarity
    normalized = tf.nn.l2_normalize(last, dim = 1)
    prod = tf.matmul(normalized, normalized, adjoint_b = True )
    prod = prod[:batch_size,batch_size:]

    # similarity between question and correct answers
    TA = tf.diag_part(prod) 

    # similarity between question and false answers
    FA = tf.linalg.set_diag(prod,[0]*batch_size)
    FA = tf.reduce_max(FA,axis=1)

    # loss function and optimizer
    substract_ = Margin + FA - TA
    loss = tf.reduce_mean(tf.maximum(0.,substract_))
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)

...