从TF-IDF到BERT:搜索排序模型的演进史

关键词:TF-IDF、搜索排序模型、BERT、模型演进、自然语言处理

摘要:本文深入探讨了搜索排序模型从TF-IDF到BERT的演进历程。首先介绍了搜索排序模型发展的背景和重要性,然后详细解释了TF-IDF、BM25等早期模型的原理,接着阐述了深度学习时代模型如word2vec、FastText等的特点,最后重点讲解了BERT模型的核心概念和优势。通过对各阶段模型的分析,展示了搜索排序模型在自然语言处理领域的不断进步和变革。

背景介绍

目的和范围

在当今信息爆炸的时代,搜索引擎成为人们获取信息的重要工具。搜索排序模型的作用就是从海量的信息中找出与用户查询最相关的内容,并按照相关性进行排序。本文的目的就是梳理搜索排序模型从早期到现在的发展脉络,介绍各个阶段的代表性模型,帮助大家了解搜索排序技术是如何不断演进的。范围涵盖了从传统的基于统计的模型到现代的深度学习模型。

预期读者

本文适合对自然语言处理、搜索技术感兴趣的初学者,以及想要深入了解搜索排序模型发展历程的技术人员。即使你没有太多的专业知识,也能通过本文通俗易懂的讲解,了解搜索排序模型的演进过程。

文档结构概述

本文首先会介绍一些与搜索排序模型相关的术语和概念,然后通过故事引入核心概念,解释从TF-IDF到BERT等各个模型的原理和它们之间的关系。接着会给出核心算法原理和具体操作步骤,用数学模型和公式进行详细讲解并举例说明。还会有项目实战部分,展示代码实际案例和详细解释。之后介绍实际应用场景、推荐相关工具和资源,探讨未来发展趋势与挑战。最后进行总结,提出思考题,并提供常见问题与解答以及扩展阅读和参考资料。

术语表

核心术语定义
  • 搜索排序模型:一种用于对搜索结果进行相关性排序的模型,根据用户的查询,计算文档与查询的相关性得分,然后按照得分对文档进行排序。
  • TF-IDF:词频 - 逆文档频率,是一种用于信息检索与文本挖掘的常用加权技术,用于评估一个词在文档中的重要性。
  • BERT:Bidirectional Encoder Representations from Transformers,一种基于Transformer架构的预训练语言模型,在自然语言处理任务中取得了很好的效果。
相关概念解释
  • 相关性:指文档与用户查询的匹配程度,匹配程度越高,相关性越强。
  • 预训练模型:在大规模无监督数据上进行训练的模型,训练完成后可以在特定的任务上进行微调,以提高模型在该任务上的性能。
缩略词列表
  • TF:Term Frequency,词频
  • IDF:Inverse Document Frequency,逆文档频率
  • BM25:Best Matching 25,一种改进的TF-IDF算法
  • CNN:Convolutional Neural Network,卷积神经网络
  • RNN:Recurrent Neural Network,循环神经网络

核心概念与联系

故事引入

想象一下,你来到了一个巨大的图书馆,里面有成千上万本书。当你想要找一本关于“恐龙”的书时,图书管理员该如何快速地从这么多书中找到与“恐龙”相关的书,并把最相关的书排在前面给你呢?这就需要用到搜索排序模型啦。早期的时候,图书管理员可能会根据书中“恐龙”这个词出现的次数来判断书的相关性,这就有点像最早的搜索排序方法。随着时间的推移,管理员发现只看词出现的次数不太准确,于是发明了更聪明的方法,就像我们接下来要介绍的从TF-IDF到BERT这些模型一样,越来越能准确地找出与你查询最相关的书。

核心概念解释(像给小学生讲故事一样)

> ** 核心概念一:TF-IDF** 
    我们可以把TF-IDF想象成一个小侦探,它能帮我们找出文档中最重要的词。TF就是词频,就好像在一个班级里,某个同学发言的次数越多,他在这个班级里就越“显眼”。比如在一篇关于水果的文章里,“苹果”这个词出现的次数很多,那它的词频就高。而IDF是逆文档频率,就好比一个同学在所有班级里都经常发言,那他的独特性就不高了;但如果一个同学只在某个班级发言,那他就很特别。IDF就是看一个词在多少篇文档中出现,如果一个词在很多文档中都出现,那它的IDF值就低;如果只在少数文档中出现,IDF值就高。TF-IDF就是把TF和IDF乘起来,这样就能找出那些在某个文档中出现次数多,同时又比较独特的词。
> ** 核心概念二:BM25** 
    BM25就像是TF-IDF的升级版小侦探。它也是来判断词在文档中的重要性的,但是它考虑得更全面。比如说,它会考虑文档的长度。如果一个文档很长,里面的词出现的次数自然会多一些,但这并不一定就说明这个词更重要。BM25就会对长文档进行一些调整,让判断更准确。就好像在一场比赛中,如果一个选手参加的项目多,得分可能会高一些,但我们不能只看总分,还要考虑他参加项目的数量,进行一些合理的调整。
> ** 核心概念三:word2vec** 
    word2vec就像是一个神奇的翻译器,它能把单词变成数字向量。我们知道,计算机不太懂单词的意思,但是它很擅长处理数字。word2vec就把单词变成了计算机能理解的数字形式。比如说,“苹果”和“香蕉”在语义上是相近的,word2vec会把它们变成在向量空间中距离很近的向量,这样计算机就能通过计算向量的距离来判断单词之间的语义关系啦。就好像把不同国家的小朋友都变成说同一种语言的小伙伴,这样他们就能更好地交流啦。
> ** 核心概念四:BERT** 
    BERT就像是一个超级智能的小老师。它能理解句子的上下文信息,就像我们读文章的时候,能根据前后文来理解一个词的意思。比如说“银行”这个词,在“我去银行存钱”和“河边的堤坝叫河银行”里意思是不一样的。BERT能通过分析句子的上下文,准确地理解“银行”在不同句子中的含义。它是基于Transformer架构的,就像一个强大的团队,里面有很多厉害的成员一起合作,能很好地处理自然语言任务。

核心概念之间的关系(用小学生能理解的比喻)

> ** TF-IDF和BM25的关系** 
    TF-IDF和BM25就像是一对好朋友,BM25是TF-IDF的好朋友升级版。TF-IDF先开始做判断词重要性的工作,但是它有一些小缺点,比如没有很好地考虑文档长度。BM25发现了这些问题,就对TF-IDF进行了改进,让判断更加准确。就好像小明和小红一起做一件事情,小明先做,但是做得不太完美,小红发现了问题,就帮忙改进,让事情做得更好。
> ** word2vec和BERT的关系** 
    word2vec和BERT就像是不同阶段的学习工具。word2vec是初级学习工具,它能把单词变成向量,让计算机对单词有一个基本的理解。而BERT是高级学习工具,它不仅能理解单词,还能理解句子的上下文信息。就好像我们学习英语,先学会了每个单词的意思(word2vec),然后再学会根据上下文理解整个句子的意思(BERT)。
> ** BM25和word2vec的关系** 
    BM25和word2vec是从不同角度来处理文本的。BM25主要是判断词在文档中的重要性,帮助我们筛选出相关的文档。而word2vec是把单词变成向量,让计算机能理解单词的语义关系。它们就像是两个不同的小助手,一个负责筛选文档,一个负责理解单词的意思,一起帮助我们更好地处理文本信息。

核心概念原理和架构的文本示意图(专业定义)

TF-IDF

TF-IDF的核心思想是一个词在文档中的重要性与它在该文档中的词频成正比,与它在整个文档集合中的出现频率成反比。其计算公式为:TF−IDF(t,d,D)=TF(t,d)×IDF(t,D)TF - IDF(t, d, D) = TF(t, d) \times IDF(t, D)TFIDF(t,d,D)=TF(t,d)×IDF(t,D),其中TF(t,d)TF(t, d)TF(t,d)表示词ttt在文档ddd中的词频,IDF(t,D)IDF(t, D)IDF(t,D)表示词ttt在文档集合DDD中的逆文档频率,IDF(t,D)=log⁡Ndf(t)IDF(t, D) = \log\frac{N}{df(t)}IDF(t,D)=logdf(t)NNNN是文档集合中的文档总数,df(t)df(t)df(t)是包含词ttt的文档数。

BM25

BM25的计算公式为:Score(Q,d)=∑i=1nIDF(qi)×TF(qi,d)×(k1+1)TF(qi,d)+k1×(1−b+b×dlavgdl)Score(Q, d) = \sum_{i = 1}^{n} IDF(q_i) \times \frac{TF(q_i, d) \times (k_1 + 1)}{TF(q_i, d) + k_1 \times (1 - b + b \times \frac{dl}{avgdl})}Score(Q,d)=i=1nIDF(qi)×TF(qi,d)+k1×(1b+b×avgdldl)TF(qi,d)×(k1+1),其中QQQ是查询,ddd是文档,qiq_iqi是查询中的第iii个词,k1k_1k1bbb是调节参数,dldldl是文档ddd的长度,avgdlavgdlavgdl是文档集合中所有文档的平均长度。

word2vec

word2vec有两种主要的模型:CBOW(Continuous Bag-of-Words)和Skip-gram。CBOW是根据上下文预测当前词,Skip-gram是根据当前词预测上下文。以Skip-gram为例,它通过一个神经网络来学习单词的向量表示,输入是当前词,输出是上下文词,通过不断训练,让网络学习到单词之间的语义关系。

BERT

BERT基于Transformer的编码器架构,它通过在大规模无监督数据上进行预训练,学习到语言的通用表示。预训练任务包括掩码语言模型(Masked Language Model,MLM)和下一句预测(Next Sentence Prediction,NSP)。在MLM任务中,会随机掩码一些单词,让模型预测这些被掩码的单词;在NSP任务中,模型需要判断两个句子是否是连续的。

Mermaid 流程图

用户查询
TF-IDF计算
BM25优化
word2vec转换
BERT理解
排序结果输出

核心算法原理 & 具体操作步骤

TF-IDF

算法原理

TF-IDF的原理是通过计算词的词频和逆文档频率来评估词在文档中的重要性。词频越高,逆文档频率越高,说明该词在文档中越重要。

具体操作步骤
  1. 计算词频(TF):统计每个词在文档中出现的次数,然后除以文档的总词数。
  2. 计算逆文档频率(IDF):统计包含该词的文档数,用文档总数除以包含该词的文档数,然后取对数。
  3. 计算TF-IDF值:将词频和逆文档频率相乘。

以下是Python代码示例:

import math
from collections import Counter

def compute_tf(document):
    tf_dict = {}
    counter = Counter(document)
    total_words = len(document)
    for word, count in counter.items():
        tf_dict[word] = count / total_words
    return tf_dict

def compute_idf(documents):
    num_docs = len(documents)
    idf_dict = {}
    all_words = set([word for doc in documents for word in doc])
    for word in all_words:
        doc_count = sum([1 for doc in documents if word in doc])
        idf_dict[word] = math.log(num_docs / (1 + doc_count))
    return idf_dict

def compute_tf_idf(tf_dict, idf_dict):
    tf_idf_dict = {}
    for word, tf in tf_dict.items():
        tf_idf_dict[word] = tf * idf_dict[word]
    return tf_idf_dict

# 示例文档
documents = [
    ["苹果", "香蕉", "橘子"],
    ["苹果", "葡萄"],
    ["香蕉", "草莓"]
]

# 计算TF-IDF
idf_dict = compute_idf(documents)
for doc in documents:
    tf_dict = compute_tf(doc)
    tf_idf_dict = compute_tf_idf(tf_dict, idf_dict)
    print(tf_idf_dict)

BERT

算法原理

BERT基于Transformer的编码器架构,通过预训练学习语言的通用表示。在预训练过程中,通过掩码语言模型和下一句预测任务,让模型学习到单词和句子的语义信息。在微调阶段,将预训练好的模型应用到具体的自然语言处理任务中,如文本分类、问答系统等。

具体操作步骤
  1. 预训练:在大规模无监督数据上进行预训练,使用掩码语言模型和下一句预测任务。
  2. 微调:将预训练好的模型应用到具体任务中,根据任务的不同,添加相应的输出层,然后在任务的标注数据上进行微调。

以下是使用Hugging Face的transformers库进行BERT文本分类的示例代码:

from transformers import BertTokenizer, BertForSequenceClassification
import torch

# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=2)

# 示例文本和标签
texts = ["这是一个积极的句子", "这是一个消极的句子"]
labels = [1, 0]

# 分词和编码
inputs = tokenizer(texts, return_tensors='pt', padding=True, truncation=True)
labels = torch.tensor(labels)

# 训练模型
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
for epoch in range(3):
    outputs = model(**inputs, labels=labels)
    loss = outputs.loss
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()
    print(f'Epoch {epoch + 1}, Loss: {loss.item()}')

# 预测
test_text = ["这是一个积极的句子"]
test_inputs = tokenizer(test_text, return_tensors='pt', padding=True, truncation=True)
with torch.no_grad():
    outputs = model(**test_inputs)
    logits = outputs.logits
    predictions = torch.argmax(logits, dim=1)
    print(predictions)

数学模型和公式 & 详细讲解 & 举例说明

TF-IDF

数学模型和公式

TF−IDF(t,d,D)=TF(t,d)×IDF(t,D)TF - IDF(t, d, D) = TF(t, d) \times IDF(t, D)TFIDF(t,d,D)=TF(t,d)×IDF(t,D)
TF(t,d)=count(t,d)∣d∣TF(t, d) = \frac{count(t, d)}{|d|}TF(t,d)=dcount(t,d),其中count(t,d)count(t, d)count(t,d)是词ttt在文档ddd中出现的次数,∣d∣|d|d是文档ddd的总词数。
IDF(t,D)=log⁡Ndf(t)IDF(t, D) = \log\frac{N}{df(t)}IDF(t,D)=logdf(t)N,其中NNN是文档集合中的文档总数,df(t)df(t)df(t)是包含词ttt的文档数。

详细讲解

TF-IDF的核心思想是通过词频和逆文档频率来评估词在文档中的重要性。词频反映了词在文档中出现的频繁程度,逆文档频率反映了词的稀有性。如果一个词在文档中出现频繁,同时在其他文档中很少出现,那么它的TF-IDF值就会很高,说明这个词对该文档很重要。

举例说明

假设有以下文档集合:

  • 文档1:[“苹果”, “香蕉”, “橘子”]
  • 文档2:[“苹果”, “葡萄”]
  • 文档3:[“香蕉”, “草莓”]

对于词“苹果”,在文档1中出现1次,文档1总词数为3,所以TF(苹果,文档1)=13TF(苹果, 文档1) = \frac{1}{3}TF(苹果,文档1)=31。文档总数N=3N = 3N=3,包含“苹果”的文档数df(苹果)=2df(苹果) = 2df(苹果)=2,所以IDF(苹果,D)=log⁡32≈0.405IDF(苹果, D) = \log\frac{3}{2} \approx 0.405IDF(苹果,D)=log230.405。则TF−IDF(苹果,文档1,D)=13×0.405≈0.135TF - IDF(苹果, 文档1, D) = \frac{1}{3} \times 0.405 \approx 0.135TFIDF(苹果,文档1,D)=31×0.4050.135

BERT

数学模型和公式

在掩码语言模型中,模型的目标是最大化预测被掩码单词的概率。设xxx是输入序列,mmm是掩码位置,ymy_mym是掩码位置的真实单词,模型的损失函数可以表示为:
LMLM=−∑m∈Mlog⁡P(ym∣x−m)L_{MLM} = - \sum_{m \in M} \log P(y_m | x_{-m})LMLM=mMlogP(ymxm),其中MMM是掩码位置的集合,x−mx_{-m}xm表示去掉掩码位置的输入序列。

在下一句预测任务中,模型的目标是判断两个句子是否是连续的。设x1x_1x1x2x_2x2是两个句子,yyy是真实标签(0表示不连续,1表示连续),模型的损失函数可以表示为:
LNSP=−ylog⁡P(y=1∣x1,x2)−(1−y)log⁡P(y=0∣x1,x2)L_{NSP} = - y \log P(y = 1 | x_1, x_2) - (1 - y) \log P(y = 0 | x_1, x_2)LNSP=ylogP(y=1∣x1,x2)(1y)logP(y=0∣x1,x2)

总的预训练损失函数为:L=LMLM+LNSPL = L_{MLM} + L_{NSP}L=LMLM+LNSP

详细讲解

掩码语言模型让模型学习到单词的上下文信息,因为它需要根据上下文来预测被掩码的单词。下一句预测任务让模型学习到句子之间的逻辑关系。通过这两个任务的联合训练,模型能够学习到语言的通用表示。

举例说明

假设输入序列为[“我”, “去”, “银行”, “存钱”],我们随机掩码“银行”这个词,模型需要根据“我”“去”“存钱”来预测“银行”。在NSP任务中,如果有两个句子“我去银行存钱”和“然后我去超市买东西”,模型需要判断它们是连续的,输出标签为1。

项目实战:代码实际案例和详细解释说明

开发环境搭建

  1. 安装Python环境,建议使用Python 3.7及以上版本。
  2. 安装必要的库,如transformerstorch等。可以使用以下命令进行安装:
pip install transformers torch

源代码详细实现和代码解读

以下是一个使用BERT进行文本分类的完整代码示例:

from transformers import BertTokenizer, BertForSequenceClassification
import torch
from torch.utils.data import DataLoader, Dataset

# 自定义数据集类
class TextDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_length):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_length = max_length

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        text = self.texts[idx]
        label = self.labels[idx]
        encoding = self.tokenizer(text, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
        input_ids = encoding['input_ids'].squeeze()
        attention_mask = encoding['attention_mask'].squeeze()
        return {
            'input_ids': input_ids,
            'attention_mask': attention_mask,
            'labels': torch.tensor(label, dtype=torch.long)
        }

# 示例数据
texts = ["这是一个积极的句子", "这是一个消极的句子", "今天天气真好", "今天心情很糟糕"]
labels = [1, 0, 1, 0]

# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=2)

# 创建数据集和数据加载器
dataset = TextDataset(texts, labels, tokenizer, max_length=128)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

# 训练参数
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
num_epochs = 3

# 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

for epoch in range(num_epochs):
    model.train()
    total_loss = 0
    for batch in dataloader:
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['labels'].to(device)

        optimizer.zero_grad()
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        total_loss += loss.item()

    print(f'Epoch {epoch + 1}, Loss: {total_loss / len(dataloader)}')

# 预测
test_texts = ["这是一个很棒的体验"]
test_dataset = TextDataset(test_texts, [0] * len(test_texts), tokenizer, max_length=128)
test_dataloader = DataLoader(test_dataset, batch_size=1)

model.eval()
with torch.no_grad():
    for batch in test_dataloader:
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        outputs = model(input_ids, attention_mask=attention_mask)
        logits = outputs.logits
        predictions = torch.argmax(logits, dim=1)
        print(predictions)

代码解读与分析

  • 自定义数据集类TextDataset类继承自torch.utils.data.Dataset,用于封装文本数据和标签。在__getitem__方法中,使用分词器将文本转换为输入ID和注意力掩码。
  • 数据加载器:使用DataLoader将数据集按批次加载,方便训练和预测。
  • 模型训练:在每个epoch中,将模型设置为训练模式,遍历数据加载器,计算损失并进行反向传播和参数更新。
  • 预测:将模型设置为评估模式,使用torch.no_grad()禁用梯度计算,对测试数据进行预测。

实际应用场景

搜索引擎

搜索引擎是搜索排序模型最典型的应用场景。搜索引擎根据用户的查询,使用TF-IDF、BM25等模型计算文档与查询的相关性得分,然后对搜索结果进行排序。在深度学习时代,BERT等模型可以更好地理解用户查询的语义,提高搜索结果的相关性。

信息检索系统

在企业内部的信息检索系统中,搜索排序模型可以帮助员工快速找到所需的文档、资料等。例如,在一个大型公司的知识库中,员工可以通过输入关键词进行搜索,系统使用搜索排序模型对知识库中的文档进行排序,提供最相关的结果。

智能客服

智能客服系统也会用到搜索排序模型。当用户提出问题时,系统会从常见问题库中搜索最相关的答案。通过使用搜索排序模型,可以提高答案的准确性和匹配度,更好地满足用户的需求。

工具和资源推荐

工具

  • Hugging Face Transformers:一个开源的自然语言处理库,提供了各种预训练模型,包括BERT、GPT等,方便用户进行模型的加载和微调。
  • Scikit-learn:一个机器学习库,其中包含了TF-IDF等特征提取方法的实现,简单易用。

资源

  • Wikipedia:提供了丰富的关于搜索排序模型和自然语言处理的知识和资料。
  • ArXiv:一个学术论文预印本平台,上面有很多关于搜索排序模型的最新研究成果。

未来发展趋势与挑战

未来发展趋势

  • 多模态融合:未来的搜索排序模型可能会融合图像、音频、视频等多模态信息,提供更加全面和丰富的搜索结果。例如,用户在搜索“苹果”时,不仅可以得到文本信息,还可以看到苹果的图片、相关的视频等。
  • 个性化搜索:根据用户的历史搜索记录、兴趣爱好等信息,为用户提供个性化的搜索排序结果。这样可以更好地满足用户的个性化需求,提高用户体验。
  • 强化学习应用:将强化学习引入搜索排序模型,通过与用户的交互不断优化排序策略,提高搜索结果的质量。

挑战

  • 数据隐私和安全:随着搜索排序模型的发展,需要处理大量的用户数据。如何保护用户的数据隐私和安全是一个重要的挑战。
  • 模型可解释性:深度学习模型如BERT等通常是黑盒模型,难以解释其决策过程。在一些对解释性要求较高的场景中,如何提高模型的可解释性是一个亟待解决的问题。
  • 计算资源需求:现代的搜索排序模型如BERT等需要大量的计算资源进行训练和推理。如何降低计算资源的需求,提高模型的效率也是一个挑战。

总结:学到了什么?

核心概念回顾

  • TF-IDF:一种用于评估词在文档中重要性的方法,通过词频和逆文档频率来计算。
  • BM25:TF-IDF的升级版,考虑了文档长度等因素,能更准确地判断词的重要性。
  • word2vec:将单词转换为向量的工具,让计算机能理解单词的语义关系。
  • BERT:基于Transformer架构的预训练语言模型,能理解句子的上下文信息,在自然语言处理任务中表现出色。

概念关系回顾

TF-IDF和BM25是传统的基于统计的模型,用于计算文档与查询的相关性。word2vec为深度学习模型提供了单词的向量表示。BERT则是在深度学习时代发展起来的强大模型,综合了前面模型的优点,能更好地处理自然语言任务。它们之间是不断演进和发展的关系,每个模型都在前一个模型的基础上进行了改进和创新。

思考题:动动小脑筋

思考题一

你能想到生活中还有哪些地方可以用到搜索排序模型吗?比如在图书馆找书、在电商平台购物等,想一想还有其他场景吗?

思考题二

如果你要开发一个小型的搜索引擎,你会选择使用哪些模型,为什么?

附录:常见问题与解答

问题一:TF-IDF和BM25哪个更好?

答:这取决于具体的应用场景。TF-IDF简单易懂,计算效率高,适用于对计算资源要求不高的场景。BM25考虑了更多因素,在处理长文档等场景下表现更好,但计算复杂度相对较高。

问题二:BERT模型训练需要多长时间?

答:BERT模型训练时间取决于很多因素,如数据量大小、计算资源等。在大规模数据和强大的计算资源下,训练可能需要数天甚至数周。

扩展阅读 & 参考资料

  • 《自然语言处理入门》
  • 《深度学习》
  • Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv preprint arXiv:1810.04805.
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐