我刚刚在进行BERT的微调,并注意到在微调过程中,分类器会附加在BERT的输出之后。
run_classifier.py中的create_model(...)
...
with tf.variable_scope("loss"):
if is_training:
# I.e., 0.1 dropout
output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)
logits = tf.matmul(output_layer, output_weights, transpose_b=True)
logits = tf.nn.bias_add(logits, output_bias)
probabilities = tf.nn.softmax(logits, axis=-1)
log_probs = tf.nn.log_softmax(logits, axis=-1)
one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32)
per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)
loss = tf.reduce_mean(per_example_loss)
...
微调后的模型可以预测我的测试集,结果类似于“0的概率,1的概率”(一个句子相似度任务)。但让我困惑的是,当我将微调后的模型输入一个句子(不是运行run_classifier.py,而是通过bert-as-service https://github.com/hanxiao/bert-as-service
运行模型),我得到一个768维的向量。这意味着我们只是使用分类器来微调BERT,但是当微调完成后,分类器会被丢弃吗?所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度?
4条答案
按热度按时间pes8fvy91#
在BERT的双向Transformer和输出之间,有一个分类层。你需要这个层来进行微调,因为输出应该是一个类别,而不是嵌入(Transformer输出的是嵌入)。
BERT-as-service给你一个句子嵌入,所以当然他们移除了分类层以便获取嵌入。这就是为什么你有768维向量:那是句子嵌入。
当微调完成后,分类器会被丢弃吗?
是的。
所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度吗?
是的,因为BERT-as-service给你的是嵌入。从这里开始,你需要添加一个分类层来适应你的数据。
zsbz8rwp2#
在BERT的双向Transformer和输出之间,有一个分类层。你需要这个层来进行微调,因为输出应该是一个类别,而不是嵌入(Transformer输出的是嵌入)。
BERT-as-service给你一个句子嵌入,所以当然他们移除了分类层以便检索嵌入。这就是为什么你有768维向量:那是句子嵌入。
当微调完成后,分类器会被丢弃吗?
是的。
所以我们必须训练另一个分类器来完成我们自己的任务,比如句子相似度吗?
是的,因为BERT-as-service给你的是嵌入。从这里,你需要添加一个分类层来适应你的数据。
这很有道理,谢谢!
1l5u6lss3#
请告诉我用于微调的步骤/发送的参数。我需要调用run_classifier的create_model()吗,还是只需要调用run_classifier?
nqwrtyyt4#
你好,我看到你使用了交叉熵损失方法,当你有两个变量:log_probs 和 one_hot_labels。然后计算每个样本的损失:
per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)
但是我想问一下,如何将其改为hinge损失?