兴奋的
去年,伯特(Bert)模型发行后,我很兴奋。
因为我正在使用fast.ai执行自然语言分类任务(我还写了一篇特别的文章“”与您分享)。两位BERT都属于预先训练的语言模型(预 - ),并且具有许多相似之处。
所谓的语言模型使用深层神经网络结构来训练大量语言文本,以掌握语言的共同特征。
通常只有大型机构才能完成上述工作。因为成本太大了。
此费用包括但不限于:
预训练意味着他们在接受培训后打开了这一结果。我们的普通人或小型机构也可以借用结果并在我们的专业领域中微调我们自己的文本数据,以便该模型可以非常清楚地了解该专业领域的文本。
所谓的理解主要是指您阻止某些单词的事实,并且该模型可以更准确地猜测您所隐藏的内容。
即使您将两个句子放在一起,该模型也可以确定它们是否是紧密连接的上下文关系。
这“知识”有用吗?
当然有。
伯特(Bert)对多个自然语言任务进行了测试,许多结果超过了人类参与者。
当然,伯特可以协助解决任务,还包括文本分类(),例如情感分类等。这也是我目前正在研究的问题。
疼痛点
但是,为了使用伯特,我等了很长时间。
官方代码已开放。甚至实施也已经迭代了许多回合。
但是我只需要打开他们提供的样本,我感到头晕。
仅该代码中的行数非常可怕。
此外,一堆数据处理过程(数据)以数据集名称命名。我的数据不属于上述任何一个,所以我应该使用哪一个?
也有无数的莫名其妙的标志()也很麻烦。
让我们比较一下,这是相同的分类任务,其中的语法结构是什么。
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
即使图像分类的数据吞吐量很大并且需要许多步骤,您也可以使用Fast.ai轻松完成几行代码。
!git clone https://github.com/wshuyi/demo-image-classification-fastai.git
from fastai.vision import *
path = Path("demo-image-classification-fastai/imgs/")
data = ImageDataBunch.from_folder(path, test='test', size=224)
learn = cnn_learner(data, models.resnet18, metrics=accuracy)
learn.fit_one_cycle(1)
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_top_losses(9, figsize=(8, 8))
不要低估这些代码行。它不仅可以帮助您训练图像分类器,而且还告诉您模型在那些具有最高分类错误的图像中关注的位置。
比较,您认为Bert示例和Fast.AI示例之间的区别是什么?
我认为后者是让人们使用的。
教程
我一直认为有人会重构代码并写简洁的教程。
毕竟,文本分类任务是一种常见的机器学习应用程序。有许多应用程序方案,也适合初学者学习。
但是,我只是没有等待这样的教程。
当然,在此期间,我还阅读了许多人撰写的申请和教程。
有些人可以将一段自然语言文本转换为伯特编码。它突然结束了。
有些人仔细介绍了如何在提供的官方数据集中使用BERT。所有修改均在原始脚本上完成。所有未使用的功能和参数均保留。至于其他人如何重复自己的数据集?人们根本没有提到这一点。
我从一开始就考虑过咀嚼代码。我记得当我在研究生院学习时,我还阅读了模拟平台上TCP和IP层的所有C码。我确定了我面前的任务,这并不那么困难。
但是我真的不想这样做。我觉得我被机器学习框架(尤其是fast.ai and - 。
后来,开发人员将伯特带到了枢纽。还专门编写了样本。
我很高兴看到这个消息。
我在集线器上尝试了许多其他型号。使用非常方便。我在文章“”文章中向您介绍了它,这是一个很好的深度学习实践和演示环境。我认为可以将这两把剑结合在一起,这次我可以使用几行代码来处理自己的任务。
让我们等一下。
当您真正打开它时,您仍将专注于示例数据。
普通用户需要什么?需要接口。
您告诉我您输入的标准规格,然后告诉我结果可能是什么。插电,毕竟离开。
最初的文本分类任务为您提供了训练和测试集,告诉您训练回合的速度,然后告诉我准确率和结果?
至于要求我为这么简单的任务阅读数百行代码,并找出自己在哪里更改它?
幸运的是,以这个例子为基础,总比没有好。
我耐心解决了。
陈述,我没有对原始代码进行任何重大更改。
因此,如果您不清楚地解释它,您将被怀疑窃并会被鄙视。
对于那些知道它的人来说,这种组织在技术上并不困难。
但是由于这个,我生气了。这很难做吗?为什么Bert样本作者拒绝这样做?
为什么从1.0到2.0会有如此巨大的变化?不是因为2.0是人们使用的吗?
您不会使界面令人耳目一新,您的竞争对手(和Fast.ai)会做到这一点,他们做得很好。只有当我不能坐下时,我才愿意淡化贵族并为普通百姓开发有用的界面。
一堂课!你为什么不吸收它?
我会为您提供一个笔记本示例,您可以轻松地在自己的数据集中替换以运行。您需要了解(包括修改)代码,不超过10行。
我首先测试了英语文本分类任务,并且效果很好。因此,我写了一个博客,该博客立即包含在数据列中。
数据列的编辑向我发送了一条私人消息,说:
我非常喜欢这不是很确定。
实际上,有一个读者连续给了这篇文章50 (),我感到震惊。
看来这个长期痛苦的点不仅仅是我。
据估计,中国分类任务在您的研究中可能会遇到更多。因此,我简单地做了另一个中文文本分类的示例,并编写了本教程并与您分享。
让我们开始。
代码
请单击此链接()以查看我在其中为您制作的文件。
在顶部,有一个非常明显的“打开”按钮。单击它,它将自动打开并加载。
我建议您单击上图中的红色中圆圈的“复制到”按钮。这样,您可以将其保存在自己的首先使用和审查中。
完成此操作后,您实际上只需要执行以下三个步骤:
您的数据应以数据框架的形式组织。如果您不熟悉它,请参考我的文章中的这篇文章。
如有必要,可以调整训练参数。实际上,它主要涉及训练率(速率)和训练回合的数量()。
执行代码以获取结果。
保存时。如果您仔细观察,您可能会感到愚弄。
老师,你撒谎!同意,代码不超过10行!
不要焦虑。
在下图中的红色中,您无需修改任何内容。
请单击此句子的位置,然后选择从菜单中进行选择,如下图所示。
以下都是重要的链接,重点。
第一步是准备数据。
!wget https://github.com/wshuyi/demo-chinese-text-binary-classification-with-bert/raw/master/dianping_train_test.pickle
with open("dianping_train_test.pickle", 'rb') as f:
train, test = pickle.load(f)
您应该熟悉此处使用的数据。这是情感上的标签数据,用于餐饮评论,我在“和”中使用了它。但是,为了方便演示,我这次将其作为一种格式输出,并将其放在演示库中,以供您下载和使用。
培训集包含1,600块数据;该测试集包含400个数据。在标签中,1代表积极的情绪,0代表负面情绪。
使用以下语句,我们改组训练集()并破坏订单。避免过度拟合()。
train = train.sample(len(train))
让我们看一下训练集的头部内容。
train.head()
如果您想稍后更换自己的数据集,请注意该格式。培训和测试集的列名应该是一致的。
在第二步中,我们将设置参数。
myparam = {
"DATA_COLUMN": "comment",
"LABEL_COLUMN": "sentiment",
"LEARNING_RATE": 2e-5,
"NUM_TRAIN_EPOCHS":3,
"bert_model_hub":"https://tfhub.dev/google/bert_chinese_L-12_H-768_A-12/1"
}
前两行是清楚地指出文本和标记的相应列名。
第三行指定训练率。您可以阅读原始纸张以进行超参数调整。或者,您只能保持默认值不变。
第4行,指定训练回合的数量。将所有数据运行到一轮。这里使用了3轮。
如果您想学习如何使用这些参数,建议使用以下教科书。
最后一行显示您要使用的BERT预训练模型。我们想对中文文本进行分类,因此我们使用此中文预培训的模型地址。如果您想使用英语,则可以参考我的博客文章和相应的英语示例代码。
在最后一步中,我们依次执行代码。
result, estimator = run_on_dfs(train, test, **myparam)
请注意,执行此句子可能需要一些时间。做好精神准备。这与您的数据量和培训回合设置有关。
在此过程中,您可以看到该程序首先可以帮助您将原始的中文文本转变为Bert可以理解的输入数据格式。
当您在下图中看到文本在红色中循环时,这意味着训练过程终于结束了。
然后,您可以打印出测试结果。
pretty_print(result)
与我们以前的数据集进行比较。
当时,我不得不编写很多代码,我不得不运行10轮,但结果仍然不超过80%。这次,尽管我只接受了3轮训练,但准确率超过88%。
在这样的小规模数据集上实现这种准确性并不容易。
伯特的表现很明显。
概括
话虽如此,您已经学会了如何使用Bert来完成中文文本的二进制分类任务。我希望你能和我一样快乐。
如果您是退伍军人,请帮我一个忙。
还记得这一行之前的代码吗?
你能帮我打包吗?这样,我们的演示代码可以更短,更简洁,更清晰,更易于使用。
欢迎在我们的项目上提交您的代码。如果您觉得本教程有帮助,请在此项目中添加星星。谢谢!
愉快的深度学习!