在微调BERT之后,分类器在哪里?

0kjbasz6  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(93)

我刚刚在进行BERT的微调,并注意到在微调过程中,分类器会附加在BERT的输出之后。

run_classifier.py中的create_model(...)
  1. ...
  2. with tf.variable_scope("loss"):
  3. if is_training:
  4. # I.e., 0.1 dropout
  5. output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)
  6. logits = tf.matmul(output_layer, output_weights, transpose_b=True)
  7. logits = tf.nn.bias_add(logits, output_bias)
  8. probabilities = tf.nn.softmax(logits, axis=-1)
  9. log_probs = tf.nn.log_softmax(logits, axis=-1)
  10. one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32)
  11. per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)
  12. loss = tf.reduce_mean(per_example_loss)
  13. ...

微调后的模型可以预测我的测试集,结果类似于“0的概率,1的概率”(一个句子相似度任务)。但让我困惑的是,当我将微调后的模型输入一个句子(不是运行run_classifier.py,而是通过bert-as-service https://github.com/hanxiao/bert-as-service运行模型),我得到一个768维的向量。这意味着我们只是使用分类器来微调BERT,但是当微调完成后,分类器会被丢弃吗?所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度?

pes8fvy9

pes8fvy91#

在BERT的双向Transformer和输出之间,有一个分类层。你需要这个层来进行微调,因为输出应该是一个类别,而不是嵌入(Transformer输出的是嵌入)。
BERT-as-service给你一个句子嵌入,所以当然他们移除了分类层以便获取嵌入。这就是为什么你有768维向量:那是句子嵌入。
当微调完成后,分类器会被丢弃吗?
是的。
所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度吗?
是的,因为BERT-as-service给你的是嵌入。从这里开始,你需要添加一个分类层来适应你的数据。

zsbz8rwp

zsbz8rwp2#

在BERT的双向Transformer和输出之间,有一个分类层。你需要这个层来进行微调,因为输出应该是一个类别,而不是嵌入(Transformer输出的是嵌入)。
BERT-as-service给你一个句子嵌入,所以当然他们移除了分类层以便检索嵌入。这就是为什么你有768维向量:那是句子嵌入。
当微调完成后,分类器会被丢弃吗?
是的。
所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度吗?
是的,因为BERT-as-service给你的是嵌入。从这里,你需要添加一个分类层来适应你的数据。
这很有道理,谢谢!

1l5u6lss

1l5u6lss3#

请告诉我用于微调的步骤/发送的参数。我需要调用run_classifier的create_model()吗,还是只需要调用run_classifier?

nqwrtyyt

nqwrtyyt4#

你好,我看到你使用了交叉熵损失方法,当你有两个变量:log_probs 和 one_hot_labels。然后计算每个样本的损失:

per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)

但是我想问一下,如何将其改为hinge损失?

相关问题