基于数据增强与对抗学习的门诊电子病历(EMR)文本分类python编程
1. 引言
随着医疗信息化建设的深入,电子病历已成为记录患者诊疗活动最核心的数据载体。其中,门诊EMR以其海量、实时的特性,蕴含着巨大的临床科研和应用价值。通过对门诊EMR中的主诉、现病史、既往史等非结构化文本进行自动分类,可以辅助医生进行快速诊断、实现智能导诊、开展疾病流行病学研究,对提升医疗服务效率和质量具有重要意义。
然而,门诊EMR文本分类任务面临着四大核心挑战:(1) 数据稀缺与长尾分布:高质量、标注准确的医疗文本数据获取成本高,且常见病与罕见病之间的样本数量差异巨大,导致模型偏向于头部类别,对尾部类别识别能力差。(2) 文本噪声严重:门诊场景下,医生记录时间紧迫,文本往往高度口语化(如“肚子疼”)、大量使用缩写(如“BP”代表血压)、错别字(如“咳簌”),并受电子病历模板影响,包含大量冗余结构化符号,对模型的文本理解能力构成考验。(3) 域内外分布漂移:不同科室、不同医院甚至不同时间段的医生在书写习惯、疾病谱构成上均存在差异,导致训练集与测试集之间的数据分布不一致,模型的泛化能力受限。(4) 对抗扰动的脆弱性:深度神经网络被证明对输入的微小扰动非常敏感,一个字符的错误或一个同义词的替换都可能导致模型输出完全错误的预测,这在性命攸关的医疗领域是不可接受的。
为了应对上述挑战,研究者们从不同角度提出了多种解决方案。在数据层面,数据增强技术通过生成与原始数据语义相似但形式不同的样本,有效扩充了训练集,尤其有助于缓解数据稀缺和过拟合问题。在模型层面,预训练语言模型如BERT、RoBERTa,通过在海量通用文本上学习,获得了强大的语言表征能力,已成为各类NLP任务的标杆。然而,单纯的PLM在面对医疗领域特有的噪声和分布漂移时,其鲁棒性仍有待提升。对抗训练,作为一种提升模型稳定性的正则化手段,通过在训练过程中构造并抵御“最坏情况”下的微小扰动,已被证明能有效增强模型的鲁棒性。
尽管已有研究分别将数据增强或对抗训练应用于医疗文本分类,但鲜有工作系统性地将二者结合,并针对中文门诊EMR的短文本特性进行深度定制和优化。本研究的主要贡献如下:
- 构建了一个专门化的混合增强框架:结合了基于医学知识的规则增强与基于预训练模型的生成式增强,并创新性地引入MixUp-Text于多标签医疗分类任务,有效提升了样本多样性。
- 系统性地应用并优化了对抗训练:采用FreeLB作为核心对抗训练策略,详细分析了其在中文医疗文本分类任务上的效果,并与FGSM等方法进行了对比。
- 进行了全面的鲁棒性与泛化能力评估:除了在标准测试集上评估性能,还设计了包含自然噪声、合成对抗样本和跨域数据的测试集,深入探究了模型在接近真实临床复杂环境下的表现。
- 提供了可复现的实验方案与伦理实践:详细阐述了数据匿名化、患者级别的数据划分以及合规流程,为后续研究提供了严谨的参考。
本文的组织结构如下:第二章介绍相关研究工作;第三章详细阐述本文提出的混合数据增强与对抗学习框架;第四章描述实验设置、数据集和评估指标;第五章展示并分析实验结果,包括主实验、消融实验和鲁棒性测试;第六章讨论研究结果、局限性及未来方向;第七章强调伦理与合规;第八章对全文进行总结。
2. 相关研究
2.1 医疗文本分类
早期的医疗文本分类方法主要依赖于传统的机器学习模型,如支持向量机(SVM)和逻辑回归(LR),配合TF-IDF或N-grams等手工设计的特征。这类方法在小规模、特定领域的数据上表现尚可,但难以捕捉文本的深层语义。随着深度学习的发展,循环神经网络(RNN)、LSTM及其双向变体BiLSTM因能处理序列信息而被广泛应用。Kim提出的TextCNN则通过卷积核捕捉局部关键特征,在短文本分类中表现出色。然而,这些模型均需从头开始训练,对数据量要求高,且泛化能力有限。
近年来,以BERT为代表的预训练语言模型彻底改变了NLP领域。BERT通过“掩码语言模型”和“下一句预测”任务在海量文本上进行预训练,学习到通用的语言知识。针对中文任务,有研究者提出了BERT-wwm(全词掩码)及其后续的RoBERTa-wwm-ext,在中文语料上表现更佳。这些PLM在医疗文本分类任务中也迅速成为主流基线,研究者们通常通过在领域内语料上进行二次预训练或直接微调来获得更好的性能。
2.2 数据增强技术
数据增强是解决数据稀缺问题的关键技术。在NLP领域,增强方法主要分为规则驱动和模型驱动两类。
规则驱动的数据增强简单高效,主要包括:
- 同义词替换:利用同义词词典(如WordNet、哈工大同义词林)或词向量空间中的近邻词进行替换。
- EDA(Easy Data Augmentation):包括随机插入、随机删除、随机交换等操作,通过微小改变来创建新样本。Wei和Zou(2019)验证了其在文本分类中的有效性。
- 回译:将文本翻译到一种中间语言(如英语),再翻译回原语言。由于翻译模型并非完全可逆,回译后的文本通常会与原文在措辞上有所差异,但语义保持一致。
模型驱动的数据增强通常能生成更自然、更流畅的文本:
- 基于生成模型的增强:利用序列到序列模型(如T5、BART)或大型语言模型(如GPT系列),通过设计特定的指令来生成改写或扩展后的文本。
- 基于预训练模型的增强:例如,利用BERT自身的MLM头,随机遮盖部分词并让模型预测填充,生成新的句子变体。
- MixUp及其变体:最初用于图像分类,通过线性混合两个样本及其标签(
x_new = λx_1 + (1-λ)x_2,y_new = λy_1 + (1-λ)y_2)来平滑决策边界。Verma等(2019)将其引入NLP,通常在模型的词嵌入层或特征层进行混合。
在医疗领域,数据增强需要谨慎进行,以保证生成的文本在医学上合理。一些工作结合医学术语库进行同义词替换,或利用领域特定的生成模型来增强临床笔记。
2.3 对抗训练
对抗训练最初由Goodfellow等人(2014)在图像领域提出,用于提升模型对对抗样本的鲁棒性。对抗样本是指通过对原始输入添加人眼难以察觉的微小扰动而构造出的,能让模型产生错误判断的样本。FGSM(Fast Gradient Sign Method)是一种单步对抗攻击方法,通过计算损失函数对输入的梯度,并沿梯度方向添加一步扰动。PGD(Projected Gradient Descent)是FGSM的多步迭代版本,通过多次小步长扰动来寻找更强的对抗样本。
在NLP领域,由于输入是离散的文本,直接在原始文本空间施加扰动困难重重。因此,主流做法是在词嵌入层进行对抗训练。通过向词嵌入向量添加连续扰动,可以达到类似的效果。FreeLB(Adversarial Training with Free Large-Batch)是一种高效的对抗训练方法,它在每次前向-反向传播中执行多步对抗更新,但其“自由”之处在于这些更新步骤不产生梯度回传给原始模型参数,只有在对抗路径的末端才计算一次梯度用于更新模型,从而在提升鲁棒性的同时保持了训练效率。VAT(Virtual Adversarial Training)则是一种无监督的对抗训练方法,通过寻找能使模型输出分布发生最大变化的扰动,迫使模型在局部邻域内保持输出一致性。SMART(Self-supervised Margin-wise Adversarial Training)结合了VAT和对比学习的思想,通过最小化对抗扰动下模型输出的KL散度来增强模型的平滑性。
3. 方法
本研究的总体框架如图1所示,包含数据预处理、混合数据增强、对抗训练模型和损失函数四个核心模块。数据首先经过清洗和匿名化,然后通过混合增强策略扩充训练集。在模型训练阶段,采用RoBERTa-wwm-ext作为基线,并融入FreeLB对抗训练。损失函数结合了交叉熵和Focal Loss,以应对多标签和长尾分布问题。
3.1 任务定义
给定一个门诊EMR短文本样本 X,该样本可能包含一个或多个诊断标签 Y,标签集合为 L = {l_1, l_2, ..., l_K}。本任务的目标是学习一个映射函数 f: X → [0, 1]^K,使得对于每个标签 l_k,输出 f(X)_k 表示文本 X 属于该标签的概率。这是一个典型的多标签文本分类问题,通常通过将输出层设置为 K 个独立的Sigmoid单元,并使用二元交叉熵损失进行训练。
3.2 基线模型:RoBERTa-wwm-ext
我们选择 hfl/chinese-roberta-wwm-ext 作为基线模型。RoBERTa通过移除BERT的下一句预测任务、使用更大的批量、更长的训练时间和动态掩码策略,在多项NLP任务上超越了BERT。wwm-ext 版本在中文语料上进行了全词掩码的扩展预训练,对中文词汇的表征更为精准。其模型结构由多层双向Transformer编码器堆叠而成,能有效地捕捉文本的上下文依赖关系。对于分类任务,我们在RoBERTa的 [CLS] 标志位对应的最终隐藏状态之上,连接一个全连接层,输出 K 维的 logits。
3.3 混合数据增强策略
为应对数据稀缺和噪声多样性,我们设计了多层次的混合数据增强策略,对每个训练样本按概率应用一种或多种增强技术。
3.3.1 规则增强(低成本)
- 医学同义替换:我们构建了一个包含症状、体征、药品、检查项目等类别的医学同义词典。例如,将“发热”替换为“发烧”,“腹痛”替换为“肚子疼”。对于不在词典中的词,可以借助词向量(如腾讯AI Lab词向量)寻找Top-N近义词作为候选。
- EDA轻量版:针对门诊EMR短文本的特性,我们调低了EDA操作的幅度以避免语义扭曲。具体参数设置为:随机删除概率
p_del=0.1,随机交换概率p_swap=0.1,随机插入概率p_ins=0.1。插入的词从原文词表中随机选取。 - 实体占位符替换:为了防止模型过拟合于特定的人名、医院名、床号等,我们使用正则表达式识别这些实体,并用统一的占位符如
[PATIENT_NAME]、[HOSPITAL]、[BED_NUM]进行替换。这有助于模型关注与疾病相关的核心内容。 - 口语化与缩写注入:为了模拟真实文本噪声,我们以一定概率(如0.05)将正式词汇替换为口语表达或常见缩写。例如,“血压”替换为“BP”,“2天”替换为“2d”,“体温38.5摄氏度”替换为“T 38.5”。这一规则表需要根据实际数据进行维护。
3.3.2 模型增强(高质量)
- 回译:我们采用
zh → en → zh的回译路径。使用Google Translate API或其他成熟的翻译引擎。为避免循环翻译导致的质量下降,我们设置了一个BLEU相似度阈值(如 > 0.7),仅保留与原文相似度在阈值以上的回译结果作为增强样本。 - 掩码语言模型(MLM)增强:利用RoBERTa自身的MLM能力。对输入文本,随机遮盖10%-15%的词,然后让模型预测这些遮盖位,将预测结果(取Top-1)替换回原文,形成新样本。这种方法生成的文本与原始模型的语义空间高度对齐。
- MixUp-Text:这是提升模型平滑度和泛化能力的关键。我们从mini-batch中随机选取两个样本
X_i和X_j及其对应的标签向量Y_i和Y_j。在词嵌入层进行线性混合:
X_mix = λ * Embedding(X_i) + (1-λ) * Embedding(X_j)
Y_mix = λ * Y_i + (1-λ) * Y_j
其中λ是从Beta(α, α)分布中采样的混合系数(α通常设为0.2或0.4)。然后将X_mix输入模型,预测结果与Y_mix计算损失。在多标签场景下,Y_mix是一个连续向量,模型通过优化回归损失来学习标签之间的平滑过渡。
3.3.3 增强策略组合
在实际训练中,我们不固定使用一种增强方法,而是构建一个“增强工具箱”。对每个batch的数据,按预设的概率分布(如:规则增强 40%,回译 20%,MLM 20%,MixUp 20%)动态选择增强方式,实现了多样化的样本生成,避免了单一增强方式可能带来的偏差。
3.4 对抗训练策略:FreeLB
为了提升模型对微小扰动的鲁棒性,我们采用FreeLB(Free Large-Batch Adversarial Training)作为核心对抗训练策略。它在词嵌入空间中迭代地寻找“最坏情况”的扰动,然后基于被扰动的嵌入来更新模型参数。
算法流程如下:
- 初始化:对于输入的文本序列,通过Tokenizer得到
input_ids和attention_mask。获取初始词嵌入E_0 = Embedding(input_ids)。 - 对抗扰动生成:
- 初始化扰动
δ_0 = 0。 - 进行
K步(K通常为3-7)迭代:- 计算当前被扰动的嵌入:
E_k = E_0 + δ_{k-1}。 - 将
E_k和attention_mask输入RoBERTa模型,得到logitslogits_k。 - 计算对抗损失
L_adv = CrossEntropy(logits_k, Y)。 - 计算损失对当前扰动的梯度:
g_k = ∇_{δ_{k-1}} L_adv。 - 更新扰动:
δ_k = δ_{k-1} + ε * sign(g_k)。其中ε是控制扰动幅度的超参数。 - 将
δ_k投影到L_∞球内,即δ_k = clamp(δ_k, -ε, ε)。
- 计算当前被扰动的嵌入:
- 初始化扰动
- 模型参数更新:
- 使用最终得到的被扰动嵌入
E_K进行前向传播,计算最终损失L_final。 L_final相对于原始模型参数θ进行反向传播,执行一步优化器更新(如Adam)。
- 使用最终得到的被扰动嵌入
FreeLB的关键优势在于,对抗扰动的 K 步迭代是在一个计算图中完成的,并且梯度仅用于更新 δ,而不影响模型参数 θ。这相当于在每次参数更新前,都对模型进行了一次“内部压力测试”,使其学习到更加平滑和鲁棒的表征。我们将最终损失函数定义为原始损失和对抗损失的加权和:
L = (1 - α) * L_clean + α * L_adv
其中 L_clean 是基于原始嵌入 E_0 计算的损失,α 是平衡超参数。
3.5 损失函数:处理多标签与长尾分布
我们的基线损失是多标签二元交叉熵:
L_BCE = - (1/N) * Σ_i Σ_k [y_{ik} * log(p_{ik}) + (1 - y_{ik}) * log(1 - p_{ik})]
为了缓解长尾分布问题,我们引入了Focal Loss。Focal Loss通过降低易于分类样本(高置信度)的权重,让模型更关注于难分类的、通常是尾部类别的样本。对于多标签任务,其形式为:
L_FL = - (1/N) * Σ_i Σ_k [α * (1-p_{ik})^γ * y_{ik} * log(p_{ik}) + (1-α) * p_{ik}^γ * (1-y_{ik}) * log(1-p_{ik})]
其中 γ 是聚焦参数(通常取1或2),p_{ik} 是模型预测样本 i 属于类别 k 的概率。α 是平衡因子,可以为不同类别设置不同的权重,但我们简化为全局常数。在本研究中,我们将BCE和FL结合,最终的损失函数为:
L_total = λ_bce * L_BCE + λ_fl * L_FL
通过调节 λ_bce 和 λ_fl 的比例,可以在保持整体优化稳定性的同时,重点提升对少数类别的识别能力。此外,我们还尝试了标签平滑,通过将 hard labels(0或1)软化为目标分布(如0.95和0.05),以抑制模型的过度自信,提高其校准能力。
4. 实验设置
4.1 数据集
本研究使用的数据来源于某三甲医院2019年1月至2022年12月的门诊电子病历。数据使用前经过了严格的脱敏处理。
-
数据收集与匿名化:我们从医院信息系统(HIS)中提取了患者的“主诉”、“现病史”和“初步诊断”字段。为了保护患者隐私,我们实施了严格的匿名化流程:
- 直接标识符移除:通过正则表达式和关键词列表,删除所有姓名、身份证号、手机号、家庭住址、社保号。
- 间接标识符泛化:将精确的床号、门诊号替换为科室编码和日期范围,将具体的医院名称、科室名称替换为占位符。
- 合规审查:整个数据脱敏过程在医院信息科和伦理委员会的监督下进行,确保符合《个人信息保护法》和最小必要原则。最终获得的数据集不包含任何可追溯到具体个人的信息。本研究获得了医院伦理委员会的审批(审批号:XXXXXX-YY)。
-
样本划分:为避免数据泄漏,我们按就诊ID进行分层划分。确保同一个患者在不同时间的就诊记录不会同时出现在训练集、验证集和测试集中。最终,我们获得了:
- 训练集:85,000条记录
- 验证集:10,000条记录
- 测试集(标准):10,000条记录
- 测试集(噪声):从标准测试集中抽取2000条,人工注入错别字、缩写和口语化表达,用于鲁棒性测试。
-
标签处理:原始的“初步诊断”是基于ICD-10编码的,极为稀疏。我们与临床专家合作,依据临床路径和常见病种,将ICD-10编码聚合为50个高代表性的诊断类别(如“上呼吸道感染”、“2型糖尿病”、“原发性高血压”等)。部分病例具有多个诊断,因此这是一个多标签分类任务。数据集中,标签分布呈现典型的长尾特征,头部10个类别的样本占比超过60%。
4.2 对比方法
为验证本研究方法的有效性,我们选取了以下具有代表性的模型作为对比:
- TF-IDF + LR:经典的机器学习基线。使用Scikit-learn实现。
- TextCNN:一个经典的CNN文本分类模型,用于对比深度学习基线。
- BiLSTM + Attention:序列模型基线,注意力机制用于加权重要信息。
- BERT-base:使用
bert-base-chinese进行微调。 - RoBERTa-wwm-ext:我们的主要基线,不使用任何增强或对抗训练。
- RoBERTa + DA:仅使用我们提出的混合数据增强策略进行微调。
- RoBERTa + AT:仅在RoBERTa-wwm-ext上使用FreeLB对抗训练。
- RoBERTa + DA (Simpler):仅使用规则增强(同义词替换+EDA)的简化版DA。
- Ours (RoBERTa + DA + AT):本文提出的完整模型,融合混合数据增强与FreeLB对抗训练。
