# Summary 条件随机场(CRF)层 # Cues # Notes 让我详细解释这两个模型架构: ## BERT+CRF **BERT+CRF** 是在BERT基础上添加条件随机场(CRF)层的模型架构,主要用于序列标注任务。 ### 为什么要结合CRF? BERT本身做序列标注时,对每个token独立预测标签,存在一个问题: - **标签依赖性被忽略**:比如在命名实体识别中,B-PER(人名开始)后面不应该直接跟B-LOC(地名开始),而应该跟I-PER(人名内部)或O(非实体) - **输出可能不一致**:可能产生不合理的标签序列 ### CRF层的作用 CRF在BERT输出层之上添加了一个全局优化层: ```Java 输入句子 → BERT编码 → 每个token的特征向量 → CRF层 → 最优标签序列 ``` CRF通过学习标签转移矩阵,建模标签之间的依赖关系: - 学习哪些标签转移是合理的(如B-PER → I-PER) - 哪些是不合理的(如B-PER → I-LOC) - 使用维特比算法找到全局最优的标签序列 ### 典型应用场景 - **命名实体识别(NER)**:识别人名、地名、机构名等 - **词性标注(POS)**:标注名词、动词、形容词等 - **分词任务**:特别是中文分词 ## 带有注意力机制的[[ELECTRA]] ### 实际应用示例 **NER任务中的BERT+CRF**: ```python # 伪代码示例 class BERT_CRF(nn.Module): def __init__(self): self.bert = BertModel() self.dropout = nn.Dropout() self.classifier = nn.Linear(hidden_size, num_labels) self.crf = CRF(num_labels) def forward(self, input_ids, labels=None): bert_outputs = self.bert(input_ids) emissions = self.classifier(bert_outputs) if labels is not None: # 训练时:计算CRF损失 loss = -self.crf(emissions, labels) return loss else: # 推理时:使用维特比解码 return self.crf.decode(emissions) ```