摄影:Max Chen on Unsplash
一、说明
这是使用 BERT 语言模型的一系列文本分类演示的第一部分。以文本的分类作为例,演示它们的调用过程。
二、什么是伯特?
BERT 代表 来自变压器的双向编码器表示。
首先,转换器是一种深度学习模型,它使用自我注意机制,根据每个单词与其他单词的关系对其进行加权。根据注意力得分,模型可以“注意”序列中的有价值的部分。其次,BERT是双向的,这意味着它在训练时会同时考虑左上下文和右上下文。从这个意义上说,BERT模型可以从两个方向理解上下文。
三、BERT BASE 和 BERT LARGE
BERT BASE:更少的变压器块和隐藏层大小,具有与OpenAI GPT相同的模型大小。[12个变压器块,12个注意头,768个隐藏层尺寸]
BERT LARGE:庞大的网络,其注意力层是BERT BASE的两倍,在NLP任务上实现了最先进的结果。[24个变压器块,16个注意头,1024隐藏层尺寸]
区别:Bert base的参数比Bert large少,因此可以用更少的计算机内存使用。Bert large具有更多的参数,因此它比Bert基数更准确。
四、伯特输入和输出
输入:[CLS]令牌序列[SEP]
- [CLS] 代表 分类令牌
- [SEP] 让 BERT 知道哪个令牌属于哪个序列
- 可以输入BERT模型的令牌的最大大小为512。因此,如果令牌小于 512,我们可以使用填充来填充空令牌;如果序列中的令牌长度超过 512,那么我们需要截断令牌。
- BERT 模型的输出将是每个令牌中大小为 768 的嵌入向量。然后,这些令牌将成为分类器的输入。
五、 尝试一个简单的文本
拥抱脸是一个很棒的学习场所。它提供语言模型、数据集,您甚至可以在那里学习自然语言处理!浏览其网站以获取更多信息:
拥抱面孔 - 构建未来的 AI 社区。
构建、训练和部署由机器学习中的参考开源提供支持的先进模型。超过。。。
huggingface.co
让我们从拥抱脸中导出一个语言模型,看看它对一个简单的句子有什么作用。我们需要先导入自动标记器来启动语言模型。
pip install transformers
from transformers import AutoTokenizer
tokenizer= AutoTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-v2')
example_text = '今日は一日サッカーをしました'
##('I played soccer for the whole day')##
BERT_input = tokenizer(example_text,padding='max_length', max_length = 20, truncation=True, return_tensors="pt")print(BERT_input['input_ids'])
print(BERT_input['token_type_ids'])
print(BERT_input['attention_mask'])
tensor([[ 2, 13711, 897, 1031, 2719, 11731, 932, 873, 13276, 881,3, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
六、解释
- 填充 :将每个序列填充到指定的最大长度。
- max_length:每个序列的最大长度。在这个例子中,我们使用 20,但对于我们的实际数据集,我们将使用 512,这是 BERT 允许的最大序列长度。
- 截断 :如果为 True,则每个序列中超过最大长度的标记将被截断。
- return_tensors:将返回的张量类型。如果你使用 Pytorch,那么你将使用 pt。如果你使用Tensorflow,那么你需要使用tf。
七 什么是input_ids
我们可以解码令牌以查看input_ids是什么。
example_text = tokenizer.decode(bert_input.input_ids[0])
print(example_text)
[CLS] 今日 は 一 日 サッカー を し まし た [SEP] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
八、 什么是token_type_ids和attention_mask?
- token_type_ids是一个二进制掩码,用于标识哪些令牌属于哪个序列。因为我们只有一个序列,所以所有代币都属于类 0。
- attention_mask是一个二进制掩码,如果令牌是实词,则为 [CLS]、[SEP] 或填充。如果令牌是实词 [CLS]、[SEP],则掩码将为 1。否则,掩码将为 0。
九、总结
在这篇文章中,我简要介绍了BERT是什么,并使用一个简单的文本来显示使用BERT的标记化结果。达门·