# 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)
```