理解蒙特卡罗估计
阿曼达·琼斯在 Unsplash 上的照片
实践教程
蒙特卡罗估计是机器学习工程师工具箱的重要组成部分。在这里,我们直观地深入研究它,以了解它的用例、性能以及一般使用时需要记住的事项。
像任何其他好的算法介绍一样,我们从一个关于我们试图解决的问题设置的故事开始。该设置是对积分的估计。
假设我给你一个函数 f ,那真的很复杂。我告诉你你可以对 f 求值,但是我对这个函数的积分感兴趣。不幸的是,你不能解析地计算这个函数的积分——也许这是不可能的,或者你的数学水平不够高。此外,函数 f 可能不会显式给出,这可能是某种模拟,您需要运行它来计算 f 的某个值。你可以做的一个选择是积分的蒙特卡罗估计。
我们正在处理估计积分的问题,因为函数 f 可能太复杂,不允许对解进行解析计算。
事实上,正如你可能从名字上怀疑的那样,这种算法起源于赌博游戏,作为一种计算预期赢款的方法,或者基于样本计算你在赌博游戏中可以赢的预期金额。显然,反复赌博以获得更多的样本来提高你的估计是不明智的,但这是计算你的预期赢(输)的有效方法。
在概率中,期望被定义为连续情况下的积分。
所以,我们来深究一下。在蒙特卡罗抽样中,我们从函数 f 的域中抽样,我们只取样本的平均值来估计函数的期望值。为什么这是一种有效的方法?TLDR;这一切都可以归结为查看估计量的前两个矩,即均值和方差。让我们来看看数学。我们可以非常粗略地将期望值的蒙特卡罗估计定义如下:
注意上面红色加粗的部分。我想让你记住,所有的样本都是从分布中抽取的,即根据密度 p(x) 来确定目标期望值。这将允许我们在推导估计量的期望值时,操纵期望值。因此,不再拖延,让我们开始推导期望值。看看下面的推导,稍微调解一下:
事实上,我们对随机变量 f(x) 的估计均值(我们用 μ-hat 来表示)具有真正的\mu 作为期望值。为什么我们会得出这个结论?因为来自分布 p(x) 的样本是独立同分布的——简称 i.i.d .剩下的就是线性的期望了。这也意味着我们对真实均值的估计是无偏的,这是一种有趣的说法,即在期望中,它渐近地收敛于真实均值。
无偏性意味着估计量收敛于真实均值
现在你可能会问这种估计量是不是“好的”,可以说你肯定会说,它是好的,因为它收敛于真实均值,而且是无偏的。还有一点你可能需要考虑的是样本数量的收敛速度。为此,我们想看看它的方差,即到其均值(二阶(中心)矩)的期望平方距离。我们得出以下结论:
最后我们得到函数 f 除以估计量的样本数 S 的方差。这是什么意思?这意味着估计器的平方误差随着因子 O(1/S) 而下降。如果我们想看看绝对误差,取该项的平方根,我们将得到 O(1/sqrt(S))。
估计π
这样收敛速度好吗?让我们来看一个例子,估算数字 π 。假设我们不知道圆周率的前 N 位,我们想估计它们。首先,我们可能注意到,单位圆的面积定义为π。如果我们看一下单位圆的四分之一面积,我们也许能够通过从单位分布中抽取一些点来估计它。
看看下图,我们看到的是包含单位圆四分之一面积的正方形。我们可以注意到,当对它们进行均匀采样(x,y 在 0 和 1 之间)时,一个点落入圆中的概率是π / 4,即圆的该部分的面积除以正方形的面积。我们可以通过采样点并根据它们是否落在圆内来标记它们来估计这一点,本质上,我们正在推断伯努利分布参数θ的值,该值应收敛到π / 4(其期望-落在圆内的概率)。
我在 JAX 编写了这个方法的简单实现,因为 JAX 很有趣,我推荐你去看看,但是等价的代码也可以用 Numpy 编写。如您所见,这在概念上非常简单,它涉及我们从均匀分布中抽取样本,标记落在圆内的样本(第 5 行),然后计算并返回π的估计值(第 6 行)。
下图说明了随着样本数量的增加,估计量的误差是怎样的。正如所料,误差大致按照我们之前推导的 S 定律 O(1/sqrt(S))的平方根倒数发展。重要的是要记住,我们已经得出了估计量的预期误差,这意味着逐点估计它可能会在预期之外波动,如图所示。
此外,如果我们以对数标度绘制前面的图,查看绝对误差,我们会注意到,当样本大小增加一个数量级时,误差会下降一个数量级。
现在我们回到这个估计量是否好的问题上来。1/sqrt(S)收敛速度对于精确计算来说不是那么好,我会告诉你为什么。以π为例。为了在数字π的第二位上大致平均精确(我说大致是因为这是基于样本的随机算法),我们需要 4 个数量级的样本(10k 个样本)。类似地,如果我们想要大致精确到第三位数,我们将需要一百万个样本。这是相当多的样本来估计只有前 3 位数的π!幸运的是,有更好的方法可以实现更快的计算速度。
外卖食品
- 蒙特卡罗算法是一种允许我们计算期望值的基于样本的估计的算法,即计算积分的估计。
- 蒙特卡洛情况下的估计误差以 O(1/sqrt(S)) 的速率下降
- 这个收敛速度没那么好。
- 但是这种算法实现起来很简单,并且在进入更好的方法之前,它可以作为估计某个量的第一次尝试。
- 不要拿它去赌博!
值得思考的事情
- 在这个算法中,我们可能只是不负责任地忽略了一个事实,即我们假设我们可以从分布 p(x) 中采样,如果我们不能从这个分布中有效地采样,会发生什么呢?
- 如果从 p(x) 取样很贵怎么办?
理解神经网络和反向传播-第一部分
relu 非线性神经网络的训练
图 1:(图片由作者提供)具有四个神经元的神经网络使用反向传播来训练,以匹配具有四个斜率的参考函数。
图 2a(图片由作者提供)(左)具有初始权重和参考函数的神经网络(右)具有最终权重和参考函数的神经网络
上面图 1 中的动画显示了使用反向传播算法训练四个神经元的神经网络。参考函数是一个形状为倒 V 形的图,每边都有一个弯曲。这是一个范围为[0,4]的图,有四个斜率。图 2a(左)显示了具有初始权重的参考函数和神经网络。图 2a(右)显示了参考函数和在 7200 次反向传播迭代后收敛到参考函数的神经网络。
本文的目的是帮助读者理解神经网络和训练中使用的反向传播算法。训练神经网络在计算上非常昂贵。反向传播算法有时会给出局部而非全局最优的解决方案。因此,对于那些部署神经网络来解决他们的问题的人来说,彻底理解该算法的基础是有用的。
本文分为三个部分,涵盖以下主题:(1)概述了监督学习的基本概念和神经网络正向计算和反向传播所涉及的数学方程。(b)将这些方程转化为将重量更新描述为视觉运动的陈述。这些运动是斜率的增大或减小,或者是斜率原点的移动。©提出了一组使用各种神经网络的例子。这些显示了反向传播算法的操作。python 程序用于计算和生成图形和动画,直观地显示计算过程,最后,给出一个注释,解释结果图形如何与(b)中所述的规则相联系。我希望可视化和解释将帮助用户更好地理解神经网络和反向传播。
监督学习:监督学习使用一种叫做神经网络的特殊功能来模拟测试数据集中输入和输出值之间的关系。测试数据集由一系列输入和输出值组成。神经网络具有权重参数,其值最初是猜测的。训练过程使用数据集来比较由模型预测的输出值,并修改权重,使得预测值和实际值之间的误差减小。一旦这个训练过程完成,神经网络就被用来预测新输入的输出值。
神经元:神经元是将 n 个输入向量映射到单个值的函数。它是线性和非线性操作的级联,如下所示。
N(w, x) = nl(x0*w0 + x1*w1+...+xn*wn + b)
where w = {w0, w1, ..., wn} is the weight parameter of size n,
x = {x0, x1, ..., xn} is the input vector of size n ,
b is a bias
and nl is a non-linear function,
线性运算是输入向量与相同大小的权重向量加上标量偏差值的点积。非线性函数是定义在单个变量上的函数。使用的典型非线性函数是 relu,其被定义为 relu(x) = x,其中 x > 0,否则为 0。在本文中,我们使用大小为 1 的输入向量,并选择 relu 作为非线性函数。因此,神经元的方程式是
N(x) = relu(w*x+b)其中 w 是权重,b 是偏差。
如果 w > 0,那么当 x > -b/w 时,N(x) > 0。我们将把-b/w 称为神经元的起源。
*神经网络:*神经网络是由神经元组成的计算图。在输入层中具有 n 个单输入神经元并且在输出层中具有一个 n 输入神经元的神经网络由以下等式指定
NN(x)= w0 * relu(iw0 * x+B0)+w1 * relu(iw1 * x+B1)+…+wnrelu(iwnx+bn)。
在单输入的情况下,我们可以将输入权重设置为 1(以消除冗余并提高反向传播搜索效率)。因此,神经网络方程为
NN(x)= w0 * relu(x+B0)+w1 * relu(x+B1)+…+wn*relu(x+bn)
一个关键的有用观察是(a)神经元 ni (wi *relu(x+bi))仅在 x > -bi 时对总和有贡献,即,神经元仅在 x > -bi 时是活动的。B1 点被称为神经元的起点。(b)如果神经元 ni 是活动的,斜率增加 wi。需要注意的重要一点是,n 个神经元的神经网络(具有相对非线性)表示具有 n 个斜率的连续图形。当 x > bi 时,每个神经元对神经网络的斜率有贡献,其中 bi 是神经元的偏差。
例 1 ( 一个有四个斜率的神经网络):下图 3a 所示为单输入单输出神经网络。输入层有 4 个神经元,每个神经元对大小为 1 的向量进行操作。每个神经元的权重和偏差分别为{1,1,1,1}和{0,-1,-2,-3}。所建模的函数具有单个输出,因此输出层具有 4 个输入的 1 个神经元。输出图层没有非线性,权重为{2,-1,-2,-1}。图 3b 示出了由该神经网络表示的曲线。该图表示具有四个斜率{2,1,-1,-2}的连续函数,其中斜率在位置{0,1,2,3}处变化。
图 3a(图片由作者提供):宽度为 4 的神经网络。
图 3b(作者提供的图片):由输入层中具有偏置{0,-1,-2,-3}和权重{1,1,1,1}的四个神经元以及输出层中具有权重{2,-1,-2,-1}和偏置 0 的一个四个输入神经元的神经网络建模的函数。
反向传播:反向传播是用来减少测试数据和神经网络预测值之间误差的算法。该算法反复修改最初猜测的偏差和权重,直到测试数据和神经网络预测值之间的误差在可接受的范围内。参考函数 ref_f(x)和神经网络之间的差值δ(x)和误差 e(x)由下式给出
delta(x) = (ref_f(x) - Σ wi*relu(x+bi) + b)
e(x) = delta(x)**2
where n > i ≥ 0, n
is the number of neurons in the input layer.
相对于权重和偏差的梯度被表示为相对于权重和偏差的偏导数。
grad = Σ ∂e/∂wi*Δwi + ∂e/∂bi*Δbi + ∂e/∂bi*Δb where∂e/∂wi = -2 * delta(x) * relu(x+bi)∂e/∂bi = -2 * delta(x) * (x+bi > 0) ? wi : 0) and∂e/∂b = 2 * delta(x)
权重更新的公式如下
wi = wi — lr*∂e/∂wi = wi + 2*lr*delta(x) * relu(x+bi) --- equation 1bi = bi — lr*∂e/∂bi = bi + 2*lr* delta(x) *(x+bi > 0) ? wi: 0) ---- equation 2b = b — lr*∂e/∂b = bi + 2*lr* delta(x) where lr is learning rate ----- equation 3
在前向路径中的每次迭代期间,我们计算输出 NN(x)=σwi * relu(x+bi)、误差函数 e(x ),并且在反向路径中,我们更新权重和偏差。
权重更新规则是:
如果 NN(x) < ref_f(x) i.e, delta(x) >为 0(神经网络输出小于参考值)则:
For each neuron x > -bi (active neuron)
weight increases (slope increases)
if wi > 0 bias is increased, (neuron (slope) moves left ) -- rule 1
if wi < 0 bias is decreased, (neuron (slope) moves right) -- rule 2
Here the magnitude of weight increase is proportional to delta(x) and the distance x + bi from the origin -bi.
The magnitude of change in bi is proportional to delta(x) and the value of weight wi.
如果 NN(x) > ref_f(x),即δ(x)< 0, ( Neural network output is greater than the reference value) then:
For each neuron x > -bi (active neuron)
weight decreases (slope decreases)
if wi > 0 bias is decreased, (neuron (slope) moves right) -- rule 3
if wi < 0 bias is increased, (neuron (slope) moves left) -- rule 4
Here the magnitude of weight decrease is proportional to delta(x) and the distance x + bi from the origin -bi.
The magnitude of change in bi is proportional to delta(x) and the value of weight wi.
In the next section, I present a few examples to illustrate the operation of the backpropagation algorithm. A random number generator generates 400 numbers in the range [0, 4]. A reference function generates the corresponding output. The reference function used in the examples are neural networks with fixed biases and weights. A training neural network withn神经元被选择。猜测训练神经网络的初始偏差和权重。反向传播算法更新权重和偏差,使得训练神经网络和参考函数之间的误差减小。对于神经网络的训练,使用 400 个数字的数据集一次或多次,直到误差减少到期望的限度内或者我们达到运行时间的上限。训练所需的时间将取决于权重和偏差的初始值。
本节中的示例附有情节和动画。每个例子具有(I)将具有初始偏差和权重的训练神经网络与参考函数进行比较的图,(ii)将具有最终偏差和权重的训练神经网络与参考函数进行比较的图,(iii)显示随着反向传播进行的每个神经元的偏差的图,(iv)显示随着反向传播进行的每个神经元的权重的图,(v)显示随着反向传播进行的神经网络和参考函数的图的动画,以及(vi)可选地,一些例子可以具有随着反向传播更新偏差和权重的单个神经元的图的动画。
示例 2 :让我们使用由等式 ref_fn1(x) =2 * relu(x-1.0)指定的单个神经元参考函数,其中 x 被定义在区间[0,4]上。对于训练,我们将使用一个神经元的神经网络,初始偏差为 0,初始权重(斜率)为-0.6。选择 0 的偏置,使得神经元在区间[0,4]上定义的整个数据集上是活动的。神经网络和参考函数的方程是:
neural(x) = wt*relu(x+b) where wt = -0.6 and b = 0.
ref_fn1(x) = 2* relu(x-1).
这个例子将说明单个神经元神经网络对参考函数的收敛。这里,反向传播算法将神经元从 0 向右移动到 1,并将其斜率从-0.6 增加到 2。让我们看看它是如何做到的。
下面的图 4a 是显示神经网络在 800 次迭代中收敛到参考函数的动画。图 4b 示出了随着反向传播的进行,神经元的偏差和权重的变化。图 4c 示出了神经网络的初始和最终图以及参考函数。
图 4a(作者的动画) :显示在反向传播算法的 800 次迭代中一个神经元神经网络收敛到参考函数的动画图
图 4b(作者提供的图像):(左)在 800 次迭代的反向传播期间神经元的偏差更新和(右)神经元的权重更新
图 4c(图片由作者提供):(左)neural1(x)和 ref_fn1(x)标绘初始偏差(0)和权重(-0.6),(右)neural1(x)和 ref_fn1(x)在 800 次反向传播权重和偏差更新后。
上面图 4a 中动画所示的收敛有三个阶段。这些阶段是:
阶段 1:最初,神经网络输出小于参考函数(如图 4c(左)所示)。因此斜率在 4 次迭代中从-0.6 增加到 0,并且神经元向右移动(对负斜率和正δ应用规则 2)。在接下来的 12 次迭代中,斜率继续从 0 增加到 1,但是神经元现在向左移动,因为斜率是正的(对正斜率和正增量应用规则 1)。
阶段 2:在该阶段,当δ为正时,斜率增加,神经元向左移动(规则 1),当δ为负时,斜率减小,神经元向右移动(规则 3)。然而,在 300 次迭代中,移动是这样的,即总斜率从 1.0 增加到 1.84(图 4b(右)),并且总神经元从 0 向右移动*(图 4a(左))。*
阶段 3:在该阶段中,斜率继续从 1.84 上升到 2.0,并且在剩余的 500 次迭代中神经元从 0.9 向右移动到 1.0。在此阶段斜率和神经元的移动较慢,因为每次迭代中的误差较小。
结论:这个例子显示了反向传播算法更新单神经元神经网络的偏差和权重的能力,使得它收敛于参考函数。
在下一个例子中,我们使用双神经元神经网络作为参考函数。
例 3 :参考函数由定义在范围[0,4]上的等式 ref _ fn2(x)= 2 * relu(x)-4 * relu(x-2)指定。为了训练,我们使用一个在输入层有 2 个神经元的神经网络。初始偏差为{0,-0.2},初始权重为{0。, 0.08}.选择偏置使得神经元的原点尽可能接近 0。这确保了两个神经元在输入范围[0,4]上定义的大部分数据集上都是活跃的。每个神经元的初始偏置值不同。权重的更新取决于(x+bi)的值,其中 bi 是第 I 个神经元的偏差。通过选择不同的偏置,每个神经元的权重更新和偏置更新的轨迹将是不同的。从这个例子中可以看出这种差异的影响。具有初始偏差和权重的神经网络函数为
neural2(x) = wt0*relu(x -b0)+wt1*relu(x-b1) where b0=0, b1=-0.2, wt0 = 0, wt1 = 0.08
图 5a(左)示出了神经元的偏差和(右)权重的轨迹,它们被反向传播算法更新。neuron2 的偏差仅增加到 0.14,然后开始移动到-2.16,而 neuron1 的偏差增加到 1.25,然后回到 0,如图 5a 和下面的动画图 5b 所示。
让我们看看轨迹不同的原因。
图 5a(作者提供的图像):(左)图显示了随着反向传播的进行,两个神经元的偏差和(右)权重
图 5b(作者的动画)是两个神经元的图,它们的偏差和权重被反向传播算法更新
两个神经元轨迹不同的原因是:
原因 1 :偏差不同导致权重更新不同:neuron 1 初始偏差为 0,neuron2 初始偏差为-0.2。因此,neuron1 的原点为 0,neuron2 的原点为 0.2。权重更新(来自等式 1)与 neuron1 的 delta(x)*x 和 neuron2 的 delta(x) * (x-0.2)成比例。因此,当 x > 0.2 时,两个神经元的权重都增加,其中神经 1 的权重增加的量更大。
原因 2: 权重的差异导致偏差更新的差异:偏差的更新(来自等式 2)与 delta(x)和神经元的权重值成比例。由于 neuron1 的重量较大,它比 neuron2 移动得更远。此外,当 delta 为负且权重降低时,由于 neuron2 的权重较小,因此其变为负(而 neuron1 的权重仍为正)。这导致 neuron2 向右移动,而 neuron1 仍然向左移动。这是神经元 1 和神经元 2 起源分离增加的两个原因。
原因 3: 当一个神经元活动而另一个神经元不活动时,偏差和权重出现差异:随着 neuron2 进一步向右移动,其原点越过 0,则当 x < -b1 时,它不活动(其权重不更新)。这就是为什么 neuron1 的斜率增加而 neuron2 的斜率减少的原因,如上面的图 5a(右)所示。这是两个神经元的偏差和权重轨迹不同的三个原因。
下面的图 5c 显示了神经网络收敛到参考函数时的动画图。图 5d(左)示出了具有初始偏差和权重的神经网络的图,图 5d(右)示出了具有最终偏差和权重的反向传播 3601 次迭代之后的图。动画有三个阶段。在第一阶段,两个神经元都向左移动,神经元 1 以更高的斜率进一步向左移动。在第二阶段,神经元 2 开始向右移动,而神经元 1 向左移动。在最后阶段,两个神经元都移动到它们的最终位置 0 和 2,并且斜率收敛到最终值 2 和-4。
图 5c(作者的动画)显示了神经网络在 3601 次迭代中收敛到参考函数的动画图
图 5d(作者的图像)(左)具有初始偏差和权重的参考函数和神经网络的图,以及(右)具有最终偏差和权重的参考函数和神经网络的图。
结论:因此我们看到反向传播算法更新了两个神经元,使得它们遵循不同的轨迹。这允许两个神经元的神经网络在 3601 次迭代中收敛到参考函数。
接下来让我们考虑一个具有四个神经元的参考函数的例子。
例 4 :参考函数由定义在 0 ≤ x ≤4 范围内的方程 ref _ fn(x)= 2 * relu(x)-relu(x-1)-2 * relu(x-2)-relu(x-3)指定。为了训练,我们将使用四个神经元的神经网络。初始偏差为{-0.002,-0.5,-1.0,-1.5},权重为{0.001,0.04,0.07,0.1}。与前面的例子相似,我们选择了不同的偏差。
图 6a(左)显示了具有初始偏差和权重的神经网络图,以及(右)具有最终偏差和权重的神经网络图。然而,在 20000 次迭代之后,该网络不收敛于参考函数。
图 6a(作者提供的图像)具有四个神经元的神经网络图,具有初始偏差和权重(左)以及最终偏差和权重(右)
为了理解它不收敛的原因,让我们看看图 6b 中所示的四个神经元的偏差和权重的轨迹,以及图 6c 中显示四个神经元的运动的动画。
图(作者提供的图像)6b(左)四个神经元的偏差图,(右)四个神经元的权重(斜率)图
图 6c(作者的动画)显示了随着反向传播的进行,四个神经元的位置和斜率的动画。
全局最优要求四个神经元以斜率{2,-1,-2,-1}移动到位置{0,1,2,3}。相反,如图 6b 所示,四个神经元{紫色、绿色、蓝色、橙色}以斜率{1.42,0.5,-1.33,-2.1}移动到位置{0,0,1.22,2.22}。因此,neuron1 和 neuron2 都收敛于位置 0。这导致两个神经元在位置 0 合并成一个神经元,组合斜率为 1.42+0.5 = 1.92。
从图 6b 中我们可以看到,neuron1 和 neuron2 的斜率是正的并且在上升。当 delta(x) > 0 且 x > -b2 时,neuron1 和 neuron2 都向左移动。当 delta(x) < 0 and x < -b2 (i.e., neuron2 is inactive) neuron1 will move to the right and neuron2 will not be updated as it is not active when x < -b2. Overall neuron1 moves right as the movement to the right is larger, while neuron2 moves left. This is the reason for coalescing of these two neurons. Thus effectively we have a neural network of three neurons with bias {0, -1.22, -2.22} and weights {1.92, -1.33, -2.1}. This is the reason for reaching a local optimum and not a global optimum.
There are two solutions to this problem.
Solution1 :一个是改变 bias 的初始值,使神经元更向右展开。让我们选择以下初始偏差{0,-0.75,-1.5,-2.24}和权重{0,0.02,0.05,0.08}。图 7a 显示这导致 19200 次反向传播迭代的收敛。图 7b 示出了偏置和权重的轨迹。我们看到三个神经元向右移动,斜率为负。由于 neuron2 向右移动并具有负斜率,它避免了与 neuron1 合并的问题。最终偏差为{0,-1.0,-1.97,-2.93},最终权重为{1.96,-0.99,-1.82,-1.15}。图 7c 是显示神经网络在 19200 次迭代中收敛到参考函数的动画图。
图 7a(作者提供的图像)(左)具有初始位置{0,0.75,1.5,2.24}的参考函数和神经网络的图,以及(右)具有最终位置{0,1.0,1.97,2.93}的参考函数和神经网络的图
图 7b(作者提供的图像)(左)随着反向传播的进行,四个神经元的偏差图和(右)权重图。
图 7c(作者提供的图像)在 19200 次迭代中,初始神经元位置在{0,0.75,1.5,2.24}处收敛到参考函数的神经网络的动画图
第二种解决方案是使用具有五个神经元的神经网络。
解 2 :我们用一个五个神经元的神经网络,初始偏差为{0,-0.4,-0.8,-1.2,-1.6},权重为{-0.08,-0.06,-0.02,0.02,0.06}进行训练。图 8a(左)是将参考函数与具有初始偏差和权重的神经网络进行比较的图。图 8a(右)显示了在 20000 次迭代后收敛到参考函数的具有最终偏差和权重的神经网络的图。
图 8a(图片由作者提供)(左)具有初始偏差和权重的参考函数和神经网络的图,以及(右)具有最终偏差和权重的参考函数和神经网络的图。
图 8b(作者提供的图像)(左)图示出了随着反向传播的进行,五个神经元的偏差和权重(右)的轨迹。
图 8c(作者的动画)显示了在 20000 次反向传播迭代中五神经元神经网络收敛到参考函数的动画图
图 8b 示出了五个神经元的偏差和权重的轨迹。我们看到 neuron1 和 neuron2 仍然以 0 的偏差结合在一起。其他三个神经元的偏差收敛于{-1,-2,-2.89}。权重收敛到{1.24,0.72,-1.05,-1.67,-1.25}。因此,收敛性比先前的四个神经元的网络好得多。
下一个解决方案结合了解决方案 1 和解决方案 2。这里,我们使用五个神经元,它们的初始偏置如解决方案 1 中一样向右移动。
解 3 :我们用一个五个神经元的神经网络,初始偏差{0,-0.6,-1.2,-1.8,-2.4,},初始权重{-0.06,-0.04,-0.02,0.02,0.06,}。图 9a(左)示出了将具有初始偏差和权重的五个神经元的神经网络与参考函数进行比较的图,图 9a(右)示出了在 12,400 次迭代之后具有最终偏差和权重的五个神经元的神经网络进行比较的图。图 9b 示出了具有五个神经元的神经网络的偏差和权重的轨迹,而图 9c 是示出了神经网络在 12,400 次迭代中收敛到参考函数的动画。最终偏差为{0.022,-0.04,-1.08,-1.99,-2.89},最终权重为{1.43,0.54,-1.1,-1.69,-1.16}。
图 9a(作者的图像)(左)具有初始权重的参考函数和具有五个神经元的神经网络的图,(右)具有最终偏差和权重的参考函数和具有五个神经元的神经网络的图。
图 9b(作者提供的图像)(左)随着反向传播的进行,神经网络的偏差和(右)权重的轨迹图。
图 9c(作者的动画)显示了在 12,400 次迭代中五神经元神经网络向参考函数的收敛的动画图。
结论:神经网络的监督训练非常耗时。反向传播算法使用最速下降算法移动神经元并调整权重。将初始偏差分配给输入数据范围内的值非常重要。最好给每个神经元分配不同的偏置值。这是很好的传播偏见,以避免合并神经元。
理解正态分布
在本帖中,我们将介绍正态分布的基本概念、属性和实际值。如果你想讨论什么或者发现错误,请发邮件到Lvqingchuan@gmail.com:)给我
热身
来自标准正态分布 N(0,1)的 10,000 个样本的密度
在开始之前,我想让你仔细看看上面的图表。这描绘了从标准正态分布 N(0,1)抽取的 10,000 个随机样本的密度。你在这里看到了什么?这是一个相当对称的图表,大多数数据点都以平均值 0 为中心。离平均值越远,数据点就越少。距离平均值两倍方差以内的数据点几乎覆盖了所有数据。
在这篇文章的后面,我们将会看到钟形和距离平均值的距离导致了一般的正态分布的重要性质。
侧栏
在本文中,我们将使用术语“随机变量”和“标准差”。这里有一个简短的回顾:
- 随机变量是同分布和独立分布的
- 标准差σ是方差的平方根。标准误差 s 是标准偏差除以样本大小的平方根,σ/sqrt(n)。
基本概念
数学和统计考试中经常给出正态分布的公式。我从来不喜欢背公式,但这个公式确实不难理解。对于独立同分布的变量 x,我们说 x 服从正态分布,如果概率密度函数(pdf。)的 x 可以写成:
忘记左边的第一个分数。它只是确保这个概率密度函数的积分等于 1。这是概率函数的基本属性之一。观察指数函数中的分数,你会发现它实际上是:
还是那句话,忘记左边 1/2 的分数。当你对上面的表达式求一阶导数时,它只是确保了右边部分的平方会被抵消掉(还记得吗?exp(f(x))的导数是 f’(x)exp(f(x))。我们为什么要求导?因为我们想找到局部极大值!为了确保局部/全局最大值处于总体均值,我们在分子上有(x 减去总体均值);为了确保 x 的分布曲线是钟形的(先增加,然后减少),我们在 1/2 前面有负号。此外,再想想什么是平方和相关的分布,你会发现(更多在属性部分):
1 度卡方分布和这里有什么关系?还记得卡方图(1)吗:
自由度 1 的卡方分布中 10,000 个随机样本的概率密度。
卡方(1)在这里是方便的,因为这种分布确保概率密度函数的增加/减少速率更小,因为 x 与总体均值的差异更大——再次是钟形曲线(BAM!).
性能
- 线性组合。将两个正态分布的随机变量组合在一起,您将再次得到一个正态分布的随机变量,尽管参数不同:
用一个“微妙”的概率密度函数来证明上述说法,将是一件痛苦的事情。然而,你可以用特征函数来攻击它。自己试试,然后查看维基百科页面寻找答案。一旦两个随机变量的情况清楚了,我们就可以通过归纳把它推广到多个(k 个)随机变量的情况。
- 线性变换。正态分布随机变量的线性变换仍然是正态分布随机变量:
这种说法的证明又是通过特征函数。我给出一维情形的证明如下。你可以自己升级到矩阵版本。
上述证明中唯一的技巧是让 s = at。
- 68–95–99.7 规则。这不是正态分布标准偏差的准确描述。然而,它在实际估算中工作得相当好。它说当 x~N(μ,σ):
这只是通过查看正态分布的累积函数值(z 得分)得出的近似值。这里有一个图表说明:
68–95–99.7 用标准正态分布说明的规则
实用价值
- 中心极限定理。这个著名的定理告诉您总体均值μ和方差σ为 N(μ,σ /n)的足够大样本的样本均值的分布,无论总体的分布是什么:
换句话说,当您重复抽取几乎无限多的替换样本时,每批样本的样本均值将遵循正态分布。̶i̶̶d̶o̶n̶’̶t̶̶h̶a̶v̶e̶̶a̶n̶̶i̶n̶t̶u̶i̶t̶i̶v̶e̶̶e̶x̶p̶l̶a̶n̶a̶t̶i̶o̶n̶̶a̶b̶o̶u̶t̶̶i̶t̶̶(̶n̶o̶r̶m̶a̶l̶̶d̶i̶s̶t̶r̶i̶b̶u̶t̶i̶o̶n̶̶i̶s̶̶t̶h̶e̶̶o̶n̶e̶̶m̶a̶g̶i̶c̶a̶l̶̶u̶n̶d̶e̶r̶l̶y̶i̶n̶g̶̶p̶o̶w̶e̶r̶?̶ ̶)̶、̶a̶l̶t̶h̶o̶u̶g̶h̶这个定理可以用特征函数和泰勒定理从理论上证明(参见本维基百科第页供参考)。更新 20220604 :一个直观的解释就是扔骰子。当你连续投掷两个骰子(每边 1-6)多次,并计算每次两个骰子的总和,你将得到比最大值 12 或最小值 2 多得多的 6-9。这是因为更容易得到中间值,如 1+6、2+5、3+4,然后得到极值,如 6+6。
中心极限定理有助于在足够大的样本量下满足关于正态分布的假设。两个常见的例子:
a)。t 检验和 z 检验。这些测试在假设检验和 AB 测试中非常流行。在最简单的情况下,他们根据样本统计比较两个总体均值。一个必要条件是每组样本均值的正态分布。另一个必要条件是用于计算每组标准误差的观察值的正态分布。有了这两个条件,我们将能够构造一个遵循 t 分布或标准正态分布的检验统计量。只要你有一个非常大的样本量,中心极限定理通过满足这两个条件使你的生活变得容易。
另一方面,几乎所有的 t-统计量的应用,如构造总体均值的置信区间,都需要相当大的样本量,因为中心极限定理保证了样本均值在每组中的正态分布。
b)。线性回归。根据高斯-马尔可夫定理,如果你想要方差最小的无偏系数估计量,你需要残差项服从正态分布。然而,这并不是获得无偏系数估计量的必备假设。之前写过一个帖子解释线性回归的不同假设:了解线性回归假设。
- 日志转换。如果您计划使用线性回归模型,并且您的标注是对数正态形状(右偏),您可能希望对数据应用对数变换。下面是在我的爱荷华房屋预测项目中转换前后标签的可视化:
左:原始数据;右图:对数转换数据
使用对数转换有两个目的:
a)。提高对偏斜度敏感的模型的性能,如回归随机森林和线性回归。回归随机森林使用所有树的平均输出,当标签中有异常值时,可能会相差很远。同样,线性回归确实是预测标签的条件期望。我之前写过实现随机森林和理解线性回归假设。
b)。获取此转换变量的正态分布属性,如可加性(属性部分中的线性组合)和线性(属性部分中的线性转换)。换句话说,如果您在原始尺度上增加了百分比(2%),那么转换后的数据将增加 20 美元。当原始数据的规模变化很大时,这尤其有用——100 美元的 2%增长与 100 万美元的 2%增长截然不同。通过日志转换,您可以更直观地查看数据。
您可能已经意识到,日志转换是有代价的。当你只想减少线性模型中的右偏时,你不得不承认对系数的解释从多重性(2%)变成了可加性(20 美元)。这种变化并不是在所有情况下都有意义,尤其是当您的原始数据确实在使用加法标度时。
此外,如果对因变量进行变换,假设检验中的 t 统计量和 p 值也会发生变化。这不难理解。对数变换会改变数据的标准差,从而影响 t 统计量和 p 值,但没有特定的模式(可能是膨胀或收缩)。那么,当数据进行对数转换时,我们应该使用检验统计量和 p 值吗?多半是的!只要您的目的是使数据更正常(更少偏斜),并且您的对数变换实现了这一目的,就没有理由怀疑测试统计或 p 值的有效性,尽管它们可能与您从未经变换的数据中获得的结果不同。但是,当您执行对数转换只是为了使建模结果更容易理解时,您不希望在没有检查转换数据分布的情况下搞砸假设检验。在极端情况下,当原始数据左偏时,执行对数变换将使数据更加左偏。这使得样本均值服从正态分布的 t 检验假设之一难以满足。因此,这种情况下的检验统计量和 p 值可能有偏差。
了解对象检测
数据科学家和 ML 工程师的学习材料
利用深度学习检测图像对象(R-CNN、SSD、YOLO)
来源 Unsplash
想象一下谷歌照片:对于你所有的照片,你如何用物体来标记它们。要不要一个一个贴标签?
自动驾驶汽车怎么样?它们如何检测行人、汽车、交通灯和即将出现的障碍物?
输入物体检测算法
从图像分类到物体检测
近年来,图像分类获得了巨大的吸引力,特别是在 CNN 和破坏性应用程序(例如:自动驾驶汽车)中。2015 年,ImageNet 竞赛产生了比人类表现更好的 RESNet。
ResNet 表现优于人类(作者注释)
虽然图像分类(例如:CNN 堆栈)在对图像进行分类方面非常有效,但它在检测图像中的多个感兴趣对象以及了解它们在图像中的位置方面仍然存在局限性。
物体检测比图像分类更进了一步,画出了一个或多个感兴趣物体的边界框。
在本教程中,我们将学习使用 R-CNN 和 YOLO 快速检测物体的方法。
物体检测的一般步骤是什么?
1.对象定位
哪里的是对象?
**要定位对象,我们需要识别兴趣对象的焦点锚点。**这来自区域提案,用于定制水平/垂直细长框。每个位置都有一个锚点。
我们创建一个模型来生成标记感兴趣区域的区域提议。我们指定边界框并注释代表这些特定区域提议的图片片段。这包括多种方法,例如:滑动窗口(强力)、选择性搜索(聚类)和区域提议网络(深度学习)。
2.对象分类
图像中的是什么 ?
我们将所有视觉特征提取到包围盒中,并在区域提议上评估每个包围盒。这包括核函数和直方图函数。
对于每一个形状,我们将计算回归量,以检查锚如何偏离地面真相。我们还讨论了区域提议,它维护了由主干架构表示的兴趣对象(例如:CNN/VGG16/etc)
3.非最大抑制
我们寻找可能的包围盒,其捕获并集上的交集(IOU)内的锚。这允许我们将所有重叠的框减少到单个有代表性的边界框。
图像分类和对象检测(来源于作者)
现有的物体检测操作有哪些?
美国有线电视新闻网
R-CNN 通过提出选择性搜索从图像中提取区域(又名。区域提案)。选择搜索将 1)生成子分割以生成候选区域,2)使用贪婪算法来组合相似区域,以及 3)使用生成的区域和最终候选区域。
扭曲区域被馈送到 CNN 分类器,CNN 分类器提取特征图以馈送到支持向量机( SVM )。如果对象存在于扭曲区域内,SVM 进行分类。然后回归器将调整并设置边界框来表示区域建议。
尽管 R-CNN 在确定代表性区域方面很有效,但它仍然效率低下,因为它需要花费大量时间来训练所有 2000 个扭曲区域。选择性算法也可能导致一代又一代的不良候选人,从而减慢整个过程。
美国有线电视新闻网(来源于作者)
快速 R-CNN(双摄)
你需要有多个 CNN 分类器。在 2014 年的论文中。这使用更快的选择搜索。快速 R-CNN 也被称为双镜头,因为它直接运行地区提案和 CNN。
快速 R-CNN(来源于作者)
更快的 RCNN
由于快速 RNN 地区的建议可能是浪费,我们实际上可以运行地区的建议,使用要素地图作为输入。这更快也更直接,因为要素地图已经包含了感兴趣的对象。
更快的 R-CNN(来源于作者)
单发探测器(SSD)
SSD 通过从每个卷积层计算包围盒和图像分类来关注速度。SSD 用的是 VGG19,主干架构,想用什么架构就用什么架构。我们可以使用 RESnet,但由于它的复杂性,它违背了目的,因为它意味着速度。另一种选择是 MobileNet,用于小物体检测程序。
你可以看一下 tf2_detection_zoo 中完整的开源算法列表。
固态硬盘(来源于作者)
其他技术
- 你只看一次(YOLO) 类似于 SSD,但不是通过特征地图计算边界框,YOLO 使用暗网作为 CNN 堆栈主干,并聚合最后三层 YOLO 使用暗网作为主干。
- **基于变压器的探测器(脸书)。**也用于检测图像中的物体。
- 面具 RCNN 怎么样?蒙版是图像分割。这是目标检测的另一个应用。这显示了细分的确切含义。
练习物体探测
本教程展示了如何用图像对对象进行分类。你将获得一些实践经验,并对以下概念形成直觉:
- 使用来自 Tensorflow 对象检测库的预训练模型和 MSCoco 数据集进行开箱检测
- 通过用新的开箱即用检测之外的类修改现有的对象检测体系结构来转移学习。本培训将在急切模式下进行(TF2)
用 GPU 运行这个 colab 大概需要 1 个小时。请随意打开下面的 colab 并开始使用:)
图书馆
我们使用 TensorFlow 对象检测 API (ODAPI)库,通过 TF 后端迭代不同的对象检测配置。
- TF-Slim 是一个轻量级的库,用来定义、训练和评估 TF 模型。这个库是由谷歌人工智能大脑团队开发的,目前仍在开发中,因此使用它需要自担风险(可能会很快被弃用)。
- pycocotools 为对象检测和图像分割提供了庞大的图像数据集。 COCO 数据集
!pip install tf_slim
!pip install pycocotools
基于 COCO 数据集安装现成模型
我们将使用“MobileNet SSD”(模型动物园)来尝试我们的开箱即用模型。
使用export_inference_graph.py
工具导出的任何模型都可以通过指定模型名称和路径来加载。
model_name = ‘ssd_mobilenet_v1_coco_2017_11_17’
detection_model = load_model(model_name) # a helper function to access http://download.tensorflow.org/models/object_detection
创建推理
- 给模特打电话
- 生成带遮罩的边界框(批注的形状)
model_fn = model.signatures[‘serving_default’]
output_dict = model_fn(input_tensor)if 'detection_masks' in output_dict:# Reframe the the bbox mask to the image size.detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(output_dict['detection_masks'], output_dict['detection_boxes'],image.shape[0], image.shape[1])
detection_masks_reframed = tf.cast(detection_masks_reframed > 0.5, tf.uint8)
output_dict['detection_masks_reframed'] = detection_masks_reframed.numpy()
使用 IPyImage display
功能显示图像:
display(IPyImage(open(anim_file, ‘rb’).read()))
注意,注释称浣熊为猫/狗/鸟/棒球手套。这意味着在 coco 数据集上训练的模型不知道如何识别浣熊。
浣熊与可可数据集(来源于作者)
训练和注释数据
我们可以使用我们准备好的训练集来训练我们的模型识别浣熊。一个简单的方法是使用object_detection.utils
中的colab_utils
工具进行注释。
使用 colab_utils 进行手动注释(来源于作者)
自我注释后的浣熊图像(来源于作者)
利用 RetinaNet 进行迁移学习
我们可以使用预先训练好的模型根据新的类别进行微调。在这种情况下,我们将使用 RetinaNet 架构,避免在实验和微调过程中浪费时间。Tensorflow 在tensor flow/models/research/object _ detection下有物体检测。
在此单元中,我们构建了一个单阶段检测架构(RetinaNet ),并恢复了除顶部分类层(将自动随机初始化)之外的所有层。
目标是加载管道配置并构建检测模型。因为我们是在一个默认情况下预测 90 个类槽的 COCO 架构下工作,所以我们在这里重写了“num_classes”字段,使其只有一个。
假设我们只注释了 10 幅图像。我们不需要创建批量输入,只需通过测试映像运行模型。
#more code in the colab.image, shapes = detection_model.preprocess(tf.zeros([1, 640, 640, 3]))
prediction_dict = detection_model.predict(image, shapes)
_ = detection_model.postprocess(prediction_dict, shapes)
print(‘Weights restored!’)optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=0.9)
train_step_fn = get_model_train_step_function(
detection_model, optimizer, to_fine_tune)
最终结果
使用正确的模型和正确的注释进行训练。这 10 个图像应该足以将图像标记为浣熊
浣熊在 RetinaNet 迁移学习后,使用手动注释和 COCO 数据集(来源于作者)
常见问题
还有哪些工具可以帮助图像注释?
在微软 coco 中,大约有 1000 张图片和 80 个对象。但是有时我们想在不存在的物体上训练模型。
我个人认为由亚马逊工程师开源的标签是最有用的标签工具。但是如果你不想使用它,我们总是有 Tensorflow 助手函数来帮助你标记和注释。
来源于 Github
我们需要多少数据?
使用迁移学习,你不需要太多的数据,在我的教程中,你可以在 12 幅图像内运行它。但是当然这取决于用例。如果您需要在晚上运行 SSD,并使用深色图像,那么您可能也需要在上面上传许多图像。
你拥有的数据越多越好,然而随着更多数据的输入,你会发现收益递减。最重要的是拥有代表您需要的数据。这是连体网络的情况,其中具有相同参数和权重的相同配置适用于多个标签。
我们怎么知道生产哪一个?
很多时候,我们会用微服务来投放。这意味着我们将安装一台服务器,提供 API 网关来连接其他服务,并在请求到来时给出结果。对于模型的类型,这真的取决于你是优先考虑准确性(R-CNN)还是速度(SSD)。这里我提到了一篇非常酷的论文
参考资料:
博客
- R-CNN,快速 R-CNN,快速 R-CNN,YOLO
- MLSS 教程为基础代码归功于罗尼·卡尔法里西
报纸
https://arxiv.org/abs/1611.10012
关于作者
文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。
除了在谷歌的工作,文森特还是乔治亚理工学院计算机科学硕士校友,三项全能运动员和数据科学媒体的特约作家,该媒体在全球拥有超过 100 万的观众。
最后,请通过LinkedIn、Medium或 Youtube 频道 联系文森特
深刻的知识的理解
思想和理论
知识结构如何将人工智能从表面相关性转化为对世界的理解
鸣谢:学习与教育——大脑功能开发理念 by Imagens Livres 授权:【https://creativecommons.org/licenses/by/2.0/】T4
哪些知识让你变得聪明?你的认知用来理解世界、解读新体验、做出深思熟虑的选择的构念是什么?定义一个框架,阐明使人类或人工智能(AI)能够理解和更高认知的各种知识,将有助于就如何有效实现这些结构进行结构化讨论,并绘制出一条通往更智能机器的道路。
允许人工智能系统组织其世界观、理解意义并展示对事件和任务的理解的知识结构将可能处于更高水平的机器智能的中心。机器认知将扩展到锚定在知识结构中的数据之外,包括描述性知识、世界动态模型和出处等维度。
学习语言时,我们区分形式和意义 : 形式是指用来表示意义的符号——表面表达。每种形式在特定的上下文中都有特定的含义,并且形式在不同的上下文中可以有不同的含义。正如 schlkopf、Bengio 等人在一篇文章中总结的那样,“当前大多数成功的机器学习可以归结为对适当收集的独立同分布(i.i.d .)数据的大规模模式识别。”系统摄取可观察的元素,如文本字符、声音信号和图像像素,并建立模式和随机相关性,同时为基于识别的任务产生出色的结果。
越来越多的人同意,算法必须超越表面相关性,进入的含义和理解,以实现更高水平的机器智能。这种明确的转变将实现所谓的系统 2 、第三波或广义/灵活人工智能。正如我在核心博客 ’ 认知人工智能的崛起 *,*中概述的那样,机器智能的下一个级别需要深层的知识结构,这些知识结构可以将人工智能从表面相关性转变为对世界的理解,代表抽象、关系、学到的经验、见解、模型和其他类型的结构化信息。
DARPA 的 John Launchbury 指出人工智能的各个方面将在第三波人工智能中看到抽象(即创造新的意义)和推理(规划和决策)的转型改进。第三次浪潮本身的特点是背景适应,其中系统为现实世界的现象类别构建背景解释模型。这里提出的框架提供了一个关于知识结构如何促进这种飞跃的视角。
其中两个知识维度反映了对世界的看法——描述性 维度及其对世界的概念抽象,以及真实世界 及其现象的动态 模型。 故事 增加了人类理解和交流基于共同信仰和神话的复杂故事的能力。 上下文和源属性 以及 值和优先级 是元知识维度,其提供了有效性和关于知识的知识的基于条件的覆盖。最后, 概念引用 是结构支撑,跨维度、模态、引用绑定。总之,这六个知识维度可以带来超越事件相关性的额外深度,通过假设持久的潜在概念,可以解释和预测过去和未来的事件,允许规划和干预,并考虑反事实现实,因此使用术语“深度知识”
阐明和描述机器智能所需的各种知识结构有助于确定实现它们的最佳方式,从而实现下一级机器智能。这个博客的目标是建立被认为与下一级人工智能认知能力的发展相关的知识结构的基本类别。
支持高智能的知识维度
对于人工智能系统,实现人类理解和交流中观察到的知识结构可以为智能提供实质性的价值。当所有的知识类型都得到支持和结合时,这种价值就会大大增加。
支持高等智力的知识维度。鸣谢:Gadi Singer/英特尔实验室。
1。 描述性知识:层次、分类和属性继承
描述性知识(即概念性、命题性或陈述性知识)描述事物、事件、它们的属性以及它们彼此之间的关系。深度描述知识的概念扩展了这个定义,假设使用(适当的)类或概念的层次分层。这类知识可以包括事实和记录系统。与特定用例及环境相关的事实和信息可以作为分层知识来组织、利用和更新。
在单个 AI 系统中使用的底层本体可以用来自管理系统的任务相关类和实体来播种(例如 OpenCyc 本体或 AMR 命名实体类型)。它应该可以用神经网络/机器学习技术来扩展——新知识的获取将贡献新的实体、关系和类。
2。 世界车型
世界中的现象模型使人工智能系统能够理解情况,解释输入/事件,预测潜在的未来结果并采取行动。这些模型是抽象/概括,可以分为正式模型和近似(非正式)现实世界模型;它们允许变量的使用和在特殊情况下对实例的应用,并支持特殊实例或更一般化的类的符号操作。
形式模型的例子包括逻辑、数学/代数和物理。与正式的模型相反,现实世界的模型通常是经验的、实验的,有时是混乱的。它们既包括物理模型,也包括心理和社会学模型。程序模型(“诀窍”)包含在本课程中。
因果模型是可以帮助人工智能系统发展到下一个机器智能水平的模型类型的主要例子。在背景发生变化的情况下,如果与因果关系等知识模型相结合,并与对主导原因的背景的理解和考虑反事实的能力相结合,过去的统计数据只能有效地应用于现在来预测未来。这些模型有助于从引发情况或事件的条件和可能因素的角度来理解情况或事件。因果推理是人类思维不可或缺的组成部分,可以形式化为实现人类水平的机器智能。
3。 故事和剧本
正如历史学家尤瓦尔·赫拉利所说,故事是个人和社会的文化和世界观的重要组成部分。故事的概念是完全理解和解释人类行为和交流所必需的。故事是复杂的,可能包括多个事件和一个关联叙述中的各种信息。它们不仅仅是事实和事件的集合。相反,它们包含了关键的信息,有助于开发理解和归纳超越了提出的数据。不同于世界模型,世界模型被期望提供一个世界的可操作的表现和一个人如何与它互动,故事可以被看作是历史的,参考的或精神的。故事可以代表价值观和经验,并告知人们的信仰和行动。例子包括宗教或民族故事,神话,以及任何层次的群体分享的故事。
4。 上下文和来源归属
上下文可以定义为围绕事件或其他信息的框架,并为其适当的解释提供资源。它可以被看作是一个覆盖的知识结构,调整它所包含的知识。上下文可以是持久的,也可以是短暂的。
持续的背景可以是持久的(如从西方与东方哲学的角度获取的知识)或者它可以基于新的材料学习随时间而改变。它不会因任务而改变。
在特定的本地上下文很重要的情况下,瞬态上下文是相关的。单词在其周围的句子或段落的本地上下文中被解释。图像中的感兴趣区域通常在整个图像或视频的上下文中解释。
持久的和短暂的背景相结合可以提供完整的环境来解释和操作知识。
知识的另一个相关方面是数据起源(又名数据血统),它包括数据起源、数据发生了什么以及数据随时间移动到哪里。人工智能系统不能假设所有摄取的信息通常都是正确或可信的,特别是关于被称为后真相时代的信息。将信息与其来源联系起来可能是建立可信度、可认证性和可追溯性所必需的
5。 【价值和优先权(包括善良/威胁和道德)】
知识的所有方面(例如,对象、概念或过程)都可以在判断范围内具有相关的价值——从最大的善到最大的恶。可以假设人类智力的进化包括对回报的追求和对风险的规避(获取午餐;避免成为午餐)。这种风险/回报关联与对事物的认识紧密相连。潜在的得与失具有功利价值;对于正在考虑的实体或潜在的未来状态,也有基于伦理的价值。这可以反映出这样的伦理价值观,即赋予“善”不是基于潜在的有形回报或威胁,而是基于对什么是正确的潜在信念。
价值和优先级是元知识,反映了人工智能系统对知识、行动和结果的相关方面的主观断言。它建立了问责制的基础,应该由负责特定人工智能系统的人小心处理。当人工智能系统与人类互动并做出影响人类福祉的选择时,潜在的价值和优先化系统很重要。
6.概念引用:消歧、统一和跨模态
知识是以概念为基础的。例如,“狗”是一个抽象概念,具有多个名称(例如,在各种语言中)、一些视觉特征、声音联想等等。然而,无论其表现形式和用法如何,基本概念“狗”是独特的。它映射到英语单词“dog”,也映射到法语单词“chien”它也是属于的财产
以及狗吠声的可能来源。
概念引用(或简称 ConceptRef)是与给定概念相关的所有事物的标识符和引用集。ConceptRefs 本身实际上并不包含任何知识——知识存在于上述维度中。概念参考是多维知识库的关键;因为它们融合了这个概念的所有表象。
Wikidata 是集中存储结构化数据的知识库的一个很好的例子。在维基数据中,条目代表人类知识中的所有事物,包括主题、概念和对象。Wikidata 的条目类似于这个框架中 ConceptRef 的定义——只有一个关键区别。在 Wikidata 中,术语“项目”指的是给定的标识符以及关于它的信息。ConceptRefs 只是指向知识库的标识符。关于概念的信息填充在前面章节中描述的各种视图中(例如与概念相关的描述性或程序性知识)。
常识性知识
常识知识由隐性信息组成——人类自动应用来理解世界的一组广泛(且广泛共享)的未写假设。将常识应用于各种情况对于理解和更高层次的认知是必不可少的。在这个框架中,常识知识被认为是上述六种知识类型的子集。
理解与知识类型的关系
理解是智力的基础。即将向更高的机器智能过渡引发了一场关于“理解”的讨论。Yoshua Bengio 描述了人类水平的人工智能理解如下:捕捉因果关系和世界如何运转;理解抽象的行动以及如何使用它们来控制、推理和计划,即使是在新奇的场景中;解释发生了什么(推论,学分分配);和非分布发电。
考虑以下以知识为中心的理解的定义:创造用丰富的知识表征表达的世界观的能力;获取和解释新信息以增强世界观的能力;以及对现有知识和新信息进行有效推理、决策和解释的能力。
四个功能是这种理解观的先决条件:表示丰富的知识、获取新知识、跨实体和关系链接知识的实例以及对知识进行推理。自然,理解不是二元属性,而是因类型和程度而异。这一观点的核心是知识的本质及其表现形式——知识结构和模型的表达能力可以促进理解和推理能力的分类差异。
想象所有的人[和机器]
正如阿尔伯特·爱因斯坦所观察到的,“智慧的真正标志不是知识,而是想象力。”要真正理解,机器智能必须超越数据、事实和故事的知识。想象力对于重建、发现和发明一个可观察属性和事件背后的宇宙模型是必要的。从人工智能系统的角度来看,想象力是通过创造性推理实现的:进行归纳、演绎或溯因推理,并产生新的结果,而不是由以前的经验和输入输出的相关性严格规定的。
知识表示和推理是人工智能的一个成熟领域,致力于世界信息的表示,因此计算机系统可以解决复杂的任务。知识和推理不一定是截然不同的,而是代表了从已知到推断(可以成为新的已知)的光谱。机器理解将通过构建知识的能力来实现,辅之以高级和更新的关联推理(例如,概率和似是而非的推理、溯因推理、类比推理、默认推理等)。).
建立在深厚知识基础上的神经符号人工智能
我对更具认知性、基于知识的人工智能方法的欣赏出现在 2010 年代中期,当时我正在英特尔研究深度学习硬件和软件解决方案。加里·马库斯的优秀论文人工智能的下一个十年:迈向强大人工智能的四个步骤提供了类似的观点。
在让人工智能更有效、更负责、更高效地支持人类的过程中,目标是让人工智能系统更强大,同时也推动它们进入下一个认知和理解水平。在操纵数据、识别模式和寻找最短暂的相关性方面已经取得了长足的进步。但是,仍然有必要考虑将使人工智能系统具备建模和理解它所操作的世界的能力的知识类型。
是时候就更具认知力的人工智能所需的知识种类展开对话了。本博客中讨论的知识表示的构造类型可以以各种形式实现,最终的系统将在神经网络能力和符号知识(无论以何种表示)实现人工智能下一阶段目标的方式上有所不同。后续的博客将更详细地介绍这个框架中引入的不同知识维度。随着我们对高级认知所需的知识结构类型建立了更深入的理解,我们可以继续构建这些深层知识,使机器能够理解世界。
参考文献
查尔斯·菲尔莫。《语言中的形式和意义》。CSLI 出版物,2002 年。https://web . Stanford . edu/group/csli publications/csli publications/site/1575862867 . shtml(2021 年 5 月 4 日访问)
schlkopf,b .等人,“走向因果表征学习”。https://arxiv.org/abs/2102.11107
本吉奥。约舒厄。“从系统 1 深度学习到系统 2 深度学习”。NIPS 2019,https://slides live . com/38922304/from-system-1-deep-learning-to-system-2-deep-learning
约翰·朗什伯里。“DARPA 对人工智能的看法”。DARPA,https://www.darpa.mil/attachments/AIFull.pdf(2021 年 3 月 23 日访问)
弗朗索瓦·乔莱。“人工智能的未来是怎样的?”,https://www.youtube.com/watch?v=GpWLZUbPhr0
歌手,加迪。《认知 AI 的崛起》。走向数据科学,2021 年 4 月。https://towards data science . com/the-rise-of-cognitive-ai-a 29 D2 b 724 CCC
禁止,肯尼斯。《OpenCyc 本体简介》。https://www.qrg.northwestern.edu/nextkb/IntroOpenCycOnt.pdf(2021 年 5 月 4 日访问)
艾伦·纽维尔。“物理符号系统”,认知科学,1980 年 4 月。https://online library . Wiley . com/doi/ABS/10.1207/s 15516709 cog 0402 _ 2
珀尔朱迪亚。《为什么之书》。纽约,基础图书,2018 年 5 月。http://bayes.cs.ucla.edu/WHY/
尤瓦尔·诺亚·哈拉里。《智人,人类简史》。哈维·塞克,2014 年。
德容,汤姆和弗格森-赫斯勒,莫妮卡。“知识的类型和质量”。教育心理学,1996 年。
帕夫勒斯,约翰。“常识更接近计算机”。Quantamagazine,2020 年 4 月。https://www . quanta magazine . org/common-sense-comes-to-computers-2020 04 30/
马库斯加里。“人工智能的下一个十年:迈向强大人工智能的四个步骤”。乐百氏人工智能,2020 年 2 月,https://arxiv.org/ftp/arxiv/papers/2002/2002.06177.pdf
本文建立在之前文章中的观点的基础上:
以及之前在 LinkedIn 上发表的一系列文章:
知识时代来临:
第一部分:接下来,机器变得更聪明
Gadi Singer 是英特尔实验室副总裁,认知计算研究总监。
了解单因素方差分析
理解差异驱动因素的真正有用的工具
今天,我们将在 Excel 中进行一些数据科学研究!是的,与一些人的想法相反,在 Excel 中进行合理的分析是可能的。
Sure statsmodels 也有一个 ANOVA(方差分析)库,但我第一次在 Excel 中看到它是在很多年前,当时就想“这是什么?”。
Excel 方差分析(来源:微软)
方差分析是比较因素和分解方差的非常有用的工具。它与聚类也有很多相似之处。让我们进入我们的例子。
财务数据的方差分析示例
这里有一些标签命名的数据,你可以复制并直接粘贴到 Excel 中。它是能源股每个季度的月度回报——假设我们有一个假设,即季节性是能源股回报的一个重要决定因素。
(需要以这种方式组织,以便正确运行 ANOVA 分析。)
Spring Summer Fall Winter
2.13% 4.40% -6.20% -5.35%
4.94% -2.90% -4.45% 4.93%
1.33% 2.74% -7.73% -1.12%
-2.50% -3.80% -7.09% -2.70%
7.67% -5.41% 10.32% 4.91%
-4.62% -5.35% -0.31% -8.38%
7.44% 4.95% 2.76% -2.09%
7.36% -1.38% 0.21% -0.31%
-1.66% 1.18% 5.21% 3.84%
我们将使用 Excel 的数据分析工具对其进行方差分析(如上图所示)。请耐心听我说一会儿——我马上会解释什么是方差分析。举个例子就简单多了。
输出如下所示:
方差分析输出(来源:作者)
汇总表非常简单。它只提供基本的汇总统计数据,例如每个变量的平均值和方差。有趣的是,我们可以看到,在分析期间,能源股的平均回报率仅在春季(我定义为 3 月、4 月、5 月)为正,而能源股在秋季表现出最大的波动性。
第二个表格是 ANOVA,是行动所在的地方。SS 代表平方和。一旦你花了一些时间在统计上,你就会意识到这一切都与方差有关——测量它,解释它,分解它。在统计领域,方差是对不确定性的估计;所以统计学家和数据科学家总是试图建模和解释它。
The equation for variance is:**Sample Variance = sum(Xi - mean(X))^2/(n-1)**
分子sum(Xi — mean(X))^2
就是我们所说的离差平方和或简称平方和(SS)。它只是每个观察值和平均值之间的平方差之和。例如,要计算能源股回报的总 SS(不按季节分时段),我们将:
- 计算能源指数的月平均回报。
- 取我们刚刚计算的平均值,从能源指数的每个月收益中减去它。
- 对步骤 2 中的每个值求平方。
- 将步骤 3 中的所有值相加。
那又怎样?
因为离差平方和(在本文中我称之为 SS)是方差方程中的分子,它与方差高度相关。保持观察次数不变,SS 越高,变量的方差越高。
现在让我们回到方差分析
ANOVA 为什么叫方差分析?这是因为方差分析是一个试图将方差分解为其来源的过程。
记得我们从一个假设开始——什么季节对能源股的表现有影响。让我们想想如何测试这一点。
**如果季节很重要,我们会期望数据看起来像什么?*一旦我们按季节将数据分类成桶,我们预计每个季节桶内的回报变化将非常小,而跨季节桶的变化将非常大。换句话说,我们期望跨季节时段的高 SS 和每个季节时段内的低 SS(无意中,一些聚类算法通过最大化跨类方差同时最小化类内方差来工作)。*这在右边的图中有直观的描述。
如果季节不重要,我们还能期待什么?这将与我们刚才描述的相反。我们应该期望看到跨季节时段的低 ss(低变化)和每个时段内的高 SS(高变化)。换句话说,排序前和排序后的变化看起来差不多(左图)。
不同状态下的分布情况(来源:作者)
这听起来越来越像假设测试了。基本上,方差分析就是这样的:
方差分析是检验不同组的均值是否显著不同的一种方法。
解释我们的方差分析结果
但我喜欢 ANOVA 的是它分解变异来源的方式(解释变异基本上就是解释方差)。
变异的来源(来源:作者)
这是我之前展示的同一个 ANOVA 输出——绿色数字是各组之间的差异的统计数据(通过将各组的平均值与总体平均值进行比较来衡量,即夏季的平均值或冬季的平均值是否与总体平均值有很大差异?)而黄色数字是一个群体内变化的统计数据(仅在冬季期间能量回报就有多少变化)?总变化只是所有能量观测的总 SS,与季节无关。
So ANOVA breaks out variation as follows:Total SS = Between Groups SS + Within Groups SSWhere SS is an estimate for variation
现在我们可以检查我们上面描述的情况:
- 如果组间变异高于组内变异,那么季节一定很重要。
- 如果组间差异相对于组内差异不是很大,那么季节就无关紧要了。
我们用来定量测试我刚才描述的内容的 F 统计量是从绿色和黄色的数字中计算出来的,如下所示:
F = (SS_between/df_between) / (SS_within/df_within)
= (0.00677/3) / (0.07816/32) = 0.924The intuition around why we divide SS by df (degrees of freedom) is that we need to do so in order to normalize it. The more observations there are, the higher the SS - so in order to compare variables with unequal numbers of observations we need to normalize SS by dividing it by df.
这是我们的测试统计。如果您需要复习假设检验,我在这里介绍了一些基础知识:
但是在高水平上,F-统计量越大,我们观察到由于随机机会而观察到的情况的可能性就越小。在这种情况下,我们的零假设是均值在统计上没有差异——或者组内的差异胜过组间的差异。
在我们的例子中,要达到 5%的显著水平,我们需要看到 F 统计值为 2.90 或更高。由于我们的 F 统计量仅为 0.924,我们无法拒绝零假设。思考我们的结论的一种更直观的方式是查看 0.44 的 p 值(这是从 F 统计得出的)——0.44 的 p 值意味着有 44%的机会观察到我们由于随机机会而做的事情。那是相当高的!难怪我们没能拒绝零假设。
理解变异的来源
现在我们已经解决了技术问题,让我们稍微关注一下直觉。划分SS_between/SS_total = 0.00677/0.08493 = 8%
。这意味着只有 8%的变化是由季节引起的。因此,季节不是能源股回报的主要驱动因素。
一个很好的问题是“SS_between 相对于 SS_total(不变)有多高,均值的差异才具有统计显著性?这在解释变异时意味着什么?
要达到 2.90 的 F 统计值,SS_between 需要达到 0.0182,几乎是原来的 3 倍。在这种情况下,季节可以解释总变异的 21.4%。因此,即使发现均值在统计上不同,每个时段内仍可能存在显著差异。
结论
让我们用一个方框图来结束吧,这是我最喜欢的一种方法,可以形象化不同类别之间的差异。
能量回报的箱线图(来源:作者)
我们可以看到,虽然春季回报率较高,但所有季节的总体分布或多或少都是相互叠加的——正如我们在未能拒绝零假设时发现的那样。
方差分析是一个很好的工具,可以帮助你理解观察到的差异的驱动因素。例如,如果您试图了解是什么导致了购物者花费的差异,您可以将购物者分类,并使用 ANOVA 测试分类的质量。这就像一个反向聚类分析。在聚类中,首先进行排序,然后试图找出这些聚类的含义。通过方差分析,你假设某个分类很重要,然后你测试自己是否正确。
这可能会有点乏味,但得出的结果肯定更容易理解(也更容易向你的老板解释)。干杯!
理解机器学习中的优化算法
机器学习中两种重要优化技术背后的数学
目录:
作者图片
- 简介
优化是我们迭代地训练模型的过程,其结果是最大和最小的函数评估。获得更好的结果是机器学习中最重要的现象之一。
我们为什么要优化我们的机器学习模型?我们通过改变每一步中的超参数来比较每一次迭代的结果,直到我们达到最佳结果。我们创建了一个错误率更低的精确模型。我们可以使用不同的方法来优化模型。在本文中,我们来讨论两个重要的优化算法:梯度下降和随机梯度下降算法;它们是如何在机器学习模型中使用的,以及它们背后的数学。
2。最大值和最小值
最大值是给定范围内函数的最大值,最小值是最小值。我们将它们表示如下:
最小值和最大值(图片由作者提供)
全局最大值和最小值:分别是函数在整个定义域上的最大值和最小值
局部最大值和最小值:分别是函数在给定范围内的最大值和最小值。
只能有一个全局最小值和最大值,但是可以有多个局部最小值和最大值。
3。梯度下降
梯度下降是一种优化算法,它能找出可微函数的局部极小值。它是最小化给定函数的最小化算法。
让我们看看梯度下降的几何直观:
Y=X 的斜率(图片作者提供)
让我们举一个抛物线的例子,Y=X
这里,最小值是原点(0,0)。这里的斜率是 Tanθ。因此,当 0
点向最小值移动的斜率(图片由作者提供)
图中的一个重要观察结果是斜率在最小值时从正变到负。当我们越接近最小值,斜率越小。
那么,梯度下降算法是如何工作的呢?
目的:计算函数 Y=X 的 X*-局部最小值。
- 随机选取一个初始点 X₀
- 在 X₀.计算 X₁ = X₀-r[df/dx]r 是学习率(我们将在学习率部分讨论 r )。让我们取 r=1。这里,df/dx 只不过是梯度。
- 在 X₁.计算 X₂ = X₁-r[df/dx]
- 计算所有的分数:X₁,X₂,X₃,…。xᵢxᵢ-₁
- 计算局部最小值的一般公式:Xᵢ = (Xᵢ-₁)-r[df/dx)在 Xᵢ-₁
- 当(Xᵢ — Xᵢ-₁)很小时,即当 Xᵢ-₁、Xᵢ收敛时,我们停止迭代并宣布 X* = Xᵢ
4。学习率
学习率是一个超参数或调谐参数,它决定了在函数中向最小值移动时每次迭代的步长。比如初始步 r = 0.1,下一步就可以取 r=0.01。同样,当我们进一步迭代时,它可以按指数规律减少。在深度学习中使用更有效。
如果我们保持 r 值不变,会发生什么:
振荡问题(图片由作者提供)
在上面的例子中,我们取 r=1。当我们计算 Xᵢ,Xᵢ+₁,Xᵢ+₂,….求局部最小值 X*,我们可以看到它在 X = -0.5 和 X = 0.5 之间振荡。
当我们保持 r 不变时,我们最终会遇到一个振荡问题。因此,我们必须在每次迭代中减少“r”值。随着迭代步长的增加,减小 r 的值。
**重要提示:**超参数决定偏差-方差权衡。当 r 值较低时,可能会使模型过拟合并导致高方差。当 r 值较高时,可能会使模型欠拟合并导致高偏差。我们可以用交叉验证技术找到正确的 r 值。用不同的学习率绘制图表,检查每个值的训练损失,选择损失最小的一个。
5。逻辑回归中的梯度下降
应用 sigmoid 函数后,逻辑回归中最佳平面的公式为:
最优平面—逻辑回归(图片由作者提供)
对逻辑回归应用梯度下降算法:
逻辑回归中的梯度下降(图片由作者提供)
我们将计算 W₀、W₁、w₂……、Wᵢ-₁、Wᵢ去找 W*。当(Wᵢ-₁-Wᵢ)很小时,即当 wᵢ-₁、wᵢ收敛时,我们宣布 W* = Wᵢ
梯度下降的缺点:
当 n(数据点的数量)很大时, k 次迭代计算最佳向量所花费的时间变得非常长。
时间复杂度:O(kn)
这个问题用随机梯度下降法解决,在下一节讨论。
5。随机梯度下降(SGD)
在 SGD 中,我们不使用所有的数据点,而是使用它的一个样本来计算函数的局部最小值。随机基本上就是概率的意思。所以我们从人群中随机选择点。
- 逻辑回归中的 SGD
逻辑回归中的随机梯度下降(图片由作者提供)
这里, m 是从总体中随机选取的数据样本, n
时间复杂度:O(km)。m 远小于 n。因此,与梯度下降法相比,计算时间更短。
6。结论
在本文中,我们讨论了优化算法,如梯度下降和随机梯度下降及其在逻辑回归中的应用。SGD 是机器学习中最重要的优化算法。它主要用于逻辑回归和线性回归。它在深度学习中被扩展为 Adam,Adagrad。
7。参考文献
[1]最大值和最小值:https://en.wikipedia.org/wiki/Maxima_and_minima
[2]梯度下降:https://en.wikipedia.org/wiki/Gradient_descent
了解病人住院时间:在 R
机器学习方法在病人住院记录中的应用
合著者:索菲·考特曼斯-马特尔
有效管理患者住院时间是现代医疗保健系统中最具挑战性也是最重要的任务之一。据目前估计,美国每年管理患者入院和住院的费用超过 3775 亿美元[1],长期住院的风险使能力和患者资源有限的医院不堪重负。研究表明,更长时间的住院会增加医院获得性疾病和感染的可能性[2],而缩短患者的住院时间(LOS)可以更有效地分配医院的资源消耗,并减少患者承担的社会和经济负担。
机器学习和数据挖掘技术已经越来越多地用于从医疗保健数据中获取洞察力,这可以帮助公共卫生机构和医院管理人力和财务资源。因此,能够将高级分析技术应用于患者医院记录具有重要价值,例如使用患者数据来预测住院时间,或者更好地了解不同患者群体对医院资源的利用情况。
目标
重症监护医疗信息集市(MIMIC) 数据库是患者数据的来源之一,它提供了全面的患者住院记录流,这些记录在过去的描述性、预测性和假设驱动的研究中被证明是有用的。该数据库由麻省理工学院计算生理学实验室开发,包含位于马萨诸塞州波士顿的哈佛大学教学医院贝丝以色列女执事医疗中心约 60,000 名重症监护病房住院患者的匿名条目。
在此分析中,我们使用从 MIMIC 数据库中提取的数据构建了两个模型,以生成关于患者住院时间的预测性和探索性洞察。我们首先建立了一个机器学习分类模型,以预测患者住院时间的分类长度,给定患者入院时的可观察特征。然后,我们使用无监督学习技术,根据各种患者-护理人员互动的数量(如程序、输入和处方药物)对患者进行聚类,这可以量化患者在住院期间使用的人力或物力资源的数量。
通过结合这些模型,我们的目标是探索患者入院时的背景和状况的固有特征,以及与患者治疗过程和资源消耗相关的属性。这些指标可用于衡量和提高医疗服务提供的有效性,实现关键医疗资源的主动分配,并可能减少不必要的住院时间。
内容
注意,模型是用 R 构建的,你可以在这里 参考完整代码 。
数据描述
MIMIC III 数据库包含 2001 年 6 月至 2012 年 10 月期间记录的 50,000 多名成人患者和 8,000 名新生儿患者的住院记录。
出于分析的目的,我们利用了来自医师 Alexander Scarlat 博士编制的 MIMIC III 数据库的属性的子集。该数据集包含关于患者人口统计、入院详情、患者状况的信息,以及关于各种患者-护理人员互动的平均每日次数的信息。此外,数据还包括患者住院的总时间以及患者是否在住院期间去世。
以下是属性的子集:
查看数据
即使从 MIMIC III 数据库提取的预先准备的数据集相对干净,我们仍然发现有必要执行进一步的预处理以促进分析。同一类别的类变量(如“GI”与“胃肠”)被重新分组到同一个类中,几个高基数分类变量被重新分类以减少类的数量。我们感兴趣的关键变量——患者住院时间(LOS) —范围为 0-294 天。为了对分类任务的目标进行分类,我们将 LOS 重新分组为三类,每类中的观察值数量相当:
- 短期停留:0-5 天
- 中等停留时间:6-10 天
- 长期停留:超过 10 天
通过观察患者的各种属性,我们在下文中看到,老年患者更经常经历中等至长期住院,而年轻患者的住院时间最短。虽然患者之间存在相当大的差异,但与所有其他种族相比,白人患者总体上似乎更老。
不同种族患者按年龄划分的住院时间(LOS)。作者提供的数字。
我们还发现,大多数患者都被医疗保险或私人保险覆盖,而且大多数患者是白人。最常见的入院诊断是分娩,这可能是急诊入院人数多但死亡率低的原因。
各种患者特征的分布。作者提供的数字。
按入院诊断划分的患者入院频率。作者提供的数字。
模型结构
分类模型
在数据准备之后,我们的第一项任务是预测患者的住院时间——短期(0-5 天)、中期(6-10 天)或长期(10 天以上)。
功能选择
在排除无效预测因素(即只有在患者入院后才能观察到的变量)后,除了年龄,我们只剩下分类变量。为了进行特征选择,我们进行了卡方独立性检验,这是一种假设检验,用于确定两个分类变量之间存在显著关系。然后,对于被确定为与 LOS 显著相关的特征,我们使用 Bonferroni 调整后的事后检验进行成对比较,并确定每个显著预测因子的哪些特定类别与 LOS 显著相关。这给我们留下了以下变量,它们在分类前被虚拟化:
在排除无效预测因素(即只有在患者入院后才能观察到的变量)后,除了年龄,我们只剩下分类变量。为了进行特征选择,我们进行了卡方独立性检验,这是一种假设检验,用于确定两个分类变量之间存在显著关系。然后,对于被确定为与 LOS 显著相关的特征,我们使用 Bonferroni 调整后的事后检验进行成对比较,并确定每个显著预测因子的哪些特定类别与 LOS 显著相关。这给我们留下了以下变量,它们在分类前被虚拟化:
为分类选择的要素和类的列表。
模特培训
为了预测患者的住院时间,我们决定探索以下 3 种不同的分类模型,并比较它们的相对性能:
- 多项式逻辑回归
- 随机森林
- 梯度推进机
简而言之,我们测试的模型通过计算患者记录属于每个 LOS 类别(短/中/长)的概率来生成 LOS 预测,并根据最高预测概率为患者分配一个 LOS 类别。
MLR 通过使用最大似然估计来定义似然函数,以计算在假设的概率分布下观察给定结果的条件概率。然后,它“搜索”实现该函数最大似然性的函数的最佳系数。另一方面,RF 和 GBM 是集成学习方法,它们构造多个决策树并输出对应于每个单独树的平均预测的 LOS 类。RF 和 GBM 之间的关键区别在于,RF 并行构建几个完整的树,从而产生个体偏差(误差)较低但树之间的预测方差可能较高的完全生长的树,而 GBM 顺序生长几个小树。由 GBM 产生的这些小树中的每一个都具有高偏差,但是从先前的树中学习并校正由先前的树产生的错误,因此减少了预测之间的总体方差。
K 均值聚类模型
为了完成分类任务,我们还决定探索无监督的方法,通过各种患者-护理人员互动的平均每日次数对患者进行聚类,作为对患者住院期间利用的人力或物力资源量的测量。为了简化流程,我们将 1349 例“急诊”住院患者作为优先考虑的对象,这些患者属于以下五种最常见的住院诊断:胃肠道出血、冠状动脉疾病、肺炎、败血症和充血性心力衰竭。
随后,我们选择了八个定量变量来对患者进行分组,这些变量以平均每日规模进行测量:
K-均值聚类模型的特征选择。
由于每个变量的范围不同,在应用 K-Means 聚类方法之前,我们首先使用最小-最大归一化来缩放变量。在将每个患者分配到一个聚类之后,将主成分分析应用于数据集以执行降维,从而通过前两个主成分可视化聚类。
根据住院时间长短对患者进行分类
从我们的分类模型中,我们可以看到梯度推进机器略微优于其他两个测试模型。由于 GBM 使用集成方法来连续生成分类树,每棵树都使用从以前的树中获得的知识来提高聚合性能,因此它通常比简单的逻辑回归或随机森林执行得更好。但是,我们在这里仍然看到,模型的整体性能较差;事实上,我们无法获得比随机猜测高得多的准确度。
用于预测患者住院时间(LOS)的模型的准确性。
这些结果表明,仅根据患者特征、诊断和入院情况,很难预测住院时间的长短。这并不奇怪,因为住院时间的长短可能是由患者的许多外源性因素决定的,如医生的可用性、专业设备和管理患者病例的有效性,或者对初始疾病的治疗是否会导致发现需要治疗的其他疾病。
我们还生成了混淆矩阵来进一步分解我们的结果,并检查模型的精确度和召回率。
作为快速复习:回忆是分类器完整性的度量;模型在该类别的所有真实现有观察值中正确识别短期、中期或长期停留的能力,同时 Precision 计算每个服务水平类别中正确识别的观察值数量与预测为短期、中期或长期停留的观察值总数的比率。
MLR、RF 和 GBM 模型的混淆矩阵比较。
混淆矩阵显示,所有模型在识别短期停留方面表现最佳。然而,这可能是由于模型倾向于压倒性地预测任何其他类别的短期停留,因为模型不太可能在中期和长期停留发生时识别它们。在这种模式下,医院很可能会低估患者的住院时间,这可能会导致床位、工作人员和资源准备不足,无法满足实际的能力需求。考虑到医疗资源分配中误导信息的高后果风险,我们可以推断,医院没有足够的信息来仅根据患者的入院特征做出任何与 LOS 相关的决定。
通过患者-看护者互动对患者进行聚类
接下来,让我们看看聚类模型的结果。对于三个聚类,我们发现总的方差和(计算为聚类之间相对于总方差的方差)为 64.5%,代表了可以由三个聚类解释的患者的总方差。前两个主成分的聚类图显示,聚类 3 代表了绝大多数患者,他们经历了相对较低的患者-护理者交互的平均每日次数,并且具有相对较低的变化程度。被分配到组 2 的患者在患者-护理者相互作用中表现出更高的变化,而组 1 代表在患者-护理者相互作用中具有最高总体数量和变化的患者。
前两个主成分绘制的患者-护理者相互作用的 K 均值聚类结果。作者提供的数字。
现在,让我们通过查看每个聚类中患者特征的相对频率来细分每个聚类,在这里,我们看到聚类 1 中的患者最有可能被诊断为败血症,住院时间最短,死亡频率最高。这一观察结果是合理的,因为脓毒症被归类为一种医学急症,它可以迅速发展为脓毒性休克,引发组织损伤、器官衰竭,并且常常是致命的[3]。虽然我们不能假设因果关系,但有可能该集群中患者-护理者相互作用的高度变化是由高致死率条件的优势驱动的,即患者要么在治疗前死亡,要么在治疗中死亡。
通过患者-看护者互动聚集的患者特征的相对频率。作者提供的数字。
我们发现集群 2 和集群 3 中的大多数患者的患者-护理人员互动次数更少,变化更小,住院时间更长。与聚类 1 相比,可能的情况是,相互作用的数量在入院后最初可能很高,但一旦患者稳定下来,最终会趋于平稳。这些组中的患者也不太可能死亡,更有可能被诊断出患有胃肠出血、冠状动脉疾病和充血性心力衰竭等疾病。这些情况有不同的严重程度,但不太可能立即危及生命。
总的来说,我们能够确定一些与患者-护理者互动次数相关的关键特征,这些特征主要涉及患者的状况,而不是他们的人口统计学特征。聚类的分布表明,很少有患者可能平均每天需要更多的资源,但是大多数患者利用了类似数量的资源。然而,聚类中的重叠仍然表明,患者-护理人员的相互作用可能会受到本分析范围之外的因素的影响,如患者病史和病情严重程度,并且在个案基础上有很大差异。
限制
模型解释和患者成本量化
将预测分析应用于医疗保健环境可能非常具有挑战性,因为患者结果的建模必须考虑模型的可推广性以及治疗成本和结果的显著差异,即使在相似的患者群体中也是如此。患者入院时的病情需要不同的治疗程序,并进入不同的单位,具有不同的能力和资源。由于目前的数据也是在 11 年期间收集的,医院项目、单位和部门的重组也可能随着时间的推移而发生。因此,为了量化患者 LOS 的成本,按照诊断、入院地点以及时间段对患者进行分类可能是有用的。
虽然我们试图通过患者-护理人员的互动对患者进行分组,以衡量患者的资源消耗,但同样重要的是要记住,像获取患者生命体征这样的互动比进行外科手术的成本低得多,因此很难仅根据这些结果来量化每个患者组的成本。
样本偏差
重要的是要认识到,用于分析的数据只包括一家医院的入院人数。这些患者也主要是白人,由私人保险或医疗保险(65 岁及以上患者的联邦健康保险)覆盖,平均年龄为 59 岁。有趣的是,我们发现 70%的患者被归类为急诊室入院,超过 10%的入院患者最终死亡,相比之下,美国平均每 1,000 名急诊室入院患者中有 0.77-1.48 人死亡[4]。由于 MIMIC III 数据集的患者资料不是美国患者人口构成的代表性样本,因此需要注意不要将结果外推至更广泛的美国人群。
功能有效性
我们的分类模型的主要限制之一是缺乏全面和定量的措施。事实上,我们只能使用六个分类预测因子(入院类型、地点和诊断、宗教、婚姻状况、种族)、一个二元预测因子(性别)和一个连续预测因子(年龄)。纳入入院时记录的其他关键指标,如体重指数(身体质量指数)、心率、体温、神经反射,以及疼痛程度和既往医疗状况等一般指标,可能会提高分类模型的预测能力。
最终想法
这项分析的中心目标之一是使用机器学习模型来更好地了解患者住院和随后住院时间(LOS)的潜在模式。虽然模型的结果表明,仅根据入院特征预测患者的 LOS 可能是困难的,但我们能够通过患者-护理者的互动对患者进行聚类,以根据医院资源利用情况成功识别三组患者,并了解与此相关的特征、诊断和死亡率模式。
医疗保健分析在促进医疗保健资源管理、预后和诊断分析,甚至疾病和残疾的早期检测方面显示出巨大的潜力。然而,为了将预测模型用于此类任务,数据收集、算法调整和模型解释必须以最终促进它们所服务的个人、社区和人群的利益的方式进行。这些模型可能有很大的好处,但当人类的生命处于危险之中时,必须小心处理。
项目代码:
github:【https://github.com/duncan-wang/LOS-prediction
参考资料:
[1] Health Catalyst (2016),“以患者为中心的 los 减少计划改善了结果,节省了成本”。
[2] Hassan M .,David K. (2006),"住院时间和获得感染的概率,"国际医药和保健营销杂志,第 4 卷,第 4 期,第 324-338 页。
[3]美国卫生与疾病中心(CDC) (2020),什么是脓毒症?”。
[4] Shmerling,R. (2018),“人死在哪里”哈佛健康博客。
MIMIC III 数据库:
MIMIC-III,一个免费的重症监护数据库。Johnson AEW,Pollard TJ,Shen L,Lehman LH,Feng M,Ghassemi M,Moody B,Szolovits P,LA 和 Mark RG。科学数据(2016)。DOI: 10.1038/sdata.2016.35。可在:【http://www.nature.com/articles/sdata201635获得
如果您想分享任何想法,请随时在 LinkedIn 上联系我们。
https://www.linkedin.com/in/duncan-w/ https://www.linkedin.com/in/sophie-courtemanche-martel/?originalSubdomain=ca
了解 PCA
插图:寻找主成分。所有图片均由作者提供。
主成分分析的深入解释
用眼睛看数据的能力是机器学习中最不受重视的事情之一。在进行任何机器学习之前,可视化数据可以揭示许多模式。探索它们可以在以后获得巨大的回报,因为我们可以获得关于使用什么算法、忽略什么特性等的良好直觉。
然而,有一个大问题:人类无法看到大于三维的空间。因此,对于现实生活中的数据集,我们必须执行某些技巧,以受益于可视化可以提供的洞察力。
主成分分析(PCA)是实现这一目的的最基本和最有用的方法之一。主成分分析将数据线性转换到一个空间,突出每个新特征的重要性,从而使我们能够修剪那些没有揭示太多的特征。
首先,我们将对 PCA 有一个直观的了解,然后我们进行更详细的数学处理。
PCA 背后的主要思想
为了更好地理解 PCA 的作用,我们将看看它在一个简单数据集上的表现。
假设我们的数据存储在矩阵中
其中 n 代表特征, d 代表样本数。为了简单起见,我们假设 n = 2 ,这样我们就可以想象正在发生什么。然而,所有这些都适用于一般情况。
简单的数据集。
我们可以立即观察到的是,x₁的特征和 x₂的特征可能不是我们数据的最佳描述符。这种分布似乎在两个变量之间延伸,尽管形状表明数据可以从特定的角度简化。这些特征似乎是相互关联的:如果 x₁小,那么 x₂大。如果 x₁大,x₂小。这意味着变量包含冗余信息。当我们有数百个特性时,冗余是次优的。如果我们能够将数据重塑为变量不相关并根据重要性排序的形式,我们就能够丢弃那些不太有表现力的变量。**
我们可以用线性代数的语言来描述这个过程。为了使数据去相关,我们希望对角化X 的协方差矩阵。因为经验协方差矩阵
是对称的,频谱分解定理保证作为正交矩阵 U 使得
(注意,在不失一般性的情况下,我们可以假设对角线中的元素是递减的。)
所以,我们有
如果我们定义变换
Y 表示具有不相关特征的数据视图。这就是主成分分析的精髓。 Y 的每个特征都是 X 特征的线性组合。 Y 称为 X 的主成分向量,而其特征称为主成分。
应用到我们的简单数据集,这是结果。
简单玩具数据集的 PCA 变换。
主成分使方差最大化
除了不相关的性质 Y 之外,还有一点使其特征独一无二:每个主成分在投影到数据上时都使数据的方差最大化。
寻找一个方向,使投射到它上面的数据的方差最大化。
PCA 可以被认为是寻找投影数据的方差最大的方向的迭代过程。
一般来说,第 k 个主分量可以通过寻找与第一个 k-1 个主分量正交的单位向量,并使投影到其上的数据的方差最大化来获得。
主成分分析降维
既然我们已经了解了 PCA 是如何工作的,我们应该研究它在真实数据集上是如何工作的。除了消除特征中的冗余,它还可以用来修剪那些没有传达很多信息的特征。回想一下,协方差矩阵
是对角线,特征的方差按降序排列:
解释了方差对的比值定义
可以认为是数据中“所有方差”的百分比。因为方差在减小,所以最有意义的特征出现在最前面。这意味着如果累计解释方差
对于一些 k 来说足够大,比如说在 95% 左右,在 k 之后的主分量可以被丢弃,而没有显著的信息损失。
为了了解它在真实数据上的表现,我们将看看 PCA 在著名的 Iris 数据集上的表现!该数据集由来自三种不同种类鸢尾的四个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)组成。这是数据集的外观。
虹膜数据集。
通过检查,我们可以看到一些特性的组合很好地分离了数据,一些则没有。他们的顺序绝对不意味着他们的重要性。通过计算协方差矩阵,我们还可以注意到它们似乎是相关的:
**[[ 0.68112222 -0.04215111 1.26582 0.51282889]
[-0.04215111 0.18871289 -0.32745867 -0.12082844]
[ 1.26582 -0.32745867 3.09550267 1.286972 ]
[ 0.51282889 -0.12082844 1.286972 0.57713289]]**
让我们应用 PCA 来看看它对我们的数据集做了什么!
虹膜数据集的 PCA 变换。
前两个主成分几乎完全描述了数据集,而第三个和第四个主成分可以省略而不会明显丢失信息。协方差矩阵看起来也更好。它本质上是对角的,所以特征彼此不相关。
**[[ 1.57502004e+02 -3.33667355e-15 2.52281147e-15 5.42949940e-16]
[-3.33667355e-15 9.03948536e+00 1.46458764e-15 1.37986097e-16]
[ 2.52281147e-15 1.46458764e-15 2.91330388e+00 1.97218052e-17]
[ 5.42949940e-16 1.37986097e-16 1.97218052e-17 8.87857213e-01]]**
PCA 不做的是
尽管 PCA 经常用于特征工程,但它的功能是有限的。例如,如果数据集被拉伸得很薄,并且它们之间的分隔边距很小(如下例所示),则 PCA 不会提供类之间差异较大的表示。
原因是正交变换给出主分量向量,并且正交变换保持距离。因此,这不会沿任何特征拉伸空间。这是优点,同时也是缺点。在二维空间中,正交变换只是旋转和反射的组合。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
理解自动驾驶的感知和运动规划(2021)
深入研究当前的 SOTA 方法,共同预测汽车周围的环境及其行为
自动驾驶是移动的未来。图片由 @ed259 提供。
解释广告最新趋势的三篇论文
尊敬的 CVPR 2021 会议自动驾驶研讨会(WAD),我想与您分享三种最先进的自动驾驶感知和运动规划方法。我选择了最近在当前基准中取得突出成绩的论文,其作者被选为 CVPR 2021 的主题演讲人。
为了更广泛地探索这个主题,这三篇论文涵盖了不同的方法: Wayve (英国初创公司)论文使用相机图像作为监督学习的输入,丰田高级发展研究所(TRI-AD) 使用非监督学习, Waabi (多伦多初创公司)使用激光雷达和高清地图作为输入的监督方法。
本文中介绍的论文的比较。图片由作者提供。
- "**:来自周围单目摄像机的鸟瞰图中的未来实例预测。",安东尼·胡、扎克·穆雷兹、尼基尔·莫汉、索菲娅·杜达斯、杰弗里·霍克、vijay·巴德里纳拉亚南、罗伯托·奇波拉和亚历克斯·肯德尔,2021。[1]
- 打包 :用于自监督单目深度估计的 3D 打包。(CVPR 2020 口述)、熊伟·吉齐利尼、拉雷斯·安布鲁斯、苏迪普·皮莱、艾伦·拉文托斯和阿德里安·盖登。[2]
- 感知、预测、规划 :通过可解释的语义表示进行安全运动规划。ECCV (2020 年)。萨达特、卡萨斯、、任、吴、普拉纳布·达万和乌尔塔松。[3]
为什么感知和动作规划在一起:
自主车辆(AVs)感知的目标是从多个传感器中提取语义表示,并将结果表示融合到 ego-car 的单个“鸟瞰图”(BEV)坐标框架中,用于下一个下游任务:运动规划。
从六个摄像机(左图)转换到一个 ego-car 鸟瞰图(右图)的示例。我们可以看到汽车用蓝色标记,它们的运动由模型预测,用线表示。图片来自 NVIDIA paper Lift,Splat,Shoot [4]。
在最近的论文中,语义预测和鸟瞰图(BEV)是联合计算的(感知)。然后,时间状态能够联合预测周围代理的行为和本车运动(运动规划)。
端到端才是王道
近年来,端到端多任务网络的表现优于顺序训练网络。目前,输入只是原始传感器测量值,输出是方向盘命令。为了避免“黑箱”效应,为了优化目的(每个块可能有其中间损失函数)和结果的可解释性(特别是当结果不好时),有必要创建中间块。因此,我们可以在中间层块之间访问可解释的中间表示,如语义图、深度图、周围代理的概率行为(见下图)。
学习使用端到端 DL 和 CV 驾驶。图片来自亚历克斯·肯德尔(Wayve) CVPR 主题演讲[5]
这篇文章深入探讨了 AD 当前分裂的两个主要部分:
- 第一部分:仅使用摄像机作为输入的模型: ▹监督// ▹无监督
- 第二部分:使用激光雷达(laser)和高清地图作为输入的模型 ▹监督*。***
第 1)节仅使用摄像机
仅限摄像头。图片来自 @jstepphoto 。
监督
我们将乘坐一辆最新型号(CVPR 2021)" T8 " FIERY"[1],由一家名为 Wayve (Alex Kendall CEO)的初创公司的研发人员制造。他们的目标是从单目相机中学习 3D 几何和时间推理的表示。
对于 AV 上只有单目摄像机的团队来说,第一个挑战是学习深度。这是创建鸟瞰图参考框架的重要步骤,在该参考框架中可以识别实例并规划运动。由于每个摄像机最初在其自己的参考坐标中输出其自己的推断,因此该任务更加困难。
该过程的一个重要步骤是从 2D 图像生成 3D 图像,因此我将首先解释将 2D 图像从相机装备“提升”到所有相机共享的世界的 3D 表示的最新方法。NVIDIA CVPR 2020 年发表的论文“ Lift,Splat,Shoot:通过隐式取消投影到 3D 来编码来自任意相机装备的图像”[4]中的这种方法也用于 FIERY。
- 使用“提升-拍打-拍摄”将 2D 编码为 3D
此处提供纸张和代码。
在 2D 图像上创建第三个维度。这张图片展示了“抬起、拍打、拍摄”纸张的“抬起”步骤[4]。
1。提升:将本地 2D 坐标系转换为所有摄像机共享的 3D 坐标系。它们为每个像素生成所有可能(离散化)深度的表示。深度概率充当自我注意权重。
该模型通过将来自 2D 图像的每个像素与离散深度 d 的列表相关联来人工创建大的点云。对于具有(r,g,b,a)值的每个像素 p,网络预测上下文向量c和**深度分布a*。上下文向量 c 然后乘以来自分布 d 的每个权重 a。作为矩阵的结果是 a 和 c 的外积。该操作使得能够对特定深度给予更多关注。如果深度分布 a 全为 0,但一个元素为 1,则该网络充当伪激光雷达。每个图像的点云张量馈入在图像网上预先训练的有效网骨干网。EfficientNet 模型将输出上述由要提升的特征 c 和一组离散深度概率 a 构成的外积。***
2。Splat :外部和内部相机参数用于将 3D 表示法 Splat 到鸟瞰视图平面上。
他们使用最初用于激光雷达点云中物体检测的点柱技术。Pointpillar 将点云转换为伪图像,以便能够应用 2D 卷积架构。
点云被离散化为 x-y 平面中的网格,这创建了一组柱子 p。云中的每个点被转换为 D 维(D=9)向量,其中我们添加( Xc,Yc,Zc )到柱子中所有点的算术平均值的距离和(Xp,Yp)从 x-y 坐标系中的柱子中心到原始点(x,y,z,反射率)的距离。从这个稀疏的支柱网格,他们创建了一个大小为(D,P,N)的密集张量,其中 P 是非空支柱的数量(可能用 0 填充),N 是每个支柱的点数(如果一个支柱中有太多的点,则可能进行采样)。这个稠密张量馈入一个点网网络以生成一个(C,P,N)张量,随后是一个 max 运算以创建一个(C,P)张量。最后,我们使用 P 将特征散射回原始的柱子位置,以创建大小为(C,H,W)的伪图像。
在“提升,拍打,射击”中,作者在 D 轴上使用总和池而不是最大池来创建 C x H x W 张量。他们将这个张量输入由 ResNet 块组成的第二个主干网络,将点云转换为鸟瞰图像。
3.拍摄:他们为 BEV 中的每个实例“拍摄”不同的轨迹,计算它们的代价和代价最小的轨迹。
对于轨迹规划,让我们看看“火热的”而不是 NVIDIA 论文的拍摄部分。
2。用于运动规划的 FIERY:
代码可用此处。
FIERY 的整体架构分六步走。图片来自原纸[1]。
学习时间表征:
让我们考虑我们已经获得了连续帧中的 BEV 特征 X=(x_1,…,x_t) 从上面呈现的**Lift-Splat-Shoot*的提升步骤。*作者用空间变换模块 s 将 x 中所有这些过去的特征 x_i 扭曲到当前参考系 t,例如 x_i^t =S(x_i,a_{t-1} a_{t-2}…a_i),使用a_i 时的平移/旋转矩阵 I
然后,这些特征被串联起来 (x_1t,…,x_tt) 并馈入 3D 卷积网络,以创建时空状态 s_t 。
*他们用这个状态 s_t 来参数化两个概率分布:现在的 P 和未来的分布 F 。当前分布以当前状态 *s_t,为条件,未来分布以当前状态 s_t 以及观察到的未来标记 (y_{t+1},…,y_{t+H}) 为条件,其中 H 为未来预测范围。
FIERY 型号的输入(a)和标签(b-f)。图片来自论文[1]。
我们可以想象上图中不同的标签。标签包含实例的未来中心度(=在该位置找到实例中心的概率)(b)、偏移量(=指向用于创建分段图的实例中心的向量©) (d)以及该实例的流量(=位移矢量场)(e)。
最终的聚合实例分段图如(f)所示。
这两种概率分布是对角高斯分布。因为来自当前分布的任何样本都应该编码可能的未来状态,所以当前分布被推动以覆盖具有 KL 散度损失的观察到的未来。
未来分布 F 是卷积门控递归单元网络,其将当前状态 s_t 和来自 F 的样本(在训练期间)或来自 P 的样本(在推断期间)作为输入,并且递归地生成未来状态。
通过 top-k 交叉熵来评估语义分割(仅 top-k 是因为大多数像素属于背景而没有任何相关信息)。
指标:
他们用未来视频全景质量评估他们的模型,用于评估分割实例度量的一致性和准确性,以及用于评估模型预测多模态未来的能力的广义能量距离。
它们在语义分割任务中优于其他最先进的方法(包括 Lift-Splat ),并且在未来实例预测中也优于基线模型。
结论:
这一切都是为了摄像机系统的一种最先进的监控方法。要记住的关键是感知和计划是一起完成的,主要依赖于时间状态和多模态。
无人监督的
代码可用此处。
单幅 RGB 图像的深度估计。图片来自 TRI-AD 博客[7]
来自 TRI-AD 的 Adrien Gaidon 认为监督学习不会扩展、推广和持续。这就是为什么他在寻找一种高效的规模化监管方式…而不用贴标签!他们找到了方法:他们使用自我监督。
在没有任何监督标签的情况下,他的 TRI-AD 人工智能团队可以从单目图像中重建 3D 点云。
怎么可能呢?他们使用射影几何的先验知识通过他们的新模型 PackNet 产生期望的输出。他们取得了非常好的结果,他们的自我监督模型优于监督模型。
自我监督训练不需要任何深度数据。而是训练它合成深度作为中间体。
他们的方法解决了由于输入图像在通过传统的 conv 网(由于汇集)后分辨率损失而存在的瓶颈。因此,他们将卷积网络架构应用于深度估计任务。由于张量操作和 3D 卷积,他们的压缩模型具有保持目标图像分辨率的优势。
给定一张图片作为测试时间,他们的目标是学习:
- 将图像映射到每像素深度的函数 f_d ,
- 单目自我运动估计器 f_x 包含源图像到目标图像的旋转/平移。
我们将关注第一个学习目标:深度预测。
深度估计问题是一个训练过程中的图像重建问题,类似于传统的计算机视觉中的运动重建问题。
传统计算机视觉中的运动结构。图片来自洪堡州立大学。
PackNet 模型正在使用带有两个主要模块的单个摄像机学习这种 SfM。
图片来自原纸[2]。
- 打包块:用可逆的 Space2Depth 技术【6】对输入的 RGB 图像张量进行缩减,然后网络学习压缩,学习用 3D conv 层进行扩展。结果通过整形变平,并馈送到 2D 卷积层。
- 解包块学习解压缩和展开打包的卷积特征回到更高的分辨率。它再次使用 2D,然后三维层,然后通过深度 2 空间技术[6]重塑和扩展。
在训练期间,网络通过从源图像中采样像素来学习生成图像t*。*
损失
它们的深度映射损失分为两个部分:
深度映射的损失。图片由作者提供。
外观匹配损失 L_p :使用结构相似度项和 L1 损失项评估目标图像 I_t 和合成图像 t 之间的像素相似度
深度正则化损失 L_s :他们鼓励估计的深度图在梯度上用 L1 罚函数进行局部平滑。因为在对象边缘上存在深度不连续,为了避免丢失无纹理的低梯度区域,当图像梯度高时,该平滑被加权为较低。
我们在这里不涉及这一点,但它们的损失利用相机速度来解决单目视觉固有的比例模糊。
结果:
图像重建与传统流水线(b)和提出的方法©的比较。所提出的方法保留了细节。图片来自原纸[2]。
在著名的 KITTI 基准测试中,他们的模型优于 self、semi 和 fully supervised 方法。
2021 年更新:
*他们最近通过他们的新 2021 型号扩展到了 360 度摄像机配置:*来自多个摄像机的全环绕单深度,熊伟·圭齐利尼等人。
为了做到这一点,他们非常狡猾地利用时空信息。他们使用的六个摄像头重叠太少,无法在另一个摄像头(摄像头 B)的帧中重建一个摄像头(摄像头 A)的图像。为了解决这个问题,他们实际上使用来自摄像机 A 的过去帧的图像来投影到摄像机 b 的当前帧。
FSM 模型从 6 个相机装备配置(如左图所示)预测点云(右图)。图片来自原始纸张[2]
半监督 =自我监督+稀疏数据。
今年,TRI-AD 还提出了一个半监督推理网络:“用于统一单目深度预测和完成的稀疏辅助网络(SANs),熊伟·圭齐利尼等人,这些 SANs 可以根据推理时只有 RGB 图像还是稀疏点云来执行深度预测和完成。
第 2)节使用激光雷达和高清地图
自动驾驶汽车最初使用激光雷达、激光传感器和高清地图来预测和规划它们的运动。近年来,多任务深度学习的使用创造了利用激光雷达技术导航的端到端模型。
***为什么使用高清地图?*高清地图包含关于语义场景的信息(车道、位置停车标志等)。
《感知、预测、规划》一文中提出的整体架构。图片来自论文[3]。
我来呈上优步·ATG 在《ECCV 2020》上发表的一篇论文:“ 【感知、预测、规划】【3】。这篇论文是由作者之一拉奎尔·乌尔萨顿提交的,她今年资助了自己的广告初创公司,名为 Waadi 。
她的论文提出了一个端到端的模型,它联合感知、预测和规划汽车的运动。他们创建了一个新的中间表示来学习他们的目标函数:一个语义占用网格来评估运动规划过程中每个轨迹的成本。这个语义层也被用作中间的和可解释的结果。这种网格使得广告比传统方法更安全,因为它不依赖于阈值来检测对象,并且可以检测任何形状
他们的模型被分成三块。
- 感知块
端到端感知和循环占用模型。||是串联、+元素式求和以及用于缩减的增量双线性插值。图片来自论文[3]。
感知模型首先从激光雷达测量和高清地图中独立提取特征。为此,他们将激光雷达的 10 次连续扫描体素化为 T=10 帧,并将其转换为 BEV(鸟瞰图)中的当前汽车帧。这将创建一个 3D 离散格网,每个像元都有一个二进制值:被占用或为空。
它们在 Z 轴上连接时间轴以获得(HxWxZT)张量。第三轴上的级联允许以后使用 2D 卷积骨干网。
地图的信息存储在 M 通道张量中。每个通道都包含不同的地图元素(道路、车道、停车标志等)。那么最后的输入张量就是 HxWx(ZT+M) 。实际上,ZT+M=17 个二进制通道。
然后,输入张量被送入由两个流组成的主干网络。一个流分别用于激光雷达和地图要素。这些流仅在使用的要素数量上有所不同(激光雷达流的要素越多)。输出被连接并馈入卷积层的最后一个块,以输出 256 维特征。
2。预测块
用于预测的语义类被组织成分层的组。每组都有不同的计划成本(停放的车辆没有移动的车辆重要)。这些组中的每一组都被表示为空间和时间上的分类随机变量的集合(对于 x,y 网格为 0.4m/像素,时间为 0.5s(因此 10 次扫描产生 5s 窗口)。简而言之,预测的目标是回答这个问题:谁(哪个类的哪个实例)将移动到哪里?
他们再次使用 2D 卷积块,主要是两个具有不同膨胀率的平行流。一个具有细粒度特征的流针对最近未来的预测。另一个流使用具有膨胀卷积的更粗糙的特征用于长期预测。使用先前的输出和连接的要素以循环方式更新输出。
3。运动规划模块
他们从自我车的各种轨迹中取样,并选择一个最小化学习成本函数的轨迹。该成本函数是主要考虑语义占用预测的成本函数: fo 和与舒适安全和交通规则相关的 fr 的总和。
fo 由两项组成:第一项惩罚与高概率区域相交的轨迹,第二项惩罚在不确定占有区域中的高速运动。
**
f 是成本函数,τ是轨迹,x 是输入数据,o 是占用预测,w 是可学习的参数。[3]
t 是时间步长,c 是占据网格的单元,τ是轨迹,λ是添加到周围物体以避免碰撞的余量参数,v 是速度。[3]
这些成本函数用于最终的多任务目标函数:
语义占用损失和规划损失之和。[3]
语义占据损失 L_s 是语义占据随机变量的地面分布 p 和预测分布 q 之间的交叉熵损失。
规划损失 L_M 是一种最大边际损失,鼓励人类驾驶轨迹(地面实况)比其他轨迹具有更小的成本。
结果
导致 5s 帧。图片来自报纸[3]
因此,在碰撞数量方面,将占用网格表示添加到模型优于最先进的方法。对整个管道进行端到端(而不是一个接一个)的训练提高了安全性(10%)和人类模仿性(5%)。
结论
我简要地探讨了广告的最新趋势,概述了最近发表的三篇最先进的论文。
2021 年感知和运动规划的趋势是:
- 端到端模型优于顺序模型,
- 相机 VS 激光雷达,
- 学习深度如果你只依靠相机,
- 多智能体与自我车的纠缠互动。
许多生产级自动驾驶公司发布了他们最近进展的详细研究论文。此外,我们应该利用他们有时将代码作为开源库发布的优势。
感谢您的阅读!
中上关注我 推特 !😃
参考资料:
[1] 火热:从环绕单目摄像机鸟瞰视角预测未来实例, Anthony Hu 等
[2]“打包:3 用于自监督单目深度估计的 3d 打包。(CVPR 2020),熊伟·吉齐利尼,拉雷斯·安布鲁斯,苏迪普·皮莱,艾伦·拉文托斯,阿德里安·盖登。https://arxiv.org/abs/1905.02693
[3] " 感知、预测和规划:通过可解释的语义表示进行安全运动规划"ECCV 2020。萨达特、卡萨斯、任、吴、普拉纳布·达万和 r .乌尔塔松、和
[4] " 举起、拍打、拍摄:通过隐式反投影将来自任意相机装备的图像编码为 3D, ECCV 2020,乔纳·菲利翁,桑亚·菲德勒,https://arxiv.org/abs/2008.05711**
[5]https://youtu.be/eOL_rCK59ZICVPR 2021 年自动驾驶研讨会
[6] " 利用高效的亚像素卷积神经网络实现单幅图像和视频的实时超分辨率",2016,施,何塞·卡瓦列罗,费伦茨·胡斯萨尔,约翰内斯·托茨,安德鲁·p·艾特肯,罗布·毕晓普,丹尼尔·吕克尔特,,,。
[7]https://medium . com/Toyota research/self-supervised-learning-in-depth-part-1-of-2-74825 baaaa 04
理解点流程模型—第 1 部分
实践教程
用 R 对点过程模型的实际介绍
我最近一直在将空间数据作为一种学习练习,我对点模式分析特别感兴趣,这种分析通常用于流行病学,并在生态学中得到发展。虽然一些软件包已经有了这方面的固定功能(参见优秀的inlabru
或众所周知的spatstat
),但我不喜欢依赖它们。因为我想提高我对点模式模型的理解,并决定在我需要从头开始编写模型代码的地方使用rstan
。Stan,这是一种概率编程语言,使用哈密尔顿蒙特卡罗算法获得贝叶斯推断。
点模式和点过程
有许多资源介绍了点模式和点过程的概念,但是我将在这里快速解释这两个概念。
点模式
点模式代表一组点在时间、空间或更高维度中的分布。例如,森林中树木的位置可以被认为是一个点模式。犯罪地点是点模式的另一个例子。有三种通用模式:
- 随机:任意点在任意位置出现的概率相等,并且一个点的位置不受其他点位置的影响。例如,如果我把一袋大理石扔在地板上,图案很可能是随机的。
- 均匀:每个点都离它的邻居尽可能远。例如,我们可以想到一个人造森林,在那里树木被有规律地放置。
- 群集:许多点集中在一起,可能是由于协变量。我们可以以蜜蜂在田野中的位置为例,这些位置很可能聚集在花的周围。我们在这篇文章中模拟点模式代表了一个聚集的点模式。
点过程
空间点过程是点模式的描述。我们可以把它看作是生成点模式的模型。这些点来自随机过程,由局部强度λ(s)描述,局部强度测量空间中给定位置 s 处的点的预期密度。如果点独立且随机出现,则局部强度可由齐次泊松分布描述,并被称为泊松点过程。如果事件位置是独立的,但强度在空间上是变化的,则分布是由非均匀点过程产生的(即λ(s)变化)。后者也称为非齐次泊松过程。
我们可以将非均匀点过程的强度建模为协变量的函数。我们将这种类型模型描述如下:
λ(s)= exp(α+β÷X(u))
其中 X(u)是空间协变量,α和β是待估计的参数。Z(u)可以代表例如土壤的 pH 值或空气中的温度。
r 库
要复制本教程,您需要加载以下库:
library(spatstat)
library(sf)
library(sp)
library(maptools)
library(raster)
library(rstan)
library(tidyverse)
library(cowplot)
模拟点模式
首先,我需要模拟一个点模式。在我看来,模拟数据有无数的好处,尤其有助于理解生成过程(即数据是如何创建的)。从实用的角度来看,当生成数据时,我们可以完全控制参数,并且很容易看出我们在拟合模型时是否犯了错误。
这是一个函数,它根据我们的α、β值和研究区域的尺寸在内部生成一个点模式。注意dim[1]
和dim[2]
必须相等。
该函数返回 3 个对象的列表:
- 每个网格单元中的点数。在 stan 中拟合模型时,这将非常有用。
- 一个 ppp 对象,它是一个 spatstat 对象。这将有助于用 spatstat 拟合模型
- 协变量,它是一个数值网格
genDat_pp <- function(b1, b2, dim, plotdat = TRUE){
# Define the window of interest
win <- owin(c(0,dim[1]), c(0,dim[2]))
# set number of pixels to simulate an environmental covariate
spatstat.options(npixel=c(dim[1],dim[2]))
y0 <- seq(win$yrange[1], win$yrange[2],
length=spatstat.options()$npixel[2])
x0 <- seq(win$xrange[1], win$xrange[2],
length=spatstat.options()$npixel[1])
multiplier <- 1/dim[2]
# Simulate the environmental covariate
gridcov <- outer(x0,y0, function (x,y) multiplier*y + 0*x)# Set the coefficients
beta0 <- b1
beta1 <- b2
# Simulate the point pattern
pp <- rpoispp(im(exp(beta0 + beta1*gridcov), xcol=x0, yrow=y0))
# We count the number of points in each grid cell, plot it and make a vector out of it
qcounts <- quadratcount(pp, ny=dim[1], nx=dim[2])
dens <- density(pp)
Lambda <- as.vector(t(qcounts)) # We have to use t() as we need to # construct the vector with the column first
if(plotdat == TRUE){
par(mfrow=c(1,2), mar=c(2,2,1,1), mgp=c(1,0.5,0))
plot(im(gridcov), main = 'Covariate')
plot(dens, main = 'Intensity')
}
# Return a list with which I can play with
return(list(Lambda = Lambda, pp = pp, gridcov = gridcov))
}
我为要复制的结果设置了一个种子,并为模拟选择了参数:
set.seed(123)
b1 <- 2
b2 <- 3
dim <- c(20,20)
最终生成我的点模式。该函数生成了两个图,第一个是模拟的协变量,第二个是点模式的模拟强度。
pp <- genDat_pp(b1, b2, dim)
瞧啊。我们现在有可以利用的数据了!
用 spatstat 拟合点过程模型
作为一个基本的检查,我用包spatstat
中的函数ppm()
来拟合模型,以确保我能够恢复我之前指定的参数。spatstat
无疑是空间分析方面最成功的软件包,它具有大量用于拟合点过程模型和描述点模式的良好功能。查看网站!
cov <- im(pp$gridcov)
fit <- ppm(pp$pp ~ 1 + cov)
fit$coef## (Intercept) cov
## 2.187846 2.788411
模型的系数与我指定的系数是一致的。
在 stan 中拟合点过程模型
我在 stan 中为点流程模型编写的代码如下:
ppm_stan <- '
data{
int<lower = 1> n;
vector[n] x;
int<lower = 0> y[n];
}
parameters{
real beta0;
real beta1;
}
transformed parameters{
}
model{
//priors
target += normal_lpdf(beta0 | 0,5);
target += normal_lpdf(beta1 | 0,10);// likelihood
target += poisson_log_lpmf(y | beta0 + beta1 * x);
}
generated quantities{
vector[n] lambda_rep;
lambda_rep = exp(beta0 + beta1 * x);
}'
我们接下来拟合这个模型:
stan_data = list(n = length(pp$Lambda),
x = as.vector(t(pp$gridcov)), y = pp$Lambda)
fit_stan <- stan(model_code = ppm_stan, data = stan_data,
warmup = 500, iter = 2000, chains = 3)
检查系数是否与我指定的一致:
print(fit_stan, pars = c('beta0', 'beta1'))## Inference for Stan model: 200e1419a3bfac13c3097743f3003142.
## 3 chains, each with iter=2000; warmup=500; thin=1;
## post-warmup draws per chain=1500, total post-warmup draws=4500.
##
## mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
## beta0 2.12 0 0.02 2.08 2.11 2.12 2.14 2.17 1003 1
## beta1 2.97 0 0.03 2.91 2.95 2.97 2.99 3.02 1029 1
##
## Samples were drawn using NUTS(diag_e) at Wed Dec 02 10:20:18 2020.
## For each parameter, n_eff is a crude measure of effective sample size,
## and Rhat is the potential scale reduction factor on split chains (at
## convergence, Rhat=1).
这也是连贯的。我们注意到 Stan return 的系数比ppm()
给我们的要高一点。
比较 spatstat 和 rstan 输出
我们能做的第一件事是检查预测是否正确。这可以帮助我们发展关于哪个软件性能更好的直觉,并帮助我们再次检查模型是否正确。
对ppm()
对象进行预测比对 stan 对象进行预测更简单,但仍然相对简单:
# spatstat predictions
pred <- predict(fit)# Stan predictions
lambda_rep <- as.data.frame(rstan::extract(fit_stan)['lambda_rep'])
mean_lambda_rep <- apply(lambda_rep, 2, 'mean')
然后我们创建一个网格,在其中我们将收集所有的预测
pointp <- pp$pp
pp_sp <- as.SpatialPoints.ppp(pointp)
pp_sf <- st_as_sf(pp_sp)grid <- st_make_grid(pp_sf, n = dim, what = 'polygons') %>% st_as_sf()
grid$pred_stan <- mean_lambda_rep
grid$pred_spatstat <- as.vector(t(pred$v))
grid$intensity <- pp$Lambda
绘制预测图
plot(grid)
不知何故,spatstat 不能预测某些细胞。
我们还可以绘制系数,这将有助于我们可视化与参数值相关的误差。
从图中我们可以看到 stan 比ppm()
函数执行得更好。我们可以通过计算均方根误差的总和来形式化这种直觉。
我们定义我们的助手函数rmse
:
rmse <- function(true, observed){sqrt((true - observed)^2)}
我们计算。首先注意,我们去掉了 NAs 值,因为 spatstat 在某些网格单元中没有预测。
grid_no_na <- grid %>% filter(!is.na(pred_spatstat))
sum(rmse(grid_no_na$intensity, grid_no_na$pred_stan))## [1] 1993.056sum(rmse(grid_no_na$intensity, grid_no_na$pred_spatstat))## [1] 2551.068
stan 拟合的点过程模型的和 rmse 不如 spatstat 拟合的和 RMSE,这使我们得出结论,在这种情况下 stan 表现更好。
最后
在本文中,我介绍了点模式和点过程模型的概念。在处理空间数据分析中经常遇到的点模式时,ppm 是一类非常强大的模型。正如我提到的,理解你正在拟合的模型是很重要的,虽然 Stan 可能不是 ppm 的最佳选择( INLA 更有效),从头开始编写你的模型会让你更好地理解你的模型在做什么,以及如何解释它的结果。
在第 2 部分中,我们将进一步研究点过程的情况,我们将了解如何模拟和拟合考克斯过程——它是一个具有随机强度函数的非齐次泊松过程。我们还将以对数高斯考克斯过程为例,其中考克斯过程的对数强度是高斯过程!
了解变压器中的位置编码
理解 ML
变压器模型位置编码方法的可视化。
什么是位置编码?
正如我在“注意力机制介绍”中解释的,注意力并不关心输入的位置。为了解决这个问题,我们必须引入一种叫做的位置编码。这种编码在最初的“注意力是你所需要的全部”论文中有所涉及,它被添加到每个输入中(不是连接而是添加)。
图 1:原变压器架构,来源 《注意力就是你需要的一切》,2017
这篇论文只考虑了固定的(不可训练的)位置编码,这就是我要解释的。现在编码是和模型一起训练的,但是这需要另一篇文章。为了计算位置编码的值,我们必须转到本文的第 3.5 节。作者使用 sin 和 cos 函数来计算每个输入向量的值。
如你所见,这些值取决于 d_{model} (输入尺寸)和 i i (位置向量的索引)。原始论文对 512 维向量进行操作,但为了简单起见,我将使用 d_{model} = 50 或 d_{model} = 20 。作者还附上了他们为什么选择这种函数的注释:
我们选择这个函数,因为我们假设它将允许模型容易地学习通过相对位置来参与,因为对于任何固定的偏移 k,PE_{pos+k}可以表示为 PE_{pos} 的线性函数。
位置编码可视化
图 2:位置编码可视化,设计基于“注意力是你所需要的全部”,NeurIPS 2017 论文
注意
这只是原图中的一个屏幕,不幸的是我不能在介质上包含部分应用程序。如果你想玩,请直接进入https://erdem . pl/2021/05/understanding-positional-encoding-in-transformers # positional-encoding-visualization
价值观念
我们使用给定指数的公式计算每个指数的值。值得注意的是, cos 函数中的 2 i 值是一个偶数,因此为了计算第 0 个和第 1 个索引的值,我们将使用:
这就是为什么第 0 个和第 1 个索引的值只取决于位置的值,而不是同时取决于位置和 d_{model} dmodel 的值。这从第二个指数向前改变,因为被除数不再等于 0,所以整个除数大于 1。
维度依赖性
如果切换到第二步,那么可以比较一下 PE 值是如何根据 d_{model} 变化的。
图 3:不同维度 PE 值对比(d),来源: 位置编码可视化
前两个指标的周期不随 d_{model} 的变化而变化,但随 d_{model} 的减小,后续指标(第 2 个及以上)的周期变宽。这可能是显而易见的,但仍然很好地看到了差异。
功能周期
当我们绘制前 20 个位置向量的 PE 值时,我们得到如下结果:
图 4:前 20 位的位置编码值,使用 Tensorflow —位置编码 代码生成
这个图是从 Tensorflow 的教程之一生成的,你可以在谷歌的帮助下直接从他们的网站上运行它。如你所见,位置向量的较低维度具有非常短的波长(相同点之间的距离)。指数 i = 6 的函数的波长具有大约 19 (2 * 10^{12/25}).)的波长
我们知道周期是随着 i 的增加而增加的。当 i 到达 d_{model} 边时,你需要大量的 pos 向量来覆盖整个函数周期。
图 5:进一步索引的函数值,来源: 位置编码可视化
较高索引的前 20 个位置的值几乎是恒定的。你可以在图 4 中看到同样的事情,其中 30-50 列的颜色几乎没有变化。为了看到这种变化,我们必须绘制成千上万个位置的值:
图 6:使用 Tensorflow —位置编码 代码生成的进一步索引的位置编码周期
警告 这个图有一个内置的错觉,它实际上不是错觉,但因为它试图在 670px(高度)上打印 40k+值,所以它不能显示任何波长小于 1px 的值。这就是为什么第 24 列之前的任何内容在视觉上都是不正确的,即使使用了正确的值来生成该图。
结论
位置嵌入为转换器提供了关于输入向量位置的知识。它们被添加(而不是连接)到相应的输入向量。编码取决于三个值:
- 位置 —矢量的位置
- i —向量内的索引
- d_{model} —输入的维度
在周期函数(和)的帮助下交替计算值,这些函数的波长随着输入向量维数的增加而增加。当更远的索引需要很多位置来改变一个值(大周期)时,更靠近向量顶部的索引值(较低的索引)变化很快。
这只是进行位置编码的一种方式。当前的 SOTA 模型具有与模型一起训练的编码器,而不是使用预定义的函数。作者甚至在论文中提到了这个选项,但没有注意到结果的不同:
我们还尝试使用习得的位置嵌入,发现两个版本产生了几乎相同的结果(见表 3 行(E))。我们选择正弦版本,因为它可以允许模型外推至比训练期间遇到的序列长度更长的序列长度。
参考资料:
- 阿希什·瓦斯瓦尼等人,“注意力是你所需要的一切”,neur IPS 2017https://arxiv.org/abs/1706.03762
原载于https://erdem . pl*。*
理解概率模型和公理
基本原则
为什么还要关心样本空间、事件和概率度量?
你必须把基础的东西做好,因为否则那些花哨的东西是不会起作用的。—兰迪·波许,美国教育家,计算机科学教授
概率论是这些基础之一,为了在机器学习或人工智能领域取得成功,人们应该认真学习。
作为数学中有关不确定性概念的一个分支,概率论为我们提供了一个一致推理以及做出预测和决策的框架。它在机器学习中起着核心作用,处理非确定性问题。
概率论和相互作用[图片由作者提供]
在下面的章节中,我们将处理概率论的基本概念,慢慢地在机器学习的主要支柱之一中建立我们的基础。
声明:我不是数学专家。请把这篇文章仅仅作为一个指南,希望能为概率论的基础提供一些基本的直觉。
概率空间
不严格地说,概率是关于不确定性的研究。
当我们谈论概率时,我们最有可能指的是不确定事件发生的几率。因此,概率可以被看作是一个事件发生的次数,或者是对一个事件的信任程度。例如,在一次投掷中硬币正面朝上的概率。
概率空间的构造提供了所需的数学结构,不仅可以正式讨论概率论,还可以描述实验的随机结果。
形式上,概率空间是由三元组(ω,F,ρ)定义的*:样本空间(ω)、事件空间和概率测度。*
样本空间
样本空间通常表示为ω,描述了所有可能结果的集合。
假设我们连续掷两次硬币。所有可能结果的集合将被定义如下:{HH, HT, TH, TT} | H=Heads; T=Tails.
两次投掷硬币的样本空间[图片由作者提供]
知道了样本空间是什么,再来说说里面的元素及其性质。
当我们掷一枚硬币时,结果不是正面就是反面,而不是两个都是。这是因为所有的元素都是相互排斥的,也就是说一次只能有一个结果。
此外,元素是*集体穷举。*如果我们再掷一次硬币,至少会有一种结果。无论是正面还是反面的结果,都涵盖了整个样本空间内的所有可能性。
元素需要有“正确的”粒度。这仅仅意味着,样本空间中的元素需要与我们的实验相关。回到我们的单次抛硬币的例子,让我们扩大我们的样本空间,包括关于天气的元素{HR, TR, HNR, TNR} | H=Heads; T=Tails; R=Raining; NR=Not raining.
虽然在抛硬币时记录这种信息可能很有趣,但它很可能与我们的实验结果无关。因此,新的样本空间没有合适的粒度。
事件空间
事件空间 F 描述了实验的一组潜在结果,因此是样本空间的子集。例如,一个 toin coss 的一组潜在结果将是{H}
——硬币正面朝上。
事件空间的欧拉图。b 是样本空间,A 是事件。[图片由作者提供]
概率测度
当我们投掷一枚硬币,想要表达硬币出现反面的概率时,我们需要某种函数将事件转换成一个实数值。
这就是概率测度(或概率分布)ρ的作用。它将事件 E ∈ F 映射到 0 和 1 之间的一个实数值。或者,换句话说,ρ可以被认为是将事件 E 转换为 0 到 1 范围内的实数值的函数,即事件空间 F 的元素。
在我们的例子中,表示事件通过一次抛硬币得到反面的概率是P(T) = 0.5
既然已经定义了概率空间,那么就可以谈谈某些规则或者说概率公理了。
概率公理
由安德雷·柯尔莫哥洛夫在 1933 年提出的三个概率公理仍然是概率论的核心和基础。
第一公理:
事件发生的概率是一个非负实数。
第一个公理,非负实数
上式告诉我们,事件空间 *F,*内事件 *E,*发生的概率 P 大于或等于零。概率也是实数值。
尽管方程看起来很复杂,但第一个公理应该是直观的。如果我们考虑扔硬币——硬币正面朝上的负概率没有任何意义,要么是正面,要么不是正面。
第二条公理:
第二个公理描述了琐碎事件,即至少一个基本事件至少出现一次。
第二个公理,琐碎事件
这将是我们的硬币,至少出现正面或反面。
第三条公理:
两个(或任何可数序列的)不相交集合的概率可以通过每个集合的单独概率的总和来计算。
第三个公理,有限可加性的一个例子
简单地说,如果 A 和 B 是不相交的,这意味着它们的交集等于一个空集,那么 A 和 B 的并集的概率等于各自概率的总和。
在我们的例子中,事件 A 是正面,事件 B 是反面。这两个事件是不相交的,因此正面或反面发生的概率是P(A) + P(B) = 0.5 + 0.5 = 1
这个等式可以进一步推广。
第三个公理,广义可加性
概率计算:示例
说完了理论背景,让我们通过看一些例子来获得更多的直觉。
离散/有限示例
想象一下连续滚动两个四面体(四边)骰子。样本空间将是覆盖所有可能结果的 4x4 网格。
两卷四面体骰子[图片由作者提供]
在我们的样本空间中,总共有 16 个(4x4)元素。每种结局发生的概率是 1/16。第一个骰子作为一个出现的概率是多少?
第一个骰子是一的概率
如上图所示,我们必须考虑四种可能的结果{(1,1), (1,2), (1,3), (1,4)}
,因此任何一种结果发生的概率是 1/4。
本例中的基本原理是离散统一定律或分布。不严格地说,这意味着样本空间由 n 个同样可能的元素(1/16)组成,事件空间包含多个 k 个元素(4)。
连续例子
让我们假设我们向一个单位正方形投掷飞镖,无论如何,我们总是击中。这可以用 0 ≤ x,y ≤ 1 来描述。
向单位正方形投掷飞镖[图片由作者提供]
以下事件的概率是多少?
或者换句话说,投飞镖的概率是多少,击中 x + y ≤ 1/2 定义的区域,基本就是上图所示的三角形。如果我们用 1/2 底高来计算面积,我们得到
接下来,击中特定点(0.5, 0.7)
的概率是多少?
为了计算该事件的概率,我们必须计算单点的面积,该面积为零。
结论
我们讲了概率空间,定义它的三元组*(样本空间,事件空间,概率测度)*,了解了三个概率公理及其含义。
尽管是基本概念,但重要的是获得直觉,为简单的原则打下坚实的基础。最终,我们的*【花式模型】*将建立在这个基础上。
喜欢这篇文章吗?成为 中级会员 继续无限学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@marvinlanhenke/membership
参考资料/更多资料:
[1] [2]戴森罗斯,议员,费萨尔,A. A .,Ong,C. S. (2020)。机器学习的数学(第 152 页)。剑桥大学出版社。
视频讲座:麻省理工学院 2012 年春季课程概率导论
了解 Python 导入,init。py 和 pythonpath —一劳永逸
PYTHON 基础
了解如何导入包和模块(以及两者之间的区别)
在本教程结束时,这是您可以轻松使用的目录结构(针对Medium_Imports_Tutorial
项目)——从一个子目录导入任何脚本到另一个子目录(蓝色箭头)。
注:如果你愿意合作,这里有Github回购。
学习 Python 导入的目录结构
在我们开始之前,让我们了解一下包和模块之间的区别,因为我们将在整篇文章中多次提到它们。
模块:一个 python 脚本。
包:模块的集合。
我们开始吧…
上图中的目录结构看起来有点复杂,我不会要求你一次创建它。
为了简单起见,让我们首先在项目目录中创建一个目录scripts
,并向其中添加两个模块——example1.py
和example2.py
。
这个想法是让在example1.py
中定义的任何函数/变量/类都可以在example2.py
中访问。该模块的内容如下:
***#example1.py***MY_EX1_STRING = 'Welcome to Example1 module!'def yolo(*x*: int):
print("You only LIve", *x*, "times.")
要在example2.py
内导入这些项目:
***#example2.py***import example1*# imported string*
print("The imported string is: ", example1.MY_EX1_STRING)*# imported function*
example1.yolo(10)
运行 example2.py 的输出
只是重复一下显而易见的内容,可以使用点符号来访问导入模块中的项目——例如,example1.yolo()
或example1.MY_EX1_STRING
。如果你觉得每次都写example1.XXX
似乎有点太长,我们可以使用别名as
并重写example2.py
如下。正如您正确猜测的那样,输出仍然保持不变。
***#example2.py***import example1 **as e1***# imported string*
print("The imported string is: ", **e1**.MY_EX1_STRING)*# imported function*
**e1**.yolo(10)
当我们写一个’ import '语句时,到底发生了什么?
python 解释器试图寻找包含我们试图在sys.path
中导入的模块的目录*。这是一个目录列表,Python 会在查看完缓存模块和 Python 标准库模块后搜索这些目录。*
让我们看看此时我们的系统路径包含了什么(通过注释掉example2.py
中的前几行代码)。
**#example2.py***# import example1
# print("The imported string is: ", example1.MY_EX1_STRING)
# example1.yolo(10)*import sys
print(sys.path)
sys.path 的输出
正如你所看到的,由sys.path
返回的列表中的第一个元素指向Medium_Imports_Tutorial/scripts
目录,这是我们导入的模块即example1.py
所在的位置。请注意,这个目录神奇地出现在sys.path
中并不是巧合。
来自
sys.path
的输出将总是包含索引为 0 的当前目录!当前目录是正在运行的脚本所在的目录。
这就是当调用者和被调用者模块位于同一个目录中时,导入相当简单的原因。
如果我只想从导入的模块中导入某些项目,而不是全部,该怎么办?
在我们的例子中,我们只有一个字符串和一个在example1.py
模块中定义的函数。需要记住的一件重要事情是,每当执行一个 import 语句时,整个模块都将运行。为了证明这一点,让我们稍微修改一下example1.py
:
***#example1.py*****print("Thanks for importing Example1 module.")**MY_EX1_STRING = 'Welcome to Example1 module!'def yolo(*x*: int):
print("You only LIve", *x*, "times.")**yolo(10000)**
现在试着运行example2.py
。您将看到打印语句以及yolo(10000)
的输出也将被打印出来(除了之前的输出)。
注意:有一个解决方法,我们可以控制语句在导入时是否运行。例如,请参见下面的代码片段。
***#example1.py***print("Thanks for importing Example1 module.")MY_EX1_STRING = 'Welcome to Example1 module!'def yolo(*x*: int):
print("You only LIve", *x*, "times.")**if __name__ == '__main__':
yolo(10000)**
在 *if__name__ == '__main__'*
语句里面的代码 在导入 的时候不会运行,但是在外面定义的 *yolo()*
和 *MY_EX1_STRING*
可以通过导入使用。话虽如此,如果我们将 example1.py
作为独立模块运行,那么if
语句中的代码将被执行。
运行 example1.py 的输出
总之,既然我已经证明了导入一个模块可以运行它的所有内容(如果不使用if __name__ == “__main__"
),那么为什么只导入感兴趣的项目是有意义的就相当直观了。让我们看看如何在example2.py
中通过从example1.py
导入yolo
函数来实现这一点。这也有助于我们摆脱点符号,我们可以简单地使用yolo
功能。
**#example2.py****from example1 import yolo**
yolo(10)
类似地,我们可以通过from example1 import yolo, MY_EX1_STRING
从example1.py
导入两个对象。
注意:通常,存在包含进口陈述的代码,例如 *from example1 import **
。这实质上意味着导入所有内容,但是,这被认为是一种不好的做法,因为它会对代码的可读性产生负面影响。
PYTHONPATH 有什么用?
如果您注意到 Github 上项目的目录结构,通常会有一个utils
目录,其中包含一些用于预处理、数据清理等常见任务的实用程序脚本。这些脚本与主脚本分开保存,旨在重用。
让我们继续为我们的项目创建一个。utils
包将包含三个模块— length.py
、lower.py
和upper.py
,分别用于返回字符串输入的长度、小写和大写。
我们还将在项目根目录下创建example3_outer.py
模块。这是我们将导入util
包中的模块的地方。
三个模块的内容如下:
**#utils/length.py**def get_length(*name*: str):
return len(*name*)**#utils/lower.py**def to_lower(*name*: str):
return *name*.lower()**#utils/upper.py**def to_upper(*name*: str):
return *name*.upper()
现在,如果我们必须在example3_outer.py
中导入length.py
模块,这是我们通常的做法。
**#example3_outer.py**import utils.lengthres = utils.length.get_length("Hello")
print("The length of the string is: ",res)
需要注意的是,如果你要做的是import length
而不是import utils.length
,你会得到ModuleNotFoundError: No module named ‘length’
。这是因为sys.path
列表不包含../Medium_Imports_Tutorial/utils
目录(但),该目录是它找到length.py
模块所需要的。让我们看看如何将它添加到sys.path
列表中。
有两种方法可以做到这一点:
方法 1 :使用sys.path.append
**#example3_outer.py**import os
import sysfpath = os.path.join(os.path.dirname(__file__), 'utils')
**sys.path.append**(fpath)
print(sys.path)import length
txt = "Hello"
res_len = length.get_length(txt)
print("The length of the string is: ",res_len)
需要考虑的事情很少:
imports
的顺序很重要——只有使用sys.path.append
将路径附加到utils
目录后,才能执行import length
语句。简而言之,不要为了整洁而将imports os
、import sys
和import length
都放在脚本的顶部!os.path.dirname(__file__)
返回当前工作目录的绝对路径。我们使用os.path.join
将utils
目录添加到这个路径中。- 与往常一样,使用点符号(即
length.get_length()
)可以方便地访问导入模块中定义的函数。
方法二:使用PYTHONPATH
环境变量
我经常发现修改 pythonpath 变量比使用方法 1 添加目录更容易。
PYTHONPATH 是一个环境变量,您可以设置它来添加额外的目录,python 将在这些目录中查找模块和包。[ 来源
在我们修改它之前,让我们在终端中使用echo $PYTHONPATH
检查它的内容(以确保我们没有覆盖它):
看起来它现在是空的,但是如果不是空的,我们总是建议修改 pythonpath,以一种追加到它而不是覆盖它的方式。更具体地说,您必须将新目录添加到PYTHONPATH
,用冒号(:
)将其与现有内容隔开。
有了 pythonpath 变量集,我们不再需要在example3_outer.py
中追加到sys.path
(为了清晰起见,我在下面的代码片段中把它们注释掉了)。
**#example3_outer.py****#import os
#import sys****#fpath = os.path.join(os.path.dirname(__file__), 'utils')
#sys.path.append(fpath)
#print(sys.path)**import length
txt = "Hello"
res_len = length.get_length(txt)
print("The length of the string is: ",res_len)
注意:一旦关闭 python,列表将恢复到以前的默认值。如果您想将一个目录永久添加到 *PYTHONPATH*
,请将导出命令( export PYTHONPATH=$PYTHONPATH:$(pwd)/utils
) 添加到您的 *~/.bashrc*
。(参见本stack overflow讨论)。
最后,定义了两个方法之后,让我们选择一个(基于您的偏好/用例)来导入剩余的两个模块—example3_outer.py
中的upper.py
和lower.py
。
(注:我用方法 1 只是为了好玩。)
**#example3_outer.py**import os
import sysfpath = os.path.join(os.path.dirname(__file__), 'utils')
sys.path.append(fpath)import length
**import upper
import lower**txt = "Hello"res_len = length.get_length(txt)
print("The length of the string is: ",res_len)**res_up = upper.to_upper(txt)
print("Uppercase txt: ", res_up)****res_low = lower.to_lower(txt)
print("Uppercase txt: ", res_low)**
超级!这看起来真棒。然而,如果我们可以只做import utils
而不是单独导入其中的所有模块,那不是很好吗?毕竟,我们的用例表明我们确实需要所有这三个功能。那么我们该怎么做呢?
我们什么时候需要 init。py?
首先,让我们尝试在example3_outer.py
中导入utils
目录(在注释掉所有现有代码之后):
**#example3_outer.py**import utils
运行这个脚本不会导致任何错误,这是理所当然的——解释器会查看sys.path
内部,并在索引 0 处找到当前目录../Medium_Imports_Tutorial
。这就是找到utils
目录所需的全部内容。
现在让我们尝试从utils
访问length.py
模块:
**#****example3_outer.py**import utilstxt = "Hello"
res = utils.length.get_length(txt)
当您尝试运行这个脚本时,您会看到一个AttributeError: module ‘utils’ has no attribute ‘length’
。通俗地说,这意味着我们将无法访问utils
中的任何 python 脚本,因为解释器还不知道这是一个包!
我们可以通过在utils
文件夹中引入__init__.py
文件将这个目录变成一个包。
在__init__.py
中,我们导入所有我们认为对我们的项目必要的模块。
***# utils/__init__.py*** *(incorrect way of importing)*from length import get_length
from lower import to_lower
from upper import to_upper
我们称之为example3_outer.py
import utilstxt = "Hello"
res_low = utils.to_lower(txt)
print(res_low)
等一下! 为什么运行 *example3_outer.py*
时会出现错误?
答:我们在上面的__init__.py
中导入模块的方式对你来说似乎是合理的——毕竟__init__.py
和length.py
(或lower.py
、upper.py
)在同一级别,所以没有理由from lower import to_lower
不工作。事实上,如果您单独运行这个init
文件,它将完美地执行(它不会给出任何输出,但仍然会成功执行)。
话虽如此,我们不能使用上述导入方式,因为即使length.py
和lower.py
与__init__.py
处于同一级别,这也不是调用init
的级别。实际上,我们从example3_outer.py
发出调用,因此sys.path
将只有example3_outer.py
的当前目录,即../Medium_Imports_Tutorial
来搜索中的任何导入。因此,当解释器在example3_outer.py
中遇到import utils
命令时,即使它移动到utils
目录中的__init__.py
,也不会自动更新sys.path
,解释器也无法知道在哪里可以找到名为length
的模块。我们必须以某种方式指向目录的位置。为此,我们可以在__init__.py
中使用相对或绝对导入(或如上所述设置PYTHONPATH
变量)。
相对导入(不推荐):指定相对于调用脚本路径的路径。
**# utils/__init__.py**from .lower import to_lower
from .upper import to_upper
from .length import get_length
我们使用点符号(.
或..
)来指定相对进口。lower 前面的单个点指的是调用导入时所在的目录。这可以看作是从./lower.py
导入to_lower()
。类似地,模块名前的双点意味着从当前级别向上移动两级。
绝对导入(更好的选择):指定从项目根目录(或 sys.path 可以访问的任何其他目录)导入的模块的绝对路径。
**# utils/__init__.py**from utils.lower import to_lower
from utils.upper import to_upper
from utils.length import get_length
现在,与相对进口相比,它包含了更多的信息,而且不容易被破解。此外,如上所述,sys.path
可以访问项目根目录,即../Medium_Imports_Tutorial
,从那里可以轻松搜索utils
目录。(为什么?因为它是项目根目录的直接子目录)。
当我们导入一个定义了 **__init__.py**
**的包时会发生什么?**这是一个初始化步骤,是我们导入包时执行的第一个文件。考虑到我们在这里做了所有必要的导入,调用脚本中的代码要干净得多。例如:
**#example3_outer.py****import utils**txt = "Hello"
res_len = **utils.get_length**(txt)
print(res_len)res_up = **utils.to_upper**(txt)
print(res_up)res_low = **utils.to_lower**(txt)
print(res_low)
厉害!现在我们已经将我们的utils
目录转换成了一个包。这个包的美妙之处在于,它可以被导入到任何地方,并且几乎可以立即使用。让我们看看如何在scripts
目录中使用这个包。让我们在scripts
中创建一个名为example3.py
的新文件。
**# scripts/example3.py**import os
import sysPROJECT_ROOT = os.path.abspath(os.path.join(
os.path.dirname(__file__),
os.pardir)
)
sys.path.append(PROJECT_ROOT) import utils
print(utils.get_length("Hello"))************** OUTPUT *********
5
需要考虑的事情很少:
- 在导入
utils
包之前,我们必须确保utils
的父目录,即项目根目录可以被 Python 解释器访问。假设它会默认发生是不明智的,主要是因为我们现在在项目根目录中的一个级别(我们从scripts/example3.py
运行脚本),sys.path
将在索引 0 处有../Medium/Imports_Tutorial/scripts
。 os.path.dirname(__file__)
将给出当前脚本的目录名,而os.pardir
将使用点符号给出父目录的路径,即..
。总而言之,os.path.abspath
将提供项目根的绝对路径。
额外好处:我们甚至可以将其他目录中的模块添加到我们的__init__.py
中。例如,让我们引入在scripts/example1.py
中定义的yolo()
。
**# utils/__init__.py**from utils.lower import to_lower
from utils.upper import to_upper
from utils.length import get_length**from scripts.example1 import yolo**
在example3.py
中调用该函数
**# scripts/example3.py**import os
import sysPROJECT_ROOT = os.path.abspath(os.path.join(
os.path.dirname(__file__),
os.pardir)
)
sys.path.append(PROJECT_ROOT)import utils
print(utils.get_length("Hello"))
**utils.yolo(2)**************** OUTPUT *********
5
**You only LIve 2 times.**
结论
老实说,导入错误在开始的时候真的让我很害怕,因为这是我从来不需要担心的一个方面。多年来,我已经学会了一个有用的技巧——对于你试图使用import XYZ
导入的任何包/模块,确保 Python 解释器可以访问它。如果没有,更新sys.path
或者更好地将相关目录附加到PYTHONPATH
变量,避免在脚本中处理它。
一如既往,如果有更简单的方法来做/解释本文中提到的一些事情,一定要让我知道。一般来说,避免不请自来的破坏性/垃圾/敌意评论!
直到下一次✨
我喜欢写循序渐进的初学者指南、操作指南、面试问题、ML/AI 中使用的解码术语等。如果你想完全访问我的所有文章(以及其他作家在媒体上的文章),那么你可以使用 我的链接这里 注册。
* https://varshitasher.medium.com/six-reasons-to-switch-to-this-podcast-app-today-3a396ada0a2b *