我最初的计划是涵盖这个主题:“如何使用Python和BigQuery构建一个机器人来自动执行无意识的任务”。我做了一些轻微的课程改变,但希望,原来的意图保持不变!

本文的灵感来自于此推文 JR奥克斯。 ?

正如优步发布的那样 Ludwig的更新版本 谷歌也宣布了在BigQuery中执行Tensorflow模型的能力,我认为时机不可能更好。

在本文中,我们将重新审视意图分类问题 我以前说过,但我们将用最先进的编码器替换我们的原始编码器:BERT,代表 变压器的双向编码器表示。

这个小改动将帮助我们将模型精度从0.66组合测试精度提高到0.89,同时使用相同的数据集而无需自定义编码!

以下是我们的行动计划:

  • 我们将重建我们在第一部分上构建的意图分类模型,但我们将使用BERT编码器来利用预训练数据。
  • 我们将针对从Google Search Console提取的问题再次对其进行测试。
  • 我们将查询和意图预测数据上传到BigQuery。
  • 我们将BigQuery与Google Data Studio联系起来,根据他们的意图对问题进行分组,并提取可用于确定内容开发工作优先级的可操作见解。
  • 我们将介绍一些新的基础概念,这些概念有助于BERT的性能明显优于我们之前的型号。

设置Google Colaboratory

与第一部分一样,我们将从内部运行路德维希 Google Colaboratory 为了使用他们的免费GPU运行时。

首先,运行此代码以检查安装的Tensorflow版本。

导入张量流为tf;打印(TF .__ version__)

让我们确保我们的笔记本使用Ludwig所期望的正确版本,并且它还支持GPU运行时。

我得到了1.14.0,这对路德维希来说很棒 要求 至少1.14.0

在Runtime菜单项下,选择Python 3和GPU。

您可以输入以下内容确认您拥有GPU:

! NVIDIA-SMI

在撰写本文时,您需要在安装最新的Ludwig(0.2)之前安装一些系统库。我后来遇到了一些错误 解决。

!apt-get install libgmp-dev libmpfr-dev libmpc-dev

当我安装失败时,我找到了StackOverflow的解决方案 回答,甚至不被接受的!

!pip安装路德维希

你应该得到:

成功安装了gmpy-1.17 ludwig-0.2

准备数据集进行培训

我们将使用相同的 问题分类数据集 我们在第一篇文章中使用过的。

登录到Kaggle并下载数据集后,您可以使用该代码将其加载到Colab中的数据框。

配置BERT编码器

我们将使用最近添加到Ludwig的BERT编码器,而不是使用我们在第一部分中使用的并行CNN编码器。

该编码器利用预先训练的数据,使其能够比我们以前的编码器更好地执行,同时需要更少的训练数据。我将在本文末尾以简单的术语解释它是如何工作的。

我们先下载一个 预训练语言模型。我们将下载BERT-Base型号的文件,Uncased。

我首先尝试了更大的模型,但由于其内存要求和Google Colab的局限性,我遇到了一些障碍。

!wget https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

解压缩:

!unzip uncased_L-12_H-768_A-12.zip

输出应如下所示:

存档:uncased_L-12_H-768_A-12.zip创建:uncased_L-12_H-768_A-12 / inflating:uncased_L-12_H-768_A-12 / bert_model.ckpt.meta inflating:uncased_L-12_H-768_A-12 / bert_model.ckpt。 data-00000-of-00001 inflating:uncased_L-12_H-768_A-12 / vocab.txt inflating:uncased_L-12_H-768_A-12 / bert_model.ckpt.index inflating:uncased_L-12_H-768_A-12 / bert_config.json

现在我们可以将模型定义文件放在一起。

让我们将它与我们在第一部分中创建的那个进行比较。

我做了一些改变。我们来回顾一下吧。

我基本上将编码器从parallel_cnn更改为bert并添加了额外的参数 需要 by bert:config_path,checkpoint_path,word_tokenizer,word_vocab_file,padding_symbol和unknown_symbol。

大多数值来自我们下载的语言模型。

我添加了一些我凭经验得出的参数:batch_size,learning_rate和word_sequence_length_limit。

Ludwig用于这些参数的默认值对BERT编码器不起作用,因为它们与预训练数据相比是偏离的。我发现了一些有用的价值观 BERT文档。

培训过程与我们之前完成的过程相同。但是,我们需要先安装bert-tensorflow。

!pip install bert-tensorflow!ludwig experiment –data_csv Question_Classification_Dataset.csv –model_definition_file model_definition.yaml

仅在两个时代之后,我们击败了之前的模型表现。

在10个时期之后,最终的改进是0.89组合测试精度。我们以前的模型用了14个时代来达到.66。

考虑到我们没有编写任何代码,这非常值得注意。我们只更改了一些设置。

令人难以置信和令人兴奋的是,深度学习研究的速度有多快以及现在的可访问性如何。

为什么BERT表现如此之好

与传统编码器相比,使用BERT有两个主要优点:

  • 双向字嵌入。
  • 语言模型通过转移学习来利用。

双向Word嵌入

当我在第一部分中解释单词向量和嵌入时,我指的是传统方法(我在假想空间中使用了坐标的GPS类比)。

传统的单词嵌入方法为每个单词分配相当于GPS的坐标。

让我们回顾一下“华盛顿”这个词的不同含义来说明为什么在某些情况下这可能是一个问题。

  • 乔治华盛顿(人)
  • 华盛顿(州)
  • 华盛顿特区(市)
  • 乔治华盛顿大桥(桥)

上面的“华盛顿”一词代表了完全不同的东西,并且不管上下文如何分配相同坐标的系统都不会非常精确。

如果我们在谷歌的纽约办事处并且我们想访问“华盛顿”,我们需要提供更多背景信息。

  • 我们打算参观乔治华盛顿纪念馆吗?
  • 我们打算开车去南方参观华盛顿特区吗?
  • 我们计划到华盛顿州进行越野旅行吗?

正如您在文中看到的那样,周围的单词提供了一些可以更清楚地定义“华盛顿”可能含义的背景。

如果你从左到右阅读,乔治这个词可能表明你在谈论这个人,如果你从右到左阅读,那么单词D.C.可能表明你指的是这个城市。

但是,你需要从左到右,从右到左阅读,告诉你实际上想要访问这座桥。

BERT通过为每个单词用法编码不同的单词嵌入来工作,并依赖于周围的单词来实现这一点。它双向读取上下文单词(从左到右,从右到左)。

回到我们的GPS类比,想象一下纽约市街区,在同一条街上有两家星巴克咖啡店。如果您想要获得特定的产品,那么之前和/或之后的业务将更容易引用它。

转学习

转学是当今深度学习中最重要的概念之一。即使您有非常小的数据集进行训练,它也会使许多应用程序变得实用。

传统上,转移学习主要用于计算机视觉任务。

您通常拥有来自大公司(谷歌,Facebook,斯坦福等)的研究小组,在像Imagenet这样的大型数据集上训练图像分类模型。

这个过程需要数天,而且通常非常昂贵。但是,一旦训练完成,训练模型的最后部分将被替换,并重新训练新数据以执行类似但新的任务。

这个过程称为微调,效果非常好。微调可能需要数小时或数分钟,具体取决于新数据的大小,大多数公司都可以访问。

让我们回到我们的GPS类比来理解这一点。

假设您想从纽约市前往华盛顿州,而您认识的人将前往密歇根州。

你可以徒步乘坐汽车前往密歇根州,然后租一辆汽车从密歇根州开往华盛顿州,而且费用和驾驶时间都要低得多。

BERT是首批在NLP(自然语言处理)中成功应用转移学习的模型之一。有几种预先训练过的模型通常需要数天才能进行训练,但如果您使用Google Cloud TPU,则可以在数小时甚至数分钟内进行微调。

使用BigQuery和Data Studio自动化Intent Insights

现在我们已经有了经过培训的模型,我们可以使用我创建的报告测试我们可以从Google Search Console获取的新问题 第一部分。

我们可以像以前一样运行相同的代码来生成预测。

这一次,我还想将它们导出为CSV并导入到BigQuery中。

test_df.join(predictions)((“Query”,“Clicks”,“Impressions”,“Category0_predictions”,“Category2_predictions”))。to_csv(“intent_predictions.csv”)

首先,登录Google Cloud。

!gcloud auth login –no-launch-browser

在单独的选项卡中打开授权窗口,然后将令牌复制回Colab。

在Google云端存储中创建一个存储桶并将CSV文件复制到那里。我将我的桶命名为bert_intent_questions。

此命令会将我们的CSV文件上传到我们的存储桶。

!gsutil cp -r intent_predictions.csv gs:// bert_intent_questions

您还应该在BigQuery中创建一个数据集来导入该文件。我将我的数据集命名为bert_intent_questions

!bq load –autodetect –source_format = CSV bert_intent_questions.intent_predictions gs://bert_intent_questions/intent_predictions.csv

在我们对BigQuery进行预测之后,我们可以将它连接到Data Studio并创建一个超级有价值的报告,以帮助我们可视化哪些意图具有最大的机会。

在我将Data Studio连接到BigQuery数据集之后,我创建了一个新字段:通过划分展示次数和点击次数来实现点击率。

由于我们根据预测的意图对查询进行分组,因此我们可以找到具有较高搜索展示次数和较少点击次数的内容机会。那些是较浅的蓝色方块。

学习过程如何运作

我想介绍最后一个基本主题,以扩展我在第一部分中简要介绍的编码器/解码器的想法。

让我们看看下面的图表,它们可以帮助我们想象培训过程。

但是,到底发生了什么?机器学习模型如何能够执行我们正在训练的任务?

第一个图表显示每个训练步骤(蓝线)的误差/损失如何减少。

但是,更重要的是,当模型在“看不见的”数据上进行测试时,错误也会减少。然后,有一点没有进一步的改进。

我喜欢将此培训过程视为通过反复试验消除输入中的噪音/错误,直到您留下对于手头任务至关重要的内容。

有一些随机搜索涉及了解要删除的内容和要保留的内容,但是由于理想的输出/行为是已知的,因此随机搜索可以是超选择性和高效的。

再说一遍,你想从纽约开车到华盛顿,所有的道路都被积雪覆盖。在这种情况下,编码器将扮演吹雪卡车的角色,其任务是为您划出一条道路。

它具有目的地的GPS坐标,可以用它来说明它的距离或距离,但需要通过智能试验和错误找出如何到达那里。解码器将是我们的汽车跟随吹雪机为这次旅行创造的道路。

如果吹雪机向南移动太远,它可以说它走向错误的方向,因为它越来越远离最终的GPS目的地。

关于过度拟合的注记

在吹雪机完成之后,很容易记住到达那里所需的所有转弯,但是如果我们需要走弯路并且没有为此划出道路,那将使我们的行程变得不灵活。

因此,记忆并不好,在深度学习术语中被称为过度拟合。理想情况下,吹雪机会不止一种方式到达我们的目的地。

换句话说,我们需要尽可能广义的路线。

我们通过在培训过程中保留数据来实现这一目标。

我们使用测试和验证数据集来使我们的模型尽可能通用。

关于BigQuery的Tensorflow的注释

我试图直接从BigQuery运行我们的预测,但是当我尝试导入我们训练过的模型时遇到了障碍。

!bq查询 –use_legacy_sql = false “CREATE MODEL bert_intent_questions.BERT OPTIONS (MODEL_TYPE ='TENSORFLOW', MODEL_PATH ='gs:// bert_intent_questions / *')”

BigQuery抱怨模型的大小超出了他们的极限。

等待bqjob_r594b9ea2b1b7fe62_0000016c34e8b072_1 …(0s)当前状态:DONE查询操作中的BigQuery错误:处理作业时出错'sturdy-now-248018:bqjob_r594b9ea2b1b7fe62_0000016c34e8b072_1':读取数据时出错,错误消息:Total TensorFlow数据大小超过允许的最大大小;总尺寸至少为:1319235047;允许的最大尺寸为:268435456

我伸出了他们的支持,他们提出了一些建议。我在这里分享它们以防有人找到时间来测试它们。

资源以了解更多信息

当我开始学习深度学习课程时,我没有看到BERT或任何最新的神经网络架构。

然而,我收到的基础,帮助我很快掌握了新的概念和想法。我发现学习新进展最有用的文章之一是这一篇: Illustrated BERT,ELMo和co。 (NLP如何破解转移学习)。

我还发现这个非常有用:纸张解剖: BERT:用于语言理解的深度双向变压器的预训练“解释 而另一个来自同一出版物: 论文解析:“XLNet:语言理解的广义自回归预训练”解释。

BERT最近 被殴打 通过一个名为XLNet的新模型。我希望在将来的文章中提及Ludwig。

SEO社区中的Python势头继续增长。这里有些例子:

Paul Shapiro本月早些时候将Python带到了MozCon舞台。他 共享脚本 他在演讲中讨论过。

当我在Twitter上分享代码片段时,我感到非常惊喜 泰勒里尔顿一个SEO的同事,很快发现了我错过的一个错误,因为他创造了一个 类似的代码 独立。

迈克尔韦伯分享了他的精彩 排名预测 使用多层感知器分类器和 Antoine Eripret 共享一个超级有价值 robot.txt更改监视器!

我还要提一下,JR为opensource.com提供了一个非常有用的Python文章 Google Natural Language API的实际用例。

图片来源

所有截图均由作者拍摄,2019年7月