如何使用Tensorflow后端从头训练问题的任何Hugging面部变压器模型(例如DistilBERT)?

时间:2020-05-10 06:50:15

标签: tensorflow keras nlp huggingface-transformers

我想了解如何训练问答系统和TensorFlow作为后端的拥抱人脸模型(例如BERT,DistilBERT等)。以下是我当前正在使用的逻辑(但是我不确定这种方法是否正确):

  1. 我正在使用SQuAD v1.1数据集。
  2. 在SQuAd数据集中,对任何问题的回答始终存在于上下文中。因此,我想用简单的话来预测开始索引,结束索引和答案。
  3. 出于相同的目的,我已经转换了数据集。在执行标记化之后,我已经添加了单词级别的开始索引和结束索引。这是我的数据集的外观, enter image description here

  4. 接下来,按照拥抱面部文档指南并重试input_id,attention_id和token_type_id,对问题和上下文进行编码。它将用作模型的输入。

def tokenize(questions, contexts):
  input_ids, input_masks, input_segments = [],[],[]
  for question,context in tqdm_notebook(zip(questions, contexts)):
      inputs = tokenizer.encode_plus(question,context, add_special_tokens=True, max_length=512, pad_to_max_length=True,return_attention_mask=True, return_token_type_ids=True )
      input_ids.append(inputs['input_ids'])
      input_masks.append(inputs['attention_mask'])
      input_segments.append(inputs['token_type_ids'])

  return [np.asarray(input_ids, dtype='int32'), np.asarray(input_masks, dtype='int32'), np.asarray(input_segments, dtype='int32')]
  1. 最后,我定义了一个Keras模型,该模型接受这三个输入,并根据给定的上下文预测答案的两个值(开始和结束单词索引)。
input_ids_in = tf.keras.layers.Input(shape=(512,), name='input_token', dtype='int32')
input_masks_in = tf.keras.layers.Input(shape=(512,), name='masked_token', dtype='int32')
input_segment_in = tf.keras.layers.Input(shape=(512,), name='segment_token', dtype='int32')
embedding_layer = transformer_model({'inputs':input_ids_in,'attention_mask':input_masks_in,
                                     'token_type_ids':input_segment_in})[0]
X = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(50, return_sequences=True, dropout=0.1, recurrent_dropout=0.1))(embedding_layer)
X = tf.keras.layers.GlobalMaxPool1D()(X)

start_branch = tf.keras.layers.Dense(1024, activation='relu')(X)
start_branch = tf.keras.layers.Dropout(0.3)(start_branch)
start_branch_output = tf.keras.layers.Dense(512, activation='softmax', name='start_branch')(start_branch)

end_branch = tf.keras.layers.Dense(1024, activation='relu')(X)
end_branch = tf.keras.layers.Dropout(0.3)(end_branch)
end_branch_output = tf.keras.layers.Dense(512, activation='softmax', name='end_branch')(end_branch)


model = tf.keras.Model(inputs=[input_ids_in, input_masks_in, input_segment_in], outputs = [start_branch_output, end_branch_output])

我正在使用具有512个单位的最后一个softmax层,因为这是我的最大字数,我的目标是预测索引偏差。

0 个答案:

没有答案