Я тренирую модель для ранжирования ответов на вопросы с использованием контрастных потерь.
Моя модель принимает пакет вопросов и соответствующие Истинные ответы.Например, если я укажу размер пакета 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)