Project Icon

character-bert

字符级CNN构建的开放词汇表神经网络模型

CharacterBERT是BERT的一个变体,采用字符级CNN模块动态构建词表示,无需依赖预定义词片词汇表。这种方法可生成任意输入标记的表示,适用于医学等专业领域。与标准BERT相比,CharacterBERT生成词级上下文表示,对拼写错误更为鲁棒,且可轻松适应不同领域而无需重新训练词片词汇表。该模型在多个医学领域任务中表现优于BERT,提供更便捷实用的词级开放词汇表表示。

CharacterBERT

这是COLING 2020发表的论文"CharacterBERT: 通过字符实现ELMo和BERT的词级开放词汇表示的调和"的代码仓库。

2021-02-25: 现在可以在这里找到预训练BERT和CharacterBERT的代码!

目录

论文概述

摘要

CharacterBERTBERT的一个变体,它在词级生成上下文表示

这是通过关注每个输入词元的字符并动态构建词元表示来实现的。事实上,与依赖预定义词片矩阵的标准BERT相比,这种方法使用类似于ELMoCharacterCNN模块,可以为任意输入词元生成表示。


上图显示了BERT中如何构建与上下文无关的表示,以及CharacterBERT中如何构建这些表示。在这里,我们假设"Apple"是一个未知词元,这导致BERT将词元分割为两个词片"Ap"和"##ple"并嵌入每个单元。另一方面,CharacterBERT按原样处理词元"Apple",然后关注其字符以生成单个词元嵌入

动机

CharacterBERT有两个主要动机:

  • 通常通过简单地在一组专业语料库上重新训练来将原始BERT适应新的专业领域(例如医学法律科学领域等)是很常见的。这导致原始(通用领域)词片词汇被重复使用,尽管最终模型实际上针对的是不同的潜在高度专业化领域,这可以说是次优的(参见论文的_第2节_)。

    在这种情况下,一个直接的解决方案是使用专业词片词汇从头开始训练一个新的BERT。然而,训练一个BERT已经足够昂贵了,更不用说需要为每个感兴趣的领域训练一个了。

  • BERT使用词片系统在词元的特异性和字符的灵活性之间取得良好平衡。然而,在实践中使用子词并不是最方便的(我们是否应该平均表示以获得原始词元嵌入用于词相似性任务?我们是否应该在序列标注任务中只使用每个词元的第一个词片?...)大多数人只是希望使用词元。

ELMo的启发,我们使用CharacterCNN模块,成功获得了BERT的一个变体,该变体既产生词级又产生上下文表示,可以根据需要在任何领域进行多次重新调整,而无需担心任何词片的适用性。作为锦上添花,关注每个输入词元的字符还使我们得到一个对任何拼写错误拼写错误更加鲁棒的模型(参见论文的_第5.5节_)。

如何使用CharacterBERT?

安装

我们建议使用专门用于CharacterBERT的虚拟环境。

如果你还没有安装conda,可以从此链接安装Miniconda。然后,检查你的conda是否是最新的:

conda update -n base -c defaults conda

创建一个新的conda环境:

conda create python=3.10 --name=character-bert

如果尚未激活,请使用以下命令激活新的conda环境:

conda activate character-bert

然后安装以下软件包:

conda install pytorch cudatoolkit=11.8 -c pytorch
pip install transformers==4.34.0 scikit-learn==1.3.1 gdown==4.7.1

注1: 如果你不打算在GPU上运行实验,请改用此命令安装pyTorch:
conda install pytorch cpuonly -c pytorch

注2: 如果你只想能够加载预训练的CharacterBERT权重,则不必安装scikit-learn,它仅在评估期间用于计算精确度、召回率、F1指标。

预训练模型

你可以使用download.py脚本下载以下任何模型:

关键词模型描述
general_character_bert通用领域CharacterBERT,在英语维基百科和OpenWebText上从头预训练。
medical_character_bert医学领域CharacterBERT,从general_character_bert初始化,然后在MIMIC-III临床记录和PMC OA生物医学论文摘要上进一步预训练。
general_bert通用领域BERT,在英语维基百科和OpenWebText上从头预训练。1
medical_bert医学领域BERT,从general_bert初始化,然后在MIMIC-III临床记录和PMC OA生物医学论文摘要上进一步预训练。2
bert-base-uncased原始通用领域BERT (base, uncased)

1, 2 我们提供BERT模型和CharacterBERT模型,因为我们预训练了这两种架构,以便公平比较这些架构。我们的BERT模型使用与bert-base-uncased相同的架构和起始词片词汇。

例如,让我们下载CharacterBERT的医学版本:

python download.py --model='medical_character_bert'

我们也可以用一个命令下载所有模型:

python download.py --model='all'

实际使用CharacterBERT

CharacterBERT的架构与BERT几乎相同,因此你可以轻松适应Transformers库中的任何代码。

示例1: 从CharacterBERT获取词嵌入

"""基本示例: 从CharacterBERT获取词嵌入"""
from transformers import BertTokenizer
from modeling.character_bert import CharacterBertModel
from utils.character_cnn import CharacterIndexer

# 示例文本
x = "Hello World!"

# 对文本进行分词
tokenizer = BertTokenizer.from_pretrained(
    './pretrained-models/bert-base-uncased/')
x = tokenizer.basic_tokenizer.tokenize(x)

# 添加[CLS]和[SEP]
x = ['[CLS]', *x, '[SEP]']

# 将词元序列转换为字符索引
indexer = CharacterIndexer()
batch = [x]  # 这是一个包含单个词元序列x的批次
batch_ids = indexer.as_padded_tensor(batch)

# 加载一些预训练的CharacterBERT
model = CharacterBertModel.from_pretrained(
    './pretrained-models/medical_character_bert/')

# 将批次输入CharacterBERT并获取嵌入
embeddings_for_batch, _ = model(batch_ids)
embeddings_for_x = embeddings_for_batch[0]
print('这些是CharacterBERT生成的嵌入(最后一个transformer层)')
for token, embedding in zip(x, embeddings_for_x):
    print(token, embedding)

示例2: 使用CharacterBERT进行二元分类

""" 基本示例: 使用CharacterBERT进行二元分类 """
from transformers import BertForSequenceClassification, BertConfig
from modeling.character_bert import CharacterBertModel

#### 加载用于分类的BERT ####

config = BertConfig.from_pretrained('bert-base-uncased', num_labels=2)  # 二元分类
model = BertForSequenceClassification(config=config)

model.bert.embeddings.word_embeddings  # 词片嵌入
>>> Embedding(30522, 768, padding_idx=0)

#### 用CHARACTER_BERT替换BERT ####

character_bert_model = CharacterBertModel.from_pretrained(
    './pretrained-models/medical_character_bert/')
model.bert = character_bert_model

model.bert.embeddings.word_embeddings  # 词片被CharacterCNN替换
>>> CharacterCNN(
        (char_conv_0): Conv1d(16, 32, kernel_size=(1,), stride=(1,))
        (char_conv_1): Conv1d(16, 32, kernel_size=(2,), stride=(1,))
        (char_conv_2): Conv1d(16, 64, kernel_size=(3,), stride=(1,))
        (char_conv_3): Conv1d(16, 128, kernel_size=(4,), stride=(1,))
        (char_conv_4): Conv1d(16, 256, kernel_size=(5,), stride=(1,))
        (char_conv_5): Conv1d(16, 512, kernel_size=(6,), stride=(1,))
        (char_conv_6): Conv1d(16, 1024, kernel_size=(7,), stride=(1,))
        (_highways): Highway(
        (_layers): ModuleList(
            (0): Linear(in_features=2048, out_features=4096, bias=True)
            (1): Linear(in_features=2048, out_features=4096, bias=True)
        )
        )
        (_projection): Linear(in_features=2048, out_features=768, bias=True)
    )

#### 准备原始文本 ####

from transformers import BertTokenizer
from utils.character_cnn import CharacterIndexer
text = "CharacterBERT关注每个词元的字符"
bert_tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
tokenized_text = bert_tokenizer.basic_tokenizer.tokenize(text) # 这不是词片分词

tokenized_text
>>> ['characterbert', 'attends', 'to', 'each', 'token', "'", 's', 'characters']

indexer = CharacterIndexer()  # 将每个词元转换为字符索引列表
input_tensor = indexer.as_padded_tensor([tokenized_text])  # 我们构建一个只包含一个序列的批次
input_tensor.shape
>>> torch.Size([1, 8, 50])  # (批次大小, 序列长度, 字符嵌入维度)

#### 使用CHARACTER_BERT进行推理 ####

output = model(input_tensor, return_dict=False)[0]
>>> tensor([[-0.3378, -0.2772]], grad_fn=<AddmmBackward>)  # 类别logits

有关更完整(但仍具有说明性)的示例,您可以参考run_experiments.sh脚本,该脚本使用BERT/CharacterBERT运行一些分类/序列标注实验。

bash run_experiments.sh

您可以调整run_experiments.sh脚本来尝试任何可用的模型。通过调整data.py脚本,您还应该能够添加真实的分类和序列标注任务。

在GPU上运行实验

为了使用GPU,您需要确保conda环境中的PyTorch版本与您机器的配置相匹配。为此,您可能需要运行一些测试。

假设您想使用机器上的GPU 0号。那么设置:

export CUDA_VISIBLE_DEVICES=0

然后运行这些命令来检查pytorch是否能检测到您的GPU:

import torch
print(torch.cuda.is_available())  # 应返回`True`

如果最后一个命令返回False,那么很可能是安装的PyTorch版本与您机器的配置不匹配。要修复这个问题,在终端中运行nvidia-smi并检查您的驱动程序版本:

<中心>drawing</中心>

然后将此版本与NVIDIA CUDA工具包发行说明中给出的数字进行比较:

<中心>drawing</中心>

在这个例子中,显示的版本是390.116,对应CUDA 9.0。这意味着安装PyTorch的适当命令是:

conda install pytorch cudatoolkit=9.0 -c pytorch

现在,一切应该正常工作了!

参考文献

如果您在工作中使用CharacterBERT,请引用我们的论文:

@inproceedings{el-boukkouri-etal-2020-characterbert,
    title = "{C}haracter{BERT}: Reconciling {ELM}o and {BERT} for Word-Level Open-Vocabulary Representations From Characters",
    author = "El Boukkouri, Hicham  and
      Ferret, Olivier  and
      Lavergne, Thomas  and
      Noji, Hiroshi  and
      Zweigenbaum, Pierre  and
      Tsujii, Jun{'}ichi",
    booktitle = "Proceedings of the 28th International Conference on Computational Linguistics",
    month = dec,
    year = "2020",
    address = "Barcelona, Spain (Online)",
    publisher = "International Committee on Computational Linguistics",
    url = "https://www.aclweb.org/anthology/2020.coling-main.609",
    doi = "10.18653/v1/2020.coling-main.609",
    pages = "6903--6915",
    abstract = "由于BERT带来的引人注目的改进,许多最新的表示模型采用了Transformer架构作为其主要构建块,因此继承了词片分词系统,尽管它本质上并不与Transformer的概念相关联。虽然这个系统被认为在字符的灵活性和完整词的效率之间达到了良好的平衡,但使用来自通用领域的预定义词片词汇并不总是适合的,特别是在为专门领域(如医学领域)构建模型时。此外,采用词片分词将重点从词级转移到了子词级,使模型在概念上更加复杂,arguably在实践中也不那么方便。出于这些原因,我们提出了CharacterBERT,这是BERT的一个新变体,它完全放弃了词片系统,而是使用Character-CNN模块通过查询字符来表示整个词。我们展示了这个新模型在各种医学领域任务上改善了BERT的性能,同时产生了稳健的、词级的和开放词汇的表示。",
}
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号