惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
黑客
2019-07-29 · via 少数派

鱼我所欲也,熊掌亦我所欲也。

痛点

我之前用 BERT ,就没有痛快过。

最初,是 Google 发布的原始 Tensorflow 代码,一堆堆参数,一行行代码,扑面而来。让人看着,就眼晕。

后来,Google 把 BERT 在 Tensorflow Hub 上面打了个包。

还是需要很多行代码,许多参数设置,才能让它学习你自己提供的数据。不过我还是很兴奋地帮你重构代码,搞了个十行代码可执行版本

但这其实,不过是隐藏了大量细节而已。

那些繁琐的代码,依然在那里。

代码越多,修改和维护就越困难。

你看人家 fast.ai ,需要什么功能,只要找到对应的 API ,输入三样东西:

  • 数据
  • 模型架构
  • 损失函数

一般而言,只需要几行代码。

然后,结果就出来了。

这样,你可以很轻易尝试自己的想法,并且在不同数据集上面加以验证。

这种快速迭代反馈,对于机器学习研究来说,是非常有益处的。

因此,当 Huggingface 的 Kaushal Trivedi 真的起心动念,仿照 fast.ai 搞了个 fastbert 时,我特别开心。

于是又写了份教程,教你如何用它来做多标签文本分类。

但是,这个 fastbert ,与 fast.ai 比起来,差别还是太大了。

首先是设置起来依旧繁琐,你得照顾到许多参数;

其次是维护并不及时。两次更新之间的时间,竟然可能相差一个月;

第三是缺乏文档和样例。这对于新手,是非常不友好的。

几乎所有遭遇到这些问题的人,都在问一个问题:

什么时候,才能在 fast.ai 里面,方便地调用 BERT 来完成自然语言处理任务呢?

大部分人,只是动动念头,然后继续将就着使用 fast.ai 提供的 ULMfit 来处理英文文本。

毕竟,对于英文、波兰文来说,效果也不错

可是,中文怎么办?

ULMfit 推出1年多了,至今却没有一个公开发布、广泛使用的中文预训练模型。

这真是令人烦恼的事儿啊!

黑客

有需求,也就有人来琢磨解决。

fast.ai 结合 BERT 这问题,对研究者的要求,着实不低。至少包括:

  • 熟悉 fast.ai 框架机制;
  • 熟悉 BERT 工作原理;

此外,还得能够融汇贯通,把二者结合起来,这就需要对 PyTorch 的熟练掌握。

能做出这样工作的人,大约就算是黑客了。

幸好,这样的高人真的出手了。

他就是卡内基梅隆大学的研究生,Keita Kurita。

Keita 有个博客,叫 Machine Learning Explained ,干货非常多,这里一并推荐给你。

他写的 fast.ai 结合 BERT 的英文教程,地址在这里

其实,有时候问题的解决,就如同窗户纸,一捅就破。

Keita 并没有尝试“重新发明轮子”,即从头去解决这个问题。

他只是巧妙地借用了第三方的力量,并且将其与 fast.ai 融合起来。

这个第三方,就是咱们前面提过的 Huggingface 。

自从 BERT 的 Tensorflow 源代码经由 Google 发布出来,他们就在 Github 上面,搞了一个 PyTorch 版本的克隆。

这个克隆,还包含了预训练的结果。

也就是说,他们提供了一个完整版的模型架构,只要配上相应的数据和损失函数, fast.ai 就可以开工了!

fast.ai 文本处理一直不支持中文,是因为它其实也调用了第三方库,就是咱们介绍过的 Spacy

到今天为止, Spacy 也并不能完整支持中文处理,这就导致了 fast.ai 对中文无能为力。

但是, BERT 可不是这样。

它很早就有专门的中文处理工具和预训练模型。

关键是,如何在 fast.ai 中,用它替换掉 Spacy 来使用。

Keita 的文章,一举解决了上述两个问题。

便捷的 fast.ai 框架就这样和强大的 BERT 模型嫁接了起来。

变化

受 Keita 的影响,其他作者也尝试了不同的任务和数据集,并且把自己的代码和工作流程也做了发布。

例如 abhik jha 这篇 “Fastai integration with BERT: Multi-label text classification identifying toxicity in texts”(地址在这里),还在 Twitter 受到了 Jeremy Howard (fast.ai 联合创始人)点赞。

蒙天放这篇知乎教程,更讲解了如何处理中文数据分类。

看起来,我似乎没有必要再写一篇教程了。

然而环境是在变化的。

Huggingface 现在,已经不仅仅做 BERT 预训练模型的 PyTorch 克隆了。

他们居然希望把所有的 Transformer 模型,全都搞一遍。

于是把原先的 Github 项目“pytorch-pretrained-BERT”,改成了“pytorch-transformers”这样一个野心勃勃的名字。

新的项目地址在这里

你的想象空间,也就可以因此而开启了。

能不能用这些基于 Transformer 的预训练模型,来做自己的下游任务呢?

一如既往, Huggingface 的技术还是那么过硬。

然而,提供的接口,还是那么繁琐。虽然用户手册比之前有了较大改进,可教程样例依然不够友好。

我于是在思考,既然老版本 BERT 预训练模型可以和 fast.ai 对接,那能否把新版本的各种 Transformer,也用这种方式简化调用呢?

如果这样做可以的话,咱们就不必再眼巴巴等着 Huggingface 改进教程与用户接口了,直接用上 fast.ai ,取两者的长处,结合起来就好了。

于是,我开始了尝试。

一试才发现,新版本“pytorch-transformers”的预训练模型,与老版本还有一些变化。倘若直接迁移代码,会报错的。

所以,这篇文章里,我从头到尾,为你提供一个在新版本“pytorch-transformers” 中 BERT 预训练模型上直接能用的样例,并且加以详细讲解。

这样一来,相信我踩了一遍的坑,你就可以躲开了。这可以大量节省你的时间。

同时,我也希望你能够以这个样例作为基础,真正做到举一反三,将其他的 Transformer 模型尝试迁移,并且把你的试验结果,分享给大家。

环境

本文的配套源代码,我放在了 Github 上。

你可以在我的公众号“玉树芝兰”(nkwangshuyi)后台回复“aibert”,查看完整的代码链接。

如果你对我的教程满意,欢迎在页面右上方的 Star 上点击一下,帮我加一颗星。谢谢!

注意这个页面的中央,有个按钮,写着“在 Colab 打开”(Open in Colab)。请你点击它。

然后,Google Colab 就会自动开启。

我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。

Colab 为你提供了全套的运行环境。你只需要依次执行代码,就可以复现本教程的运行结果了。

如果你对 Google Colab 不熟悉,没关系。我这里有一篇教程,专门讲解 Google Colab 的特点与使用方式。

为了你能够更为深入地学习与了解代码,我建议你在 Google Colab 中开启一个全新的 Notebook ,并且根据下文,依次输入代码并运行。在此过程中,充分理解代码的含义。

这种看似笨拙的方式,其实是学习的有效路径。

代码

首先提示一下,fast.ai 给我们提供了很多便利,例如你只需要执行下面这一行,许多数据科学常用软件包,就都已经默认读入了。

from fastai.text import *

因此,你根本就不需要执行诸如 import numpy as npimport torch 之类的语句了。

下面,我们本着 fast.ai 的三元素(数据、架构、损失函数)原则,首先处理数据。

先把数据下载下来。

!wget https://github.com/wshuyi/public_datasets/raw/master/dianping.csv

这份大众点评情感分类数据,你应该已经很熟悉了。之前的教程里面,我多次用它为你演示中文二元分类任务的处理。

让我们用 Pandas ,读入数据表。

df = pd.read_csv("dianping.csv")

下面是划分训练集、验证集和测试集。我们使用 scikit-learn 软件包协助完成。

from sklearn.model_selection import train_test_split

首先,我们把全部数据,分成训练和测试集。

注意这里我们设定 random_state ,从而保证我这儿的运行结果,在你那里可复现。这可是“可重复科研”的基本要件。

train, test = train_test_split(df, test_size=.2, random_state=2)

之后,我们再从原先的训练集里,切分 20% ,作为验证集。依旧,我们还是要设置random_state

train, valid = train_test_split(train, test_size=.2, random_state=2)

之后,咱们检查一下不同数据集合的长度。

训练集:

len(train)

验证集:

len(valid)

测试集:

len(test)

然后,来看看训练集前几行内容。

train.head()

数据预处理的第一步,已经做完了。

但是,我们都知道,机器学习模型是不认识中文的,我们必须做进一步的处理。

这时候,就需要 Huggingface 的 Transformers 预训练模型登场了。

!pip install pytorch-transformers

本文演示的是 BERT ,所以这里只需要读入两个对应模块。

一个是 Tokenizer ,用于把中文句子,拆散成一系列的元素,以便映射成为数字来表示。

一个是序列分类模块。在一堆 Transformer 的顶部,通过全连接层,来达到分类功能。

from pytorch_transformers import BertTokenizer, BertForSequenceClassification

我们指定几个必要的参数。

例如每句话,最长不能超过128个字。

每次训练,用32条数据作为一个批次。

当然,我们用的预训练模型,是中文的,这也得预先讲好。

bert_model = "bert-base-chinese"
max_seq_len = 128
batch_size = 32

设置参数之后,我们就可以读取预置的 Tokenizer 了,并且将它存入到 bert_tokenizer 变量中。

bert_tokenizer = BertTokenizer.from_pretrained(bert_model)

我们检查一下,看预训练模型都认识哪些字。

这里我们随意选取从 2000 到 2005 位置上的 Token 来查看。

list(bert_tokenizer.vocab.items())[2000:2005]

这里我们看到, BERT 还真是认识不少汉字的。

我们把全部的词汇列表存储起来,下面要用到。

bert_vocab = Vocab(list(bert_tokenizer.vocab.keys()))

注意 fast.ai 在 Tokenizer 环节,实际上设计的时候有些偷懒,采用了“叠床架屋”的方式。

反正最终调用的,是 Spacy ,因此 fast.ai 就把 Spacy Tokenizer 作为底层,上层包裹,作为自己的 Tokenizer 。

我们这里做的工作,就是重新定义一个新的 BertFastaiTokenizer ,最重要的功能,就是把 Spacy 替掉。另外,在每一句话前后,根据 BERT 的要求,加入起始的 [CLS] 和结束位置的 [SEP],这两个特殊 Token 。

class BertFastaiTokenizer(BaseTokenizer):
    def __init__(self, tokenizer, max_seq_len=128, **kwargs):
        self.pretrained_tokenizer = tokenizer
        self.max_seq_len = max_seq_len

    def __call__(self, *args, **kwargs):
        return self

    def tokenizer(self, t):
        return ["[CLS]"] + self.pretrained_tokenizer.tokenize(t)[:self.max_seq_len - 2] + ["[SEP]"]

我们把这个类的调用,作为一个函数保存。

tok_func = BertFastaiTokenizer(bert_tokenizer, max_seq_len=max_seq_len)

然后,最终的 Tokenizer, 是把这个函数作为底层,融入其中的。

bert_fastai_tokenizer = Tokenizer(
    tok_func=tok_func,
    pre_rules = [],
    post_rules = []
)

我们设定工作目录为当前目录。

path = Path(".")

之后,得把训练集、验证集和测试集读入。

注意我们还需要指定数据框里面,哪一列是文本,哪一列是标记。

另外,注意 fast.ai 和 BERT 在特殊 Token 定义上的不同。 include_bosinclude_eos 要设定为 False ,否则两套系统间会冲突。

databunch = TextClasDataBunch.from_df(path, train, valid, test,
                  tokenizer=bert_fastai_tokenizer,
                  vocab=bert_vocab,
                  include_bos=False,
                  include_eos=False,
                  text_cols="comment",
                  label_cols='sentiment',
                  bs=batch_size,
                  collate_fn=partial(pad_collate, pad_first=False, pad_idx=0),
             )

让我们来看看预处理之后的数据吧:

databunch.show_batch()

在 fast.ai 里面,正常出现了 BERT 风格的中文数据预处理结果,还是很令人兴奋的。

注意,前面我们指定了 pre_rulespost_rules 两个参数,都写成 [] 。这是必要的。

我尝试了一下,如果按照默认值,不提这两个参数,那么二者默认都是 None 。这样一来,数据预处理结果就会成这样。

screenshot.1cb26c1bae14411db79e2a1e75d884ce.png
screenshot.1cb26c1bae14411db79e2a1e75d884ce.png

这和我们需要的结果,不一致。所以此处需要留意。

第一个元素,数据有了。

下面我们来处理架构

Huggingface 的网页上面介绍,说明了新的 Transformer 模型和原先版本的 BERT 预训练模型差异。

最大的不同,就是所有的模型运行结果,都是 Tuple 。即原先的模型运行结果,都用括号包裹了起来。括号里,可能包含了新的数据。但是原先的输出,一般作为新版 Tuple 的第一个元素。

可是 fast.ai 默认却不是这样的。

为了避免两个框架沟通中的误解,我们需要定义一个类。

它只做一件事情,就是把 forward 函数执行结果,只取出来第一项作为结果使用。

代码很简单:

class MyNoTupleModel(BertForSequenceClassification):
  def forward(self, *args, **kwargs):
    return super().forward(*args, **kwargs)[0]

下面,我们来用新构建的类,搭模型架构。

注意你需要说明分类任务要分成几个类别。

我们这里是二元分类,所以写2。

bert_pretrained_model = MyNoTupleModel.from_pretrained(bert_model, num_labels=2)

现在,只剩下第三个元素了,那就是损失函数

因为要做二元分类,输出的结果按照 fast.ai 的要求,会是 [0.99, 0.01] 这样。所以损失函数我们选择 nn.CrossEntropyLoss

loss_func = nn.CrossEntropyLoss()

三大要素聚齐,我们终于可以构建学习器 Learner 了。

learn = Learner(databunch,
                bert_pretrained_model,
                loss_func=loss_func,
                metrics=accuracy)

有了 Learner ,剩下的工作就简单了许多。

例如,我们可以寻找一下最优的最大学习速率。

learn.lr_find()

找到后,绘制图形。

learn.recorder.plot()

读图以后,我们发现,最大学习速率的量级,应该在 e-5 上。这里我们设置成 2e-5 试试。

这里,只跑两个轮次,避免过拟合。

当然,也有省时间的考虑。

learn.fit_one_cycle(2, 2e-5)

验证集上,效果还是很不错的。

但是,我们不能只拿验证集来说事儿。还是得在测试集上,看真正的模型分类效果。

这里面的原因,我在《如何正确使用机器学习中的训练集、验证集和测试集?》一文中,已经为你做了详细的解释。

如果忘了,赶紧复习一下。

我们用笨办法,预测每一条测试集上的数据类别。

定义一个函数。

def dumb_series_prediction(n):
  preds = []
  for loc in range(n):
    preds.append(int(learn.predict(test.iloc[loc]['comment'])[1]))
  return preds

实际执行,结果存入到 preds 里面。

preds = dumb_series_prediction(len(test))

查看一下前 10 个预测结果:

preds[:10]

我们还是从 scikit-learn 里面读入分类报告和混淆矩阵模块。

from sklearn.metrics import classification_report, confusion_matrix

先看分类报告:

print(classification_report(test.sentiment, preds))

f1-score 达到了 0.9 ,很棒!

再通过混淆矩阵,看看哪里出现判断失误。

print(confusion_matrix(test.sentiment, preds))

基于 BERT 的中文分类任务完成!

小结

通过这篇文章的学习,希望你掌握了以下知识点:

  • 如何在 fast.ai 中使用自定义 Tokenizer;
  • 如何根据与训练模型要求,微调特殊 Token 设置;
  • 如何在 fast.ai 中调用 Transformer 预训练模型;
  • 如何把自己的数据、架构和损失函数封装在 fast.ai 学习器中。

如前文所述,希望你举一反三,尝试把 Huggingface 推出的其他 Transformer 预训练模型与 fast.ai 结合起来。

欢迎你把尝试的结果在留言区分享给其他同学。

祝深度学习愉快!

征稿

SSCI 检索期刊 Information Discovery and Delivery 要做一期《基于语言机器智能的信息发现》( “Information Discovery with Machine Intelligence for Language”) 特刊(Special Issue)。

本人是客座编辑(guest editor)之一。另外两位分别是:

征稿的主题包括但不限于:

  • Language Modeling for Information Retrieval
  • Transfer Learning for Text Classification
  • Word and Character Representations for Cross-Lingual Analysis
  • Information Extraction and Knowledge Graph Building
  • Discourse Analysis at Sentence Level and Beyond
  • Synthetic Text Data for Machine Learning Purposes
  • User Modeling and Information Recommendation based on Text Analysis
  • Semantic Analysis with Machine Learning
  • Other applications of CL/NLP for Information Discovery
  • Other related topics

具体的征稿启事(Call for Paper),请查看 Emerald 期刊官网的这个链接(http://dwz.win/c2Q)。

作为本专栏的老读者,欢迎你,及你所在的团队踊跃投稿哦。

如果你不巧并不从事上述研究方向(机器学习、自然语言处理和计算语言学等),也希望你能帮个忙,转发这个消息给你身边的研究者,让他们有机会成为我们特刊的作者。

谢谢!

延伸阅读

你可能也会对以下话题感兴趣。点击链接就可以查看。

题图: Photo by Harley-Davidson on Unsplash