掌握BERT:自然语言处理 (NLP) 从初级到高级的综合指南
1. 什么是BERT?
在不断发展的自然语言处理 (NLP) 领域,一项名为 BERT 的突破性创新已经出现,改变了游戏规则。BERT 代表 Bidirectional Encoder Representations from Transformers,不仅仅是机器学习术语海洋中的另一个首字母缩略词。它代表了机器理解语言方式的转变,使它们能够理解使人类交流丰富而有意义的错综复杂的细微差别和上下文依赖关系。
2. 为什么BERT很重要?
想象一句话:“她拉小提琴的时候很漂亮。传统的语言模型会从左到右处理这个句子,有可能忽略了小提琴(“violin”)本身会影响整个句子的解释这一关键事实。然而BERT的机制能够理解关键信息,单词的上下文关系在派生意义方面起着关键作用。它抓住了双向性的本质,使其能够考虑围绕每个单词的完整上下文,从而彻底改变了语言理解的准确性和深度。
3. BERT是如何工作的?
BERT的核心是由一个强大的神经网络架构(称为 Transformers)提供支持的。这种架构采用了一种称为自我注意的机制,允许 BERT 根据其上下文(包括前后)来权衡每个单词的重要性。这种上下文感知使BERT能够生成上下文的单词嵌入,这些单词嵌入是考虑单词在句子中的含义的表示。这类似于BERT阅读和重新阅读句子以深入了解每个单词的作用。
考虑这句话:“The 'lead' singer will 'lead' the band.”传统模型可能会为“lead”这个词的歧义而苦苦挣扎。然而,BERT 毫不费力地区分第一个 “lead” 是名词,而第二个 “lead” 是动词,展示了它在消除语言结构歧义方面的实力。
4. BERT预处理逻辑
Tokenization:将文本分成有意义的块
想象一下,您正在教 BERT 阅读一本书。你不会一次交出整本书;你会把它分成句子和段落。同样,BERT 需要将文本分解为更小的单元,称为标记。但这里有一个转折点:BERT 使用 WordPiece Token。它将单词拆分成更小的部分,例如将 “running” 转换为 “run” 和 “ning”。这有助于处理棘手的单词,并确保 BERT 不会在不熟悉的单词中迷失方向。
原文:“ChatGPT is fascinating”。
WordPiece Token: [“chat”, “##G”, “##PT”, “is”, “fascinating”, “.”]
Input Formatting:为 BERT 提供上下文
BERT 能理解上下文。我们以 BERT 可以理解的方式处理tokens。我们在句子之间添加特殊标记,如 [CLS](代表分类),[SEP](代表分离)。我们还分配了segment embeddings来告诉 BERT 哪些token属于哪个句子。
原文: “ChatGPT is fascinating.”
Formatted Tokens: [“[CLS]”, “Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”, “[SEP]”]
Masked Language Model (MLM) 目标:BERT 上下文理解
BERT 的秘诀在于它能够理解双向上下文。在训练过程中,一些单词在句子中被掩盖(替换为 [MASK]),BERT 学会从上下文中预测这些单词。这有助于 BERT 掌握单词在之前和之后如何相互关联。
原文: “The cat is on the mat.”
Masked Sentence: “The [MASK] is on the mat.”
使用 Hugging Face Transformer 进行分词
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text = "BERT preprocessing is essential."
tokens = tokenizer.tokenize(text)
print(tokens)
5. 针对特定任务微调 BERT
BERT 有不同的风格,如 BERT-base、BERT-large 等。这些变体具有不同的模型大小和复杂性。选择取决于任务要求和您拥有的资源。较大的模型可能性能更好,但它们也需要更多的计算能力。我们微调 BERT 的任务称为 “下游任务”。包括情绪分析、命名实体识别等。微调涉及使用特定于任务的数据更新 BERT 的权重。有助于 BERT 专注于这些任务,且好处就是不需要从头开始。
例如简单使用 BERT 进行文本分类
from transformers import BertForSequenceClassification, BertTokenizer
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
text = "This movie was amazing!"
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
predictions = torch.argmax(outputs.logits, dim=1)
print(predictions)
6. BERT的注意力机制
Self-Attention: BERT对关键信息的把控
想象一下,怎么快速阅读一本书并高亮最重要的那些单词。对于 BERT,这种处理方式叫做自注意力机制,它会查看句子中的每个单词,并根据它们的重要性决定应该对其他单词给予多少关注。这样,BERT 可以专注于相关单词,即使它们在句子中相距很远。
Multi-Head Attention: 多个注意力协同
BERT 不仅仅依赖于一个观点,它使用多个“头”的注意力。将这些 heads 想象成不同的专家,专注于句子的各个方面。这种多头方法帮助 BERT 捕捉单词之间的不同关系,使其理解更丰富、更准确。
可视化注意力权重
import torch
from transformers import BertModel, BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text = "BERT's attention mechanism is fascinating."
inputs = tokenizer(text, return_tensors='pt', padding=True, truncatinotallow=True)
outputs = model(**inputs, output_attentinotallow=True)
attention_weights = outputs.attentions
print(attention_weights)
7. BERT的训练过程
BERT从预训练开始,从大量的文本数据中学习。想象一下,向 BERT 展示数百万个句子,并让它预测缺失的单词。这个练习有助于 BERT 建立对语言模式和关系的坚实理解。在预训练期间,BERT 会得到一些单词被掩盖(隐藏)的句子。然后,它尝试根据周围的上下文预测这些掩码词。这就像填空游戏,通过猜出缺失的单词,BERT 了解单词如何相互关联,从而获得其上下文的Embedding关系。BERT不仅能理解单词;它抓住了句子的生成方向。在 NSP 目标中,BERT经过训练来预测文本对中的一个句子是否紧跟下一个句子。这有助于BERT理解句子之间的逻辑联系,使其成为理解段落和较长文本的大师。
8. BERT Embeddings
BERT 的强大之处在于它能够以一种在特定上下文中捕获其含义的方式表示单词。
Word Embeddings vs. Contextual Word Embeddings
Word Embeddings比较常见,但BERT通过上下文理解更进一步生成Contextual Word Embeddings。BERT不是每个单词只有一个含义,而是根据句子中的上下文为同一单词创建不同的embedding。这样,每个单词的表示都更加微妙,并受到周围内容的影响。
WordPiece Tokenization:更好处理复杂词汇
BERT 的词汇就像一个由称为子词的小块组成的拼图。它使用 WordPiece分词将单词分解为这些子词。这对于处理长而复杂的单词以及处理以前从未见过的单词特别有用。
Positional Encodings: 引导句子结构
由于 BERT 以双向方式读取单词,因此它需要知道每个单词在句子中的位置。位置编码被添加到Embedding中,以使 BERT 具有这种空间感知能力。这样,BERT 不仅知道单词的含义,还知道它们在句子中的位置。
使用 Hugging Face Transformer 提取单词嵌入
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text = "BERT embeddings are fascinating."
inputs = tokenizer(text, return_tensors='pt', padding=True, truncatinotallow=True, add_special_tokens=True)
outputs = model(**inputs)
word_embeddings = outputs.last_hidden_state
print(word_embeddings)
本文转载自 沐白AI笔记,作者: 杨沐白