原文:NeptuneAI Blog
协议:CC BY-NC-SA 4.0
原文:https://web.archive.org/web/https://neptune.ai/blog/backpropagation-algorithm-in-neural-networks-guide
本文是对反向传播算法的全面指导,反向传播算法是用于训练人工神经网络的最广泛使用的算法。我们将从在训练神经网络的过程中定义正向和反向传递开始,然后我们将集中讨论反向传播在反向传递中是如何工作的。我们将研究反向传播算法的详细数学计算。
此外,我们将基于这个 GitHub 项目讨论如何使用 NumPy 从零开始用 Python 实现一个反向传播神经网络。该项目建立了一个通用的反向传播神经网络,可以与任何架构。
让我们开始吧。
在最简单的情况下,神经网络的架构由一些连续的层组成,其中编号为 i 的层连接到编号为 i+1 的层。这些层可以分为 3 类:
- 投入
- 隐藏的
- 输出
下图显示了全连接人工神经网络(FCANN)的示例,这是演示反向传播算法如何工作的最简单的网络类型。该网络有一个输入层、两个隐藏层和一个输出层。在图中,网络体系结构是水平显示的,每一层都是从左到右垂直显示的。
每层由一个或多个用圆圈表示的神经元组成。因为网络类型是全连接的,那么层 i 中的每个神经元都与层 i+1 中的所有神经元相连。如果 2 个后续层具有 X 和 Y 神经元,则中间连接的数量为 XY* 。
对于每个连接,都有一个相关的权重。权重是一个浮点数,用于衡量两个神经元之间连接的重要性。权重越高,联系越重要。权重是网络进行预测的可学习参数。如果权重是好的,那么网络做出准确的预测,误差更小。否则,应该更新权重以减小误差。
假设在层 1 的一个神经元 N [1] 连接到在层 2 的另一个神经元 N [2] 。还假设 N [2] 的值是根据下一个线性方程计算的。
N[2]= w[1]N[1]+b
如果 N [1] =4,w [1] =0.5(权重),b=1(偏差),那么 N [2] 的值就是 3。
N [2] =0.54+1=2+1=3
这就是单个重量如何将两个神经元连接在一起。请注意,输入层根本没有可学习的参数。
层 i+1 的每一个神经元对于层 i 的每一个连接的神经元都有一个权重,但是它只有一个单一的偏向。因此,如果层 i 具有 10 个神经元,层 i+1 具有 6 个神经元,则层 i+1 的参数总数为:
权重数+偏差数=10×6 +6=66
输入层是网络中的第一层,它由网络的输入直接连接。网络中只能有一个输入层。例如,如果输入是一个学期的学生成绩,那么这些成绩将连接到输入图层。在我们的图中,输入层有 10 个神经元(例如,10 门课程的分数——一个英雄学生上了 10 门课程/学期)。
输出层是返回网络预测输出的最后一层。和输入层一样,只能有一个输出层。如果网络的目标是预测下学期的学生成绩,那么输出层应该返回一个分数。下图中的架构有一个返回下一学期预测分数的神经元。
在输入层和输出层之间,可能有 0 个或更多隐藏层。在本例中,有两个隐藏层,分别包含 6 个和 4 个神经元。请注意,最后一个隐藏层连接到输出层。
通常,隐藏层中的每个神经元使用类似 sigmoid 或整流线性单元(ReLU)的激活函数。这有助于捕捉输入和输出之间的非线性关系。输出层中的神经元也使用类似 sigmoid(用于回归)或 SoftMax(用于分类)的激活函数。
构建好网络架构后,就该开始用数据训练它了。
为了训练神经网络,有两个阶段:
- 向前
- 向后的
在前向传递中,我们从将数据输入传播到输入层开始,经过隐藏层,从输出层测量网络的预测,最后根据网络做出的预测计算网络误差。
该网络误差衡量网络距离做出正确预测还有多远。例如,如果正确的输出是 4,网络的预测是 1.3,那么网络的绝对误差是 4-1.3=2.7。注意,将输入从输入层传播到输出层的过程称为正向传播。计算出网络误差后,前向传播阶段结束,后向传递开始。
下图显示了一个指向向前传播方向的红色箭头。
在反向传递中,流程是反向的,因此我们从将误差传播到输出层开始,直到通过隐藏层到达输入层。将网络误差从输出层传播到输入层的过程称为反向传播,或简单的反向传播。反向传播算法是用来更新网络权重以减少网络误差的一组步骤。
在下图中,蓝色箭头指向向后传播的方向。
向前和向后的阶段从一些时期开始重复。在每个时期,会发生以下情况:
- 输入从输入层传播到输出层。
- 计算网络误差。
- 误差从输出层传播到输入层。
我们将关注反向传播阶段。让我们讨论一下使用反向传播算法的优点。
前面我们讨论过,网络是用两个通道训练的:向前和向后。在正向传递结束时,计算网络误差,该误差应尽可能小。
如果当前误差较高,则网络没有从数据中正确学习。这是什么意思?这意味着当前的权重集不够精确,不足以减少网络误差并做出准确的预测。因此,我们应该更新网络权重以减少网络误差。
反向传播算法是负责以减少网络误差为目标更新网络权重的算法之一。挺重要的。
以下是反向传播算法的一些优点:
- 在计算导数时,它是内存高效的,因为与其他优化算法相比,它使用更少的内存,如遗传算法。这是一个非常重要的特性,尤其是对于大型网络。
- 反向传播算法速度很快,尤其适用于中小型网络。随着更多层和神经元的加入,随着更多导数的计算,它开始变得更慢。
- 这种算法足够通用,可用于不同的网络架构,如卷积神经网络、生成对抗网络、全连接网络等。
- 没有参数来调整反向传播算法,因此开销较少。该过程中唯一的参数与梯度下降算法有关,如学习速率。
接下来,让我们基于一个数学示例来看看反向传播算法是如何工作的。
基于一个简单的网络可以很好地解释该算法的工作原理,如下图所示。它只有一个有 2 个输入的输入层(X [1] 和 X [2] )和一个有 1 个输出的输出层。没有隐藏层。
输入的权重分别为 W [1] 和 W [2] 。偏差被视为输出神经元的新输入神经元,其具有固定值+1 和权重 b。权重和偏差都可以被称为参数。
假设输出层使用由以下等式定义的 sigmoid 激活函数:
其中 s 是每个输入与其相应重量之间的乘积之和(SOP ):
s = X[1] W[1]+X[2]* W[2]+b*
为了简单起见,本例中只使用了一个训练样本。下表显示了具有输入的单个训练样本及其对应的样本的期望(即正确)输出。在实践中,使用了更多的训练实例。
假设权重和偏差的初始值如下表所示。
为简单起见,所有输入、权重和偏差的值都将添加到网络图中。
现在,让我们训练网络,看看网络将如何根据当前参数预测样本的输出。
正如我们之前讨论的,培训过程有两个阶段,向前和向后。
前进传球
激活函数的输入将是每个输入与其权重之间的 SOP。然后将 SOP 加到偏置上,返回神经元的输出:
s = X[1] W[1]+X[2]* W[2]+b*
s=0.1 0.5+ 0.30.2+1.83
s=1.94
然后将值 1.94 应用于激活函数(sigmoid),得到值 0.。
来自输出神经元的激活函数的输出反映了样本的预测输出。很明显,期望的输出和期望的输出之间存在差异。但是为什么呢?我们如何使预测输出更接近期望输出?我们稍后会回答这些问题。现在,让我们看看基于误差函数的网络误差。
误差函数表明预测输出与期望输出有多接近。误差的最佳值是零,这意味着根本没有误差,期望的和预测的结果是相同的。误差函数之一是平方误差函数,如下式定义:
注意,值 12 乘以等式是为了使用反向传播算法简化导数计算。
基于误差函数,我们可以如下测量网络的误差:
结果显示有误差,而且误差很大:( ~0.357 )。这个误差只是给了我们一个指示,告诉我们预测的结果离期望的结果有多远。
知道有错误,我们该怎么办?我们应该把它最小化。为了最小化网络错误,我们必须改变网络中的某些东西。请记住,我们唯一可以改变的参数是权重和偏差。我们可以尝试不同的权重和偏差,然后测试我们的网络。
我们计算误差,然后正向传递结束,应该开始反向传递计算导数,更新参数。
为了实际感受反向传播算法的重要性,让我们尝试不使用该算法直接更新参数。
参数更新方程
可以根据下式改变参数:
W[(n+1)]= W(n)+η[d(n)-Y(n)]X(n)
其中:
- n:训练步骤(0,1,2,…)。
- W(n):当前训练步骤中的参数。Wn=[bn,W1(n),W2(n),W3(n),…,Wm(n)]
- η :学习率,取值在 0.0 到 1.0 之间。
- d(n):期望输出。
- Y(n):预测产量。
- X(n):网络做出错误预测的当前输入。
对于我们的网络,这些参数具有以下值:
- n: 0
- 女(男):[1.83,0.5,0.2]
- η :因为是超参数,那么我们可以选择 0.01 为例。
- d(n): [0.03]。
- Y(n): [0.]。
- X(n): [+1,0.1,0.3]。第一个值(+1)是偏差。
我们可以如下更新我们的网络参数:
W[(n+1)]= W(n)+η[d(n)-Y(n)]X(n)
=[1.83,0.5,0.2]+0.01[0.03-0.][+1,0.1,0.3]
=[1.83,0.5,0.2]+0.01[-0.][+1,0.1,0.3]
=[1.83,0.5,0.2]±0.00[+1,0.1,0.3]
=[1.83,0.5,0.2]+[-0.00,-0.000,-0.00]
=【1.,0.,0.】
下表列出了新参数:
根据新的参数,我们将重新计算预测的产量。新的预测输出用于计算新的网络误差。根据计算的误差更新网络参数。该过程继续更新参数并重新计算预测输出,直到它达到误差的可接受值。
这里,我们成功地更新了参数,而没有使用反向传播算法。我们还需要那个算法吗?是的。你会明白为什么。
参数更新方程仅仅依赖于学习率来更新参数。它以与错误相反的方向改变所有参数。
但是,使用反向传播算法,我们可以知道每个权重如何与误差相关。这告诉我们每个权重对预测误差的影响。也就是我们增加哪些参数,减少哪些参数才能得到最小的预测误差?
例如,反向传播算法可以告诉我们有用的信息,比如将 W1 的当前值增加 1.0 会使网络误差增加 0.07。这表明 W1 值越小,误差越小。
偏导数
向后传递中使用的一个重要操作是计算导数。在开始计算反向传递中的导数之前,我们可以从一个简单的例子开始,让事情变得简单一些。
对于一个多元函数,比如 Y=X2Z+H,给定变量 X 的变化对输出 Y 有什么影响?我们可以使用偏导数来回答这个问题,如下所示:
注意,除了 X 之外的一切都被视为常数。因此,在计算偏导数之后,H 被替换为 0。在这里,∂X 意味着变量 x 的微小变化,同样,∂Y 意味着 y 的微小变化,y 的变化是改变 x 的结果,通过对 x 做一个非常微小的改变,对 y 有什么影响?
微小的变化可以是微小值的增加或减少。通过代入 X 的不同值,我们可以发现 y 相对于 X 是如何变化的。
可以遵循相同的过程来学习 NN 预测误差如何随网络权重的变化而变化。因此,我们的目标是计算∂E/W [1] 和∂E/W [2] ,因为我们只有两个权重 W [1] 和 W [2] 。我们来计算一下。
预测误差对 R.T 参数的导数
看看这个方程,Y=X ² Z+H,计算偏导数∂Y/∂X 似乎很简单,因为有一个方程将 y 和 x 联系起来。在我们的例子中,没有直接方程同时存在预测误差和权重。所以,我们要用多元链式法则来求 Y W r t x 的偏导数
参数链预测误差
让我们试着找出预测误差和权重之间的联系。预测误差根据以下等式计算:
这个方程没有任何参数。没问题,我们可以考察前面方程的每一项(期望 & 预测)是如何计算的,用它的方程代入,直到达到参数。
前一个等式中的所需的项是一个常数,因此没有机会通过它获得参数。预测的项是基于 sigmoid 函数计算的,如下式所示:
同样,用于计算预测输出的等式没有任何参数。但是仍然有变量 s (SOP ),它已经依赖于用于其计算的参数,根据这个等式:
s = X[1] W[1]+X[2]* W[2]+b*
一旦我们得出了一个有参数(权重和偏差)的方程,我们就到达了衍生链的末端。下图显示了计算误差对参数的导数所遵循的导数链。
注意 s W.R.T 偏差 b 的导数(∂[s]/w1】为 0,可以省略。正如我们之前所做的那样,可以使用学习率简单地更新偏差。这留给我们计算 2 个权重的导数。
根据上图,要知道预测误差如何随参数的变化而变化,我们应该找到以下中间导数:
- 预测输出的网络误差。
- SOP 下的预测产量。
- SOP W.R.T 三个参数中的每一个。
总共有四个中间偏导数:
*∂E/∂Predicted ,*∂predicted/∂[s]t5】,∂[s]/w[1]t11】和∂[s]/w[2]t17】
要计算误差对重量的导数,只需将误差链中的所有导数与每个重量相乘,如下 2 个等式所示:
∂e/w[1]=∂e/∂predicted∂predicted/∂[s]∂[s]/w[1]
∂ew[2]=∂e/∂predicted ∂predicted/∂s∂[s]/w[2]
重要提示:我们使用导数链解决方案,因为没有将误差和参数联系在一起的直接方程。但是,我们可以创建一个将它们联系起来的方程,并对其直接应用偏导数:
E = 1/2(desired-1/(1+E^(-(X1 * W1+X2 * W2+b)))²
因为这个方程直接计算误差对参数的导数似乎很复杂,所以为了简单起见,最好使用多元链规则。
用替换法计算偏导数值
让我们计算我们创建的链的每个部分的偏导数。
对于误差对预测输出的导数:
∂e/∂predicted=∂/∂predicted(1/2(desired-predicted)²)
=21/2(期望-预测) ^(2-1) (0-1)
=(期望-预测)(-1)*
=预测-期望
通过替换以下值:
∂e/∂predicted=predicted-desired=0.-0.03
∂e/∂predicted=0.
对于预测输出相对于 SOP 的导数:
[s][s](1/(1+e^(【s】))
记住:商法则可用于计算 sigmoid 函数的导数,如下所示:
∂predicted/∂s=1/(1+e(-s))(1-1/(1+e(-s))
通过替换以下值:
∂predicted/∂s=1/(1+e(-s))(1-1/(1+e(-s))=1/(1+e(-1.94))(1-1/(1+e(-1.94))
= 1/(1+0.)(1-1/(1+0.))
= 1/1.(1-1/1.)
= 0.(1-0.)
= 0.(0.)
∂predicted/∂s=0.
对于 SOP W.R.T W1 的衍生产品:
[【s】]/w[【1】]=/
= 1 * X[1](W[1])^((1-1))+0+0
= X[1](W[1])【T5(0)*
=X [1] (1)
∂[s]/w[1]= x[1]
通过替换以下值:
∂ [s] /W1=X [1] =0.1
对于 SOP W.R.T W2 的衍生产品:
[【s】]/w[【2】]=/
= 0+1 * X[2](W[2])^((1-1))+0
= X[2](W[2])【T5(0)*
= X[2]①
∂[s]/w[2]= x[2]
通过替换以下值:
∂[s]/w[2]= x[2]= 0.3
在计算了所有链中的各个导数之后,我们可以将它们全部相乘,以计算所需的导数(即误差相对于每个重量的导数)。
对于误差 W.R.T W1 的导数:
∂e/w[1]= 0. * 0. * 0.1
∂e/w[1]= 0.00
对于误差 W.R.T W2 的导数:
∂e/w[2]= 0. * 0. * 0.3
∂e/w[2]= 0.0
最后,有两个值反映预测误差相对于权重如何变化:
0.00 为 W[1]
0.0 为 W[2]
这些值意味着什么?这些结果需要解释。
解释反向传播的结果
从最后两个导数中可以得出两个有用的结论。这些结论是基于以下几点得出的:
- 导数符号
- 导数大小
如果导数符号是正的,这意味着增加权重会增加误差。换句话说,减少权重会减少误差。
如果导数符号为负,增加权重会减小误差。换句话说,如果它是负的,那么减少权重会增加误差。
但是误差增加或减少了多少呢?导数的大小回答了这个问题。
对于正导数,权重增加 p 会使误差增加 DMp,对于负导数,权重增加 p 会使误差减少 DMp。
让我们将此应用到我们的示例中:
- 因为∂E/W [1] 导数的结果是正的,这意味着如果 W1 增加 1,那么总误差增加 0.00。
- 因为∂E/W [2] 导数的结果是正的,这意味着如果 W2 增加 1,那么总误差增加 0.0。
现在让我们根据计算出的导数来更新权重。
更新权重
在成功地计算出误差相对于每个单独权重的导数之后,我们可以更新权重来改进预测。每个权重基于其导数进行更新:
对于 W [1] :
w[1 新]= w[1]-η∂e/w[1]*
=0.5-0.010.00*
W[1 新的] =0.
对于 W [2] :
w[2 新]= w[2]-η∂e/w[2]*
=0.2-0.010.0*
W[2 新] = 0.
请注意,导数是从重量的旧值中减去(而不是加上)的,因为导数是正的。
权重的新值为:
- W [1] =0.
- W [2] = 0.
除了先前计算的偏差(1.)之外,这两个权重被用于新的前向传递以计算误差。预计新误差将小于当前误差(0.)。
以下是新的正向传递计算:
s = X[1] W[1]+X[2]* W[2]+b*
s = 0.1 * 0.+0.3 * 0.+1.
s=1.7
f(s)=1/(1+e ^(-s) )
f(s)= 1/(1+e^(-1.7))
f(s)=0.0056
E = 1/2(0.03-0.0056)²
E=0.
当比较新误差(0.)和旧误差(0.)时,减少了 0.00009043。只要有减少,我们就在朝着正确的方向前进。
误差减少很小,因为我们使用了一个小的学习率(0.01)。要了解学习率如何影响训练神经网络的过程,请阅读本文。
应该重复向前和向后传递,直到误差为 0 或经过多个时期(即迭代)。这标志着示例的结束。
下一节讨论如何实现本节讨论的例子的反向传播。
对于上一节讨论的例子,实现反向传播算法非常容易。在本节中,我们将使用 GitHub 项目从头开始构建一个具有 2 个输入和 1 个输出的网络。
下一个代码使用 NumPy 来准备输入(x1=0.1 和 x2=0.4),值为 0.7 的输出,值为 0.01 的学习速率,并为两个权重 w1 和 w2 分配初始值。最后,创建两个空列表来保存每个时期的网络预测和误差。
接下来的代码构建了一些函数来帮助我们进行计算:
- Sigmoid():应用 sigmoid 激活函数。
- error():返回平方误差。
- error_predicted_deriv():返回误差对预测输出的导数。
- sigmoid_sop_deriv():返回 sigmoid 函数相对于 sop 的导数。
- sop_w_deriv():返回单个权重的 SOP W.R.T 的导数。
update_w():更新单个权重。
现在,根据下一个代码,使用“for”循环,我们准备对多个时期进行向前和向后传递计算。循环经过 80,000 个纪元。
在正向传递中,执行以下代码行来计算 SOP,应用 sigmoid 激活函数来获得预测输出,并计算误差。这将分别在 predicted_output 和 network_error 列表中追加当前网络预测和误差。
在向后传递中,执行“for”循环中的剩余行来计算所有链中的导数。误差 W.R.T 对权重的导数保存在变量 gradw1 和 gradw2 中。最后,通过调用 update_w()函数来更新权重。
完整的代码如下。它在每个时期后打印预测的输出。此外,它使用 matplotlib 库创建 2 个图,显示预测输出和误差如何随时间演变。
在下图中,绘制了 80,000 个历元的误差。请注意误差如何在值 3.8443e-13 处饱和,该值非常接近 0.0。
下图显示了预测的输出是如何随着迭代而变化的。请记住,在我们的示例中,正确的输出值设置为 0.7。输出饱和值为 0.64375,非常接近 0.7。
GitHub 项目也给出了一个更简单的接口来构建 Ch09 目录中的网络。有一个例子,建立一个有 3 个输入和 1 个输出的网络。在代码的最后,调用函数 predict() 来要求网络预测一个新样本[0.2,3.1,1.7]的输出。
这段代码使用了一个名为 MLP 的模块,这是一个构建反向传播算法的脚本,同时为用户提供了一个简单的界面来构建、训练和测试网络。关于如何构建这个脚本的细节,请参考这本书。
反向传播算法有两种主要类型:
- 传统的反向传播一直用于固定输入和固定输出的静态问题,比如预测图像的类别。在这种情况下,输入图像和输出类永远不会改变。
- 时间反向传播(BPTT) 针对随时间变化的非静态问题。它应用于时间序列模型,如递归神经网络(RNN)。
即使反向传播算法是训练神经网络最广泛使用的算法,它也有一些缺点:
- 应该仔细设计网络,以避免消失和爆炸梯度影响网络的学习方式。例如,从 sigmoid 激活函数计算出的梯度可能非常小,接近于零,这使得网络不能更新其权重。结果,没有学习发生。
- 反向传播算法平等地考虑网络中的所有神经元,并为每次反向传递计算它们的导数。即使使用了丢弃层,也要计算丢弃的神经元的导数,然后丢弃。
- 反向传播依赖于无限效应(偏导数)来执行信用分配。当人们考虑更深和更非线性的函数时,这可能成为一个严重的问题。
- 它期望误差函数是凸的。对于非凸函数,反向传播可能会陷入局部最优解。
- 误差函数和激活函数必须是可微的,以便反向传播算法能够工作。它不适用于不可微函数。
- 在正向传递中,层 i+1 必须等待层 i 的计算完成。在向后通道中,层 i 必须等待层 i+1 完成。这使得网络的所有层都被锁定,等待网络的其余层向前执行并向后传播错误,然后它们才能被更新。
传统的反向传播有多种替代方法。以下是四种选择。
李东贤等人的“差异目标传播”关于数据库中机器学习和知识发现的欧洲联合会议。施普林格,查姆,2015。,主要思想是在每一层计算目标而不是梯度。像渐变一样,它们是向后传播的。目标传播依赖于每层的自动编码器。与反向传播不同,即使当单元交换随机比特而不是实数时,它也可以被应用。
马、万多·库尔特、J. P .刘易斯和 w .巴斯蒂亚安·克莱因。" hsic 瓶颈:没有反向传播的深度学习."AAAI 人工智能会议记录。第 34 卷。04 号。2020.,他们提出了 HSIC (Hilbert-Schmidt 独立性准则)瓶颈,用于训练深度神经网络。HSIC 瓶颈是传统反向传播的替代方案,具有许多明显的优点。该方法有助于并行处理,并且需要的操作明显较少。它不会遭受爆炸或消失梯度。这在生物学上比反向传播更合理,因为不需要对称反馈。
在 Choromanska,Anna 等人的《超越反向投影:带辅助变量的在线交替最小化》中机器学习国际会议。PMLR,2019。,他们提出了一种用于训练深度神经网络的在线(随机/小批量)交替最小化(AM)方法。
贾德伯格、马克斯等人的“使用合成梯度的去耦神经接口”机器学习国际会议。PMLR,2017。,他们通过解耦模块(即层)打破了锁定层的约束,引入了网络图未来计算的模型。这些模型仅使用局部信息来预测建模的子图将产生什么结果。结果,子图可以独立地和异步地更新。
希望现在你明白了为什么反向传播是训练人工神经网络最流行的算法。它相当强大,其内部工作方式令人着迷。感谢阅读!
原文:https://web.archive.org/web/https://neptune.ai/blog/balanced-accuracy
当我们训练一个 ML 模型时,我们希望知道它的表现如何,这种表现是用度量来衡量的。直到性能足够好,度量标准令人满意,模型才值得部署,我们必须不断迭代,找到模型既不欠拟合也不过拟合的最佳点(完美的平衡)。
有很多不同的指标来衡量机器学习模型的性能。在本文中,我们将探索基本的度量标准,然后更深入地挖掘平衡的准确性。
机器学习中有两个广泛的问题:
第一个处理离散值,第二个处理连续值。
分类可以细分为两个更小的类型:
多类分类
在多类分类中,类等于或大于三。许多二进制分类使用带有标签的两个类进行操作,并且许多分类器算法可以对其进行建模,而多类分类问题可以通过应用某种策略(即一对一或一对一)使用该二进制分类器来解决。
二元分类
二元分类有两个目标标签,大多数时候一个类别处于正常状态,而另一个类别处于异常状态。设想一个欺诈性交易模型,该模型预测交易是否是欺诈性的。这种异常状态(=欺诈性交易)有时在一些数据中表现不足,因此检测可能至关重要,这意味着您可能需要更复杂的指标。
初学数据的科学家可能会犯的一个错误是,在构建模型后没有对其进行评估,也就是说,在部署之前不知道他们的模型有多有效,这可能是灾难性的。
评估标准衡量模型在训练后的表现。您建立一个模型,从度量中获得反馈,并进行改进,直到获得您想要的精确度。
选择正确的指标是正确评估 ML 模型的关键。选择单一指标可能不是最佳选择,有时最佳结果来自不同指标的组合。
不同的 ML 用例有不同的度量。在这里,我们将重点关注分类指标。
请记住,指标不同于损失函数。损失函数显示了模型训练期间模型性能的度量。度量用于判断和测量训练后的模型性能。
显示我们模型性能的一个重要工具是混淆矩阵——它不是一个指标,但与指标一样重要。
混淆矩阵
混淆矩阵是数据上分类器性能分布的表格。这是一个 N×N 矩阵,用于评估分类模型的性能。它向我们展示了模型执行得有多好,需要改进什么,以及它犯了什么错误。
其中:
- TP–真阳性(模型正确预测的阳性类别结果),
- TN–真阴性(模型的正确预测的阴性类别结果),
- FP–假阳性(模型的错误预测阳性类别结果),
- FN–假阴性(模型的错误预测的阴性类别结果)。
现在让我们转到指标,从准确性开始。
准确(性)
准确性是一种度量标准,它通过将总正确预测除以模型的总预测来总结分类任务的性能。它是所有数据点中正确预测的数据点的数量。
这适用于在混淆矩阵上看到的预测类别,而不是数据点的分数。
【准确度= (TP + TN) / (TP+FN+FP+TN)
回忆
召回率是一个度量标准,它量化了模型可以做出的所有肯定预测中的正确肯定预测的数量。
回忆= TP / (TP+FN)。
召回率是多类分类中所有类的真阳性的总和,除以数据中所有真阳性和假阴性的总和。
【回忆=总和(TP) /总和(TP+FN)
回忆也叫敏感。
宏观召回
宏观召回衡量每类的平均召回。它用于具有两个以上目标类别的模型,是召回的算术平均值。
宏调用=(Recall 1+Recall 2+——-Recall in)/n .
精确
精度量化了模型做出的正面预测中正确的正面预测的数量。Precision 计算真阳性的准确度。
精度= TP/(TP + FP。)
f1-分数
F1-score 保持了精确度和召回率之间的平衡。它通常用于类别分布不均匀的情况,但也可以定义为单个测试准确性的统计度量。
F1 = 2 ([精度召回]/[精度+召回])
ROC_AUC
ROC_AUC 代表“受试者操作者特征 _ 曲线下面积”。它总结了预测模型的真阳性率和假阳性率之间的权衡。当每个类之间的观察值平衡时,ROC 会产生好的结果。
无法从混淆矩阵中的汇总数据计算出此指标。这样做可能会导致不准确和误导的结果。可以使用 ROC 曲线来查看,该曲线显示了真阳性率和假阳性率之间每个可能点的变化。
平衡精度用于二进制和多类分类。它是灵敏度和特异性的算术平均值,其用例是当处理不平衡数据时,即当一个目标类比另一个出现得更多时。
平衡精度公式
敏感度:这也称为真阳性率或召回率,它衡量模型做出的总阳性预测中正确预测的真阳性的比例。
敏感度= TP / (TP + FN)
特异性:也称为真阴性率,它衡量正确识别的阴性占模型做出的总阴性预测的比例。
【特异性=TN / (TN + FP)
要在模型中使用这个函数,您可以从 scikit-learn 中导入它:
平衡精度二进制分类
二元分类的平衡精度有多好?让我们看看它的用例。
在异常检测中,如处理欺诈性交易数据集,我们知道大多数交易都是合法的,即欺诈性交易与合法交易的比率很小,对于这种不平衡的数据,平衡的准确性是一个很好的性能指标。
假设我们有一个二元分类器,其混淆矩阵如下:
这个分数看起来令人印象深刻,但它没有正确处理积极的一栏。
所以,让我们考虑平衡精度,这将说明类中的不平衡。下面是我们的分类器的平衡精度计算:
平衡的准确性做了一件伟大的工作,因为我们想要识别我们的分类器中存在的阳性。这使得分数低于准确性预测的分数,因为它给了两个类相同的权重。
平衡精度多类分类
正如二元分类一样,平衡精度对于多类分类也是有用的。这里,BA 是在每个类别上获得的回忆的平均值,即每个类别的回忆分数的宏观平均值。因此,对于一个平衡的数据集,分数往往与准确性相同。
让我们用一个例子来说明在不平衡数据中,平衡精度是一个更好的性能指标。假设我们有一个带有混淆矩阵的二元分类器,如下所示:
从每个类获得的 TN、TP、FN、FP 如下所示:
让我们计算一下精确度:
分数看起来很棒,但是有个问题。集合 P 和 S 是高度不平衡的,模型在预测这一点上做得很差。
让我们考虑平衡精度:
平衡精度=(recall p+recall q+recall r+recall s)/4。
对数据中存在的每个类计算召回率(类似于二进制分类),同时取召回率的算术平均值。
在计算召回时,公式是:
【回忆= TP / (TP + FN)
如你所见,这个模型预测 P 类的真阳性率很低。
正如我们所看到的,与准确性相比,这个分数确实很低,因为对所有存在的类应用了相同的权重,而不考虑每个集合中的数据或点。
所以这里我们知道要得到一个更好的分数,应该提供更多的关于 P S .和 R .的数据。
平衡精度与分类精度
- 如果我们在数据集中有一个相似的平衡,准确性可以是一个有用的度量。如果不是,那么平衡精度可能是必要的。一个模型可以有高精度但性能差,也可以有低精度但性能好,这可能与精度悖论有关。
考虑下面不平衡分类的混淆矩阵。
看看这个模型的准确性,我们可以说它很高,但是…它不会产生任何结果,因为它的预测能力为零(这个模型只能预测一个类别)。
这意味着该模型不预测任何事情,而是将每个观察结果映射到一个随机猜测的答案。
准确性并不能让我们看到模型的问题。
在这里,模型积极因素得到了很好的体现。
所以,在这种情况下,平衡的准确性比准确性更好。如果数据集平衡良好,则精度和平衡精度往往会收敛于相同的值。
平衡准确度与 F1 分数
所以你可能想知道平衡准确度和 F1 分数之间的区别,因为两者都用于不平衡分类。所以,我们来考虑一下。
- F1 保持了精确度和召回率之间的平衡
- F1 评分并不关心有多少真阴性正在被分类。当处理不平衡的数据集时,需要注意底片,平衡精度比 F1 更好。
- 在积极因素和消极因素同样重要的情况下,平衡准确度是比 F1 更好的衡量标准。
- 当需要更多关注正面数据时,F1 是不平衡数据的一个很好的评分标准。
考虑一个例子:
在建模期间,数据有 1000 个负样本和 10 个正样本。模型预测 15 个阳性样本(5 个真阳性,10 个假阳性),其余为阴性样本(990 个真阴性,5 个假阴性)。
f1-得分和平衡准确度将为:
你可以看到平衡精度仍然比 F1 更关心数据中的负数。
考虑另一种情况,数据中没有真正的负数:
正如我们所看到的,F1 没有任何变化,而当真负值降低时,平衡精度会快速下降。
这表明 F1 分数更重视正面的数据点,而不是平衡的准确性。
平衡精度与 ROC_AUC
平衡精度和 roc_auc 有什么不同?
在制作模型之前,您需要考虑以下事项:
- 这是为了什么?
- 它有多少种可能性?
- 数据有多平衡?等等。
Roc_auc 类似于平衡精度,但有一些关键区别:
- 平衡准确度是根据预测类别计算的,roc_auc 是根据每个数据点的预测分数计算的,这些数据点不能通过混淆矩阵计算获得。
- 如果问题是高度不平衡的,平衡精度是比 roc_auc 更好的选择,因为 Roc_auc 是不平衡数据的问题,即当偏斜严重时,因为少量的正确/错误预测会导致分数的巨大变化。
- 如果我们希望在分类中观察到一系列可能性(概率),那么最好使用 roc_auc,因为它是所有可能阈值的平均值。然而,如果类别是不平衡的,并且分类的目标是输出两个可能的标签,那么平衡的准确度更合适。
- 如果你既关心正负类,又关心稍微不平衡的分类,那么 roc_auc 更好。
为了更好地理解平衡准确性和其他评分者,我将在一个示例模型中使用这些指标。代码将会在 Jupyter 笔记本上运行。数据集可以从这里下载。
我们将在这里使用的数据是欺诈检测。我们希望预测交易是否是欺诈性的。
我们的流程将是:
- 加载数据,
- 清理数据,
- 建模,
- 预测。
加载数据
像往常一样,我们从导入必要的库和包开始。
如您所见,数据既有数字变量,也有分类变量,一些操作将通过这些变量进行。
让我们看看目标中类的分布,即‘欺诈性列’。
让我们来看看剧情。
我们可以看到分布是不平衡的,因此我们进入下一个阶段——清理数据。
数据清理
这个数据没有 NAN 值,所以我们可以继续从时间戳中提取有用的信息。
我们将通过下面的代码提取交易的年份和时间:
编码
下一步是将字符串(分类)变量编码成数字格式。我们将对其进行标记和编码。Sklearn 也为此提供了一个名为 LabelEncoder 的工具。
由于现在已经进行了编码,数据应该如下所示:
True / False 值列不需要编码,因为它们是布尔值。
设置索引和删除列
数据中不重要的列需要放到下面:
数据缩放
我们需要调整数据,以确保每个特征的权重相同。为了缩放这些数据,我们将使用 StandardScaler。
建模
在拟合之前,我们需要将数据分为测试集和训练集,这使我们能够在部署之前了解模型在测试数据上的表现。
在这种分割之后,我们现在可以在查看计算图时,用我们到目前为止讨论过的评分标准来拟合和评分我们的模型。
查看上面的图表,我们可以看到模型预测如何基于历元和学习率迭代波动。
- 虽然准确性最初很高,但与其他记分员相比,它逐渐下降,没有完美的下降。它没有很好地处理混淆矩阵上的数据表示。
- F1 的分数在这里很低,因为它偏向于数据中的负值。然而,在上面的数据中,正面和负面都很重要。
- roc_auc 得分是一个没有偏见的得分,数据中的两个标签被给予同等的优先级。与具有 1:100 比率的目标标记的一些数据相比,该数据偏斜度不是很大,因此 ROC_AUC 在这里表现得更好。
- 总的来说,平衡准确性在数据评分方面做得很好,因为模型并不完美,它仍然可以得到更好的预测。
要查看预测并存储在元数据中,请使用以下代码:
记录元数据并查看绘图。图表中要记录和比较的指标有:acc(准确度)、f1(f1-得分)、roc_auc 得分、bal_acc(平衡准确度)。
此函数创建绘图并将其记录到元数据中,您可以从 scikitplot.metrics 中获得它处理的各种曲线。
我们已经讨论了很多关于平衡精度的问题,但是在一些情况下,即使是最简单的指标也是绝对合适的。
- 当数据平衡时。
- 当模型不仅仅是映射到(0,1)结果,而是提供广泛的可能结果(概率)时。
- 当模型更倾向于正面而非负面时。
- 在多类分类中,一些类的重要性不如另一些类,由于所有类都具有相同的权重而不考虑类的频率,因此可能会出现偏差。这样做可能会导致错误,因为我们的模型应该提供解决方案,而不是相反。
- 当有一个很高的偏差或者一些类比其他类更重要时,那么平衡的准确性就不是模型的完美评判。
研究和构建机器学习模型可能很有趣,但如果没有使用正确的度量标准,也会非常令人沮丧。正确的度量标准和工具非常重要,因为它们向您展示了您是否正确地解决了手头的问题。
这不仅仅是关于一个模型有多棒,更重要的是解决它被认为应该解决的问题。
平衡精度在某些方面是很好的,例如当类不平衡时,但是它也有缺点。深入理解它,会给你所需的知识,让你知道该不该用它。
感谢阅读!
原文:https://web.archive.org/web/https://neptune.ai/blog/bayesian-neural-networks-with-jax
贝叶斯神经网络(BNN)不同于人工神经网络(NN) 。主要区别——BNNs 可以回答“我不确定”。这很有趣,但为什么你会希望神经网络告诉你它不知道你问题的答案?
为了向您展示网络说“我不确定”的重要性,我们需要考虑处理非分布数据。在人工智能安全中,非分布检测是当有人试图用并非来自数据集的例子愚弄网络时,网络如何感知的。
我们将探索 BNNs 背后的理论,然后用 BNNs 实现、训练和运行数字识别任务的推理。这很棘手,但是我会告诉你你需要做什么来让 BNNs 开始学习。我们将把它编码在新的、热门的 JAX 框架中(如果你不知道,我们将做一个快速介绍)。
在文章的最后,我们将向我们的神经网络输入字母而不是数字,看看它会做什么。我们开始吧!
在我们开始之前,请注意这是一个复杂的话题。如果你觉得这个理论很难理解,那就直接跳到本文的编码部分。稍后,您还可以查看本文末尾链接的其他深入指南。
在非贝叶斯人工神经网络模型中(上图左侧),我们训练网络参数的点估计。
在贝叶斯人工神经网络(上图右侧)中,我们用分布来表示我们对训练参数的信念,而不是点估计。代替变量,我们有随机变量,我们想从数据中推断。
贝叶斯神经网络组件列表:
- 数据集 D 带有预测器 X (例如图像)和标签*(例如类)。*
- *可能性 P(D|θ) 或 P(Y |X,θ) 用由 θ 参数化的神经网络(NN)计算的逻辑上的分类 softmax 分布表示,例如 softmax 多层感知器。
- 注意:到目前为止,它与非贝叶斯神经网络没有区别。
- 如果我们“正常地”训练它 SGD 使用交叉熵损失——那么我们可以说,我们得到了参数的最大似然点估计。参见“深度学习”,第 5.5 章:最大似然估计(“深度学习”。自适应计算和机器学习。”麻省理工学院出版社,2016 )
- 然而,使用贝叶斯神经网络,参数来自它们的分布。进一步阅读!*
- 在神经网络参数之前,【P(θ)】用正态分布来表示。
- 它编码了我们对参数值可能是什么的先验知识(或者说缺乏知识)。
- 然而,我们怀疑这些是零附近的一些小值。
- 这一假设来自我们的先验知识,即当我们将 dnn 的参数保持在 0 附近时,它们往往工作得很好。
- 在看到数据之后,我们的 NN 参数的后验P(θ| D)*—人们可以说是“在训练之后”。
- 这是训练参数的分布。
- 我们将使用贝叶斯定理来计算它…
- …或者至少我们会尝试这样做。*
贝叶斯定理
从理论上讲,贝叶斯定理是我们应该用来根据先验和似然性计算神经网络参数的后验概率的工具。但是,有一个条件。
这个积分很难计算。只有在一些需要使用共轭先验的特殊情况下才容易处理。在“深度学习”,第 5.6 章:贝叶斯统计(“深度学习”中了解更多信息。自适应计算和机器学习。”麻省理工出版社,2016 。在《走向数据科学》网站上还有一篇关于共轭先验的精彩文章。
在我们的例子中,它很难处理,因为这个积分没有解析解。我们使用一个复杂的非线性函数,名为“人工神经网络”。这在计算上也很难处理,因为在分母中有指数数量的可能参数赋值需要评估和求和。
想象一个二元神经网络,它对 N 个参数分配了2^N个参数。对于 N=272,就是2^(272),已经比可见宇宙中的原子数量还要多。让我们同意,272 个参数并不多,要知道现代 CNN-s 有数百万个参数。
变分推理为救援!
不会算?然后近似!
我们用一个分布 Q 来近似后验概率,称为变分分布,最小化它们之间的 KL 散度*[KL](Q(θ)*| |P(θ| D))。我们将找到与后验概率最接近的概率分布,它由一小组参数表示,如多元高斯分布的均值和方差,并且我们知道如何从中采样。
此外,我们必须能够通过它进行反向传播,并每次对分布的参数(即均值和方差)进行一点点修改,以查看最终的分布是否更接近我们想要计算的后验分布。
如果后验概率正是我们想要计算的,我们如何知道最终的分布是否更接近后验概率?就是这个想法!
从分布之间的 KL 散度,D[KL](Q(θ)| |P(θ| D)),可以得到证据下界(ELBO)。
这就是所谓的变分推理。它把推理问题变成了优化问题。通过优化右侧,我们优化了从我们的变分分布 NN 参数*【θ∾Q()*中采样的经典最大似然分类损失(例如交叉熵损失),减去正则化损失,对于高斯分布,正则化损失采用封闭形式,这意味着它是一个众所周知的方程,您将在一分钟内看到。
通过优化它,我们最大化证据——我们的数据集为真的概率——并最小化我们的变分分布、*【Q(θ)*和后验、 P(θ|D) 之间的差异。后路正是我们想要的,是我们的目标!
还有一个注意:它被称为证据下限,因为 KL 散度将总是正的。因此,右边是左边证据的下限。详见本教程:多尔施,卡尔。变型自动编码器教程。
现在,正如所承诺的,我们有了 NN 参数上的分布,【Q(θ),我们知道如何使用 ELBO 学习它。让我们跳到代码中来看看它的实践吧!
正如我之前提到的,我们将使用 JAX。
“JAX亲笔签名和 XLA ,聚在一起进行高性能数值计算和机器学习研究。它提供了 Python+NumPy 程序的可组合转换:区分、矢量化、并行化、实时编译到 GPU/TPU,等等。”~ JAX 文档。
您可以查看 JAX 文档,但是您可能不需要它来理解下面的代码。正如作者所说,这就像机器学习和深度学习研究的 NumPy。但是,我建议至少读一节,关于随机数的那一节。这可能不直观,因为通常在 NumPy 中你不必考虑伪随机数发生器的状态,但是在 JAX 中,你可以显式地将它传递给随机值采样函数。
你可以在这里找到代码。README 告诉您如何运行它。我鼓励你现在就去做,然后读完这篇文章。该回购包括:
- MNIST 的 mlp 分类器(在 JAX 和俳句中)。
- MNIST 上的伯努利 vae 生成模型。
- Bayes . py–MNIST 上的变分 Bayes NN 分类器。
今天,我们将做最后一个,变分贝叶斯神经网络分类器。我们将讨论代码中最重要的部分。
关于 HumbleSL(HSL 包)的说明
HumbleSL 是我写的直接监督学习(SL) Python 库。它提供了进行深度 SL 所需的所有样板代码:
- 一个网络定义工厂,
- 度量和损失,
- 一种数据加载器,
- 火车环线,
- 等等。
它得到了 JAX 图书馆和 T2 俳句框架的支持。它使用 TensorFlow 数据集进行数据加载和预处理。
培养
下载 MNIST 数据集
第 56-61 行下载训练和测试数据集。
train_dataset 用于训练。train_eval_dataset 用于对训练数据集进行性能评估。test_eval_dataset 用于对测试数据集进行性能评估,你猜对了。
数据集是迭代器,您可以通过以下方式访问图像(和标签)的连续批次:
创建多层感知器(MLP)模型
第 71-74 行创建了 MLP 模型。
如果你对这个片段到底做了什么感兴趣,请查看俳句基础。所有你需要知道的是,它创建了“标准”的 MLP 与 64 个单位的两个隐藏层。
它在输入端接受一个 28×28 的图像,并返回对应于每个可能的类(数字)的 10 个值。net 对象有两个函数:init 和 apply。
- params = net.init(next(rng),batch_image)获取下一个随机生成器状态和图像批次,并返回初始模型参数。它需要随机发生器状态来采样参数。
- logits = net.apply(params,batch_image)获取模型参数和图像批次,然后返回批次输出(10 个数字的批次)。
你可以把网络想象成一个典型的裸架构。你需要提供一些参数来预测它。
初始化贝叶斯神经网络参数
第 79-85 行获取 MLP 模型参数,并使用它来初始化贝叶斯神经网络参数。
我们用平均场逼近后验概率。这意味着我们用以均值和方差(或对数方差)为参数的高斯分布来表示我们的变分分布,因为它可以采用任何值,而不仅仅是正值,这简化了训练。我们这样做是因为从高斯分布中取样很容易。
记住这里,后验概率是经过训练的 MLP 参数的分布。我们没有一套 MLP 参数来训练。我们训练近似后验的变分分布,并从中采样 MLP 参数。在代码中,对于变量名,我可能会交替使用 aprx_posterior、posterior 和 prior 来表示变分分布,我承认这不是 100%正确,但在实践中,它们是一回事,或者我想强调训练参数的阶段(即 prior 是未训练的后验)。
初始化优化程序
第 89-90 行定义并初始化 ADAM 优化器。
就这么简单。您传递学习率 FLAGS.lr 和初始参数 prior。当然,优化器用于将梯度应用到参数上。与标准深度学习中的相同。
定义目标
第 92-110 行定义了 ELBO 目标。
它获取一批图像(和标签),对 MLP 参数进行采样,并对它们进行预测。然后,它计算 logits 和标签之间的交叉熵(分类损失),并计算变分分布和正态分布之间的 KL 散度(正则化损失)。
hsl.gaussian_kl 以封闭形式计算后者。由 flagsβ加权的两者的组合产生 ELBO。这与上面 ELBO 的数学表达式相匹配。损失是负面的 ELBO:
我们需要取反,因为 JAX 优化器只能做梯度下降。然而,我们需要最大化 ELBO,而不是最小化它。
训练循环
第 116-126 行定义了 SGD 更新步骤。这是我们进行培训所需的最后一块。
此函数执行 SGD 更新的一个步骤。首先,它评估损失函数对于当前参数和该批数据的梯度。然后,计算更新并将其应用于参数。这个函数在一次更新后返回新的变分分布参数和优化器状态。之所以需要后者,是因为 ADAM 优化器存储并更新其自适应矩估计所需的状态。
现在,您只需在循环中运行这个函数,训练就会继续进行。我有一个助手函数:hsl.loop,它还负责检查点和定期评估训练和测试性能。
估价
第 128-140 行计算诊断。
它从对提供的参数和数据运行预测开始。这不同于在 ELBO 物镜中简单地采样一组参数。下一小节将对此进行描述。这些预测与地面实况标注一起用于计算精度 hsl.accuracy 辅助函数。
接下来,我们计算 ELBO、分类损失(log_likelihood)和正则化损失(kl_divergence)。ELBO 用于计算近似证据,这直接来自 ELBO 的公式——它是证据下界,不是吗?这是在当前参数下数据的近似概率,即图像具有相应的标签。越高越好,因为这意味着我们的模型很好地拟合了数据-它为来自数据集的标签提供了高概率。
所有这些指标都放在一个字典中,并返回给调用者。在我们的例子中,hsl.loop 辅助函数将不时地对来自训练和测试数据集的数据以及当前参数调用它。
预言;预测;预告
第 41-49 行运行预测。
这只是在样本数量 _ 样本参数集上运行预测。然后,对预测进行平均,并计算这些预测的标准偏差作为不确定性的度量。
说到不确定性,现在我们已经有了所有的部分,让我们来玩一下贝叶斯神经网络。
您运行代码并看到以下内容:
这些是训练前的诊断,看起来没问题:
- 精确度约为 10%,对于随机初始化的神经网络来说是非常好的。这是随机猜测标签的准确性。
- ELBO 非常低,这在开始是没问题的,因为我们的变分分布远离真实的后验概率。
- 变分分布和正态分布之间的 KL 散度为正。它一定是正的,因为我们是以封闭形式计算的,而 KL,因为它是距离的度量,不能取负值。
- MLP 模型返回的真实标签的对数似然或对数概率非常低。这意味着模型将低概率分配给真正的标签。如果我们还没有训练它,这是预料之中的。
- 平均近似证据为 0。同样,我们还没有训练模型,所以它根本没有对数据集建模。
让我们运行 10k 步,再次查看诊断结果:
这不好。真实标签的概率上升,log_likelihood 和
均值近似证据上升,变分分布更接近正态分布,kl 散度下降。
然而,采用返回概率的 argmax 来推断标签并将其与地面真实标签进行比较的准确度仍然比随机分类器好大约 10%。这不是代码中的错误。诊断是正确的,我们需要两个技巧来训练它。继续读!
训练贝叶斯神经网络的技巧
低β值
β参数对分类损失和正则化损失进行加权。beta 越高,正则化越强。太强的正则化会对模型有太多的约束,它将不能对任何知识进行编码。在上面的例子中,它被设置为 flagsβ= 1。
这使得 kl_divergance(正则化损失)大幅下降。但是,太强了!更好的值大约是 FLAGS.beta = 0.001,这是我提供给你的代码中的默认值。
低初始方差
另一件事是变分分布的初始方差。太大了,网络很难开始训练和编码任何有用的知识。这是因为采样参数变化很大。在上面的例子中,它被设置为大约 0.37。在代码中,默认情况下,它被设置为~0.001,这是一个更好的值。
固定示例
现在我们已经将超参数更改为正确的参数,让我们看看 10k 步后的诊断结果:
测试准确率为 98%,我们可以同意它现在工作!注意正则化损失(kl_divergence)有多大。
是的,它离正态分布有那么远,但它需要如此。尽管如此,有了这个小测试,它仍然可以防止过度拟合。平均近似证据也非常高,这意味着我们的模型很好地预测了数据。注意 ELBO 也非常接近零(这是它的最大值)。
查找不符合分布的示例
我把训练好的模型放在上面的数字“3”和字母“B”上运行。以下是输出结果:
如你所见,它将数字“3”归类为 3 没有任何问题。然而,当我们给它喂食它在训练中没有看到的东西时,一件有趣的事情发生了。该模型将字母“B”分类为 8。如果我们处理的是正常的神经网络,那就是了。
幸运的是,我们训练的贝叶斯神经网络也可以告诉我们它有多确定。
我们看到,在数字“3”的情况下,它是可信的——STD。戴夫。概率为 0 左右。对于字母“B ”,它返回的概率在任一方向上可以变化 0,45 %!
这就像我们的模型告诉我们“如果我不得不猜,那么这是 8,但它可能是任何东西——我以前没见过这个。”
这样,贝叶斯神经网络既可以对图像进行分类,也可以说“我不知道”。我们可以查出性病。戴夫。阈值,在该阈值之后,我们拒绝来自例如我们用来评估我们的模型的测试数据集的分类。
我简单地在整个测试数据集上运行模型,并观察 std。戴夫。它的预测值。然后,我取第 99 个百分位数(99%的其他值较低的值),在本例中为 0.37。因此,我决定应该拒绝 1%测试图像的分类。
我这样做是因为我知道 MNIST 数据集中有一些疯狂的图像,连我都无法正确分类。回到我们的例子,显然 0.45 > 0.37,所以我们应该拒绝字母“B”的分类。
就是这样!现在你可以训练一个不会让你愚弄它的神经网络。不确定性估计是人工智能安全中的一个大主题。我留给你们更多的阅读材料:
原文:https://web.archive.org/web/https://neptune.ai/blog/bert-and-the-transformer-architecture
目前,很少有人工智能领域比 NLP 更令人兴奋。近年来,可以执行类似人类语言任务的语言模型(LM)已经发展到比任何人预期的更好。
事实上,他们表现得如此之好,以至于人们怀疑他们是否达到了一般智力的水平,或者我们用来测试他们的评估标准跟不上。当像这样的技术出现时,无论是电力、铁路、互联网还是 iPhone,有一点是明确的——你不能忽视它。它将最终影响现代世界的每一个部分。
了解这样的技术很重要,因为这样你就可以利用它们。所以,我们来学习吧!
我们将涵盖十个方面,向您展示这项技术的来源、开发方式、工作原理以及在不久的将来会有什么样的前景。这十件事是:
- 什么是 BERT 和变压器,为什么我需要了解它?像 BERT 这样的模型已经对学术界和商业界产生了巨大的影响,因此我们将概述这些模型的一些使用方法,并澄清围绕它们的一些术语。
- 在这些模型之前,我们做了什么?要了解这些模型,重要的是要了解这一领域的问题,并了解在 BERT 等模型出现之前我们是如何解决这些问题的。通过这种方式,我们可以了解以前模型的局限性,并更好地理解 Transformer 架构关键设计方面背后的动机,这是大多数 SOTA 模型(如 BERT)的基础。
- NLPs“ImageNet 时刻;预训练模型:原来我们都是自己训练模型,或者你要针对某个特定任务,全面训练一个模型。实现性能快速发展的关键里程碑之一是创建预先训练的模型,这些模型可以“现成”使用,并根据您的具体任务进行调整,只需很少的努力和数据,这一过程称为迁移学习。理解这一点是理解为什么这些模型在一系列 NLP 任务中一直表现良好的关键。
- 了解变形金刚:你可能听说过伯特和 GPT-3,但是关于罗伯塔、艾伯特、 XLNet ,或者龙前、改革者,或者 T5 变形金刚呢?新模型的数量看起来势不可挡,但是如果您理解 Transformer 架构,您将有机会了解所有这些模型的内部工作方式。这和你理解 RDBMS 技术的时候是一样的,让你很好的掌握 MySQL、PostgreSQL、SQL Server 或者 Oracle 之类的软件。支撑所有数据库的关系模型与支撑我们的模型的转换器架构是一样的。明白了这一点,RoBERTa 或 XLNet 就成了使用 MySQL 或 PostgreSQL 的区别。学习每个模型的细微差别仍然需要时间,但是你有一个坚实的基础,你不是从零开始。
- 双向性的重要性:当你读这篇文章时,你并没有严格地从一边读到另一边。你不是从一边到另一边一个字母一个字母地读这个句子。相反,你正在向前跳跃,从你现在所处的位置之前的单词和字母中学习上下文。事实证明,这是变压器架构的一个关键特性。Transformer 架构支持模型以双向方式处理文本,从开始到结束,从结束到开始。这是以前模型局限性的核心,以前的模型只能从头到尾处理文本。
- 伯特和变形金刚有什么不同? BERT 使用 Transformer 架构,但在几个关键方面有所不同。对于所有这些模型,理解它们与 Transformer 的不同是很重要的,因为这将定义它们可以做好哪些任务,以及它们将努力完成哪些任务。
- 记号化器——这些模型如何处理文本:模型不会像你我一样阅读,所以我们需要对文本进行编码,以便它可以被深度学习算法处理。如何对文本进行编码对模型的性能有很大的影响,这里的每个决定都要进行权衡。所以,当你看另一个模型时,你可以先看看所使用的记号赋予器,并且已经了解了关于那个模型的一些东西。
- 掩饰——聪明的工作与努力的工作:你可以努力工作,也可以聪明地工作。和深度学习 NLP 模型没什么区别。这里的艰苦工作只是使用一个普通的 Transformer 方法,并向模型中投入大量数据,使其性能更好。像 GPT-3 这样的模型有令人难以置信的大量参数,使它能够以这种方式工作。或者,您可以尝试调整训练方法,以“强制”您的模型从更少的内容中学到更多。这就是像伯特这样的模型试图用掩蔽来做的事情。通过理解这种方法,你可以再次用它来观察其他模型是如何被训练的。他们是否采用创新技术来提高这些模型能够从给定的数据中提取多少“知识”?还是他们采取了一种更野蛮的方法,扩大规模,直到你打破它?
- 微调和迁移学习:BERT 的主要优势之一是它可以针对特定领域进行微调,并针对许多不同的任务进行培训。像伯特和 GPT-3 这样的模型是如何学习执行不同的任务的?
- 鳄梨椅——伯特和其他变形金刚型号的下一步是什么?为了回顾 BERT 和 Transformer 架构,我们将展望这些模型的未来
The Transformer (Muppet) family | Source: PLM Papers
为了理解 BERT 和 Transformer 的范围和速度,让我们看看这项技术的时间框架和历史:
- 2017:Transformer 架构于 2017 年 12 月在一篇谷歌机器翻译论文中首次发布“ 注意力是你所需要的全部 ”。那篇论文试图找到能够自动翻译多语言文本的模型。在此之前,许多机器翻译技术都涉及一些自动化,但它受到重要规则和基于语言的结构的支持,以确保翻译对于像 Google Translate 这样的服务来说足够好。
- 2018 : BERT(来自变压器的双向编码器表示)于 2018 年 10 月在“ 深度双向变压器语言理解预训练 中首次发布。
Improvements in Google translate with the Transformer | Source: Google AI Blog
起初,Transformer 主要影响机器翻译领域。新方法带来的改进很快被注意到。如果它停留在翻译领域,那么可能现在就不会读这篇文章了。
翻译只是一系列自然语言处理任务中的一项,包括词性标注、命名实体识别(NER)、情感分类、问答、文本生成、摘要、相似性匹配等等。以前,这些任务中的每一个都需要一个经过特殊训练的模型,所以没有人需要学习所有的任务,而且你通常只对你自己的领域或特定的任务感兴趣。
然而,当人们开始关注 Transformer 架构,并怀疑它是否能做一些不仅仅是翻译文本的事情时,这种情况发生了变化。他们观察了该架构能够“集中注意力”于特定单词并比其他模型处理更多文本的方式,意识到这可以应用于广泛的其他任务。
我们将在第 5 节中讨论转换器的“注意力”能力,我们将展示它如何使这些模型能够双向处理文本,并查看与当时正在处理的句子的特定上下文相关的内容。
一旦人们意识到 Transformer 架构可以被分解,并以不同的方式执行一系列任务,它的影响就开始迅速增长:
正是在这一点上,《变形金刚》超越了 NLP。突然间,人工智能的未来不再是有感知能力的机器人或自动驾驶汽车。
如果这些模型可以从文本中学习上下文和意义,并执行广泛的语言任务,这是否意味着它们理解文本?他们会写诗吗?他们会开玩笑吗?如果它们在某些 NLP 任务中表现得比人类更好,这是一般智力的一个例子吗?
像这样的问题意味着这些模型不再局限于聊天机器人和机器翻译的狭窄领域,而是它们现在是人工智能一般智能更大辩论的一部分。
“… in a lecture published Monday, Bengio expounded upon some of his earlier themes. One of those was attention — in this context, the mechanism by which a person (or algorithm) focuses on a single element or a few elements at a time. It’s central both to machine learning model architectures like Google’s Transformer and to the bottleneck neuroscientific theory of consciousness, which suggests that people have limited attention resources, so information is distilled down in the brain to only its salient bits. Models with attention have already achieved state-of-the-art results in domains like natural language processing, and they could form the foundation of enterprise AI that assists employees in a range of cognitively demanding tasks”. | Source: VentureBeat
像任何范式转换技术一样,了解它是被夸大还是被低估是很重要的。最初,人们认为电力不是一项变革性的技术,因为它需要时间来重新定位工作场所和城市环境,以利用电力提供的优势。
铁路也是如此,互联网诞生之初也是如此。关键是,不管你同意还是不同意,你至少需要对手边快速发展的技术有一些看法。
这就是我们现在对伯特这样的模型的看法。即使你不使用它们,你仍然需要理解它们可能对人工智能的未来产生的潜在影响,以及如果它让我们更接近开发普遍智能的人工智能——对社会的未来产生的影响。
BERT 和 Transformer 架构本身,都可以在他们试图解决的问题的上下文中看到。像其他商业和学术领域一样,机器学习和 NLP 的进展可以被视为试图解决当前技术的缺点或不足的技术进化。亨利·福特使汽车更便宜、更可靠,因此它们成为了马的可行替代品。电报改进了以前的技术,能够与人交流而不需要亲自到场。
在 BERT 之前,NLP 的最大突破是:
- 2013 : Word2Vec 论文, 向量空间中单词表征的高效估计 发表。连续单词嵌入开始被创建,以更准确地识别单词的语义和相似性。
- 2015 : Sequence to sequence 的文本生成方法 一篇论文发布了一个神经对话模型 。它建立在 Word2Vec 中首次展示的一些技术之上,即深度学习神经网络从大量非结构化文本中学习语义和句法信息的潜在能力。
- 2018 :来自语言模型的嵌入(ELMo)论文 深度语境化词语表征 发布。ELMo(这是整个布偶命名的开始,不幸的是,它并没有停止,见厄尼、大鸟和 KERMIT )在单词嵌入方面是一个飞跃。它试图解释使用一个单词的上下文,而不是静态的,一个单词,一个意思的 Word2Vec 的限制。
在 Word2Vec 之前,单词嵌入要么是使用 one hot 编码技术的具有大量稀疏向量的简单模型,要么是我们使用 TF-IDF 方法来创建更好的嵌入,以忽略常见的低信息量单词,如“”、“ this ”、“ that ”。
*
One hot embeddings are not really useful since they fail to show any relationship between words, source: FloydHub blog
这些类型的方法在它们的向量中编码很少的语义意义。我们可以用它们来分类文本和识别文档之间的相似性,但是训练它们是困难的,并且它们的整体准确性是有限的。
Word2Vec 通过设计两种新的神经网络架构改变了这一切;跳跃式语法和连续词袋(CBOW)让我们能够在大量文本中训练单词嵌入。这些方法迫使神经网络在给出句子中其他单词的一些例子的情况下尝试并预测正确的单词。
这种方法背后的理论是常用词将一起使用。例如,如果你在谈论“手机”,那么我们很可能也会看到类似“手机”、 iPhone 、 Android 、电池、触摸屏等词汇。这些词可能会在足够频繁的基础上同时出现,以至于该模型可以开始设计一个具有权重的大向量,这将有助于它预测当它看到“电话”或“移动”等时可能会发生什么。然后,我们可以使用这些权重或嵌入来识别彼此相似的单词。
Word2Vec showed that embeddings could be used to show relationships between words like capital cities and their corresponding countries | Source: Semantic Scholar Paper
通过对更大的文本序列(如句子)做类似的事情,这种方法通过文本生成的例子得到了扩展。这就是所谓的顺序对顺序方法。它扩展了深度学习架构的范围,以执行越来越复杂的 NLP 任务。
这里要解决的关键问题是语言是一个连续的单词流。一个句子没有标准长度,每个句子都不一样。通常,这些深度学习模型需要知道它们正在处理的数据序列的固定长度。但是,这在文本中是不可能的。
因此,序列对序列模型使用了一种称为递归神经网络(RNNs)的技术。有了它,这些架构可以执行“循环”,并连续处理文本。这使他们能够创建响应输入提示产生文本的 LMs。
An example of how to think of RNNs as “looping” output from one part of the network to the input of the next step in a continuous sequence | Source: Chis Olah’s (amazing) post on RNNs
尽管像 Word2Vec 这样的模型和 RNNs 这样的体系结构在 NLP 方面取得了令人难以置信的进步,但它们仍然有一些缺点。Word2Vec 嵌入是静态的——每个单词都有一个固定的嵌入,即使单词根据上下文有不同的含义。RNN 架构的训练速度很慢,这限制了它可以训练的数据量。
正如我们所提到的,每一个新的模型都可以被看作是在以前的基础上进行改进的尝试。ELMo 试图解决 Word2Vec 的静态单词嵌入的缺点,采用 RNN 方法来训练模型识别单词含义的动态性质。
这是通过尝试根据单词所在的句子,动态地给单词分配一个向量来实现的。ELMo 模型允许用户向模型中输入文本,并基于该句子生成嵌入,而不是像 Word2Vec 那样使用带有单词和嵌入的查找表。因此,它可以根据上下文为一个单词产生不同的含义。
ELMo uses two separate networks to try and process text “bidirectionally” | Source Google AI Blog
这里需要注意的另一个要点是,ELMo 是第一个尝试非顺序处理文本的模型。以前的模型如 Word2Vec 一次读取一个单词,并按顺序处理每个单词。埃尔莫试图复制人类阅读文本的方式,他用两种方式处理文本:
- 开始到结束:架构的一部分正常读取文本,从开始到结束。
- 反过来,end to start :架构的另一部分从后往前读文本。理想的情况是,模型可以通过阅读“未来”来学习其他东西。
- 组合:在文本被阅读后,两个嵌入被连接起来“组合”意思。
这是一种双向阅读文本的尝试。虽然它不是“真正”双向的(它更像是一种反向的单向方法),但它可以被描述为“浅”双向的。
在很短的时间内,我们已经看到了一些快速的进步,从 Word2Vec 到更复杂的神经网络架构,如用于文本生成的 RNNs,再到通过 ELMo 基于上下文的单词嵌入。然而,使用这些方法训练大量数据的限制仍然存在问题。这严重阻碍了这些模型提高在一系列 NLP 任务中表现良好的能力的潜力。这就是预训练的概念为伯特这样的模型的到来奠定了基础,以加速进化。
简单地说,如果没有预训练模型的出现,BERT(或任何其他基于 Transformer 的模型)的成功是不可能的。预训练模型的理想在深度学习中并不新鲜。在图像识别方面已经实践了很多年。
Training a model on a massive amount of data and then making it available pre-trained enabled innovation in machine vision | Source
ImageNet 是一个巨大的标签图像数据集。多年来,它一直是训练图像识别模型的基础。这些模型学会了从这些大型数据库中识别图像识别的关键方面。这是识别图像边界、边缘和线条以及常见形状和物体的能力。
这些通用的训练模型可以下载,并用于训练你自己的,小得多的数据集。假设你想训练它识别你公司的人的脸。你不需要从零开始,让模型了解图像识别的一切,而是只需建立一般训练的模型,并根据你的数据调整它们。
像 Word2Vec 这样的模型的问题是,虽然它们是在大量数据上训练的,但它们不是通用的语言模型。您可以根据您的数据从头开始训练 Word2Vec,或者您可以简单地使用 Word2Vec 作为网络的第一层来初始化您的参数,然后添加层来为您的特定任务训练模型。因此,您可以使用 Word2Vec 来处理您的输入,然后为您的情感分类或 POS 或 NER 任务设计您自己的模型层。这里的主要限制是,每个人都在训练自己的模型,很少有人有资源(无论是数据还是计算成本)来训练任何非常大的模型。
正如我们在第 2 节中提到的那样,直到 2018 年像 ELMo 这样的模型出现。在那段时间,我们看到其他模型,如 ULMFit 和Open AIs first transformer model,也创建预训练模型。
这就是领先的 NLP 研究人员 Sebastian Ruder 所说的 NLPsImageNet moment——NLP 研究人员开始在预训练模型的强大基础上构建新的更强大的 NLP 应用程序。他们不需要大量的资金或数据来做这件事,这些模型可以“开箱即用”。
这对于像 BERT 这样的模型至关重要的原因有两个:
- 数据集大小:语言杂乱、复杂,对计算机来说比识别图像要难学得多。他们需要更多的数据来更好地识别语言模式,识别单词和短语之间的关系。像最新的 GPT-3 这样的模型是在 45TB 的数据上训练的,包含 1750 亿个参数。这些是巨大的数字,所以很少有人甚至组织有资源来训练这些类型的模型。如果每个人都必须训练自己的 BERT,如果研究人员不利用这些模型的力量,我们将会看到很少的进展。进展将是缓慢的,并且仅限于几个大玩家。
- 微调:预先训练的模型具有双重优势,即它们可以“现成”使用,即无需任何更改,企业只需将 BERT 插入他们的管道,并与聊天机器人或其他应用程序一起使用。但这也意味着这些模型可以针对具体任务进行微调,而无需太多数据或模型调整。对于 BERT 来说,你所需要的只是几千个例子,你可以根据你的数据进行微调。预训练甚至使得像 GPT-3 这样的模型可以在如此多的数据上进行训练,以至于他们可以采用一种被称为零或少量拍摄学习的技术。这意味着他们只需要看一些例子就能学会执行一项新任务,比如编写一个计算机程序。
随着预训练模型的兴起,以及从 Word2Vec 到 ELMo 的训练和架构的进步,现在是 BERT 登场的时候了。在这一点上,我们知道我们需要一种方法来处理更多的数据并从这些数据中学习更多的上下文,然后使其在预训练的模型中可用,供其他人在他们自己的领域特定的应用中使用。
如果你从这篇文章中学到了什么,那就是对 Transformer 架构的总体理解,以及它与 BERT 和 GPT-3 等模型的关系。这将让您查看不同的 Transformer 模型,了解他们对 vanilla 架构做了哪些调整,并了解他们试图解决什么问题或任务。这提供了一个关键的洞察力,它可能更适合什么任务或领域。
据我们所知,最初的变形金刚论文叫做“注意力是你所需要的全部”。名称本身很重要,因为它指出了它与以前的方法有什么不同。在第 2 节中,我们注意到 ELMo 等模型采用 RNNs 以类似循环的方式顺序处理文本。
RNNs with sequence to sequence approaches processed text sequentially until they reached an end of sentence token (). In this example an request, “ABC” is mapped to a reply “WXYZ”. When the model receives the token the hidden state of the model stores the entire context of the preceding text sequence. Source: A Neural Conversation Model
现在想一个简单的句子,比如“狗在街上追着猫跑”。对于一个人来说,这是一个容易理解的句子,但是如果你想按顺序处理它,实际上有很多困难。一旦你到了“ it 部分,你怎么知道它指的是什么?您可能需要存储一些状态来识别这个句子中的主角是“猫”。然后,当你继续阅读这个句子时,你必须找到某种方法将" it “和” cat "联系起来。
现在想象这个句子的长度可以是任意数量的单词,试着想想当你处理越来越多的文本时,你将如何跟踪被引用的内容。
这就是序列模型遇到的问题。
它们是有限的。他们只能优先考虑最近处理过的单词的重要性。随着他们继续沿着句子前进,前面单词的重要性或相关性开始减弱。
你可以把它想象成在处理每个新单词时向列表中添加信息。您处理的单词越多,就越难引用列表开头的单词。本质上,你需要一次一个元素,一个单词一个单词地往回移动,直到你找到更早的单词,然后看看那些实体是否相关。
“它是指“猫”吗?这就是所谓的“消失梯度”问题,ELMo 使用了一种称为长短期记忆网络(LSTMs)的特殊网络来缓解这种现象的后果。LSTMs 确实解决了这个问题,但没有消除它。
最终,他们无法创造一种有效的方式来“聚焦”每个句子中的重要单词。这就是变压器网络通过使用我们已知的“注意”机制来解决的问题。
This gif is from a great blog post about understanding attention in Transformers. The green vectors at the bottom represent the encoded inputs, i.e. the input text encoded into a vector. The dark green vector at the top represents the output for input 1. This process is repeated for each input to generate an output vector which has attention weights for the “importance” of each word in the input which are relevant to the current word being processed. It does this via a series of multiplication operations between the Key, Value and Query matrices which are derived from the inputs. Source: Illustrated Self-Attention.
“注意力是你所需要的全部”这篇论文使用注意力来提高机器翻译的性能。他们创建了一个包含两个主要部分的模型:
- 编码器:这部分“注意力是你所需要的全部”模型处理输入文本,寻找重要部分,并根据与句子中其他单词的相关性为每个单词创建嵌入。
- 解码器:它接收编码器的输出,这是一个嵌入,然后将这个嵌入转换回文本输出,即输入文本的翻译版本。
然而,论文的关键部分不是编码器或解码器,而是用于创建它们的层。具体来说,编码器和解码器都不像传统的 RNNs 那样使用任何递归或循环。取而代之的是,他们使用“注意力”层,信息通过它线性传递。它没有多次循环输入——相反,转换器通过多个注意层传递输入。
你可以把每一个注意力层看作是“学习”更多的输入信息,也就是看着句子的不同部分,试图发现更多的语义或句法信息。这在我们之前提到的渐变消失问题中是很重要的。
随着句子长度的增加,rnn 处理它们和学习更多信息变得越来越困难。每一个新单词都意味着要存储更多的数据,并且更难检索这些数据来理解句子中的上下文。
This looks scary, and in truth it is a little overwhelming to understand how this works initially. So don’t worry about understanding it all right now. The main takeaway here is that instead of looping the Transformer uses scaled dot-product attention mechanisms multiple times in parallel, i.e. it adds more attention mechanisms and then processes input in each in parallel. This is similar to looping over a layer multiple times in an RNN. Source: Another great post on attention
变压器可以解决这个问题,只需添加更多的“注意头”,或层。由于没有循环,它不会遇到渐变消失的问题。转换器在处理更长的文本时仍然有问题,但它不同于 RNN 的问题,我们不需要在这里讨论。作为比较,最大的 BERT 模型由 24 个注意层组成。GPT 2 号有 12 个关注层,GPT 3 号有 96 个关注层。
在这里,我们不会详细讨论注意力是如何工作的。我们可以在另一个帖子中查看。同时,您可以查看上图中链接的博客文章。它们是关于注意力及其运作方式的极好资源。这篇文章的重点是要理解 Transformer 架构是如何消除我们在 NLP 中使用 RNNs 时遇到的许多问题的。我们前面提到的另一个问题是,在研究 RNNs 的局限性时,以无序方式处理文本的能力。通过注意力机制,转换器使这些模型能够精确地做到这一点,并双向处理文本。
我们前面提到过,rnn 是在 Transformer 之前用来处理文本的架构。rnn 使用递归或循环来处理文本输入序列。以这种方式处理文本会产生两个问题:
- 速度慢:单向顺序处理文本的成本很高,因为这会造成瓶颈。这就像高峰时段的单车道,那里有长长的车龙,而非高峰时段的道路上几乎没有车。我们知道,一般来说,如果这些模型根据更多的数据进行训练,它们会表现得更好,所以如果我们想要更好的模型,这个瓶颈是一个大问题。
- 它错过了关键信息:我们知道人类并不是以绝对纯顺序的方式阅读文本。正如心理学家丹尼尔·威林厄姆在他的书“《阅读的头脑》”、“我们不是一个字母一个字母地读,我们是一个字母一个字母一个字母地读,一次找出几个字母”。原因是我们需要知道一点未来的事情来理解我们现在正在读的东西。NLP 语言模型也是如此。单向处理文本限制了他们从数据中学习的能力
This text went viral in 2003 to show that we can read text when it is out of order. While there is some controversy around this, see here for more detail, it still shows that we do not read text strictly in a letter by letter format
我们看到 ELMo 试图通过我们称之为“浅层”双向的方法来解决这个问题。它在一个方向上处理文本,然后反转文本,即从末尾开始,并以这种方式处理文本。通过连接这两种嵌入,希望这将有助于捕捉句子中的不同含义,如:
- 鼠标放在桌子上,靠近笔记本电脑
- 那只老鼠在桌子上,靠近那只猫
这两个句子中的“鼠标”指的是一个非常不同的实体,这取决于句子中的最后一个词是“笔记本电脑还是“猫”。通过颠倒句子,从单词“ cat ”开始,ELMo 试图学习上下文,以便能够对单词“ mouse ”的不同含义进行编码。通过首先处理单词“cat ”, ELMo 能够将不同的意思结合到“反向”嵌入中。这就是 ELMo 如何改进传统的、静态的 Word2Vec 嵌入的方法,后者只能对每个单词的一个含义进行编码。
如果不理解这一过程的细微差别,我们会发现 ELMo 方法并不理想。
我们希望有一种机制能够让模型在编码过程中查看句子中的其他单词,这样它就可以知道我们是否应该担心桌子上有一只鼠标!而这正是 Transformer 架构的注意力机制让这些模型能够做到的。
这个来自 谷歌博客 的例子展示了变形金刚网络中的注意力机制如何将注意力“集中”在“它”所指的东西上,在这种情况下是街道,同时也认识到“动物”一词的重要性,即动物没有穿过它,因为街道太宽了。
能够双向读取文本是像 BERT 这样的 Transformer 模型能够在传统的 NLP 任务中取得如此令人印象深刻的结果的关键原因之一。正如我们从上面的例子中看到的,当你只从一个方向阅读文本时,要知道“它”指的是什么是困难的,并且必须顺序存储所有的状态。
我想这并不奇怪,这是 BERT 的一个关键特性,因为 BERT 中的 B 代表“双向”。Transformer 架构的注意机制允许像 BERT 这样的模型通过以下方式双向处理文本:
- 允许并行处理:基于 Transformer 的模型可以并行处理文本,因此它们不会像基于 RNN 的模型那样受到必须顺序处理文本的瓶颈的限制。这意味着,在任何时候,模型都能够查看它正在处理的句子中的任何单词。但是这引入了其他问题。如果你在并行处理所有的文本,你怎么知道原文中单词的顺序呢?这是至关重要的。如果我们不知道顺序,我们就只有一个单词袋类型的模型,无法从句子中完全提取意思和上下文。
- 存储输入的位置:为了解决排序问题,Transformer 架构将单词的位置直接编码到嵌入中。这是一个“标记”,让模型中的注意力层识别他们正在查看的单词或文本序列位于何处。这个漂亮的小技巧意味着这些模型可以并行处理大量不同长度的文本序列,并且仍然知道它们在句子中出现的顺序。
- 使查找变得容易:我们之前提到过,RNN 类型模型的一个问题是,当它们需要顺序处理文本时,这使得检索早期的单词变得困难。因此,在我们的“鼠标”例句中,RNN 人希望理解句子中最后一个词的相关性,即“笔记本电脑”或“猫”,以及它与句子的前一部分的关系。要做到这一点,它必须从 N-1 个单词,到 N-2,到 N-3 等等,直到它到达句子的开头。这使得查找变得困难,这就是为什么单向模型很难发现上下文的原因。相比之下,基于 Transformer 的模型可以在任何时候简单地查找句子中的任何单词。这样,它在注意力层的每一步都有一个序列中所有单词的“视图”。所以它在处理句子的前半部分时可以“向前看”到句子的末尾,反之亦然。(根据注意力层的实现方式,这有一些细微差别,例如,编码器可以查看任何单词的位置,而解码器仅限于“回顾”它们已经处理过的单词。但是我们现在不需要担心这个)。
由于这些因素,能够并行处理文本,在嵌入中嵌入输入的位置,并且能够方便地查找每个输入,像 BERT 这样的模型可以双向“读取”文本。
从技术上来说,它不是双向的,因为这些模型实际上是一次查看所有文本,所以它是非定向的。但是最好把它理解为一种尝试双向处理文本的方法,以提高模型从输入中学习的能力。
能够以这种方式处理文本带来了一些问题,BERT 需要用一种叫做“屏蔽”的巧妙技术来解决,我们将在第 8 节中讨论。但是,现在我们对 Transformer 架构有了更多的了解,我们可以看看在最初的“注意力是你所需要的”论文中 BERT 和普通 Transformer 架构之间的区别。
当你读到最新的模型时,你会看到它们被称为“变形金刚”模型。有时这个词会被不严格地使用,像伯特和 GPT-3 这样的模型都会被称为“变形金刚”模型。但是,这些模型在一些重要方面非常不同。
如“注意力是你所需要的”一文中所述的变压器网络。注意,左边是编码器,右边是解码器,这就是我们的网络。|来源: 关注是你所需要的
理解这些差异将有助于您了解针对您自己独特的用例使用哪种模型。理解不同模型的关键是了解它们如何以及为什么偏离最初的 Transformer 架构。一般来说,需要注意的主要事项有:
- 是否使用了编码器?最初的 Transformer 架构需要翻译文本,因此它以两种不同的方式使用注意机制。一个是对源语言进行编码,另一个是将编码后的嵌入解码回目标语言。查看新型号时,检查它是否使用了编码器。这意味着它涉及以某种方式使用输出来执行另一项任务,即作为另一层的输入来训练分类器,或类似的事情。
- 解码器用了吗?或者,一个模型可能不使用编码器部分,而只使用解码器。解码器实现的注意机制与编码器略有不同。它的工作方式更像传统的语言模型,在处理文本时只查看以前的单词。这将适用于语言生成等任务,这就是为什么 GPT 模型使用转换器的解码器部分,因为它们主要关心的是生成文本以响应文本的输入序列。
- 增加了哪些新的训练层?最后要看的是模型为了执行训练增加了哪些额外的层(如果有的话)。正如我们前面提到的,注意力机制通过平行和双向处理文本打开了一系列的可能性。不同的层可以在此基础上构建,并为不同的任务训练模型,如问答或文本摘要。
BERT only uses the encoder part of the original Transformer network
现在我们知道要找什么了,BERT 和普通的变形金刚有什么不同呢?
- BERT 使用编码器 : BERT 使用转换器的编码器部分,因为它的目标是创建一个执行许多不同 NLP 任务的模型。因此,使用编码器使 BERT 能够在嵌入中对语义和语法信息进行编码,这是许多任务所需要的。这已经告诉了我们很多关于伯特的事情。首先,它不是为文本生成或翻译等任务设计的,因为它使用编码器。它可以在多种语言上训练,但它本身不是一个机器翻译模型。同样,它仍然可以预测单词,所以它可以用作文本生成模型,但这不是它优化的目的。
- BERT 不使用解码器:如前所述,BERT 不使用普通变压器架构的解码器部分。所以,BERT 的输出是嵌入的,而不是文本输出。这很重要——如果输出是嵌入的,这意味着无论你用 BERT 做什么,你都需要做一些嵌入的事情。例如,您可以使用余弦相似性等技术来比较嵌入并返回相似性得分。相比之下,如果您使用解码器,输出将是一个文本,所以您可以直接使用它,而不需要执行任何进一步的行动。
- BERT 使用创新的训练层: BERT 采用编码器的输出,并将其用于执行两种创新训练技术的训练层,即掩蔽和下一句预测(NSP)。这些是解锁包含在 BERT 嵌入中的信息的方法,以使模型从输入中学习更多信息。我们将在第 8 节详细讨论这些技术,但要点是 BERT 让 Transformer 编码器尝试并预测隐藏或屏蔽的单词。通过这样做,它迫使编码器尝试并“学习”更多关于周围文本的信息,并能够更好地预测隐藏或“屏蔽”的单词。然后,对于第二种训练技术,它让编码器在给定前一个句子的情况下预测整个句子。BERT 引入了这些“调整”来利用转换器,特别是注意力机制,并创建了一个为一系列 NLP 任务生成 SOTA 结果的模型。在当时,它超越了以前做过的任何事情。
现在我们知道了 BERT 与普通变压器架构的不同之处,我们可以仔细看看 BERT 模型的这些部分。但首先,我们需要了解伯特是如何“阅读”文本的。
当我们考虑像 BERT 这样的模型时,我们经常忽略这个过程的一个重要部分:这些模型如何“读取”输入,以便能够从他们接受训练的大量文本中学习?
你可能认为这是容易的部分。一次处理一个单词,用一个空格把每个单词分开,然后把它传递给注意力层,让他们施展魔法。
Tokenization seems straightforward, it just breaks the sentence up into words. But it turns out this is not as easy as it seems. | Source: FloydHub
然而,当我们尝试通过单词或其他简单方法(如标点符号)来标记文本时,会出现一些问题,例如:
- 一些语言不通过空格分隔单词:使用单词级方法意味着该模型不能用于像中文这样的语言,在这些语言中单词分隔不是一项简单的任务。
- 你将需要大量的词汇:如果我们按单词来划分事物,我们需要为我们可能遇到的每一个可能的单词做相应的嵌入。这是个很大的数字。你怎么知道你在训练数据集中看到了每一个可能的单词?如果你没有,模型将无法处理一个新单词。这是过去发生的事情,当遇到一个未知单词时,模特们被迫向< UNK >令牌进行识别。
- 更大的词汇量会降低你的模型的速度:记住,我们需要处理更多的数据,让我们的模型学习更多的语言知识,更好地完成自然语言处理任务。这是 Transformer 的主要好处之一——我们可以处理比以前任何模型都多得多的文本,这有助于使这些模型变得更好。然而,如果我们使用单词级标记,我们需要大量的词汇,这增加了模型的大小,并限制了它对更多文本进行训练的能力。
HuggingFace 有一个很棒的标记器库。它包括关于不同方法如何工作的优秀范例教程。例如,这里显示了如何根据训练数据中单词的频率创建基本词汇。这显示了像“hug”这样的单词是如何被标记为“hug”的,而“pug”是由两个子单词部分“p”和“ug”标记的。
伯特是如何解决这些问题的?它实现了一种新的标记化方法, WordPiece ,它将子词方法应用于标记化。WordPiece 通过以下方式解决了许多以前与标记化相关的问题:
- 使用子词代替单词:wordpartie 不是查看整个单词,而是将单词分解成更小的部分,或者构建单词块,这样它就可以使用它们来构建不同的单词。比如想一个“学”这样的词。你可以把它分成三个部分,“lea”,“rn”和“ing”。这样,你就可以用积木造出各种各样的单词:
- 学习= lea + rn + ing
- lean = lea+rn
然后,您可以将它们与其他子单词单元组合在一起,组成其他单词:
- Burn = bu + rn
- 流失= chu +rn
- Turning = tur + rrn + ing
- 圈数= tu + rn + s
您可以为最常用的词创建完整的词,但为不经常出现的其他词创建子词。然后,您可以确信您将通过使用您创建的构建块来标记任何单词。如果你遇到一个全新的单词,你总是可以一个字符一个字符地把它拼凑起来,例如 LOL = l + o + l,因为子单词标记库也包括每个单独的字符。即使你从未见过,你也可以造出任何单词。但是一般来说,你应该有一些可以使用的子词单元,并根据需要添加一些字符。
- 创建一个小词汇量:因为我们不需要为每个单词准备一个令牌,我们可以创建一个相对较小的词汇量。例如,BERT 在其库中使用了大约 30,000 个令牌。这可能看起来很大,但是想想曾经发明和使用过的每一个可能的单词,以及它们所有不同的用法。要涵盖这一点,您需要包含数百万个标记的词汇表,但您仍然无法涵盖所有内容。能够用 30,000 个代币做到这一点是不可思议的。这也意味着我们不需要使用< UNK >令牌,仍然有一个小的模型大小和大量的数据训练。
- 它仍然假设单词由空格分隔,但是… 虽然 wordpartie 确实假设单词由空格分隔,但新的子单词令牌库,如sentepiece(与基于 Transformer 的模型一起使用)或多语言通用句子编码器 (MUSE),是这种子单词方法的进一步增强,也是新模型最常用的库。
如果你想更深入地了解这个主题,我在这里写了一篇关于记号赋予者的深入评论。
正如我们在第 6 节中提到的,当你在看不同的基于 Transformer 的模型时,看看它们在训练方法上的不同会很有趣。就 BERT 而言,培训方法是最具创新性的方面之一。Transformer 模型提供了足够的改进,你可以使用传统的语言模型方法训练它们,并看到巨大的好处。
One problem with BERT and other Transformer based models which use the encoder is that they have access to all the words at input time. So asking it to predict the next words is too easy. It can “cheat” and just look it up. This was not an issue with RNNs based models which could only see the current word and not the next one, so they couldn’t “cheat” this way. Source: Stanford NLP
这是从以前的标记预测未来标记的地方。以前的 rnn 使用自回归技术来训练它们的模型。GPT 模型同样使用自回归方法来训练它们的模型。除了变压器架构(即我们之前提到的解码器),他们可以训练比以往更多的数据。而且,正如我们现在所知,模型可以通过注意力机制和双向处理输入的能力更好地学习上下文。
BERT uses a technique called masking to prevent the model from “cheating” and looking ahead at the words it needs to predict. Now it never knows whether the word it’s actually looking at is the real word or not, so it forces it to learn the context of all the words in the input, not just the words being predicted.
相反,BERT 使用了一种创新技术,试图“强迫”模型从给定的数据中学习更多。这项技术还提出了许多关于深度学习模型如何与给定的训练技术进行交互的有趣方面:
- 为什么需要掩蔽?记住,转换器允许模型双向处理文本。本质上,模型可以同时看到输入序列中的所有单词。以前,对于 RNN 模型,他们只看到输入中当前的工作,不知道下一个单词是什么。让这些模型预测下一个单词很容易,模型不知道它,所以必须尝试预测它,并从中学习。然而,有了 Transformer,BERT 可以“欺骗”并查看下一个单词,因此它什么也学不到。这就像参加一个考试,并得到答案。如果你知道答案永远在那里,你就不会学习。伯特使用掩蔽来解决这个问题。
- 什么是掩蔽?掩蔽(也称为完形填空)简单地说就是我们隐藏或“掩蔽”一个单词,然后强迫模型预测这个单词,而不是预测下一个单词。对于 BERT 来说,15%的输入令牌在模型看到之前就被屏蔽了,所以它不可能作弊。为此,随机选择一个单词,简单地用“[MASK]”标记替换,然后输入到模型中。
- 不需要标签:对于这些任务,要记住的另一件事是,如果你正在设计一种新的训练技术,最好是你不需要为训练标记或手动构造数据。屏蔽通过要求一种简单的方法来实现对大量非结构化数据的训练来实现这一点。这意味着它可以在完全无人监督的情况下进行训练。
- 15%的 80%:虽然蒙版看起来是一个简单的技术,但它有很多细微的差别。在被选择用于屏蔽的 15%的令牌中,只有 80%实际上被替换为屏蔽令牌。取而代之的是,10%用一个随机的单词替换,10%用正确的单词替换。
- 蒙版有什么好玩的?为什么不直接屏蔽 100%选择的 15%输入?这是个有趣的问题。如果你这样做,模型将知道它只需要预测被屏蔽的单词,而不需要了解输入中的其他单词。不太好。你需要模型去了解所有的输入,而不仅仅是 15%的屏蔽输入。为了“强迫”模型学习非屏蔽单词的上下文,我们需要用随机单词替换一些标记,用正确的单词替换一些标记。这意味着 BERT 永远不知道它被要求预测的非屏蔽单词是否是正确的单词。作为一种替代方法,如果我们在 90%的时间里使用掩码标记,然后在 10%的时间里使用不正确的单词,BERT 会在预测非掩码标记时知道它总是错误的单词。类似地,如果我们只在 10%的时间里使用正确的单词,BERT 会知道它总是正确的,所以它会继续重用它为那个单词学习的静态单词。它永远也学不会这个单词的上下文嵌入。这是对 Transformer 模型如何在内部表示这些状态的一个有趣的洞察。毫无疑问,我们会在其他模型中看到更多类似的训练调整。
现在应该很清楚了,当它在几年前出版时,BERT 在很多方面打破了这个模式。另一个区别是能够适应特定的领域。这建立在我们已经讨论过的许多事情的基础上,例如作为一个预先训练的模型,这意味着人们不需要访问大型数据集来从头训练它。您可以构建从更大的数据集中学习的模型,并将该知识“转移”到特定任务或领域的模型中。
In Transfer Learning we take knowledge learned in one setting, usually via a very large dataset, and apply it to another domain where, generally, we have much less data available. | Source Sebastian Ruder blog post
BERT 是一个预先训练好的模型,这意味着我们可以根据我们的领域对它进行微调,因为:
- BERT 可以进行迁移学习:迁移学习是一个 power 概念,最早是为机器视觉实现的。然后,在 ImageNet 上训练的模型可用于其他“下游”任务,在这些任务中,它们可以基于在更多数据上训练的模型的知识。换句话说,这些预先训练的模型可以将它们在大型数据集上学习的知识“转移”到另一个模型,后者需要更少的数据来出色地完成特定任务。对于机器视觉,预先训练的模型知道如何识别图像的一般方面,如线条、边缘、面部轮廓、图片中的不同对象等等。他们不知道像个人面部差异这样的细微细节。一个小模型可以很容易地被训练来将这种知识转移到它的任务中,并识别特定于它的任务的人脸或物体。如果你想让识别一株患病的植物,你不需要从头开始。
- 你可以选择相关的层来调优:虽然这仍然是正在进行的研究的问题,但似乎 BERT 模型的较高层学习更多的上下文或语义知识,而较低层往往在句法相关的任务上表现更好。较高层通常与特定任务的知识更相关。对于微调,您可以在 BERT 的基础上添加自己的层,并使用少量的数据来训练一些任务,如分类。在这些情况下,您可以冻结后面层的参数,只允许您添加的层参数发生变化。或者,您可以“解冻”这些更高层,并通过更改这些值来微调 BERT。
- 伯特需要更少的数据:既然伯特似乎已经学习了一些关于语言的“一般”知识,你需要更少的数据来微调它。这意味着你可以使用带标签的数据来训练分类器,但你需要标记的数据要少得多,或者你可以使用 BERT 的原始训练技术,如 NSP,来训练它对未标记的数据。如果你有 3000 个句子对,你可以用你的未标记数据来微调 BERT。
所有这些意味着 BERT 和许多其他 Transformer 模型可以很容易地适应您的业务领域。虽然微调似乎确实存在一些问题,而且许多模型已经从零开始为独特的领域训练 BERT,如 Covid19 信息检索,但这些模型的设计仍然有很大的转变,它们能够在无人监督和相对少量的数据上进行训练。
Avocado chairs designed by a decoder based Transformer model which was trained with images as well as text. | Source: OpenAI
现在,我们已经结束了对 BERT 和 Transformer 架构的旋风式回顾,让我们期待一下深度学习这一令人兴奋的领域的未来:
- 关于这些模型局限性的问题:围绕着试图仅从文本中提取意义的潜在局限性,有一场引人入胜、近乎哲学的讨论。一些最近发表的论文展示了关于深度学习模型可以从语言中学习什么的一种新的思维形式。在对越来越多的数据进行训练方面,这些模型注定会达到收益递减的点吗?这些都是令人兴奋的问题,它们正在超越自然语言处理的界限,进入更广泛的通用人工智能领域。关于这些模型的更多限制,请看我们之前关于这个话题的 neptune.ai 帖子。
- 模型的可解释性:人们常说我们开始使用一项技术,然后才弄清楚它是如何工作的。例如,我们在真正理解湍流和空气动力学的一切之前就学会了驾驶飞机。同样,我们使用这些模型,我们真的不明白他们在学习什么或如何学习。对于这些工作,我强烈推荐莉娜·沃伊塔的博客。她对伯特、GPT 和其他变压器模型的研究令人难以置信,是我们开始逆向工程这些模型如何工作的越来越多的工作的一个例子。
- 一幅图像胜过千言万语:变形金刚模型的一个有趣的潜在发展是已经在进行一些工作将文本和视觉结合起来,使模型能够根据句子提示生成图像。类似地,卷积神经网络(CNN)一直是机器视觉的核心技术,直到最近,基于变压器的模型开始被用于该领域。这是一个令人兴奋的发展,因为视觉和文本的结合有可能改善这些模型的性能,而不是单独使用文本。正如我们前面提到的,最初的机器翻译模型已经演变成一种技术,似乎比人工智能的任何其他领域都更接近于实现一般智能的圣杯。仔细观察这个空间,它可能是目前人工智能最令人兴奋的领域。
仅此而已。如果你做到了这一步,非常感谢你的阅读!我希望这篇文章能帮助您理解 BERT 和 Transformer 架构。
这确实是目前人工智能中最有趣的领域之一,所以我鼓励你继续探索和学习。您可以从我在本文中留下的各种不同的链接开始。
祝你的人工智能之旅好运!*
原文:https://web.archive.org/web/https://neptune.ai/blog/best-8-machine-learning-model-deployment-tools
机器学习在科技界并不新鲜。它为许多行业带来了革命性的变化,能够实现渠道自动化,并增加业务工作流程的灵活性。
我们如何在生产环境中创建和部署训练有素的模型 API 由机器学习生命周期的许多方面控制。 MLOps 的概念对于处理复杂的 ML 部署环境非常有益。
实施可靠的 MLOps 可以为投资机器学习的公司带来巨大的好处。理解使用和执行什么是这个难题的一个重要部分。学习和适应简化整体工作流程的新工具是另外一回事。
本文列出了用于模型部署的最佳 MLOps 工具。帮助您扩展和管理机器学习生命周期的所有要素,包括服务、监控和管理 API 端点。
如果您想将训练好的模型部署为端点,您可以使用 TensorFlow 服务来实现。
它允许您创建一个 REST API 端点来服务于训练好的模型。TensorFlow Serving 是一个健壮的高性能系统,用于服务机器学习模型。
您可以轻松部署最先进的机器学习算法,同时维护与其各自端点相同的服务器架构。它足够强大,可以为不同类型的模型和数据以及 TensorFlow 模型提供服务。
它是由谷歌创建的,许多顶级公司都使用它。将模型作为集中的模型库是一个很好的方法。服务架构对于大量用户同时访问模型是足够有效的。
如果由于大量请求而出现任何阻塞,可以使用负载平衡器轻松维护。总体而言,该系统具有较高的可扩展性和可维护性。
TensorFlow 发球优势:
- 一旦部署模型准备就绪,这个工具就可以轻松地提供服务。
- 它可以向同一个模型发起批量请求,因此可以有效地利用硬件。
- 它还提供了模型版本管理。
- 该工具易于使用,并负责建模和服务管理。
TensorFlow 发球缺点:
- 加载新型号或更新旧型号时,无法确保零停机时间。
- 仅适用于张量流模型。
如果您正在寻找一个开源工具来组织您的整个 ML 生命周期,这可能是您的平台。
MLflow 提供管理 ML 流程和部署的解决方案。它可以进行实验、复制、部署,或者作为一个中央模型注册中心。
该平台可以被个人开发者和团队用于 ML 部署。它可以整合到任何编程生态系统中。该库旨在满足各种技术需求,并可用于不同的机器学习库。
组织整个 ML 生命周期围绕着四个主要功能:跟踪、项目、模型和模型注册。
它有助于简化自动化 ML 模型跟踪的过程。但是一个缺点是它不能自动处理模型定义。这意味着向模型定义添加额外的工作需要手动完成。
MLflow 优点:
- 模型跟踪机制很容易建立。
- 它为服务提供了非常直观的 API。
- 日志记录实用且简单,因此很容易进行实验。
- 代码优先的方法。
MLflow 缺点:
- 向模型添加额外的工作并不是自动的。
- 对于将模型部署到不同的平台来说,这并不容易,也不理想。
Kubeflow 的主要目标是维护机器学习系统。这是为 Kubernetes 设计的强大套件。
主要操作包括打包,组织 docker 容器,帮助维护整个机器学习系统。
它简化了机器学习工作流的开发和部署,从而使模型具有可追溯性。它提供了一套强大的 ML 工具和架构框架来有效地执行各种 ML 任务。
多功能 UI 仪表板使管理和跟踪实验、任务和部署运行变得容易。笔记本功能使我们能够使用指定的平台开发套件与 ML 系统进行交互。
组件和管道是模块化的,可以重复使用以提供快速解决方案。这个平台是 Google 通过 Kubernetes 为 TensorFlow 任务服务而启动的。后来,它扩展到执行整个 ML 管道的多云、多架构框架。
Kubeflow 优点:
- 一致的基础架构,提供监控、运行状况检查、每次复制,以及对新功能的扩展。
- 简化新团队成员的入职流程。
- 标准化流程有助于建立安全性并更好地控制基础架构。
Kubeflow cons :
- 难以手动设置和配置。
- 高可用性不是自动的,需要手动配置。
- 这个工具的学习曲线很陡。
Cortex 是一个开源的多框架工具,非常灵活,可以用作模型服务工具,也可以用于模型监控等目的。
凭借其处理不同机器学习工作流的能力,它允许您完全控制模型管理操作。它还可以作为使用 SageMaker 工具提供模型的替代方案,以及基于 AWS 服务(如 Elastic Kubernetes Service (EKS)、Lambda 或 Fargate)的模型部署平台。
Cortex 扩展到 Docker、Kubernetes、TensorFlow Serving 和 TorchServe 等开源项目。它可以与 cohesion 中的任何 ML 库或工具一起工作。它提供端点的可扩展性来管理负载。
它允许您在单个 API 端点中部署多个模型。它还可以作为一种解决方案,在不停止服务器的情况下更新已经存在的生产端点。它覆盖了模型监控工具的足迹,监督端点的性能以及预测数据。
皮质优点:
- 当网络流量波动时,允许 API 安全的自动扩展功能。
- 支持多个平台,如 Keras、TensorFlow、Scikit-learn、PyTorch 等…
- 更新型号时不会停机。
皮层 cons :
- 设置过程可能有些令人望而生畏。
Seldon.io 提供了 Seldon core,这是一个开源的框架。该框架简化并加速了 ML 模型和实验部署。
它处理和服务在任何其他开源 ML 框架中构建的模型。ML 模型部署在 Kubernetes。当它与 Kubernetes 一起伸缩时,它使我们能够使用最先进的 Kubernetes 特性,比如定制资源定义来处理模型图。
Seldon 还提供了将您的项目与持续集成和部署(CI/CD)工具相连接的能力,以扩展和更新模型部署。
它有一个警报系统,当监控生产中的模型出现问题时,它会通知您。您可以定义模型来解释某些预测。该工具在云中可用,在内部也可用。
谢顿优点:
- 定制离线模型。
- 向外部客户公开 API 的实时预测。
- 简化部署过程。
谢顿缺点:
- 设置可能有点复杂。
- 对新来的人来说,学习可能很难。
BentoML 简化了构建机器学习服务的过程。它为部署和维护生产级 API 提供了一个基于 Python 的标准架构。这种架构允许用户使用任何 ML 框架轻松打包训练好的模型,用于在线和离线模型服务。
BentoML 的高性能模型服务器支持自适应微批处理,以及独立于业务逻辑扩展模型推理工人的能力。UI 仪表板提供了一个集中的系统来组织模型和监控部署过程。
其模块化设计使配置可在现有 GitOps 工作流中重复使用,自动 docker 映像生成使生产部署成为一个简单的版本化流程。
多用途框架解决了 ML 模型的服务、组织和部署。主要重点是连接数据科学和 DevOps 部门,以实现更高效的工作环境,并产生高性能的可扩展 API 端点。
欢迎使用:
- 易于大规模部署预测服务的实用格式
- 以单一统一的格式支持高性能模型服务和部署
- 支持部署到多个平台,而不仅仅是 Kubernetes
膨润土辅料:
- 不注重实验管理。
- 不支持开箱即用的水平扩展。
AWS Sagemaker 是亚马逊提供的强大服务。它让 ML 开发者能够快速构建、训练和部署机器学习模型。
它通过删除一些复杂的步骤来简化整个机器学习过程,从而提供高度可扩展的 ML 模型。
机器学习开发生命周期是一个复杂的迭代过程。它迫使你整合复杂的工具和工作流程。这项任务可能要求很高,令人恼火,而且可能会消耗你大量的时间。更不用说配置时出错的麻烦了。
Sagemaker 使这一过程变得更加容易,在一个集中的工具集中提供了用于机器学习的所有组件。没有必要配置每一个,因为它已经安装并准备使用。
这以最小的努力和成本加速了模型的生产和部署。该工具可用于使用任何 ML 框架创建的端点。它还提供预测跟踪和捕获,以及日程监控。
AWS Sagemaker 优点:
- 设置过程很简单,可以用 Jupyter 笔记本运行。因此,脚本的管理和部署得到了简化。
- 基于您使用的功能,成本是模块化的。
- 模型训练在多台服务器上完成。
AWS Sagemaker 缺点:
- 初级开发人员的陡峭学习曲线。
- 严格的工作流程很难定制。
- 仅适用于 AWS ecostystem
Torchserve 是一个 Pytorch 模型服务框架。它简化了训练有素的 PyTorch 模型的大规模部署。它消除了为模型部署编写定制代码的需要。
Torchserve 由 AWS 设计,是 PyTorch 项目的一部分。对于那些使用 PyTorch 环境构建模型的人来说,这使得设置变得很容易。
它支持低延迟的轻量级服务。部署的模型具有高性能和广泛的可伸缩性。
Torchserve 为一些 ML 任务提供了内置库,比如对象检测或文本分类。它可以节省你花在编写代码上的时间。它提供了强大的特性,比如多模型服务、用于 A/B 测试的模型版本控制、用于监控的指标以及用于应用程序集成的 RESTful 端点。
火炬服务的优点:
- 扩展部署的模型得到了简化。
- 服务端点是轻量级的,具有高性能规模。
火炬服务的缺点:
- 因为这个工具是实验性的,所以经常会发生变化和更新。
- 仅适用于 PyTorch 型号
创建和部署高性能和可扩展的机器学习模型是具有挑战性的任务。
幸运的是,本文中列出的部署工具和框架可以帮助您创建健壮的 ML 模型,并快速、轻松地部署它们。
处理和组织全面的机器学习生命周期绝非易事。这些工具将帮助你节省时间和精力。
祝你好运!
资源:
ML 生产基础设施工具 Aparna Dhinakaran
克里斯萨纳瓦特·卡韦桑穆昂
阅读下一篇
9 分钟阅读|作者弗拉基米尔·利亚申科| 2021 年 7 月 14 日更新
开发您的模型是 ML 项目工作的重要部分。这通常是一个艰难的挑战。
每个数据科学家都必须面对它,还有困难,比如失去实验的线索。这些困难很可能既烦人又不明显,会让你时不时感到困惑。
这就是为什么简化管理 ML 模型的过程是有好处的,幸运的是有几个工具可以做到这一点。这些工具有助于:
- 实验跟踪
- 模型版本控制
- 测量推理时间
- 团队协作
- 资源监控
因此,寻找和使用适合您的项目的工具是常识和良好的实践。
在本文中,我们将探索模型管理工具的前景。我将尝试向您展示各种工具,并强调它们的优点。
我们将涵盖:
- 选择模型管理工具的标准
- 模型管理工具 : Neptune、亚马逊 SageMaker、Azure 机器学习、Domino 数据科学平台、Google Cloud AI 平台、Metaflow、MLflow
Continue reading ->
原文:https://web.archive.org/web/https://neptune.ai/blog/best-ai-ml-tools-when-you-work-with-projects-for-telecom-industry-use-cases
电信公司有许多业务和职能部门,这使得它们运转良好。
在电信部门工作的数据科学家根据部门的不同,可能需要处理各种任务。可能会有一个改善客户体验的数据科学团队,或者一个为产品&工程部门提供动力的团队。
在本文中,我们将从我作为一名前电信数据科学家的角度,来看看电信公司中数据科学和相关工具的流行用例。
作为客户体验团队中的数据科学家,我的角色涉及三种主要类型的任务。
一切照旧(BAU)
BAU 是您跟踪某些 KPI,或调整/更新现有机器学习模型的地方。
老实说,对于一个充满热情的数据科学家来说,这是最没意思的工作,因为它涉及很少的创新和大量多余的任务。
但它是电信公司非常重要的一部分,因为它有助于领导层和高管做出更好的决策,并有效地运营业务。
构建概念证明(POC)
大多数新项目都从概念验证开始。分配大量时间来构建这些概念证明是很常见的。
与 BAU 不同,这项工作需要专注、研究和发展。这是一个更有创造性的职位,你的工作结果并不总是积极的。
咨询
很多时候,业务涉众可能会提出一个业务问题,比如“为什么 NPS(净推广得分)下降了?”。
作为一名咨询数据科学家(许多受雇担任这一角色的数据科学家是根据他们的咨询型问题解决能力进行评估的),您必须将该业务问题转化为数据科学问题。
首先,你可以探索影响 NPS 的因素。它有季节性吗?有时,即使 NPS 调查不友好,客户也会因为不喜欢该调查而倾向于给出糟糕的分数。正如你所看到的,这些问题是微妙的,需要数据科学家理解商业的本质,甚至心理学。
数据科学家需要戴上他们的咨询帽子,将他们的分析告诉他们的东西转化为对业务利益相关者有效、有价值的结论。
BAU、概念验证和咨询是数据科学家任务的主要类别,但不是唯一的类别。可能与上述三种任务重叠的一些其他类型的任务是:
会议
如果你曾在一家大公司工作过,你会知道你的大量时间都花在了会议上。
如果你的团队(比如我所在的团队)使用敏捷方法,那么你的日程表将会被大量与 sprint 相关的会议填满。每日站立,冲刺关闭,冲刺回顾,冲刺计划,积压整理/故事优先化。
这些只是和短跑有关。还有其他类型的内部会议。团队会议,与经理的一对一,越级会议等等。
无论你是软件工程师还是数据科学家,会议都是为大公司工作的最大诅咒。
你需要它们,因为它们为你正在解决的问题提供了背景,但是过多的会议会让你筋疲力尽。当你有冲刺计划或团队会议的时候,你会因为参加会议而感到疲惫。
数据治理
当您处理数据时,该流程从确定您需要什么类型的数据、谁拥有该数据(哪个业务部门)、数据存储在哪里、您是否需要信息安全部门的批准才能访问该数据、所有人需要谁签字等开始。
在开始项目或概念验证之前,您可能需要回答许多问题,克服许多困难。在电信公司,数据是圣杯。必须极其小心地对待它,否则你不仅会危及你的团队,甚至会危及你的整个公司及其品牌价值。
有大量的安全措施来避免任何灾难,它们会成为你启动项目的一大障碍。
有时,数据科学项目可能会被取消,仅仅是因为有人无法完成数据治理过程,或者因为该过程花费的时间比实际项目花费的时间多。
在完成所有必要的数据治理程序之前,您不能启动项目。
这些用例将局限于客户体验数据科学家的视角。企业中的大多数数据科学用例都围绕团队的业务 KPI。
通常,数据科学团队的任务是改善这些 KPI,或者防止它们下降。
对于客户体验(CX)团队,示例 KPI 可以是:
- 客户流失,
- 活跃用户–DAU、WAU、MAU(每日、每周和每月活跃用户),
- NPS–净推介值,
- CSAT-客户满意度得分。
基于这些 KPI 的用例将是:
- 客户流失预测,
- 识别驱动或影响客户流失的因素,
- 客户流失成本估算,
- 提高 DAU、WAU、MAU(用户保持率和活跃度)、
- 预测给定客户案例的 NPS,
- 识别驱动或影响 NPS 的因素,
- 来自 NPS 和 CSAT 调查反馈的客户反馈见解,
- 来自 NPS 反馈的情感分析,
- 构建客户 360°智能(主要针对 B2B 客户),
- 向上销售和交叉销售的推荐引擎。
这些用例是如何处理的?首先,它从一个想法开始。比方说,“推荐引擎”是我们的想法,我们把它推销给相关的利益相关者——CX 主管或客户保持。
接下来,我们将在推介环节回答一些问题。如果项目负责人被说服了,这个想法就进入了 POC 阶段。
概念验证阶段是我们使用真实数据的小样本构建一个小型原型的阶段。这和产品公司的 MVP 流程很像。
POC 的成功将基于许多因素来衡量(通常这些成功指标是在想法推介阶段定义的)。如果“推荐引擎”是这个想法,那么成功的衡量标准可以是:
- 这能产生多少追加销售?
- 这个推荐引擎可以帮助获取多少客户钱包份额?
- 它还能避免客户流失吗?
- 它会提高客户保持率吗?
所有这些问题通常都有定性和定量的答案,有实际的数字(样本数据的小子集)。如果项目发起人或业务干系人/团队认为概念验证是成功的,那么项目就进入生产阶段。
将数据科学项目从 POC/原型阶段转移到生产阶段会带来新的挑战。
到目前为止,它只是关注数据科学团队及其各自的业务团队。当它进入生产阶段时,情况就完全不同了。事情是这样的:
- 优化我们现有的代码,
- 遵循工程/开发团队的编码标准,
- 代码和机器学习模型的质量保证,
- 确保依赖性,
- 为将来的更新设置 CI/CD 管道,
- 决定如何提供推理的设计——微服务、API 或 web 应用程序。
这需要更多团队的参与:IT、开发运维、工程。这涉及到更多的项目管理程序。
在这一点上需要注意的一件重要事情是,在 POC 阶段,我们给出了项目上线的最后期限。在计算截止日期时,必须考虑 POC 和生产之间的所有必要阶段,这一点很重要。
在大型组织中,使用不同的工具组来解决相同类型的问题是很常见的。
以数据可视化为例。您可能会看到数据科学团队(处理可视化)在一个项目中使用 Tableau,在另一个项目中使用 Qlik Sense,而与此同时,一些团队成员可能正在使用 R Shiny 或 Python Plotly Dash 构建新的仪表板。
底线–一个问题,多种工具。此外,因为电信行业通常是资本密集型的,他们不会回避投资昂贵的专有工具。
让我们来看看一家电信公司的客户体验数据科学团队使用的一些工具。
数据基础设施
在讨论数据科学团队时,数据基础架构是一个经常被忽略且不太被谈论的东西。不认识到数据工程团队为数据科学团队提供数据和计算平台所做的大量工作是亵渎神明的。
与许多现代科技公司不同,由于大量的安全和合规措施,电信公司没有采用云解决方案的奢侈。
随着监管要求,这使得使用尖端计算平台非常困难。像 Teradata、SAS 这样被认为是老派和昂贵的技术,仍然在为这样的电信数据科学团队提供动力。
如果你需要一台强大的机器呢?嗯,您可能会通过 VDI 或 Citrix(虚拟化)获得功能强大的远程服务器。这也带来了自身的安全和数据定位挑战。
即使你有一台强大的本地电脑/笔记本电脑,也有很多限制:
- VPN,
- 无法在本地机器上下载客户数据,
- 需要匿名 PII,
还有更多复杂的问题需要你去克服。总而言之,电信公司的数据是一件很难处理的事情。这不一定与数据复杂性有关,而是与安全性、合规性、数据源、存储、计算限制等有关。
Adobe Analytics
Adobe Analytics 过去被称为 Adobe Sitecatalyst 或 Omniture,是一种非常受欢迎的数字分析工具,电信公司使用它来收集和分析他们的数字(web 和应用程序)点击流数据。
这个工具帮助他们了解什么是最受欢迎的网页,什么是跳出率最高/最低的网页(以便可以优化页面),如何优化转化率等等。
python–Numpy,Pandas,Scikit-Learn,Matplotlib,Plotly
Python 数据科学栈无处不在,几乎所有团队都在用,电信也不例外。
构建于 Numpy 之上的 Pandas 是许多基于 Python 的开发者的首选数据分析&数据操作工具。Pandas 与 Seaborn(基于 Matplotlib 构建)一起用于执行探索性数据分析。
Scikit-learn 绝对是机器学习的首选包/框架。虽然我在这里粗略地提到了机器学习,但它可以涵盖从构建基线 ML 模型到超参数调整和模型部署的任何内容。
这些天来,可解释的机器学习(也称为“可解释的人工智能”)越来越受欢迎。它有助于向业务涉众解释所谓的“黑盒”模型。
进入交互式可视化很常见:有时在 Jupyter 笔记本 中的独立 EDA 上,但其他时候作为仪表板的一部分。多亏了 Plotly 和 Plotly Dash,在 Python 中,交互式可视化和在其上构建简单的仪表板变得非常容易。
请注意,Plotly Dashdashboards/visualization 可能不是领导团队或更高层管理人员希望收到的最终内容。他们可能更喜欢类似 Tableau 的东西,因为他们很熟悉。
到目前为止,我还没有提到与深度学习相关的内容。事实是,在我的经历中,深度学习几乎从未发生过。发生这种情况的领域是网络分析、客户支持和概念验证。
你可以用手指数出正在生产的深度学习项目的数量(例如:聊天机器人、异常检测、预测、计算机视觉)。
但这并不意味着质量问题没有解决。对于表格数据,像 xgboost 、 lightgbm 、catboost 这样的框架是非常方便的,因为在这样的数据科学项目中,准确性只是成功的衡量标准之一(与可解释性、维护、部署一起)。
R + R 闪亮
R 编程语言(结合 RStudio 作为 IDE)是很多数据科学团队使用的流行解决方案。对于时间序列预测,它比 Python 更受欢迎(由于多功能的“预测”包),例如预测即将到来的季度或财政年度的 NPS/CSAT/流失。
在运行实验(A/B 测试)的同时,r 也优先执行统计测试。Shiny 是一个 R 包,可以让你只基于 R 创建 web 应用程序和仪表板,它通常是快速原型或与业务涉众进行模型调整的首选。
鉴于 Shiny Server for Linux 是免费的(不像 Tableau Server),它是团队尝试的一个划算的选择。
(舞台上由人扮的)静态画面
Tableau 是分享数据科学分析见解的最受欢迎的方式之一。Tableau 是首选,因为对于非技术高管来说,它很容易使用,并定期跟踪他们的一些 KPI。
数据科学团队也采用 Tableau 作为平台来提供见解,因为市场上有 Tableau 开发人员,并且数据科学家能够快速上手 Tableau。
信息/数据安全
信息/数据安全被视为电信行业的圣杯。如果你要从事与电信数据相关的工作,你应该愿意忍受等待数据、签署 InfoSec 批准表格、与数据隐私官(DPO)跟进以及极其小心地处理数据的痛苦。
即使是看似微不足道的数据泄露也会给你的公司带来巨大的灾难。最重要的是,坚持 GDPR 是数据科学和机器学习项目的另一个复杂因素。
真理的唯一来源(SSOT)
由于安全策略的原因,收集数据很难,同样,组合多个数据源并创建一个单一的真实来源也很难。为什么?
这主要是因为电信行业仍在使用大量遗留系统,遗留系统中驻留的或来自遗留系统的大量数据与您从现代数字系统中获得的数据非常不同。
例如,传统的销售点系统与最新的在线支付或充值系统之间存在巨大差异。你需要中间件来连接这些系统。
总而言之,数据来源越多,创建单一的真实来源就变得越复杂。
结论
在这篇文章中,我们探索了在一家电信公司的客户体验团队中担任数据科学家的感受。
但最重要的是,如果你成为电信行业的数据科学家,你将面临的挑战和惊喜。
这是我个人经历的一个简短总结,我希望它对您了解在电信行业做一名数据科学家是什么感觉很有用。
But the most important thing were the challenges and surprises that you will face if you become a data scientist in telecom.
This was a short summary of my personal experience, and I hope it was useful for you to see what it’s like to be a data scientist in telecom.
原文:https://web.archive.org/web/https://neptune.ai/blog/best-alternatives-to-mlflow-model-registry
MLflow 模型注册是 MLflow 平台的四个组件之一。其他三个组件是跟踪、项目和模型。它们的设计方式使得每个组件都可以单独使用,但它们也可以很好地协同工作。
MLflow 模型注册组件是一个集中式模型存储、一组 API 和 UI,用于协作管理 MLflow 模型的整个生命周期。它提供模型沿袭(MLflow 实验和运行产生了模型)、模型版本化、阶段转换(例如从阶段转换到生产)和注释。”–ml 流程文件
MLflow Model Registry 的目标,就像任何机器学习模型注册工具一样,是为了让 ML 团队在需要的任何时候都能轻松找到所有与模型相关的元数据。以一种间接的方式,模型注册促进了将模型从培训转移到生产的过程,并确保了模型治理。
MLflow 模型注册组件和 MLflow 平台作为一个整体,都是很好的工具,可以在每个 ML 项目中提供巨大的帮助。但是,他们当然不会为每个人勾选所有的复选框。
您可能认为具有挑战性的一些事情:
- 没有模型传承和评估历史特性,如下游创建的模型或测试运行的历史。
- MLflow 模型注册表中缺少代码版本化和数据集版本化,这使得再现性更加困难。
- 团队协作和访问管理功能不可用,因此如果您在团队中工作,您必须找出一些耗时的解决方法。
- MLflow 是一个开源工具。因此,除非您想使用 Databricks 平台,否则您需要自己设置和维护 MLflow 服务器。
- 在这种情况下,您通常需要独自调试任何问题。没有专门的用户支持来一步一步地告诉你该做什么。即使开源社区非常活跃,他们也可能没有所有的答案,或者可能需要一些时间才能得到答案。
MLflow 模型注册表被很多团队使用,他们肯定看到了它的价值。但是如果以上几点对您或您的团队很重要,并且您希望在您的模型注册工具中包含它们,那么这里有几个您应该考虑的选择。
Neptune 是 MLOps 的元数据存储。它的主要焦点是帮助数据科学家和 ML 工程师进行实验跟踪和模型注册。
它在模型注册区提供了什么?
首先,你可以将各种建模元数据记录到 Neptune,包括代码、git 信息、文件、Jupyter 笔记本、数据集等等。通过这种方式,您可以在一个中央注册表中对模型进行版本化,并且可以轻松地分析、比较或检索数据。
无论你或你的同事(如果你在团队中工作)在哪里进行训练——无论是在云中、本地、笔记本或其他地方——Neptune 都可以成为你的真实来源和你过去跑步的数据库。
有了这些,对于任何模型,你都可以知道谁创建了它,如何创建的,但是你也可以检查你的模型是在什么数据上训练的,并且在运行之间比较数据集。
海王星还没有的是模型的审批机制。但是作为一个 ML 元数据存储,它给了你很大的灵活性,所以你可以自己建立提升模型的协议。
海王星——概要:
如果你想看海王星在行动,检查这个现场笔记本或这个例子项目(不需要注册),只是玩它。你也可以看看这个 MLflow 和 Neptune 的深度对比。
阅读 Zoined 的案例研究,了解他们为什么选择 Neptune 而不是 MLflow。
Amazon SageMaker model registry | Source
Amazon SageMaker 是一个完全托管的服务,开发者可以将其用于 ML 开发的每一步,包括模型注册。使用 SageMaker 模型注册中心,您可以为生产编制模型目录,管理模型版本,将元数据(比如培训指标)与模型相关联,以及管理模型的批准状态。
要在 Amazon SageMaker 中注册一个模型,您只需要创建一个模型版本并指定它属于哪个组。还可以用指定容器和相关变量的推理管道注册它。然后,您将使用 AWS Python SDK 来创建新的版本模型。
AWS 的便利之处在于您可以在注册中心之外部署模型。机器学习模型经过训练后,可以部署到 SageMaker 端点,这些端点可以提供低延迟的实时推理。
在部署您的模型之后,您可以使用 Amazon SageMaker Model Monitor 持续实时监控您的机器学习模型的质量。
VertaAI model registry | Source
Verta AI 是一个模型管理和操作工具,具有模型注册功能,在一个统一的空间中,您可以管理和部署您的机器学习模型。
在一个友好的 UI 中,您注册您的模型并发布所有的模型元数据、文档和工件。然后,您可以将您的模型连接到一个实验跟踪系统,在那里您将能够端到端地管理实验。Verta 提供了所有模型信息的统一视图,以便更好地发现。
Verta AI 系统还为 ML 项目的版本控制提供工具,并允许单独跟踪代码、数据、配置和环境的变化。您可以随时访问审计日志,以检查模型的合规性和稳健性。这个平台可以在模型生命周期的任何阶段使用。
Verta AI 允许您减少发布时间,同时不影响质量。只有当模特通过基本的安全和隐私检查后,他们才会被放行。您可以构建适合您的项目的自定义审批工作流,并将其与您选择的票证系统集成。
Verta AI 的主要功能包括:
- 仪表盘用于报告和绩效评估,您可以根据需要定制。
- 集成–该工具在 Docker 和 Kubernetes 上工作,并与 Tensorflow 和 PyTorch 等大多数机器学习工具集成。它还为 CI/CD 带来了巨大的商机,因为它与 Jenkins 和 GitOps 等 CI/CD 管道相集成。
- 类似 Git 的环境–如果你有使用 Git 的经验(大多数开发者都有),那么你会发现这个系统直观易用。
Azure Machine Learning 是一个云 MLOps 平台,允许您管理和自动化整个 ML 生命周期,包括模型管理、部署和监控。Azure 中包含以下 MLOps 功能:
- 创建可复制的 ML 管道。
- 为培训和部署模型创建可重用的软件环境。
- 从任何地方注册、打包和部署模型。
- 处理端到端 ML 生命周期的数据治理。
- 就 ML 生命周期中的事件发出通知和警报。
- 监控 ML 应用程序的运行和 ML 相关问题。
- 利用 Azure 机器学习和 Azure 管道自动化端到端 ML 生命周期。
Azure ML 在模型注册和审计跟踪领域提供了特性。您可以使用中央注册中心来存储和跟踪数据、模型和元数据,并通过审计跟踪自动捕获沿袭和治理数据。
如果你想让你的整个 ML 基础设施基于云,或者已经这样做了,Azure 是很有帮助的。
Comet 是一个机器学习实验管理平台。这是一个功能丰富的系统,可以帮助您通过 Python SDK 实验记录实验模型,以及注册、版本化和部署它们。
在 Registered models 选项卡中,您将看到您的模型的所有版本,以及每个版本的详细信息。Comet 使得跟踪实验和模型版本的历史变得简单。由于通过贝叶斯超参数优化算法的模型再现和模型优化,ML 工作流的维护也变得更加有效。这里你可以阅读更多关于 Comet 的模型注册表。
总的来说,Comet 具有强大的功能,允许个人开发人员和专业团队运行和跟踪实验:
- 快速整合。只需几行代码,就可以轻松将该解决方案与您使用的其他工具集成。Comet 兼容大多数平台和机器学习库。
- 对比实验。您可以在一个用户界面中访问代码、超参数、指标和依赖关系,从而方便比较实验。
- 不断地监视。如果模型的性能下降,您会收到警报。从培训到生产的自动化监控提高了项目的质量。
- 改善报告。可视化和报告的内置功能有助于与利益相关者和团队其他成员的沟通。
Dataset versioning in Weights & Biases | Source
Weights and Biases 是一个用于实验跟踪、数据集版本化和模型管理的平台。模型注册不是它的主要焦点,而是 WandB 的组件之一, Artifacts ,允许您对数据集和模型进行版本化,这有助于 ML 模型的传承并保证它们的可重复性。
Wandb 还拥有令人难以置信的可视化工具,有助于可视化模型性能、训练指标和模型预测。您可以将 Weights & Biases 与您喜欢的库和框架一起使用。
除此之外,该工具使工程师能够用超参数的各种组合来训练模型。多亏了这个工具,这个过程变得简单多了:数据科学家所要做的就是准备代码来训练模型和调整超参数。
WandB 的主要优势包括:
- 简单的实验跟踪
- 自动超参数调谐
- 可定制的可视化
- 与流行框架的集成
- 协作功能
MLflow 是一个非常有用的工具,它不仅提供了模型注册,还提供了实验跟踪、代码和模型打包、模型部署等等。这是最受 ML 从业者欢迎的开源工具之一。但是,它缺少一些功能,比如模型血统、代码和数据集版本控制、访问管理或者共享项目(这对 ML 团队来说尤其有益)。它还必须托管在您自己的服务器上。
如果这些要点对你至关重要,看看市场周围,看看有什么替代工具可用总是好的。
你应该选择什么?如果您正在寻找一个专注于模型注册并扩展该领域功能的工具,Neptune 是最佳选择(它的主要焦点是实验跟踪和模型注册)。如果你对可以帮助你完成整个 ML 模型生命周期的工具感兴趣,可以去亚马逊 SageMaker 或者 VertaAI 看看。AzureML 和 Comet 也涵盖了更广泛的任务。
分析您的需求和用例,并测试与它们最匹配的工具。希望这个列表能帮助你找到一些选择!
原文:https://web.archive.org/web/https://neptune.ai/blog/best-benchmarks-for-reinforcement-learning
在这篇文章中,我将与你分享我的支持训练强化学习(RL)代理的环境库。RL 研究的基础,甚至玩 RL 或者学习 RL 的基础,都是环境。它是你运行你的算法来评估它有多好的地方。我们将探索 23 种不同的基准,因此我保证您会发现一些有趣的东西!
但首先,我们将做一个简短的介绍,如果你刚刚开始学习 RL,你应该寻找什么。不管你目前的知识水平如何,我建议你浏览一下整个列表。我希望它能激励你继续做好工作,并激励你以不同于标准基准的方式开始自己的项目!
如果你对专门研究离散动作空间 (PPO、DQN、彩虹……)的算法感兴趣,例如,动作输入可以是雅达利 2600 游戏控制器上的按钮,那么你应该看看开放 AI 健身房中的雅达利环境。这些包括 Pong,Breakout,Space Invaders,Seaquest 等等。
另一方面,如果你对专门研究连续动作空间 (DDPG、TD3、SAC、…)的算法更感兴趣,比如说,动作输入是学习走路的人形机器人关节上的扭矩,那么你应该看看 OpenAI Gym 和 DeepMind Control Suite 中的 MuJoCo 环境。PyBullet Gymperium 是一种免费的替代品。更艰苦的环境包括机器人在开放人工智能健身房。
如果你还不知道你感兴趣的是什么,那么我建议你在 OpenAI 健身房里玩玩经典控制环境,并阅读《T2》深度学习。
介绍够了,来看看基准吧!
这一部分的第一部分只是一个列表,按字母顺序列出了所有 23 个基准。接下来,我添加了每个基准测试创建者的一些描述,向您展示它的用途。
RL 基准列表
体验假说是这样一种观点,即“智能出现在主体与环境的相互作用中,并且是感觉运动活动的结果”。 Habitat 是一个用于研究嵌入式人工智能的模拟平台。
想象一下,走到一个家用机器人面前,问“嘿,机器人,你能去看看我的笔记本电脑在不在我的桌子上吗?如果有的话,拿给我”。或者问一个以自我为中心的人工智能助理(坐在你的智能眼镜上):“嘿——我最后一次看到我的钥匙是在哪里?”。AI Habitat 能够在将学到的技能转移到现实之前,在高度逼真的&高效 3D 模拟器中训练这种具体化的 AI 智能体(虚拟机器人和以自我为中心的助手)。
如果你学习具有物理或虚拟化身的智能系统,这将是最适合你的。
bsuite 是一组精心设计的实验,调查强化学习(RL)代理的核心能力,有两个主要目标。
- 收集清晰的、信息丰富的、可扩展的问题,这些问题抓住了设计有效的、通用的学习算法中的关键问题。
- 通过代理在这些共享基准上的表现来研究他们的行为。
这个库自动评估和分析这些基准上的任何代理。它有助于对 RL 中的核心问题进行可重复和可访问的研究,并最终设计出优秀的学习算法。
dm_control 软件包是一个 Python 库和任务套件的集合,用于关节式身体模拟中的强化学习代理。MuJoCo 包装器提供了方便的函数和数据结构绑定,可以创建自己的任务。
此外,控制套件是一组具有标准化结构的固定任务,旨在作为性能基准。它包括像 HalfCheetah,Humanoid,Hopper,Walker,Graber 等经典任务(见图)。运动框架提供了运动任务(如足球)的高级抽象和示例。还包括一组可配置的操作任务,包括机械臂和拼接砖。
该软件包的介绍性教程可通过协作笔记本获得。
DeepMind Lab 是通过 ioquake3 和其他开源软件,基于 Quake III Arena 的 3D 学习环境。DeepMind 实验室为学习代理提供了一套具有挑战性的 3D 导航和解谜任务。它的主要目的是作为人工智能研究的试验台,代理人必须根据视觉观察采取行动。
DeepMind 记忆任务套件是一组 13 个不同的机器学习任务,需要记忆来解决。构造它们是为了让我们评估特定于内存的维持集的泛化性能。
Psychlab 是 DeepMind 实验室第一人称 3D 游戏世界内部的模拟心理学实验室。Psychlab 实现了经典的实验室心理学实验,因此它们可以与人类和人工代理一起工作。Psychlab 有一个简单灵活的 API,使用户能够轻松地创建自己的任务。例如,Psychlab 包括几个经典的实验范例,包括视觉搜索、变化检测、随机点运动辨别和多目标跟踪。
元强化学习算法可以使机器人通过利用先前的经验来学习如何学习,从而更快地获得新技能。 Meta-World 是一个开源的模拟基准,用于元强化学习和多任务学习,由 50 个不同的机器人操纵任务组成。作者旨在提供足够广泛的任务分布,以评估 meta-RL 算法对新行为的推广能力。
MineRL 是一个始于卡耐基梅隆大学的研究项目,旨在开发《我的世界》人工智能的各个方面。简而言之,MineRL 由两个主要部分组成:
- MineRL-v0 数据集–最大的模仿学习数据集之一,拥有超过 6000 万帧记录的人类球员数据。该数据集包括一组环境,这些环境突出了现代强化学习中的许多最困难的问题:稀疏奖励和分层政策。
- 用于在《我的世界》进行人工智能研究的丰富的 python3 包。这包括两个主要的子模块:MineRL . env——《我的世界》的一组不断增长的 OpenAI 健身房环境和MineRL . data——用于试验 MineRL-v0 数据集的主要 python 模块。
多代理自动课程中紧急工具使用的环境生成代码。这是一篇有趣的论文,我强烈推荐你阅读。作者观察到代理人在玩简单的捉迷藏游戏时逐渐发现更复杂的工具使用。通过在模拟的捉迷藏环境中的训练,代理人建立了一系列六种不同的策略和反策略。这种简单环境中自我监督的涌现复杂性进一步表明,多主体协同适应可能有一天会产生极其复杂和智能的行为。
它使用“world gen:Randomized MuJoCo environments”允许用户生成复杂的、高度随机化的环境。如果你想创造自己的环境,你也应该尝试一下!
Gym 除了是最广为人知的基准之外,还是一个开发和比较强化学习算法的神奇工具包。它支持教导代理从行走模拟人形机器人(需要 MuJoCo,免费选择见 PyBullet Gymperium )到玩像 Pong 或 Pinball 这样的 Atari 游戏。我个人在研究中用得最多。它非常容易使用,而且是当今的标准配置。你应该好好了解一下。
健身房复古可以认为是 OpenAI 健身房的延伸。它可以让你将经典的视频游戏转化为开放式人工智能健身房环境,用于强化学习,并集成了约 1000 个游戏。它使用各种支持 Libretro API 的模拟器,使得添加新的模拟器相当容易。
OpenSpiel 是一个环境和算法的集合,用于游戏中一般强化学习和搜索/规划的研究。OpenSpiel 支持 n 人(单个和多个代理)零和、合作和一般和、一次性和连续、严格轮流和同时移动、完美和不完美信息游戏,以及传统的多代理环境,如(部分和完全可观察的)网格世界和社会困境。OpenSpiel 还包括分析学习动力和其他常见评估指标的工具。游戏被表示为程序性的扩展形式的游戏,带有一些自然的扩展。为了提高效率,核心的 API 和游戏都是用 C++实现的,为了便于使用,它们都暴露在 Python 中。
Procgen Benchmark 由 16 个独特的环境组成,旨在测量强化学习中的样本效率和泛化能力。这个基准是评估泛化的理想选择,因为在每个环境中都可以生成不同的训练集和测试集。该基准也非常适合于评估样本效率,因为所有环境都给 RL 代理带来了各种各样令人信服的挑战。环境的内在多样性要求代理学习健壮的策略;过度适应状态空间中的狭窄区域是不够的。换句话说,当代理人面对不断变化的水平时,概括的能力成为成功的一个不可或缺的组成部分。
PyBullet Gymperium 是 OpenAI Gym MuJoCo 环境等的开源实现。这些都是具有挑战性的连续控制环境,比如训练人形机器人行走。它的酷之处在于,它不需要用户安装 MuJoCo,这是一个需要付费许可证才能运行 30 天以上的商业物理引擎。
现实世界强化学习的挑战论文确定并描述了一组九个挑战,这些挑战目前阻碍了强化学习(RL)代理在现实世界应用和产品中的应用。它还描述了一个评估框架和一组环境,可以评估 RL 算法对现实系统的潜在适用性。从那时起,对现实世界强化学习的挑战进行了实证研究论文,实现了九个描述的挑战中的八个,并分析了它们对各种最先进的 RL 算法的影响。
这是用于执行该分析的代码库,也是用于围绕这些挑战进行可重复实验的通用平台。它被称为 realworldrl-suite (真实世界强化学习(RWRL)套件)。
RLCard 是一个卡牌游戏中强化学习(RL)的工具包。它通过易于使用的界面支持多卡环境。游戏包括 21 点,UNO,限制德州扑克,等等!它还允许您创建自己的环境。RLCard 的目标是在强化学习和不完美信息博弈之间架起一座桥梁。
RL 不插电是一套离线强化学习的基准测试。RL Unplugged 旨在促进易用性,它为数据集提供了统一的 API,一旦建立了通用管道,从业者就可以轻松地处理套件中的所有数据。它包括最常见基准的数据集:雅达利、DeepMind 移动、DeepMind 控制套件、Realworld RL、DeepMind 实验室和 bsuite。
Screeps 是一款大型多人在线即时战略游戏(phwee,很多)。每个玩家都可以在一个所有玩家共享的世界中创建自己的殖民地。这样的殖民地可以开采资源,建造单位,征服领土。随着你征服更多的领域,你在游戏世界中的影响力也在增长,你扩大自己影响的能力也在增长。然而,这需要你付出很多努力,因为多个玩家可能会瞄准同一个领域。最重要的是,你建立了一个能做所有这些的人工智能!
Screeps 是为有编程技能的人开发的。与其他 RTS 游戏不同,你在 Screeps 中的单位可以在没有你参与的情况下对事件做出反应——前提是你已经对它们进行了适当的编程。
毒蛇。AI 是一个简单而强大的新颖框架,帮助开发者创建游戏代理。用熟悉的 Python 代码,将你拥有的任何视频游戏变成一个成熟的沙盒环境进行实验。比如 GTA 里的这个自动驾驶智能体。该框架首先为机器学习& AI 研究提供了一个有价值的工具。作为一个业余爱好者来说,使用它也是非常有趣的(而且很容易上瘾)!
PySC2 为 RL 代理提供了与星际争霸 2 交互的接口,获取观察和发送动作。它将暴雪娱乐的星际争霸 2 机器学习 API 暴露为 Python RL 环境。这是 DeepMind 和暴雪的合作,将星际争霸 2 开发成一个丰富的 RL 研究环境。 PySC2 有很多预配置的小游戏地图,用于对 RL 代理进行基准测试。
这是一个开源项目,使游戏和模拟成为训练智能代理的环境。Unity 提供了最先进算法的实现(基于 PyTorch ),使游戏开发者和爱好者能够轻松训练 2D、3D 和 VR/AR 游戏的智能代理。然而,研究人员可以使用提供的简单易用的 Python API,通过强化学习、模仿学习、神经进化或任何其他方法来训练代理!例如,参见马拉松环境。
这是官方的 Python 实现 WordCraft:一个基准测试常识代理的环境。快速解决各种现实任务的能力需要对世界有常识性的理解。为了更好地利用常识对代理进行研究,你应该试试 WordCraft,一个基于小炼金术 2 的 RL 环境。小炼金术 2 是一个有趣和令人上瘾的游戏,它允许玩家组合元素来创造更多的元素。这种轻量级环境运行速度很快,并且建立在受现实世界语义启发的实体和关系之上。
我们的 RL 基准测试列表到此结束。我真的不能告诉你应该选哪一个。对于一些人来说,在“经验法则”一节中描述的更经典的基准,如 OpenAI Gym 或 DM Control Suite,将是最合适的。对于其他人来说,这是不够的,他们可能会想投入一些不那么累的东西,如 Unity ML-agents 或 Screeps。
就我个人而言,有一次我和 GRF 一起工作,看到我的经纪人如何学习踢足球和进球很有趣。目前,我正在进行一些更基础的研究,并使用公认的 OpenAI Gym MuJoCo 环境测试我的代理,这在其他方面很有趣,比如看到我的方法真的有效。
无论你的选择是什么,我希望这个列表能帮助你让你的 RL 研究更令人兴奋!
到此这篇transunet复现(transunet复现synapse数据集)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/80527.html