一、NLP技术主要解决的问题
人工智能主要包括自然语言处理/NLP、计算机视觉和传统机器学习(非多层神经网络)三个领域。基于自然语言处理技术又衍生出AI逻辑推理和AI智能体技术。以下为自然语言处理技术主要解决的问题和方案。任何与自然语言有关的问题都属于自然语言处理/NLP领域。但具体来看,根据不同的自然语言处理任务,自然语言处理又分为多种不同的任务类型;比如说:对话,问答,分类等。自然语言处理主要包括以下六大任务类型,而每个大的任务类型下又有多个小的子任务类型。
- 文本生成(Text Generation)指通过算法让计算机自动生成符合语言规范、语义连贯且具有特定目标的可读文本。
- 文本摘要提取(Text Summarization Extraction)旨在从长文本中提取或生成简洁、连贯且保留核心信息的短文本。
- 文本中的实体识别问题(通常称为命名实体识别,Named Entity Recognition, NER)是指从非结构化文本中自动识别、定位并分类特定类型实体的任务。这些实体通常包括人名、地名、组织机构名、时间、日期、货币、百分比等具有明确语义意义的词汇或短语。识别文本中的实体任务还包括从大量文本中进行信息检索与抽取。识别文本中的实体属于语言理解类任务,是自然语言处理(NLP)中的一项核心任务。
- 文本分类任务(Text Classification Task)是指通过算法将文本数据划分到预定义的类别或标签中,是NLP中最基础且应用最广泛的问题之一。
- 语义相似度识别(Semantic Similarity Measurement)是指通过计算模型量化两个文本片段(词、短语、句子或段落)在语义层面的相似程度。语义相似度识别属于语义与结构分析类任务,旨在衡量两个文本片段在语义上的相似程度。
- 语音识别与合成:语音转文本(ASR)或文本转语音(TTS)。多模态NLP:结合文本与图像/视频的理解(如描述图片内容)。
二、BERT核心思想和架构
BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型,由Google在2018年提出。它在自然语言处理(NLP)任务中表现出色,尤其在理解上下文语义方面。以下是BERT的工作原理简介:
1. 核心思想
- 双向上下文编码:传统模型(如LSTM或GPT)只能单向(从左到右或从右到左)处理文本,而BERT通过 双向Transformer 包括Masked Language Model (MLM) 和 Next Sentence Prediction (NSP) 任务, 同时学习上下文信息,捕捉单词与前后文的关联。
- 预训练+微调:
- 预训练:先在大规模语料(如 Wikipedia、BookCorpus)上预训练。
- 微调:针对具体任务(如分类、问答)用少量标注数据调整模型。
2. 模型架构
BERT基于 Transformer的编码器(Encoder) 堆叠而成,主要组件包括:
a、输入表示
每个输入token由三部分相加:
- Token Embeddings:词向量(WordPiece分词)。将单词映射为向量。
- Segment Embeddings:区分句子(如句子A/B,用于问答或句对任务)。
- Position Embeddings:位置编码(标记单词在序列中的位置)。
特殊标记:
[CLS]
:分类任务的聚合标记。[SEP]
:分隔句子。[MASK]
:掩码标记(用于 MLM 任务)。
[CLS] 我 喜 欢 猫 [SEP] 但 讨 厌 狗 [SEP]
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
CLS标记 Token Embeddings SEP标记
- Transformer Encoder:
- 由多层(如BERT-base为12层)相同的Encoder堆叠。
- 每层包含:
- 多头自注意力(Multi-Head Self-Attention):计算单词间依赖关系。
- 前馈神经网络(FFN):非线性变换。
- 残差连接(Residual Connection) 和 层归一化(LayerNorm):稳定训练。
b、参数配置
模型 | 层数(L) | 隐藏层维度(H) | 注意力头数(A) | 参数量 |
---|---|---|---|---|
BERT-Base | 12 | 768 | 12 | 110M |
BERT-Large | 24 | 1024 | 16 | 340M |
3、关键优势
- 上下文感知:双向注意力机制能捕捉“银行”在“存钱”和“河边”中的不同含义。
- 通用性强:预训练模型通过微调可适配多种任务,减少从头训练的成本。
- 并行计算:Transformer的自注意力机制比RNN更高效。
4、适用场景
- 文本分类(情感分析、新闻分类)
- 命名实体识别(NER)
- 问答系统(如 SQuAD)
- 语义相似度计算
5、优缺点分析
✅ 优势
- 上下文感知能力强:优于传统 Word2Vec、LSTM。
- 通用性强:通过微调适配多种任务(分类、问答、NER)。
- 开源生态完善:Hugging Face 提供预训练模型和工具链。
❌ 局限性
- 计算资源消耗大:Base 版需 3GB+ GPU 显存。
- 长文本处理弱:输入长度限制(通常 512 Token)。
6、性能表现
(1) GLUE 基准测试(通用语言理解)
任务 | BERT-Base 得分 |
---|---|
MNLI(文本蕴含) | 84.4% |
QQP(相似度) | 91.3% |
SST-2(情感分析) | 93.5% |
(2) 中文任务(如 CLUE)
- 使用
bert-base-chinese
在以下任务表现优异:- 文本分类(THUCNews):96%+ 准确率。
- 命名实体识别(MSRA-NER):95%+ F1。
7、典型变体
- RoBERTa:移除NSP任务,动态掩码,更大批次训练。
- ALBERT:参数共享减少计算量。
- ERNIE:引入实体级掩码,提升知识理解能力。
三、预训练任务
BERT通过两个无监督任务预训练:
1、掩码语言模型(Masked Language Model, MLM)
方法:随机遮盖15%的输入token(如将“猫”替换为[MASK]
),让模型预测被遮盖的词。
例如:输入"The [MASK] sat on the mat."
目标为预测 [MASK] = "cat"
。
改进:80%替换为[MASK]
,10%替换为随机词,10%保留原词,防止模型过度依赖[MASK]
。
掩码语言模型主要作用是通过对输入文本中部分单词的掩码(替换为[MASK]),迫使模型基于上下文预测被掩码的单词,从而学习深层次的双向上下文语义表示。
a、学习双向上下文依赖
传统语言模型(如GPT)通常基于单向(从左到右或从右到左)的上下文预测单词,而MLM通过随机掩码迫使BERT同时利用左右两侧的上下文信息来预测被掩码的词。例如句子:"The cat sat on the [MASK]."
模型需要结合"cat sat on the"
和"the"
前后的信息,预测[MASK]
可能是"mat"
或"floor"
。这种双向性使BERT能更全面地理解单词在句子中的含义。
b、提升模型泛化能力
采用随机掩码策略,BERT在预训练中随机掩码15%的输入词(其中80%替换为[MASK]
,10%替换为随机词,10%保持不变)。这种策略让模型:
- 学会处理不完整输入(鲁棒性)。
- 避免过度依赖局部特征(防止过拟合)。
c、为下游任务提供通用语义表示
MLM任务使BERT学习到的词向量包含丰富的上下文信息(如多义词区分、语法结构等)。例如:
"bank"
在"river bank"
和"bank account"
中通过上下文能生成不同的表示。- 这种通用表示可通过微调(fine-tuning)迁移到各类下游任务(如文本分类、问答、NER等)。
d、解决自编码与自回归模型的局限性
- 自回归模型(如GPT)只能单向建模,而MLM属于自编码模型,允许双向信息流动。
- MLM的掩码预测任务避免了像传统语言模型那样简单地“记住”下一个词,而是必须理解全局上下文。
2、下一句预测(Next Sentence Prediction, NSP)
方法:给定两个句子(A和B),预测B是否是A的下一句。
输入格式:
[CLS] 句子A [SEP] 句子B [SEP]
[CLS]
标记的最终隐藏状态用于分类(是/否)。
输入:("The cat sat on the mat.", "It was very furry.")
→ 标签 IsNext
。
MLM专注于单词级理解,NSP补充句子间关系建模,两者结合使BERT同时捕捉细粒度语义和篇章结构。
下一句预测样例:CCF-BDCI-2020贝壳房地产行业聊天问答匹配
四、微调(Fine-tuning)
将预训练的BERT适配到具体任务,例如:
- 文本分类:用
[CLS]
标记的表示作为整个序列的摘要,接一个分类层。 - 序列标注(如NER):用每个token的隐藏状态预测标签。
- 问答任务:用两个线性层分别预测答案的起始和结束位置。
五、如何使用
1、通过 Hugging Face 加载
from transformers import BertTokenizer, BertModel
# 加载模型和分词器
model_name = "bert-base-uncased" # 英文版本
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
# 编码文本
inputs = tokenizer("Hello, BERT!", return_tensors="pt")
outputs = model(**inputs)
print(outputs.last_hidden_state.shape) # [1, 7, 768]
2、微调示例(文本分类)
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)
# 训练代码(需准备数据集)...
3、中文模型
选择中文版BERT模型:
model_name = "bert-base-chinese" # 中文版本
4、扩展样例
代码中的 IQIYModelLite
模型在BERT基础上:
- 提取隐藏状态:获取最后一层的所有token表示。
- 注意力池化:学习每个token的重要性权重,生成上下文向量。
- 多标签输出:为每个情感标签(如“love”“joy”)独立预测。
总结
BERT通过双向Transformer和预训练任务,学习深层次的上下文语义表示,成为NLP任务的基石模型。其核心在于 双向编码 和 预训练-微调范式,使得模型能高效适配多样化下游任务。