神经网络概述
数学、代码、绘图、情节、类比和思维导图
我桌子的照片。这项工作是由爱、核桃、葡萄干和茶推动的
我的意图是用类比、数学、代码、图表、绘图和思维导图与你一起走过神经网络的主要概念。我们关注神经网络的构建模块:感知器。
在整篇文章中,我们将直面令人生畏的数学,并使用 Python 代码和 Numpy 实现它。我们还将看看使用 Scikit-learn 的等效实现。我们的结果将使用 Matplotlib 和 Plotly 可视化。在每个概念的结尾,我们将使用思维导图来构建我们的理解。
感知器的结构
感知器的输入层是一个占位符。它包含的结点数与训练数据集中的要素数一样多。这些节点中的每一个都通过一条边连接到输出节点。我们将权重分配给边,将偏差分配给输出节点。
一个很好的类比是把感知器想象成一只乌贼。它的输入层有许多分支。臂的数量等于它需要的输入的数量。在这个类比中,让我们想象我们的数据集包含三种类型的配料:咸的、酸的和辣的。我们的鱿鱼需要三只手臂从每一种类型中抓取一种成分。手臂连接到头部,头部是鱿鱼混合配料的输出节点,并为它们的味道打分。
鱿鱼一生都生活在海里,很难注意到咸的成分,所以它们不会影响整体味道。然而,对于酸味和辣味,它可能是一个真正的势利小人。感知器中的权重可以理解为代表我们的配料类型对最终味道的贡献。这种偏见可以理解为影响鱿鱼味觉的一个因素,就像它的情绪或食欲一样。
输入乘以相应的权重,然后与偏差相加。这种具有各自权重的成分的混合和具有偏差的相加是一个仿射函数: z=𝑤x+𝑏
混合后,鱿鱼输出其对味道的印象分数。该分数被称为激活,并使用激活函数进行计算。激活可能只是结果 z ,因为它是*,*在这种情况下,我们可以使用身份函数。它可能是一个介于-1 和 1 之间的数字,在这种情况下,我们可以使用双曲正切函数。也可以是 0 到 1 之间的数字,在这种情况下,我们可以使用 sigmoid 函数。或者 0 和∞之间的一个数,在这种情况下,我们可以使用整流器线性单元(ReLU) 功能。最后,还可以要求 Squid 为相同的输入给出多个分数,每个分数基于不同的标准在 0 到 1 之间。在这最后一种情况下,我们可能会对将所有分数相加为 1 感兴趣,对于这个任务来说, softmax 函数将是理想的。
思维导图 1:激活功能
选择取决于任务和最适合您的输出间隔。利用权重 𝑤 和偏差 𝑏 从输入向量𝑎计算 sigmoid 激活𝑎′的示例:
等式 1:乙状结肠活化
等式 2: sigmoid 函数
术语:
- 看到输入向量在等式 1 中用 𝑎 表示,而在 z=𝑤x+𝑏.中用 x 表示,可能会令人困惑原因是输入层中的节点也被称为激活。在多层感知器的情况下,有两层以上,每一层都被认为是下一层的输入层。
- 权重和偏差被认为是𝑎′.的参数可以将权重和偏差合并成一个参数向量。这可以通过在输入向量中预先加上 1,并在最初只包含权重的向量中预先加上偏差来实现。
**关于激活函数的注释:**因为仿射函数是线性的,所以它们不能表示非线性数据集。由于激活函数引入的非线性,神经网络被视为通用函数逼近器。
训练感知器
我们对朋友鱿鱼的产量不满意。它运行的参数似乎是随机的。果然,偏差和权重已经初始化为:
我们想训练鱿鱼获得更好的味道。我们对准确口味的标准是一个向量 y ,包含我们的配料数据集中每一行的实际分数。将根据 y. 中的分数对 Squid 的性能进行评估
评估 Squid 性能的目的是测量其相对于目标的误差 y. 有不同的函数来计算该误差:
- 均方误差(MSE): 如果任务是回归并且数据集不包含离群值,这是一个不错的选择。
- 绝对平均误差(AME): 如果任务是回归并且数据集包含异常值,这是一个不错的选择。
- ****胡伯损失:中小企业和 AME 的组合
- ****交叉熵(对数损失):如果任务是分类,这是一个很好的选择:感知机的输出是一个概率分布。
思维导图 2:成本函数
为了评估我们的感知器,我们将使用均方误差函数:
等式 3:均方误差
训练是通过调整参数 w 和 b 来最小化误差𝐶。最形象化的比喻是,当天太黑看不见的时候,你在一座山上试图下山回家。下方的 Home down 代表最小的误差𝐶。计算 MSE 的平方根,就可以得到你和家之间的直线距离。然而,知道这个距离对你在黑暗中没有任何帮助。相反,你想知道的是你下一步的方向。
3D 世界中的方向包括三个坐标 x、y 和 z。因此问题是“家在哪里?”必须相对于 x、y 和 z 来回答。同样,问题“最小误差𝐶在哪里?”必须根据参数 w 和 b 进行回答。这些方向的数学表示是𝐶.的梯度更具体地说,𝐶: -∇𝐶.的负梯度
∇𝐶是一个向量,包含 c 对每个参数的所有偏导数。对于 MSE,我们从推导等式 3 开始:
等式 MSE 的梯度等于层 L 的激活减去 y
我们仅仅推导了 MSE,在得到𝐶对参数的偏导数之前,我们还有一些工作要做。在等式 4 中,𝑎取决于激活函数的输出。在 sigmoid 激活的情况下,𝑎等价于等式 1 中的𝑎′。接下来是𝐶相对于 z 的梯度(回想一下 z=𝑤x+𝑏 ):
等式 5:C相对于 z 的梯度是 C 相对于 a 的梯度与 z 的 s 形导数的的乘积****
等式 5 令人生畏,直到您在 Python 代码中看到它的对等物
我们有𝐶相对于 z 的梯度。由于 z 中的偏差乘以 1,C 相对于偏差的偏导数为:
等式 6:C相对于 b的偏导数****
**并且由于权重乘以输入 x,C 相对于权重的偏导数为:
等式 7:C相对于 w** 的偏导数**
有了成本𝐶对参数的偏导数,我们现在就可以知道下一步回家的方向了。现在我们需要知道我们应该走多远。选择一个好的步长很重要。如果你的步子太窄,你将无法跳过你前进道路上的障碍。如果你的脚步太宽,你可能会越过下面的整个城镇,最终到达另一座山。一个好的步长介于两者之间,可以通过将偏导数(等式 6 和 7)乘以一个选定值来计算,该选定值称为学习速率或 eta : 𝜂 。
现在我们可以走下山坡了。这相当于更新我们的坐标/参数:
等式 8:更新偏差
等式 9:更新权重
这就结束了梯度下降:在更新参数之前计算下一步的方向和大小的过程。通过梯度下降,我们可以训练鱿鱼获得更好的味道。我们通过让 Squid 以一些输入为食并使用等式 1 输出一个分数来做到这一点:这被称为前馈**。分数作为𝑎代入方程 4,其结果作为𝐶相对于𝑎的梯度代入方程 5。然后,我们在等式 6 中计算𝐶相对于 z 的梯度。最后,我们计算𝐶相对于参数的梯度,并更新 Squid 的初始随机参数。这个过程被称为反向传播,因为它将误差从输出层反向传播到输入层。**
梯度下降是迭代的。当满足以下条件之一时,它会停止:
- 已达到定义的最大迭代次数。
- 梯度达到 0 或接近 0 的某个定义值。
- 验证错误已达到最小值。这叫早停。
思维导图 3:梯度下降
将碎片拼在一起
感知器的完整实现可以从我们看到的代码片段中构建。为了不让这篇文章被代码淹没,这里有一个链接指向一个感知器的完整实现。
为了看到我们的感知机在工作,让我们做一个非常简单的数据集。我们将随机生成包含一百行整数的两列。然后,我们将创建第三列来存储我们的标签。标签将等于第一列加上第二列值的一半。
我们知道,为了达到目标,我们的感知器必须从随机参数开始,并优化它们,使偏差等于 0,第一个权重等于 1,第二个权重等于 0.5。让我们来测试一下:
在 Scikit-learn 中
我们从最基本的感知机开始。因为它正在执行回归,所以不需要激活函数。到目前为止,它所做的只是随机梯度下降。在 Scikit-learn 中,这可以通过使用 SGDRegressor 类来实现。虽然 Scikit-learn 包含一个感知器类,但它并不服务于我们当前的目的,因为它是一个分类器,而不是回归器。
可视化梯度下降
我们可以画出我们的感知器采取的步骤,看看它达到理想参数的路径。下面是使用 Matplotlib 绘制梯度下降的代码:
前面代码的输出:使用 Matplotlib 可视化梯度下降
这是从不同的角度和使用 Plotly 的同一个情节:
前面代码的输出:使用 Plotly 可视化的梯度下降
我想让你看到我们的感知机的下降导致它回家。但这不是最直的路,远非如此。我们引入了对功能缩放的改进。
特征缩放
通常情况下,机器学习算法在缩放数字输入的情况下表现更好。如果没有缩放,梯度下降需要更长时间才能收敛。在 2D 的世界里,你仍然试图在黑暗中下山回家,你需要减少你离家的垂直和水平距离。如果两个距离在不同的范围内,您将花费更多的时间来缩短范围较大的距离。
例如,如果你需要减少的垂直距离是以千为单位,而水平距离是以个为单位,那么你的下降主要是向下爬。当你接近最小水平距离时,你仍然需要减少垂直距离。
将这两个距离缩放到相等的范围会使您的脚步同时影响这两个距离,这使您能够沿着直线直接向家行进。
说明比例对梯度下降的影响的简单图形
两种最常见的数据缩放方式是规范化和标准化**。我们将实现这两个方法,并可视化它们对梯度下降的影响。**
正常化
也被称为最小-最大缩放**,是一种将数据压缩到 0 和 1 之间的方法:**
等式 10:最小-最大缩放或归一化
使用 Numpy 标准化我们的训练数据集
sci kit-learn 中的标准化:
标准化
**也称为 **z 分数归一化,是一种将数据集中在 0 附近,标准差等于 1 的方法。𝜇是平均值,𝜎是标准差:
等式 11: Z 分数标准化或规范化
sci kit-learn 中的标准化:
思维导图 4:功能扩展
特征缩放对梯度下降的影响
为了研究特征缩放的效果,我们将再训练两个感知器。目的是比较缩放和不缩放时梯度下降中参数的收敛性。
我们的第一个感知机是在未缩放的数据集上训练的。第二个将在标准化数据上训练。第三个将接受标准化数据的训练。
我们现在可以想象我们的三个感知器所采取的路径。下面的代码使用 Plotly:
在缩放数据上训练的感知机采取了更直接的路径来收敛。直接路径使它们的下降速度更快,步幅更宽(可能通过增加学习速率eta
实现),步数更少(可能通过减少迭代次数epochs
)。
概括起来
思维导图 5:概念总结
参考
A.Géron,使用 Scikit-Learn、Keras 和 TensorFlow 进行动手机器学习 (2019)
I. Goodfellow,Y. Bengio 和 a .库维尔,深度学习 (2016)
米(meter 的缩写))尼尔森,神经网络和深度学习 (2019)
米(meter 的缩写))胺,神经网络概述: Jupyter 笔记本和游乐场
米(meter 的缩写))胺,神经网络概述: 代码片段
XMind,思维导图软件
具有记忆的神经网络
Infralist.com在 Unsplash 上拍照
深度学习
了解 LSTM RNN 不到 5 分钟
我们总是听说神经网络 ( NNs )是受生物神经网络的启发。这个巨大的展示是以一种奇妙的方式完成的。
图 1 显示了单个神经元的解剖结构。中心部分称为细胞核所在的细胞体。有各种导线将刺激传递到细胞体,少数导线将输出发送到其他神经元。树突的厚度暗示了刺激的重量/偏向/力量。许多具有不同细胞体的神经元堆叠在一起,形成了生物神经网络。
图 1:单个神经元的解剖(来源,作者编辑)
在神经网络中也实现了同样的结构。输入通过带加权边的激活函数传递。生成的输出可以传递给另一个激活函数。许多激活功能可以堆叠起来,其中的每一个都被称为一个层。在一层中,我们可以有多个神经元。
图 2:单神经元神经网络(图片由作者创建)
这些激活函数可以像 sigmoid 函数一样简单
神经网络相对于传统机器学习算法的优势
- 可以处理各种类型和大小的数据
- 可以轻松配置多种功能
- 可以有效地处理非线性数据
具有记忆的神经网络
神经网络和生物神经网络的主要区别在于记忆。虽然人脑和神经网络都有能力从可用的记忆中读取和写入,但大脑也可以创建/存储记忆。研究人员发现这一关键差异是当今人工智能系统达到人类智能水平的主要障碍。
DeepMind 的研究人员旨在通过构建一个神经网络并将其连接到外部存储器来构建一台可区分的计算机。神经网络将充当带有存储器的 CPU。这种可微分计算机旨在从输入和输出数据中学习程序(算法)。
当数据量巨大时,使用神经网络。例如,文本数据具有大量的维度,或者图像数据被分割成大量的像素。
递归神经网络
一部电影由一系列场景组成。当我们观看一个特定的场景时,我们不会试图孤立地理解它,而是联系以前的场景来理解。以类似的方式,机器学习模型必须通过利用已经学习的文本来理解文本,就像人类神经网络一样。
在传统的机器学习模型中,我们无法存储模型的先前阶段。然而,递归神经网络(通常称为 RNN)可以为我们做到这一点。下面我们来仔细看看 RNNs。
图 3:基本 RNN 的工作原理(图片由作者提供)
RNN 有一个重复模块,它接收前一级的输入,并将其输出作为下一级的输入。然而,在 RNNs 中,我们只能保留最近阶段的信息。这就是 LSTM 的问题所在。
长短期记忆网络
为了了解长期依赖关系,我们的网络需要记忆能力。LSTMs 是可以做到这一点的 rnn 的特例。它们具有与 RNNs 相同的链状结构,但具有不同的重复模块结构。
图 4:LSTM 的工作(图片由作者提供)
LSTM 在序列到序列建模任务中有广泛的应用,如语音识别、文本摘要、视频分类等。
要想快速了解这些网络在现实生活中的应用,请阅读下面的文章。
应用自然语言处理和深度学习进行垃圾邮件检测
towardsdatascience.com](/spam-detection-in-emails-de0398ea3b48)
垃圾邮件检测模型可以通过将文本数据转换成向量、创建 LSTM 模型并用向量拟合该模型来实现。
履行
为了实现这些完整的神经网络,Keras 和 TensorFlow 将其简化。
我们正在实现一个带有 ReLU 激活功能的双向 LSTM。
#Importing necessary libraries
import tensorflow as tf
from keras.layers import LSTM, Activation, Bidirectional#Addding Bi-directional LSTM
model.add(Bidirectional(tf.keras.layers.LSTM(64)))#Relu allows converging quickly and allows backpropagation
model.add(Dense(16, activation='relu'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
创建每一层只是一行代码。
摘要
在这篇文章中,我们学习了神经网络如何与生物神经网络相联系,以及具有记忆的神经网络的工作原理(即 RNN,LSTM)。
谢谢你的阅读。我也将在未来写更多初学者友好的帖子。请在媒体上关注我,以便了解他们。我欢迎反馈,可以通过 Twitter ramya_vidiyala 和 LinkedIn RamyaVidiyala 联系我。快乐学习!
完全初学者用的神经网络从零开始第 3 部分:逻辑回归
sigmoid 激活函数是神经网络中最基本的概念。在本教程中,您将学习实现使用 sigmoid 激活函数和 Numpy 进行分类的逻辑回归。
无论是机器学习还是深度学习,都会遇到两种问题,分别是和 分类 。
在 回归问题 中,你预测一个连续的实数值,而在 分类问题 中,你预测不同类别的对象。
在前面的教程中,我们深入探讨了什么是感知器,后来又学习了它如何使用线性回归来学习预测。如果你是这个领域的绝对初学者,我推荐你去看看我以前的简短教程。
在本教程中,您将简要了解什么是神经网络以及它们是如何发展起来的。在…
towardsdatascience.com](/neural-networks-with-numpy-for-absolute-beginners-introduction-c1394639edb2) [## 绝对初学者用的带 Numpy 的神经网络第 2 部分:线性回归
在本教程中,您将详细学习使用 Numpy 实现预测的线性回归,并可视化…
towardsdatascience.com](/neural-networks-with-numpy-for-absolute-beginners-part-2-linear-regression-e53c0c7dea3a)
在本教程中,您将了解用于分类问题的逻辑回归。
像以前一样,会涉及到一些数学知识,但我会确保从基础开始,这样你就可以很容易地理解。
如果你不确定使用哪种环境来实现本教程中的代码,我推荐 Google Colab 。该环境已经安装了许多重要的软件包。安装新的包以及导入和导出数据非常简单。最重要的是,它还带有 GPU 支持。所以,开始编码吧!
最后,我建议您在开始之前先浏览前两个教程。然而,如果你已经对线性回归和神经网络有所了解,或者只是想学习逻辑回归,你可以马上开始!
Sigmoid 激活函数
使用最早和最普遍的激活功能之一是s 形函数。
sigmoid 函数的等式如下:
该函数的图形如下:
Sigmoid 函数
因此,具有 sigmoid 激活函数的感知器对给定的数据集进行二元分类。这个二元分类的过程俗称 逻辑回归 。在下一节中,我们将深入研究逻辑回归,并了解模型是如何被训练的。
逻辑回归
那么,什么是逻辑回归呢?
逻辑回归是一种用于二元分类的技术。它在数据点之间创建一个决策边界,以便将它们归类到两个类别中的任何一个。下图就是这样一个例子。我们将通过实际操作来深入理解和训练一个逻辑回归模型。理解逻辑回归将为理解神经网络模型提供基础。
要实施的逻辑回归的计算图如下图所示。
我们有两个输入 x₁ 和 x₂ ,它们分别乘以权重 w₁ 和 w₂ 。将附加偏置 b 加到它们的和上,得到 z 。这些参数( w₁ 、 w₂ 、 b )是在梯度下降过程中学习到的。
现在让我们开始编码吧!
第一步是导入所需的包。
您将使用 sklearn 包来执行两项任务:
- 生成 blobs 数据集
- 将数据分成训练集和测试集。
您将使用 matplotlib 来可视化结果。
在你开始定义代码之前,在任何机器学习项目中,你的第一个任务将是定义超参数。超参数可以是数据集大小、学习率、时期数等。你一定想知道为什么这些变量被称为超参数!您稍后会发现,参数是在模型中学习到的,我们使用 hyperparameter 来微调模型,以实现更高的准确性。
在这里,我们还定义了创建数据集所需的输入要素数和聚类数。
继续定义它们吧!
接下来,我们用 make_blobs 函数从 scikit-learn 导入数据集,该函数创建类的 blob。我们也将同样想象。
现在,让我们绘制一个图形来可视化生成的数据。
这两组数据点属于这两类。我们的目标是找到一个区分这两类的最优决策边界。
下一步将把数据分成训练集和测试集。我们这样做是为了验证所学算法的准确性。
Shape of X_train (400, 2)
Shape of y_train (400, 1)
Shape of X_test (100, 2)
Shape of y_test (100, 1)
现在,您将随机初始化参数 W 和 b,它们是在训练过程中学习到的。
Initializing weights...
W: [[-0.59134456] [-0.31427067]]
b: -1.6078558751252707
在我们随机初始化参数后,下一步是执行正向传播,并查看网络如何预测。
现在,您将利用generate_mesh_grid
函数绘制数据集和等高线。
现在是时候定义损失函数了!!
成本/损失函数
与线性回归的 MSE 不同,这里我们使用逻辑损失函数。这是因为当我们通过 sigmoid 激活函数传递总和 z 时,输出是非线性的(因为 sigmoid 函数是非线性的)。这会导致非凸误差。
但是你说的非凸是什么意思?
简单来说,非凸函数看起来就像右图。
在这种情况下,虽然我们的目标是找到最小点,但由于波谷和波峰,找到一个点变得极其困难。相反,如果我们有一个简单的函数(就像左边的那个),我们可以很容易地找到最小点,我们就可以使我们的问题变得简单。这是左边的凸函数。
因此,我们使用一个对数函数,它实际上将非线性函数转换回线性函数,从而产生一个凸函数!
凸优化和非凸优化。来源:https://bit.ly/3d9ESRL
损失可以定义为:
ᅳ 测井曲线( x ) 如上图所示。可以推断给定 y = 1 如果y→0**,那么 loss → 0 而当 y’ → 0 时,那么 loss → ∞。同样,如果y’→0,那么 loss → 0 而当y’→1,那么 loss → ∞给定 y = 0 。这意味着当预测错误时,参数会受到严重惩罚,而当预测正确时,参数不会受到惩罚。
在这里,函数简化为ᅳ log( y’ ) 当 y = 1 和**log(1ᅳy ')**当 y = 0 正如我们
虽然以上只是一个例子(数据点)的错误,我们需要考虑所有的例子。因此,我们将所有误差相加,然后除以示例数量,得出误差的平均值,如下所示。
这方面的代码如下:
1.0579769986979133
让我们画出损失图。您将跟踪所有迭代(时期)的损失,之后您将能够可视化误差的减少。
[1.0579769986979133]
梯度下降
这通常是最难理解的部分,但是我用了非常简单的术语。
来源:吉菲
用外行人的话说梯度下降就像走下一座小山。这座山指的是我们的错误。误差越大,山越高!!所以当你滚下山的时候,误差( 损失 )就下降了。
来源:吉菲
因此,我们的目标是滚到误差最小的点。
嘿,但是等一下!我该如何改变损失?🤔
现在你必须观察到,如果你调整参数 W 和b损耗 也会改变!!
因此,我们找到关于参数W&b的导数(即变化率),并相应地更新它们。
嗯,那就简单了!只要找到它的导数或者斜率。数学上,斜率在极小点(minima)处为 零 【如果你不了解导数和斜率,可以参考这个精彩的可汗学院视频。]而如果你观察敏锐的话,斜率在极小值左边是负的,在极小值右边是正的。当 p 在最小值的左边时,我们需要增加一些值,以便它向最优值 p 移动,当 p 在右边时,减去一些值。
在我们的例子中,我们找到了 损失 相对于 W 和 b 的导数。
我跳过了几个不必要的步骤,但是如果感兴趣,你可以参考下面的视频。
更新参数
至于更新参数的最后部分,利用斜率,我们将斜率乘以阻尼因子 α ,使得参数在具有非常高的误差时不会过冲。
您现在将实现与下面相同的gradient_descent
算法。
现在还有最后一件事要做,即将两个绘图功能合并为一个。
我们获得了一个美丽的决定边界以及损失的情节。
现在,作为你们的最后一项任务,让我们把你们到目前为止所做的一切汇总起来,自己看看结果。
所以,你首先要定义超参数。您可以摆弄这些值,尤其是学习率l_r
和epoch
,以观察模型如何学习预测。
现在,您可以一次性编写从创建数据集到训练逻辑回归模型的代码,如下所示。
Shape of X_train (400, 2)
Shape of y_train (400, 1)
Shape of X_test (100, 2)
Shape of y_test (100, 1)
Initializing weights...
W: [[ 0.43753829] [-1.70958537]]
b: -0.8793505127088026
--------------------------------------------------------------------
Iteration: 0
W = [[ 0.43753829] [-1.70958537]]
b = -0.8793505127088026
Loss = 0.3991070405361789
-------------------------------------------------------------------- Iteration: 5
W = [[ 0.09634223] [-1.73455902]]
b = [[-0.87943027]]
Loss = 0.10346899489337041
--------------------------------------------------------------------Iteration: 10
W = [[-0.02440044] [-1.73555684]]
b = [[-0.87945069]]
Loss = 0.06810528539660123
--------------------------------------------------------------------Iteration: 15
W = [[-0.09215724] [-1.73617853]]
b = [[-0.87945614]]
Loss = 0.0569509026646708
--------------------------------------------------------------------Iteration: 20
W = [[-0.13607178] [-1.737859 ]]
b = [[-0.87945457]]
Loss = 0.05224655857924122
--------------------------------------------------------------------Iteration: 25
W = [[-0.16649094] [-1.74055496]]
b = [[-0.87944893]]
Loss = 0.04996979153280091
预言;预测;预告
我们之前已经创建了一个测试数据集,现在您将根据它测试您的回归模型并确定其准确性。
精确度的公式为:
Prediction: Loss = 0.2929627097697204 Accuracy = 95.0%
Hence W = [[ 3.9538485] [-3.9152981]] b = [[-0.68703193]]
我们已经获得了 95%的准确率,这是相当不错的!
结论
在本教程中,您学习了
- Sigmoid 激活函数
- 创建逻辑回归模型
- 训练逻辑回归模型
在下一篇教程中,您将学习仅使用 Numpy 从头实现神经网络!*
神经结构化学习和对抗正则化
张量流中用对立正则化提高分类模型的鲁棒性
作者拥有的图像
介绍
正如我们许多人无疑都知道的那样,计算机视觉领域取得的不变进展已经在多个学科领域取得了一些令人难以置信的成就,从医疗保健和自动驾驶汽车,到气候研究和游戏,不一而足。
从最先进的液氮冷却硬件形式的张量处理单元(TPU) 到日益复杂的数百万参数深度卷积网络,如 GoogLeNet 、 AlexNet 这种技术的能力继续打破以前无法逾越的障碍。
对抗性脆弱性
尽管取得了这些令人难以置信的成就,但事实证明,即使是最熟练的模型也不是绝对可靠的。多项研究表明,这些模型对输入数据结构中的微小变化非常敏感。最初是在谷歌和纽约大学的联合研究论文的发现中:“神经网络的有趣特性,2014”模型易受对立例子影响的主题现在被认为是如此重要的主题,以至于现在存在解决它的竞赛。
这些错误的存在提出了各种各样的关于样本外泛化的问题,以及如何使用这样的例子来滥用已部署的系统。
神经结构化学习
在某些应用中,这些误差可能不是有意产生的,而且,它们可能是由于人为误差或仅仅是由于输入不稳定而产生的。在采矿业,计算机视觉有无数非常有用的应用,例如,从流式处理工厂传送带图像以预测矿石纯度,到使用卫星图像检测商品库存水平和非法运输/采矿。
我们经常会发现,由于相机未对准、振动或可能导致错误分类的非常独特的样本外示例,此类图像数据在收集过程中遭到破坏。
为了克服诸如此类的例子,并总体上改进我们的模型以对抗损坏或扰乱的数据,我们可以采用一种形式的 神经结构化学习 称为 对抗正则化 。
神经结构化学习(NSL) 是一个相对较新的开源框架,由 TensorFlow 的优秀人员开发,用于使用结构化信号训练深度神经网络(与传统的单一样本相反)。NSL 实现了神经图形学习,其中使用图形(见下图)训练神经网络,图形携带关于目标(节点)的信息和通过节点边缘连接的其他节点中的相邻信息。
图片来自 TensorFlow 博客:在 TensorFlow 中引入神经结构化学习,2019
这样,这允许训练模型通过以下方式同时利用标记和未标记的数据:
- 在标记数据上训练模型(任何监督学习问题中的标准程序);
- 偏置网络以学习图上相邻节点的相似隐藏表示(相对于输入数据标签)
图片来自 TensorFlow 博客:神经结构化学习,对抗性例子,2019 。
与第二点一致,我们可以在上述表达式中观察到经验损失(即监督损失)和**邻居损失的最小化。**在上面的例子中,这被计算为目标隐藏层内的计算的权重向量与输入、 *X、*和添加了某种程度的噪声的相同输入之间的距离度量(即,L1、L2 距离)的点积:
典型地,通过计算输出相对于输入的梯度 x_i,然后最大化损失来创建对立的例子。例如,如果您有一个对吉娃娃和松饼进行分类的模型,并且您希望创建对立的示例,您可以将一个 128 x 128 像素的吉娃娃图像输入到您的网络中,根据输入计算损失的梯度(128 x 128 张量),然后将负梯度(扰动)添加到您的图像中,直到网络将图像分类为松饼。通过使用正确的标签再次对这些生成的图像进行训练,网络变得对噪声/干扰更加鲁棒。
为什么用 NSL?
- 更高的精度:样本间的结构化信号可以提供在特征输入中并不总是可用的信息。
- 更强的鲁棒性:用对立的例子训练的模型在对抗为误导模型的预测或分类而设计的对立扰动方面明显更强。
- 需要更少的标记数据 : NSL 使神经网络能够利用标记和未标记的数据,迫使网络学习类似的“邻近样本”的隐藏表示,这些样本可能有也可能没有标记。
对抗性规则
如果没有这样明确的结构作为输入,我们能做什么?
关于 TensorFlows 神经结构化学习库,特别有用的是提供了一些方法,使用户能够通过对抗扰动,从原始输入数据中动态构建诱导的*对抗示例作为隐式结构。NSL 的这种一般化被称为**对抗正则化,*在这种情况下,对抗示例被构造成在训练期间有意混淆模型,从而产生对小输入扰动具有鲁棒性的模型。
实践中的对抗性规范
在下面的例子中,我们将比较基线图像分类模型(特别是卷积神经网络)与利用对抗正则化的变体的性能。不幸的是,我们无法在上述任何采矿数据上演示 AR 的使用,因为这是专有的。
相反,我们将对在著名的图像分类数据集— Beans 上训练的两个模型进行分析。我们将比较基线模型的结果,与一个经过对抗性例子训练的结果,以充分理解对抗性规则对每个模型的能力和性能的影响。
包含本文所用代码的 Colab 笔记本可以在这里找到。一个优秀的教程,这篇文章的灵感和一些代码的来源,可以在 TensorFlow NSL 页面上找到。
在开始之前,我们必须先安装 TensorFlow 的神经结构学习包:
!pip install neural_structured_learning
进口
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
import keras_preprocessing
import neural_structured_learning as nsl
import tensorflow as tf
import tensorflow_datasets.public_api as tfdsfrom tensorflow.keras import models
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGenerator
加载和检查图像数据
TensorFlow 在其 TensorFlow 数据集集合中托管了许多著名的数据集。
我们可以使用tfds.load()
方法加载我们想要训练模型的 Beans 数据集,该方法执行两个操作:
- 下载数据集并将其保存为
[tfrecord](https://www.tensorflow.org/tutorials/load_data/tfrecord)
文件。 - 加载
tfrecord
文件并返回[tf.data.Dataset](https://www.tensorflow.org/api_docs/python/tf/data/Dataset)
的实例
# load dataset
dataset = 'beans' #@paramdataset = tfds.load(dataset, shuffle_files=True)
train, test = dataset['train'], dataset['test']IMAGE_INPUT_NAME = 'image'
LABEL_INPUT_NAME = 'label'
在执行任何图像缩放或图像增强/扰动之前,我们可以检查数据集中的图像样本,以了解卷积层可能作为特征提取的各种结构和组成,并了解数据集中各种类之间的差异:
# Get random batch
raw_images = train.take(10)# Tensor to np format
raw_images = [item['image'] for item in
raw_images.as_numpy_iterator()]# Plot batch
fig = plt.gcf()
fig.set_size_inches(10, 10)
for i, img in enumerate(raw_images):
sp = plt.subplot(2, 5, i+1)
sp.axis('Off')
plt.imshow(img)plt.show()
默认情况下,[tf.data.Dataset](https://www.tensorflow.org/api_docs/python/tf/data/Dataset)
对象包含一个由[tf.Tensor](https://www.tensorflow.org/api_docs/python/tf/Tensor)
组成的dict
,我们可以通过在我们的列表理解中调用raw_images
上的.as_numpy_iterator()
来迭代这批图像(tf.data.Dataset 键值)。该方法返回一个生成器,该生成器将数据集的批处理元素从tf.Tensor
格式转换为np.array
格式。然后,我们可以绘制生成的一批图像:
由作者生成的图像:“豆”数据集中的 10 个训练图像的样本批次,描绘了 3 个不同的类别:“健康”、“豆锈病”和“角斑病”
预处理
我们对图像数据执行简单的缩放操作,将输入映射到 0 和 1 之间的浮点张量(Beans 数据集是 500 x 500 x 3 图像的集合)。有益的是,TDFS 数据集将要素属性存储为字典:
FeaturesDict({
'image': Image(shape=(500, 500, 3), dtype=tf.uint8),
'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=3),
})
因此,我们可以访问各个图像及其标签,并使用我们的训练和测试tf.Dataset
实例的.map()
属性就地执行这些预处理操作**😗*
def normalize(features):
"""Scale images to within 0-1 bound based on max image size."""
features[IMAGE_INPUT_NAME] = tf.cast(
features[IMAGE_INPUT_NAME],
dtype=tf.float32) / 500.0)
return featuresdef examples_to_tuples(features):
return features[IMAGE_INPUT_NAME], features[LABEL_INPUT_NAME]def examples_to_dict(image, label):
return {IMAGE_INPUT_NAME: image, LABEL_INPUT_NAME: label}# Define train set, preprocess. (Note: inputs shuffled on load)
train_dataset = train.map(normalize)
.batch(28)
.map(examples_to_tuples)test_dataset = test.map(normalize)
.batch(28)
.map(examples_to_tuples)
功能examples_to_dict
将在稍后解释。
基线模型
然后,我们构建一个简单的基线卷积神经网络模型,并使其适合我们的图像数据:
def conv_nn_model(img_input_shape: tuple) -> tf.keras.Model():
"""Simple Conv2D Neural Network.
Args:
img_input_shape: An (mxnxo) tuple defining the input image
shape.
Returns:
model: An instance of tf.keras.Model.
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu',
input_shape=input_shape),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
# Note to adjust output layer for number of classes
tf.keras.layers.Dense(3, activation='softmax')])
return model# Beans dataset img dims (pixel x pixel x bytes)
input_shape = (500, 500, 3)# Establish baseline
baseline_model = conv_nn_model(input_shape)
baseline_model.summary()baseline_model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc'])baseline_history = baseline_model.fit(
train_dataset,
epochs=5)
我们的基准 Conv2D 模型架构
results = baseline_model.evaluate(test_dataset)
print(f'Baseline Accuracy: {results[1]}')3/3 [==============================] - 0s 72ms/step - loss: 0.1047 - acc: 0.8934
Baseline Accuracy: 0.8934375
我们可以看到,我们的基线模型在测试数据集上表现良好,达到了 89%的准确率。
对抗正则化模型
我们现在将检查该模型如何针对包括对立干扰示例的测试集执行,并将其与在包括所述示例的数据集上训练的模型进行比较。我们首先创建另一个卷积神经网络模型,只是这一次我们将把对抗性训练纳入其训练目标。
接下来,使用 TensorFlow 的 NSL 框架,我们用 NSL 的助手函数[nsl.configs.make_adv_reg_config](https://www.tensorflow.org/neural_structured_learning/api_docs/python/nsl/configs/make_adv_reg_config)
定义一个配置对象:
#@title ADV Regularization Config# Create new CNN model instance
base_adv_model = conv_nn_model(input_shape)# Create AR config object
adv_reg_config = nsl.configs.make_adv_reg_config(
multiplier=0.2,
adv_step_size=0.2,
adv_grad_norm='infinity')# Model wrapper
adv_reg_model = nsl.keras.AdversarialRegularization(
base_adv_model,
label_keys=[LABEL_INPUT_NAME],
adv_config=adv_config)
我们可以注意到,这个函数要求我们设置许多超参数。其中一些不需要明确的值,其他的需要我们的输入:
**multiplier**
:训练中对抗性损失相对于标签损失的权重,w.r.t 我们 AR 模型的目标函数。我们应用 0.2 作为正则化权重。**adv_step_size**
:训练中要应用的对抗性扰动的程度/幅度。**adv_grad_norm**
:归一化梯度的张量范数(L1 或 L2),即对抗性扰动幅度的测量。默认为 L2。
然后,我们可以使用nsl.keras.AdversarialRegularization
函数包装我们新创建的模型,这将把我们之前使用adv_reg_config
对象配置的对抗性正则化添加到我们基本模型的训练目标(要最小化的损失函数)中。
在这个阶段需要注意的重要一点是,我们的模型期望它的输入是特性名称到特性值的字典映射。可以看到,当我们实例化我们的对抗性模型时,我们必须将label_keys
作为参数传入。这使得我们的模型能够区分输入数据和目标数据。这里,我们可以使用我们的examples_to_dict
函数,并将其映射到我们的训练和测试数据集:
train_set_for_adv_model = train_dataset.map(convert_to_dictionaries)
test_set_for_adv_model = test_dataset.map(convert_to_dictionaries)
然后,我们正常编译、拟合和评估我们的对抗性正则化模型:
4/4 [==============================] - 0s 76ms/step - loss: 0.1015 - sparse_categorical_crossentropy: 0.1858 - sparse_categorical_accuracy: 0.8656 - scaled_adversarial_loss: 0.1057 accuracy: 0.911625
类似地,我们的对抗性正则化模型很好地推广到我们的测试数据集,达到了与我们的baseline_model
相似的精度(0.91%)。
针对不利扰动数据的评估
现在是有趣的部分。
就像我们在测试集上评估一个训练过的模型的能力一样,我们将在我们的两个模型上执行相同的操作。然而,在这种情况下,我们将比较我们的两个模型;基线 CNN,以及已经针对包含对抗性扰动示例的测试数据集对对抗性扰动输入数据进行训练的变体。
为了生成上述示例,我们必须首先创建一个参考模型,其配置(损耗、指标和校准/学习权重)将用于生成扰动示例。为此,我们再次用nsl.keras.AdversarialRegularization
函数包装我们的性能基线模型并编译它。请注意,我们并未将该模型应用于我们的数据集,我们希望保留与基础模型相同的学习权重):
# Wrap baseline model
reference_model = nsl.keras.AdversarialRegularization(
baseline_model,
label_keys=[LABEL_INPUT_NAME],
adv_config=adv_reg_config)reference_model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']models_to_eval = {
'base': baseline_model,
'adv-regularized': adv_reg_model.base_model}metrics = {
name: tf.keras.metrics.SparseCategoricalAccuracy()
for name in models_to_eval.keys()}
如果此时你和我一样,喜欢理解这些事情背后的逻辑,你可以在这里找到包含对抗性正则化类的源代码。
然后我们存储我们的两个模型;字典中的基线和对抗性正则化变量,随后在我们的测试数据集的每一批上循环(成批评估是对抗性正则化模型的一个要求)。
使用我们新包装的reference_model
的.perturb_on_batch()
方法,我们可以生成与我们的adv_reg_config
对象一致的对抗性扰动批处理,并在其上评估我们的两个模型的性能:
labels, y_preds = [], []# Generate perturbed batches,
for batch in test_set_for_adv_model:
perturbed_batch = reference_model.perturb_on_batch(batch)
perturbed_batch[IMAGE_INPUT_NAME] = tf.clip_by_value(
perturbed_batch[IMAGE_INPUT_NAME], 0.0, 1.0)
# drop label from batch
y = perturbed_batch.pop(LABEL_INPUT_NAME)
y_preds.append({})
for name, model in models_to_eval.items():
y_pred = model(perturbed_batch)
metrics[name](y, y_pred)
predictions[-1][name] = tf.argmax(y_pred, axis=-1).numpy()for name, metric in metrics.items():
print(f'{name} model accuracy: {metric.result().numpy()}')>> base model accuracy: 0.2201466 adv-regularized model accuracy: 0.8203125
结果
相对于 adv_reg_model,我们的基线模型在对抗扰动数据上的性能显著降低,对抗学习在提高模型稳健性上的有效性立即变得明显。
我们的基线模型的性能下降了 69% 相比于我们的对抗性正则化模型,只实现了 14%的性能下降。
借助 Kera 的 Layers API,我们可以通过可视化卷积层来了解扰动前后提取的特征,从而检查恶意扰动数据对基线模型的影响:
扰动前
*# Random img & conv layer idxs
IDX_IMAGE_1=2
IDX_IMAGE_2=5
IDX_IMAGE_3=10
CONVOLUTION_NUMBER = 10# Get baseline_model layers
layer_outputs = [layer.output for layer in baseline_model.layers]
activation_model = tf.keras.models.Model(
inputs =baseline_model.input,
outputs = layer_outputs)# Plot img at specified conv
f, axarr = plt.subplots(3,2, figsize=(8, 8))
for x in range(0, 2):
f1 = activation_model.predict(test_images[IDX_IMAGE_1].reshape(
1, 500, 500, 3))[x]
axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER],cmap='inferno')
axarr[0,x].grid(False)
f2 = activation_model.predict(test_images[IDX_IMAGE_2].reshape(
1,500, 500, 3))[x]
axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER],cmap='inferno')
axarr[1,x].grid(False)
f3 = activation_model.predict(test_images[IDX_IMAGE_3].reshape(
1, 500, 500, 3))[x]
axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER],cmap='inferno')
axarr[2,x].grid(False)*
由作者生成的图像:给定卷积层的中间图像表示
我们可以在上面的图像中观察到,我们的基线模型似乎已经确定了定义每个类别的相关区别特征:角叶锈病、健康叶锈病和豆状叶锈病,通过不同的颜色梯度变得可见。
扰动后
现在,我们可以检查基线模型在扰动数据中识别的特征:
*# Pertubed test data
perturbed_images = []
for batch in test_set_for_adv_model:
perturbed_batch = reference_model.perturb_on_batch(batch)
perturbed_batch[IMAGE_INPUT_NAME] = tf.clip_by_value(
perturbed_batch[IMAGE_INPUT_NAME], 0.0, 1.0)
perturbed_images.append(perturbed_batch)# Get images
pt_img = [item['image'] for item in perturbed_images]IDX_IMAGE_1=0
IDX_IMAGE_2=1
IDX_IMAGE_3=2
CONVOLUTION_NUMBER = 11base_mod_layer_out = [layer.output for layer in baseline_model.layers]base_mod_activ = tf.keras.models.Model(
inputs = baseline_model.input,
outputs = base_mod_layer_out)f1 = base_mod_activ.predict(pt_img[IDX_IMAGE_1].numpy())[x]
f2 = base_mod_activ.predict(pt_img[IDX_IMAGE_2].numpy())[x]
f3 = base_mod_activ.predict(pt_img[IDX_IMAGE_3].numpy())[x]*
作者生成的图像:中间图像表示;敌对扰乱数据。
正如我们在上面的表示中所观察到的,网络很难表示每幅图像中的原始像素,并且由于扰动而变得更加抽象。在最右边的图像中,似乎网络成功地保留了代表‘角叶锈病’的特征,但是叶子的基本结构大部分丢失了。当然,这只是我们未经调整的网络中的一个卷积层,但它仍然是一个可信的演示,说明了一个以前熟练的模型是如何被敌对的输入数据推翻的。
结论
在本文中,我们研究了如何使用对抗正则化显著提高卷积神经网络模型在对抗扰动数据上的鲁棒性和泛化性能。此外,我们还探索了:
- 如何在 Keras 模型中添加对抗性规则?
- 如何将一个对抗性的规范化模型与一个基线性能模型进行比较?
- 如何通过可视化中间层来检查敌对扰动数据对传统训练模型的影响。
如果您发现错误或有任何建设性的批评/构建,请评论。
感谢您的阅读。
参考
神经类型转移——一种高级方法
保罗·本丹迪https://unsplash.com/photos/hZUlyk-EeuU
今天我想谈谈神经风格转移和卷积神经网络(CNN)。已经有相当多的文章和教程可用。有时内容只是复制,有些提供了新颖的实现。所有的共同点是快速深入细节。在我看来太具体了。不仅如此,通常还有一些实现细节,这使得从整体上关注主要概念变得更加困难。
这篇文章可以被认为是对其他文章(列在我的“灵感”部分)的概述和理解,在更高的层次上理解这个概念。我的意图是去掉一些实现细节,对初学者来说足够高,并激发阅读原始研究论文和后续实现的好奇心。
目录
放弃
我与本文中使用的任何服务都没有关联。
我不认为自己是专家。如果你觉得我错过了重要的步骤或者忽略了什么,可以考虑在评论区指出来或者联系我。
我总是乐于听取建设性的意见以及如何改进。
这篇文章写于 2020 年 10 月 17 日。我无法监控我的所有文章。当你阅读这篇文章时,提示很可能已经过时,过程已经改变。
如果你需要更多关于某些部分的信息,请在评论中指出来。
要求
我假设理解卷积神经网络(CNN)。架构对于计算机视觉和深度学习中的许多事情都非常关键。网上有很多可用的资源。作为复习,我建议这篇文章。
神经类型转移
研究论文一种艺术风格的神经算法——Leon A . Gatys,Alexander S. Ecker,Matthias Bethge
在美术中,尤其是绘画,人类已经掌握了通过在图像的内容和风格之间构建复杂的相互作用来创造独特视觉体验的技能。到目前为止,这个过程的算法基础还是未知的,也不存在具有类似能力的人工系统。然而,在视觉感知的其他关键领域,如物体和人脸识别,最近一类被称为深度神经网络的生物启发视觉模型展示了接近人类的表现。在这里,我们介绍一个基于深度神经网络的人工系统,它可以创建高感知质量的艺术图像。
该系统使用神经表示来分离和重组任意图像的内容和风格,为艺术图像的创建提供神经算法。此外,鉴于性能优化的人工神经网络和生物视觉之间惊人的相似性,我们的工作提供了一条通往人类如何创造和感知艺术意象的算法理解的道路。
架构和流程概述
对于 CNN 如何处理神经类型转移,有许多很好的可视化。本来想自己画的,后来发现已经有很好看的了。所以我只展示这些并引用创建者。
以下是我认为很棒的。
首先是这个。它非常漂亮地展示了损失是如何计算的,以及它是如何在总体结果中组合在一起的。
这个也不错。示出了不同层上的重建过程。
来自 arxiv 许可要求下的原始研究论文
为了理解随后的计算,有必要说一下 CNN 的不同层代表什么。
- CNN 的较浅层倾向于检测较低级别的特征,例如边缘和简单纹理。
- 更深的层倾向于检测更高级的特征,例如更复杂的纹理以及对象类别。
因为生成的图像应该具有与输入图像相似的内容。建议在中间使用一个层,高度表示内容。
研究论文中的 VGG19 架构使用深度卷积神经网络和 SVM 分类器和知识共享许可进行乳房自动肿块检测
迁移学习与风格迁移
另一个重要的概念是使用预先训练的网络。最常见的是 VGG-19。值得注意的是,我们利用了所谓的“迁移学习”。
这里我们有两个概念需要区分:
- 迁移学习
- 风格转移
尽管两者都使用了“传输”这个词,但从实现的角度来看,它们是完全不同的。
1.迁移学习
这个概念本身非常有趣,并且可以通过使用已建立的模型来创建新的解决方案。
精彩的介绍,我可以推荐这篇文章:https://machine learning mastery . com/transfer-learning-for-deep-learning/。
理解它在风格转换的概念中是如何使用的是至关重要的。
简而言之,我们可以说
迁移学习和领域适应指的是这样一种情况,在一种环境中所学的知识被用来提高在另一种环境中的概括能力
这在计算机视觉中特别有用,因为这些模型的计算和训练非常耗费资源。使用一个在大型数据集上训练过的模型,其结果现在可以免费获得,实际上非常适合个人实验。
您可以将迁移学习用于:
- 直接使用预先训练的模型
- 预训练模型的特征提取
- 改变预训练模型的最后一层的权重
在我们的例子中,我们将使用第二种方法。使用特征提取,其中来自输出层之前的层的模型输出被用作新分类器的输入。
2.风格转移
来自原始论文:
概念上最密切相关的是使用纹理转移来实现艺术风格转移的方法。然而,这些先前的方法主要依赖于非参数技术来直接操纵图像的像素表示。相比之下,通过使用在对象识别上训练的深度神经网络,我们在明确表示图像的高级内容的特征空间中执行操作。
因此,这意味着深度学习方法的专长是提取图像的风格,而不是仅仅通过风格图片的像素观察,而是结合风格图像的内容提取预训练模型的特征。所以,本质上,为了发现图像的风格,我们
- 通过分析样式图像的像素来处理样式图像
- 将该信息馈送到预训练模型的层,以“理解”/将所提供的输入分类为对象
如何做到这一点,我们将在“风格成本”一节中探讨。
风格和内容
基本思想是将图像的风格转换为图像的内容。
因此,我们需要理解两件事:
- 图像的内容是什么
- 图像的风格是什么
不严格地说,图像的内容就是我们人类在图像中识别的对象。汽车、桥、房子等。风格更难定义。这很大程度上取决于形象。就是整体质感,选色,对比等。
这些定义需要以数学方式表达,以便在机器学习的世界中实现。
成本计算
一、为什么要进行成本/损失计算?重要的是要明白,在这种情况下,成本仅仅是原始图像和生成图像之间的差异。关于如何计算它有多种方法(MSE、欧几里德距离等)。通过最小化图像的差异,我们能够传递风格。
当我们开始在损失上有很大差异时,我们会看到风格转移并不是那么好。我们可以看到风格的转移,但这似乎是粗糙和不直观的。随着成本最小化的每一步,我们都朝着更好地融合风格和内容的方向前进,最终得到更好的图像。
正如我们所看到的,这个过程的核心要素是损失计算。需要计算 3 项成本:
- 内容成本
- 风格成本
- 总(变动)成本
在我看来,这些步骤是最难理解的,所以让我们一个一个地深入研究。
请始终记住,我们是在将原始输入与生成的图像进行比较。这些差异就是成本。我们希望将这一成本降至最低。
理解这一点非常重要,因为在这个过程中还会计算其他差异。
内容成本
什么是内容成本?正如我们之前发现的,我们通过图像的对象来定义图像的内容。我们人类能够识别的事物。
了解了 CNN 的结构后,现在很明显,在神经网络的末端,我们可以访问一个层,它很好地代表了对象(内容)。通过池层,我们失去了图像的风格部分,但就获取内容而言,这是所期望的。
现在,在不同物体的存在下,CNN 的更高层中的特征地图被激活。因此,如果两幅图像具有相同的内容,它们在较高层中应该具有相似的激活。
这是定义成本函数的前提。
下图有助于理解图层是如何展开的,以便为计算做准备(本文不涉及):
风格成本
现在它变得越来越复杂。
一定要理解图像的风格和图像的风格损失之间的区别。两种计算都不一样。一个是检测“风格表示”(纹理、颜色等),另一个是将原始图像的风格与生成图像的风格进行比较。
总样式成本分两步计算:
- 所有卷积层的样式开销。识别样式图像的样式
a.从卷积层获取特征向量
b.将这些向量与另一层的特征向量进行比较(找出其相关性)
2.原之间的风格成本(原风格形象!)和生成的图像。
为了找到风格,通过将特征图与其转置相乘来捕捉相关性,从而得到 gram 矩阵。
幸运的是,CNN 为我们提供了多个层次,我们可以选择找到正确的风格。比较不同的层和它们的相互关系,我们可以识别图像的风格。
因此,我们不使用层的原始输出,而是使用单个层的特征图的 gram 矩阵来识别图像的风格。
第一个成本是这些 gram 矩阵之间的差异,即相关性的差异。第二个成本也是原始图像和生成图像之间的差异。这实质上是“风格转移”。
总变动成本
它的作用就像一个正则化器,可以提高生成图像的平滑度。这在原始论文中没有使用,但是改进了结果。本质上,我们在生成的图像中消除了风格和内容传递之间的差异。
灵感
本节提供了撰写本文时使用的阅读材料。这是一个与风格转移相关的文章选集。
- https://towards data science . com/light-on-math-machine-learning-intuitive-guide-to-neural-style-transfer-ef88e 46697 ee
- https://towards data science . com/what-is-deep-transfer-learning-and-why-it-be-so-popular-91 acdcc 2717 a
- https://towards data science . com/neural-networks-intuitions-2-dot-product-gram-matrix-and-neural-style-transfer-5d 39653 e 7916
- https://towards data science . com/art-with-ai-neural-style-transfer-63d 0 ef 76596 a
- https://medium . com/@ sanjivgautamoficial/understanding-neural-style-transfer-from-another-medium-post-c 61d 19 af df1d
- https://machine learning mastery . com/transfer-learning-for-deep-learning/
- https://machine learning mastery . com/how-to-use-transfer-learning-when-development-convolutionary-neural-network-models/
- https://github . com/aleju/papers/blob/master/Neural-nets/A _ Neural _ Algorithm _ for _ Artistic _ style . MD发表论文摘要
- 【https://www.mikegao.net/graphics/summary/neural_style.html】by麦克高
- https://github.com/Adi-iitd/AI-Art
代码实现:
- https://towards data science . com/neural-style-transfer-4d 7c 8138 E7 f 6
- http://ziqing Guan . net/index . PHP/2020/05/30/deep-learning-art-neural-style-transfer/
- https://www . tensor flow . org/tutorials/generative/style _ transfer
- https://medium . com/tensor flow/neural-style-transfer-creating-art-with-deep-learning-using-TF-keras-and-eager-execution-7d 541 AC 31398
- https://medium . com/analytics-vid hya/NST-creating-artworks-with-the-help-of-the-machine-56 EBD 3 EB 780 c
- https://keras.io/examples/generative/neural_style_transfer/
- https://medium . com/gradient crescent/neural-art-style-transfer-with-keras-theory-and-implementation-91 b 7 FB 08 ee 81
研究论文:
- https://arxiv.org/pdf/1508.06576.pdf一种艺术风格的神经算法
- https://arxiv.org/pdf/1701.01036.pdf揭秘神经类型转移
关于
丹尼尔是一名企业家、软件开发人员和商业法毕业生。他曾在各种 IT 公司、税务咨询、管理咨询和奥地利法院工作。
他的知识和兴趣目前围绕着编程机器学习应用程序及其所有相关方面。从本质上说,他认为自己是复杂环境的问题解决者,这在他的各种项目中都有所体现。
如果您有想法、项目或问题,请不要犹豫与我们联系。
你可以在 https://www.buymeacoffee.com/createdd上支持我
连接到:
神经风格转移:乐队作为他们的专辑封面
上帝保佑你!计算机视觉模型
我们头脑中的热芯片+通过神经类型转移(第一帧致谢:立体树胶/热芯片)
最早在 Gatys et al. (2015) 提出的神经风格迁移方法,已经被广泛讨论和复制。这是一项非常酷的技术,通过这种方式可以将两幅图像组合在一起,从而保留一幅图像的大部分内容*,同时向另一幅图像的风格移动。这使得创建两个图像的混合图像成为可能,人类将很难预先想象这两个图像,但是当该方法工作良好时,一旦人们看到它们,这两个图像就很有意义(即,“如果以 B 的风格完成,那Is*AA看起来会是什么样子”)。**
我尝试了一下,按照 Keras 文档中的例子,使用 VGG16 卷积模型的中间层来计算图片在内容和风格上的相似性。我强烈推荐这篇文章,它展示了部分算法的改变如何影响结果。Keras 的例子在这方面已经做好了准备。我试验了内容、风格和总变化损失的相对权重,以及用于内容损失的层,但主要是我在这里利用了其他人已经完成的关于风格转移的探索工作。
对于我尝试的任何参数值来说,找出“什么有效”作为样式图像是很有趣的。该方法理想地适用于绘画风格,其由调色板和笔触技术的组合组成,后者被视觉捕捉并被模型捕捉为图像中的一个或多个中等大小的形状或结构。对于非绘画图像,如果图像太详细(太多的颜色或太小比例的图案),这种方法就不好用了。要成功定义一种风格,图像需要有某种重复的结构和/或独特的配色方案。
我实现了这个算法,将我最喜欢的专辑的封面作为风格图像,将他们各自的艺术家作为内容图像,来重新设计乐队作为他们专辑封面的风格。在某些情况下,这非常有效。这里说明了这个想法:拍摄一个标准的 Go 波段图像!团队作为内容,并添加 的封面、雷霆、闪电、 的封面作为风格,使用 TLS 封面的调色板和一些结构方面,得到的结果不再是照片,而是乐队的“艺术家印象”:
**
图片鸣谢:1songday.com;维基百科等。
我的原始结果!团队+雷霆,闪电,打击
在这种情况下,也许不太清楚这张照片现在是不是相册封面的“风格”;相反,这只是一个我们以前没有想象过的新形象。在其他示例中,风格可以更容易地被描述,并且更明显地被转移到内容图像。
这种技术有很多很好的选择。我尝试了其中的一些,这里有一些效果不错的例子。我非常喜欢制作这些,所以我建立了一个网站来展示当前的一批和未来的补充:乐队作为专辑封面。
这是 Idlewild 主唱罗迪·温布尔的风格 偏远地区 :
奥马尔和安凯臣从汽车电影院出来,按 的关系指挥 :
我真的很喜欢这首:祝你好运!黑皇,以 的风格,抬起瘦骨嶙峋的双拳像天线一样指向苍天 :
这里使用了较高的内容权重来保留带的轮廓,因为红线样式相对较强。
以下是在 滑道太窄 : 的缤纷世界中玩耍的小腿
Joy Division 的 任逍遥的 显然是这种技术的候选,正如所料,它工作得非常好:
这就好像乐队正在消失在电波信号中。
爱尔兰歌手丽莎·汉尼根,穿着针织风格的 海缝 :
她在麦克风前拿着一把尤克里里琴,但内容图像的细节被样式强烈修改了。
在户外玩耍的 Sigur Ros,被val tari:的绿霾追上
*最后,我最喜欢的,如上图所示,由我们头脑中的*:参差不齐的颜色构成的热薯片
还值得展示一个内容权重更高的版本,它保留了乐队的面孔,让人想起电咖 中的发电厂乐团。
基于 VGG 模型的神经风格迁移
一种采用不同图像风格的数字图像变换技术
简介:
在我们开始之前,让我们去这个网站获取一些灵感。在网站上,我们从本地计算机中选择一张照片(假设图片名为 Joey.jpg)。我们姑且称之为内容图像。然后,我们选择另一个图像,说风格图像命名为 style1.jpg 从本地计算机。该网站所做的是生成一个混合图像,它保留了内容图像的轮廓,并将样式图像的纹理和颜色模式添加到内容图像中。以下是结果。
左:原始图像,右:风格图像,中间:混合图像
描述:
这被称为神经风格转移(NST),通过使用深度学习,具体来说是卷积神经网络(CNN)来完成。我想你对 CNN 很熟悉。如果没有,我会强烈推荐 CNN的吴恩达课程。
让我们借助下面的流程图来理解 NST 的基础知识。它显示了具有 13 个卷积层的样式转移算法(为简单起见,仅显示了几个)。两个图像被输入到神经网络,即内容图像和风格图像。我们的目的是生成一个混合图像,它包含内容图像的轮廓和样式图像的纹理、颜色模式。我们通过优化几个损失函数来做到这一点。
内容图像的损失函数最小化在一层或多层上为对应于混合图像(最初只是逐渐改善的噪声图像)的内容图像激活的特征的差异。这将内容图像的轮廓保留到合成的混合图像中。
而风格图像的损失函数最小化了风格图像和混合图像之间的所谓 Gram 矩阵之间的差异。这是在一层或多层完成的。Gram 矩阵的用途是识别在给定的层上哪些特征被同时激活。然后,我们模仿同样的行为,将其应用于混合图像。
使用 TensorFlow,我们将内容和风格图像的这些组合损失函数的梯度更新到令人满意的水平。Gram 矩阵的某些计算,存储效率的中间值,图像去噪的损失函数,归一化组合损失函数,使得两个图像相对于彼此缩放。
编码:
现在我们已经理解了算法,让我们开始编码。原纸用的是 VGG-19 型号。但是这里我们将使用公开的 VGG-16 模型。从这里下载 VGG-16 模型(请记住是~550MB 文件)。
在根目录下,新建一个文件夹,命名为 vgg16 ,将上面的文件和 Github 链接中的 vgg.py 粘贴过来。此外,我们通过注释掉 maybe_download 函数修改了 vgg16.py 文件(因为您已经下载了 vgg16.tfmodel 文件)
让我们先导入库。然后导入 vgg16 型号。
让我们为图像操作定义几个辅助函数。
load_image 加载一个图像并返回一个 numpy 浮点数组。图像被调整到最大高度或宽度。
save_image 将图像保存为像素值在 0 ad 255 之间的 jpeg 文件
plot_image_big 绘制更大的图像。
plot_images 绘制内容、样式和混合图像。
接下来,我们将定义在 Tensorflow 中用于优化的损失函数。
mean_squared_error 运算将返回一个张量,即两个输入张量之间的均方误差(MSE)差。
create_content_loss 将计算内容和混合图像之间的 MSE。损失被最小化,使得内容的激活特征与混合图像相似,从而将轮廓从内容图像转移到混合图像。
接下来,我们的动机是捕捉混合图像的风格特征。为了做到这一点,我们将做一些类似的事情,即测量哪些功能同时激活的风格层,并复制这个模式到混合图像。一种有效的方法是计算 Gram 矩阵。Gram 矩阵本质上是特征激活层向量的点积。如果矩阵中的条目具有较小的值,则意味着给定层中的两个特征不会同时激活,反之亦然。
让我们首先将计算文法矩阵定义为 gram_matrix ,然后是 create_style_loss ,它计算 gram 矩阵的 MSE,而不是两个原始张量(正如我们在 create_content_loss 中所做的)。
为了减少合成混合图像中的噪声,我们使用一种称为“全变差去噪”的去噪滤波算法,使用以下代码。
下一段代码是核心。我们将定义计算损失函数梯度下降的风格转移算法。该算法使用归一化,使得损失值等于一,这有助于选择独立于内容和样式层的损失权重。
首先,我们将载入我们希望包含在混合图像中的具有轮廓特征的内容图像。在这里,我把它命名为 1.jpg
现在,我们将加载我们希望其颜色和纹理出现在混合图像中的样式图像。
此外,我们将定义我们想要匹配内容图像的层索引。通常是刚开始几层。VGG-16 中的第 5 层(指数为 4)似乎工作良好。类似地,样式图像的层索引。通常,它位于总图层的末尾。这里我们将定义第 13 层。
执行的最后一部分是将样式转换应用于我们定义的内容和样式图像。根据定义,它自动为内容和样式层创建损失函数,并根据迭代次数执行优化。最后,显示混合图像。
结果:
这个过程可能在 CPU 上运行缓慢(我用的是 CPU)。看看给出什么结果。
结论:
还不错!结果证明了组合两个图像的基本思想。他们并不像这些技术的先驱迪帕克那样不相上下。也许更多的迭代、更小的步长、更高分辨率的图像、变化的样式和内容层索引或者更高的计算能力会提高混合图像的质量。
感谢您朗读这篇文章。希望有帮助。
你可以在这个链接找到 github repo。
参考:
[1] Hvass-Labs,TensorFlow 教程#15 Style Transfer (2018),来源
张量流中枢神经式传递
我不会画画,但是机器学习可以…
介绍
我不是艺术鉴赏家,但上面这幅画看起来不错。
我也不是画家,但在本文结束时,我将创建一个与上面的图像具有相似绘画风格的图像。
本文将涵盖以下内容:
- 神经类型转移的描述
- 神经类型转移如何工作
- 样式传递的代码实现
对于热心的读者,请随意向下滚动到 *code*
部分。
什么是神经类型转移
神经风格转移(NST)是一种涉及利用深度卷积神经网络和算法从一幅图像中提取内容信息并从另一幅参考图像中提取风格信息的技术。在提取样式和内容之后,生成组合图像,其中所得图像的内容和样式源自不同的图像。
NST 是一种图像风格化的方法,这是一种涉及使用输入参考图像来提供具有从输入图像导出的风格差异的输出图像的过程。
NST 技术出现在 Leon A Gatys 等人的论文“艺术风格的神经算法”中。
它是如何工作的
深度神经网络(DNN),更具体地说,卷积神经网络(CNN)具有一个至关重要的特征,即能够学习图像内内容和风格的空间表示。这一特性使得 NST 技术成为可能。
由 CNN 生成的输入图像的空间表示捕获了图像的风格和内容的统计信息。NST 将提取的样式和内容组合成一个生成的输出图像。
CNN 层结构内的中间层中的激活功能提供了捕获输入图像的内容和风格统计信息的能力。
在卷积操作之后,CNN 图层输出一个特征图,卷积操作包括在输入图像上滑动一个过滤器。一幅图像的内容其实就在生成的每一层的特征图之内。
从中间层的特征图中提取内容将提供输入图像的高级结构和几何信息。
特征图获得输入图像的风格。**为了获得图像的风格,需要评估中间层中特征图的均值和相关性。**该过程提供的信息提供了输入图像的纹理图案信息。
密码
精彩的部分来了。
我们将创建一个图像的内容和下面的图像风格。
左:内容图片(在 Unsplash 上由斯特凡·斯特凡·基克拍摄),右:风格图片(在 Unsplash 上由阿德里安娜·吉奥拍摄)
为了使用两个参考图像成功实现神经类型转移的过程,我们将利用 TensorFlow Hub 上的模块
TensorFlow hub 提供了一套可重用的机器学习组件,如数据集、权重、模型等。
对于本文的实现部分,我们将利用一系列工具和库来加载图像和执行数据转换。
- TensorFlow :机器学习模型的实现、训练、部署的开源平台。
- Matplotlib :用于在 Python 中创建可视化绘图的工具,如图表、图形等
- Numpy :启用数组数据结构的几种数学计算和运算。
- tensor flow Hub:模型、数据集等可重用机器学习组件的库
我们将使用 Jupyter Notebook 进行代码实现。本文末尾还包含了一个到笔记本 Github 资源库的链接。
首先,我们将导入所需的工具和库。
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import PIL.Image
import tensorflow_hub as hub
接下来,我们声明两个变量,保存输出结果的内容和样式的图像的目录路径。此外,我们将显示图像。
content_path = 'images/human.jpg'
style_path = 'images/painting.jpg'content_image = plt.imread(content_path)
style_image = plt.imread(style_path)plt.subplot(1, 2, 1)
plt.title('Content Image')
plt.axis('off')
imshow(content_image)plt.subplot(1, 2, 2)
plt.title('Style Image')
plt.axis('off')
imshow(style_image)
内容和风格图像
要求将图像转换成张量表示。下一步,我们将利用 TensorFlow 的图像处理方法。
我们将创建一个接受图像路径的函数,然后使用“tf.io.read_file”将图像转换为张量。我们进一步使用“tf.image.decode_image”将张量中值的数据类型更改为介于 0 和 1 之间的浮点数。
def image_to_tensor(path_to_img):
img = tf.io.read_file(path_to_img)
img = tf.image.decode_image(img, channels=3, dtype=tf.float32)
# Resize the image to specific dimensions
img = tf.image.resize(img, [720, 512])
img = img[tf.newaxis, :]
return img
需要与上述相反的实现来可视化 TensorFlow Hub 模块的结果。我们需要将返回的张量转换成我们可以可视化的图像。
我们只是通过将每个元素乘以 255,将包含 0 和 1 之间的值的张量反规格化为实际像素值。下一步是使用 Numpy 创建一个数组,其中包含我们需要的适当数据类型。
我们从张量返回一个图像对象。
def tensor_to_image(tensor):
tensor = tensor*255
tensor = np.array(tensor, dtype=np.uint8)
tensor = tensor[0]
plt.figure(figsize=(20,10))
plt.axis('off')
return plt.imshow(tensor)
到目前为止,我们已经完成了以下工作:
- 查看内容和样式图像参考
- 创建一个函数,将图像转换为张量,并将张量转换为图像
现在我们将把图像转换成张量,并通过。TensorFlow Hub 包中的 load()'方法。
我们期望从我们的参考图像中得到样式和内容的组合结果;因此,我们将创建一个变量来保存模块的操作结果。
为了可视化结果,我们只需利用我们之前创建的“张量到图像”函数。
content_image_tensor = image_to_tensor(content_path)
style_image_tensor = image_to_tensor(style_path)hub_module = hub.load('[https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2'](https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2'))
combined_result = hub_module(tf.constant(content_image_tensor), tf.constant(style_image_tensor))[0]
tensor_to_image(combined_result)
神经类型转移结果
结论
我们已经成功地结合了两个参考图像的风格和内容,并生成了一个网格图像。
接下来,我建议你更详细地探讨神经类型转移的话题。
下面是一个 GitHub repo 的链接,它提供了本文中的代码。
[## Richmond alake/tensor flow _ 2 _ 教程
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/RichmondAlake/tensorflow_2_tutorials/blob/master/03_neural_style_transfer.ipynb)
我建议您探索的另一个主题是图像分类。下面是一篇文章的链接,其中我介绍了如何使用 TensorFlow 和 Keras 实现图像分类。
[## 使用 TensorFlow 2.0 进行(深入)机器学习图像分类
理解实现用于图像分类的神经网络的过程。
towardsdatascience.com](/in-depth-machine-learning-image-classification-with-tensorflow-2-0-a76526b32af8)
NeurIPS 2019 亮点
我在最大的机器学习大会上学到的总结。
温哥华会议中心海滨景色[图片由本人拍摄]
NeurIPS 2019 有 13000 名参与者,1428 篇被接受的论文(来自 6743 篇提交的论文),58 场研讨会,16K 页的会议记录,是我参加过的最具影响力也是最有成效的会议之一。主席们在“我们从 NeurIPS 2019 数据中学到了什么”上展示了一份精彩的会议数据分析。
考虑到会议的规模,要涵盖所有的曲目、演讲和海报几乎是不可能的。在这篇文章(以及后续文章)中,我将从我个人的角度提供一些大会的亮点。
1.专题讲座:
Yoshua Bengio | 从系统 1 深度学习到系统 2 深度学习
Vivienne Sze | 深度神经网络的高效处理:从算法到硬件架构
Celeste Kidd |如何知道
Mohammad emti yaz Khan |深度学习与贝叶斯原理
Blaise Aguera y Arcas |
从系统 1 深度学习到系统 2 深度学习 ( 幻灯片 ): Yoshua Bengio 的演讲是大会最受欢迎的主题演讲。Yoshua 对深度学习的现状及其未来提供了一个奇妙的见解。受《思考 、快与慢 ,这本书的启发,他提出了一条从深度学习擅长的系统 1 (直觉、快速无意识非语言、习惯性决策/推理)到其未来的系统 2 (缓慢、逻辑、顺序、有意识、语言、算法、决策)的路径。他将意识(以及 注意力 作为其关键成分)作为系统 2 的基础,以稀疏因子图作为意识先验,以元学习作为理论框架,将深度学习从系统 1 扩展到系统 2。
系统 1 与系统 2 学习[图片取自 Yoshua Bengio 的幻灯片
深度学习与贝叶斯原理 ( 幻灯片 ): 深度学习和贝叶斯学习被认为是两个完全不同的领域,经常在互补的设置中使用。Emtiyaz Khan 在他的演讲中介绍了现代贝叶斯原理来弥合这一差距,通过结合它们的优势来解决具有挑战性的现实世界问题。
贝叶斯 vs 深度学习[图片取自https://emtiyaz.github.io/papers/neurips_tutorial.pdf
我们可以使用贝叶斯原则作为一般原则,通过计算后验近似来设计、改进和推广一系列学习算法。我们可以将现有的算法(例如 Adam optimizer)作为特例,或者设计新的深度学习算法,用于不确定性估计、小数据集上的推广和终身学习。训练贝叶斯神经网络特别是后验近似仍然是一个具有挑战性和计算昂贵的问题。因此,可以使用近似方法,如变分推论 (VI)。
进一步阅读可以参考论文“实用深度学习与贝叶斯原理”、“变分推理的自然梯度下降”、“概率方法—变分推理”。PyTorch 实现也是一个即插即用的优化器。
2.趋势:
下图显示了 NeurIPS 2019 所有已接受论文标题的最常用标记(单词)的单词云(经过一些预处理,如删除自定义停用词,如“neural”&“network”)。获取标题和令牌频率的代码可以在 Github 上找到。
论文标题中最常见标记的词云和频率图—neur IPS 2019[源代码可在此处获得
最常用的 10 个词如下:优化、强化、对抗、图、高效、随机、最优、生成、贝叶斯。我对以下关键词进行了进一步分析:优化、强化学习、对抗、图形、生成和贝叶斯神经网络(代码可在此处找到),发现了一些有趣的结果:
按主题分类的论文标题中最常见标记的词云—neur IPS 2019[源代码可在此处获得
从我的角度来看(基于会议出席人数和上述数据),以下主题是会议的趋势:
- 强化学习 : RL 仍然是人工智能会议中最热门的话题之一。彼得·阿比尔等人的深度强化学习工作坊。艾尔。Katja Hofmann 的教程强化学习:过去、现在和未来的观点 ( 幻灯片)是今年 Neurips 最受欢迎的课程之一。最近受到很多关注的一个非常有趣的话题是 多智能体 RL (MARL) *,*在复杂的环境中,多个智能体相互竞争和/或协调以实现一个目标。The Nature paper, 星际争霸 2 中的特级大师级使用多智能体强化学习 ,是 DRL 工作坊的重头戏。Katja Hofmann 在她的演讲中概述了我们目前所处的位置,以及对未来研究和 RL 实际应用的关键机会的展望。关于 MARL 的介绍可以在这篇博客文章中找到,关于这个主题的论文的完整列表可以在蓝涛宇的报告中找到。
- 对抗网络:gan 为知识获取提供了一个很好的机制,然而,它们也可以被用作对抗例子来产生对 DNN 模型的攻击(例如,来自攻击者的对抗输入可以在训练图像中引起难以察觉的变化来欺骗分类模型)。评估深度学习模型针对这种攻击的对抗性 健壮性 一直是 OpenAI、Google 和 IBM 等 AI 巨头(例如 IBM 的对抗性健壮性工具箱)的优先事项,并且不出所料是该领域的主导话题。
- 【新增****贝叶斯深度学习:请参考第一节 深度学习与贝叶斯原理 。
- 【新】图形神经网络:在这次 NeurIPS 大会上,图形几乎无处不在。图是非常强大的非欧几里得数据结构,可以表示对象之间的复杂关系和相互依赖性。因此,大量应用(如社交网络、物理科学、化学、电子商务、知识库、推荐系统和组合问题)中的数据可以用图来表示。图的不规则结构(可变大小和节点的无序邻居集)使得对它们执行诸如卷积的操作具有挑战性。因此,人们对图形神经网络(GNNs) 算法越来越感兴趣,以便推广深度学习方法,如针对图形数据的 CNN、RNNs 和自动编码器。gnn 可以分为四类:递归图神经网络、卷积图神经网络(cgnn)、图自动编码器和时空图神经网络,目前 cgnn 的权重最大。
左边的 2D 卷积与右边的图卷积(节点的邻居是无序的,大小可变)的比较[图片取自本文]。
要了解更多关于 GNNs 的知识,可以看看关于图神经网络的温和介绍的帖子或者下面的调查论文:
关于图神经网络的全面调查、
Stanford SNAP 的图神经网络教程和
图神经网络:方法和应用回顾。
在本次回购中还收集了一份不错的 GNN 论文清单。图不仅可以用作数据结构,还可以表示神经网络的输出,例如,任何联合分布都可以表示为因子图,正如 Yoshua Bengio 在他的特邀演讲中所指出的。
3.新方向奖:
杰出新方向论文奖授予了 Vaishnavh Nagarajan 和 j .济科·科尔特的统一收敛可能无法解释深度学习中的泛化(幻灯片,博客,代码)。
深度学习理论中最大的公开挑战之一是泛化难题,因为深度网络模型(与经典学习理论相反)尽管存在严重的过度参数化,但仍能很好地泛化。为了解释这种反直觉的行为,理论工作试图推导出深度网络的泛化差距(模型在训练数据和来自同一分布的未看到的数据上的表现之间的差距)的上限。这项工作退一步说,追求一致收敛为基础的界限可能不会真正导致我们对这个难题的完整解决方案。特别地,它表明 1)理论泛化界限随着训练集大小而增长(而经验差距减小),以及 2)任何类型的一致收敛界限将被证明无法解释深度学习中某些情况下的泛化。
4.车间
在为期 3 天的 54 场研讨会中,以下是最受与会者欢迎的研讨会:
深度强化学习
图形表征学习
元学习 ( 大卫·阿贝尔笔记,第 4 节,对本次工作坊有个牛逼的总结)
贝叶斯深度学习
生物和人工强化学习
用 ML 应对气候变化
以及对对话式 AI 感兴趣的人
关于与 ML 一起应对气候变化的研讨会[图片来自 Paul Save 的推特 ]
5.民众
在会议期间的 28 个演示中,以下是我个人最喜欢的(有些偏向 NLP):
ex BERT:一个解释 BERT 的学习表示的可视化分析工具
Streamlit, 机器学习工具的新应用程序框架
allenlp 解释器:解释 NLP 模型的预测
密码:人类和人工智能代理之间的合作猜字游戏
趣味演示: 机器人辅助梳头 、 旋律吃角子老虎机 互动音乐系统、 与人工智能化身的一对一健身训练
6.社区、社交和聚会:
NeurIPS 2019 强调多样性和包容性。有 15 次正式的社交聚会把有共同兴趣的人聚集在一起。此外,与会者通过大会的官方移动应用程序(Whova)交流了大量信息。例如,有超过 300 个聚会由参与者组织和(几乎)无数的主题讨论!!
AI 名人:
看到一些人工智能名人并与他们交谈是非常令人兴奋的,因为他们非常热情和谦逊:)
我和艾名人[图片由我自己]
8.其他摘要:
奇普·胡延的惊人之帖:来自 NeurIPS 2019 的关键趋势
大卫·阿贝尔的牛逼 NeurIPS 2019 笔记 (70 页)
罗伯特·兰格的优美手记
9.相关链接
- neur IPS 2019 被接受论文的完整列表
- NeurIPS 2019 实录会谈
- 我们从 NeurIPS 2019 数据中学到了什么
- NeurIPS 2019 |数字
- NeurIPS 2019 综述:杰出论文、专题演讲、事实和数字
- 深度 RL 工作坊论文
神经元,激活函数,反向传播,历元,梯度下降:这些是什么?
如果你听到像深度学习、神经网络、激活函数、梯度下降、纪元这样的术语,但不知道它们真正的意思,那么这篇文章就是为你准备的。本文是对深度学习的介绍,其中您将了解什么是神经网络,它们如何学习,激活函数的类型,以及深度学习与机器学习的区别。让我们开始吧。
克里斯托夫·高尔在 Unsplash 上拍摄的照片
深度学习:为什么是现在
深度学习和神经网络自 80 年代以来就已经存在,但由于缺乏强大的处理能力和数据,直到最近才出现大的飞跃。回到 80 年代或 90 年代,存储内存有限且昂贵,这意味着我们无法加载大量数据进行处理。此外,CPU 和 GPU 非常昂贵,负担不起。如今,只需几美元,你就可以在 AWS 或 GCP 或 Azure cloud 上安装一个高端 NVIDIA GPU 和几千兆字节的内存。
直到最近,处理能力和内存还不足以进行深度学习。来源。
为了让你知道 CPU 和内存有多贵,看看这些 90 年代中期的广告就知道了。2000 多美元的 16MB 内存和 120MHz CPU 是 90 年代中期的顶级产品。现在,在亚马逊或当地的百思买上查找 GPU 和内存,看看有多大的存储和强大的处理器可以以非常实惠的价格提供。
深度学习:它是什么
深度学习基于神经网络,它们旨在模仿人类大脑,这是地球上最强大的工具。
深层与浅层神经网络。来源。
这些神经网络由许多神经元组成,它们有一个输入层、一个输出层和隐藏层。每个输入、输出或隐藏节点是一个神经元,具有一个 激活函数 ,用于神经网络学习。我们将在本文后面讨论他们是如何学习的。
隐藏层越多,神经网络就越深。关于是什么使神经网络变浅和变深有不同的观点,但是拇指的作用是隐藏层越多,神经网络就越深,很少有隐藏层(有人说 2 或 3 层)使它变浅。
在学习时,这些神经元将具有不同的权重,这些权重在学习期间被调整。神经元的权重调整是学习的结果。使用 反向传播 和 梯度下降 来调整权重,这将在本文的后面介绍。
深度学习与机器学习
深度学习是机器学习的一个子集, 每一个深度学习算法都被认为是机器学习但不是每一个机器学习算法都被认为是深度学习。
AI vs. ML vs. DL。来源。
机器学习和深度学习最大的区别在于它们是如何学习的。
机器学习:选择模型(例如某个分类器)进行训练,手动对要学习的模型进行特征提取。
深度学习:你选择神经网络的架构(层数、激活函数)和特征 自动从美联储标注的训练数据中提取 。
为了更好地理解这一点,让我们以汽车和公共汽车的分类为例。在机器学习中,您将定义您想要使用的分类器,然后执行特征提取,例如,您教导模型汽车的特征是某些尺寸、2 或 4 个门、4 个轮胎、4 个窗户等。对于公共汽车,你告诉模型,公共汽车的特征是有一定的尺寸,1 或 2 个门,8 个轮胎,10 个窗户,等等。在这里,您手动提取特征并将其输入到您的模型中。
机器学习与深度学习
在深度学习中,不需要做特征提取,甚至不需要知道特征。你首先选择你的网络,例如卷积神经网络(CNN ),因为我们将处理图像。定义层数和要使用的激活函数,然后将你的网络指向一个贴有汽车和公共汽车标签的文件夹。神经网络将自动浏览图片并捕捉汽车和公共汽车的特征。就是这样,你的神经网络教会了自己如何区分汽车和公交车。
激活功能
激活功能 是神经元中发生的事情,每个神经元都有一个激活功能,当神经元被激发时就起作用。
神经网络中的激活函数。来源。
神经元的输入将通过激活函数,得到处理,然后发送到下一层或输出神经元。这是神经网络学习的方式,并最终决定将什么发送给下一个神经元。
有许多不同的激活功能,但我在这里将涵盖主要的五个。
阈值(二进制步长)激活函数。来源。
阈值函数
也称为二元阶跃函数,它是一个基于阈值的激活函数。如果输入值高于或低于某个阈值,神经元就会被激活,并向下一层发送完全相同的信号。这是一个是或不是的函数。
乙状结肠(逻辑)激活功能。来源。
s 形函数
主要用于逻辑回归,比阈值函数平滑。它在神经网络的输出层也非常有用。一些数据科学家抱怨这种方法计算量很大。
ReLU 激活功能。来源。
整流器(ReLU)功能
这是神经网络最受欢迎的功能之一。它可以帮助减轻消失和爆炸梯度下降问题。ReLU 是一个非线性函数,计算效率很高。
Tanh 激活函数。来源。
双曲正切函数
它类似于乙状结肠,但它低于零,不像乙状结肠。它主要用于输入值为强负值、中性值或强正值的情况。
Softmax 激活功能。来源。
Softmax 功能
这主要用于多类预测的分类问题。它通常位于神经网络的输出层。
同一神经网络中的不同激活函数。来源。
您可以对隐藏层和输出层应用不同的激活功能。在此图中,ReLU 应用于隐藏层,而 Sigmoid 应用于输出层。这是预测某事发生的概率的常见方法。
神经网络:它们如何学习
学习是通过将带标签的数据从输入层一直传递到输出层,然后再返回来进行的。由于数据被标记,神经网络知道什么是预期输出,并将其与神经网络的实际输出进行比较。
在第一个 时期 中,被标记的数据在输入层被输入,并被传播到输出层,在那里你的神经网络将计算出一个输出。你的神经网络的实际输出与预期输出之间的差异被称为 成本函数 。你的神经网络的目标是尽可能地减少这个 成本函数 。因此,您的神经网络将 从输出层一直反向传播 到输入层,并相应地更新神经元的权重,以尝试最小化这个 成本函数 。
将数据从输入层发送到输出层,然后一路返回的行为称为 时期 。在每个时期,神经网络更新神经元的权重,这也被称为 学习 。在多个时期和权重更新之后,损失函数(神经网络输出与实际输出之间的差异)应该达到最小值。
学习阶段的神经网络
在学习时,神经元将具有不同的权重,这些权重将决定未来的输出。例如,在我们之前的汽车与公共汽车分类场景中,神经元可以通过查看窗口的数量来确定该对象是汽车还是公共汽车,显然,该神经元比通过查看对象的颜色来确定该对象是汽车还是公共汽车的神经元具有更高的权重。这是对神经元功能的过度简化,但我希望你能根据重要性来理解神经元的权重。
梯度下降
梯度下降。来源。
梯度下降 是一种最小化代价函数以更新神经元权重的方法。此方法告诉您的神经网络如何以快速有效的方式计算成本函数,以最小化实际和预期输出之间的差异。
最容易理解也是最常见的例子是将您的成本函数比作一个球,通过更新其斜率来试图找到最低点。
随机梯度下降
随机梯度下降 建立在梯度下降的基础上,可以处理复杂的成本函数。
梯度下降陷入局部极小值,错过真正的极小值。来源。
梯度下降仅在只有一个最小值的凸成本函数的情况下工作良好。然而,在复杂的成本函数的情况下,梯度下降很容易陷入局部最小值,这破坏了你的神经网络学习。
随机下降与梯度下降
为了理解随机下降和梯度下降有什么不同,让我们举个例子。我们将假设您已经将数据标记为行,并将它们输入到您的神经网络中进行训练。
梯度(批量)下降 当你的神经网络一次遍历一行数据,计算每一行的实际输出。然后,在完成数据集中的所有行后,神经网络将所有行的累积总输出与预期输出进行比较,并反向传播以更新权重。这意味着神经网络在作为一个大批量处理整个数据集之后更新一次权重,这是一个非常及时的时期。神经网络会这样做几次来训练网络。
梯度下降与随机梯度下降。来源。
随机梯度下降 当你的神经网络一次遍历一行数据,计算每行的实际输出。神经网络立即将第一行的实际输出与预期输出进行比较,并反向传播以更新权重,从而完成一个时期。然后对第二行进行同样的操作,比较输出并反向传播以更新权重。一直到最后一行,因此多个历元和多个权重更新会贯穿整个数据集,而不是像梯度下降那样将其视为一个大批次。这有助于避免局部极小值,它比梯度下降法更快,因为它不需要将所有数据加载到内存中并一次遍历它们,而是一次加载一行并更新权重。
有一种两全其美的方法叫做 小批量梯度下降 ,它基本上是将两者结合起来。您可以决定一次运行和更新多少行。因此,您可以灵活地选择运行任意数量的行,而不是将整个数据集作为一批运行,或者一次运行一行。
反向传播
现在你应该知道什么是反向传播,如果你不知道,那么它只是在计算成本函数后调整你的神经网络中所有神经元的权重。反向传播是你的神经网络学习的方式,它是计算成本函数的结果。需要知道的重要概念是反向传播同时更新所有神经元的所有权重。
出于训练目的,在开始时,神经元的权重用小数字随机初始化,然后通过学习和反向传播,权重开始用有意义的值更新。
最后,我希望你喜欢这个深度学习的快速介绍,现在你应该对一些常见术语有了更好的理解,如神经元、反向传播、权重、激活和成本函数。
机器学习、人工智能和深度学习是非常令人兴奋的话题,将改变每个行业,取决于你的工作职能,你需要对它们有一些了解。
新精算师必须了解机器学习
在 Unsplash 上由斯特凡·斯特凡·契克拍摄的照片
这个职业正在发展
机器学习(ML)是一个不可回避的话题——它也在精算行业引起了轰动。机器学习可以简单地定义为“对计算机编程的科学(和艺术),以便它们可以从数据中学习”,这是 A. Géron 在他的 2019 年书中提供的。事实证明,它是一个无价的工具,拥有海量数据的公司可以利用它来提取洞察力,以改进他们的产品和服务。
精算师的情况也是如此。精算师偶尔会被描述为第一批数据科学家,因为他们长期从事数据和建模技术的工作。这两个研究领域之间显然有很大的重叠——这就是为什么越来越多的精算师发现自己在日常工作中应用机器学习工具。无论是为了释放传统上被忽视的数据的潜力(例如,从文本字段或图像中提取洞察力,而不仅仅是冰冷的硬数字数据),还是为了利用更强大的技术和算法来利用他们已经拥有的数据,有一点是明确的-机器学习将会继续存在。
只有一个问题
尽管自 20 世纪 90 年代以来,一些机器学习算法一直在后台悄悄工作,但似乎这个世界已经迅速变得越来越多地与人工智能有关。商业用例非常丰富,人工智能和人工智能存在于各种产品和服务中(为我们的手机、我们最喜欢的网站和我们每天依赖的工业生产过程提供动力)。但是 ML 在精算领域也有应用:分析死亡率经验以发现新趋势,保险产品定价,预测金融数据…
然而,需要教授给培训中的精算师的材料仍然是静态的。世界在前进,这种教育脱节在加剧。精算大纲看起来有过时的危险。
解决方案
也就是到 2019 年。教学大纲被修改了——引入了新鲜的新材料,重要性日益下降的旧材料被淘汰了。瞧,精算师协会(IFoA)科目 CS2 考试的新增加内容之一是机器学习,以及科目 CM1 中密切相关的数据分析主题。这些变化是为了“确保课程是相关的、最新的,并反映在不断变化的全球商业环境中精算师所需的技能、知识和属性。”这听起来是一个足够好的理由——但是这种新材料符合这种说法吗?
根据新大纲,机器学习现在占 CS2 考试的 10%,涵盖五个学习目标,即:
- ML 的分支及其解决的问题类型
- 关于从数据中学习的高级概念
- 关键技术的描述和示例
- 将 ML 技术应用于简单问题
- 了解其他非精算定量研究人员(数据科学家、统计学家……)的观点
听起来像是对这个主题的全面介绍。让我们来看看核心阅读材料(CS2 考试的可测试材料)中涉及了哪些关键主题。
洗钱的定义和范围
相当合理的是,我们从一些基本的定义和解释开始,关于 ML 对于什么样的问题是有用的。在经典方法可以解决的情况下,开发一个花哨的 ML 算法没有多大意义——同样,如果在数据中没有真正的模式可以检测,ML 也没有什么可以提供的。
在从一些具体的例子(如定向广告、预测选举、预测贷款违约)开始之后,材料变得更加正式——将机器学习过程描述为逼近一个目标函数,该目标函数将一组可测量的变量映射到输出。这些材料不怕揭示算法和问题的数学本质——这对于那些只听说过 ML 的不精确术语的人来说可能是一个受欢迎的变化(或者只是被各种相关的流行词汇反复击中头部)。
关键概念概述
接下来是对该领域关键概念的讨论。特别是:
- 损失函数
- 评估模型的方法(准确度、精确度、召回率、混淆矩阵等)
- 参数和超参数
- 训练集、验证集和测试集
- 过度拟合
- 模型正则化
这些概念被描述得很好——但这仅仅是一个描述。机器学习是那些你需要亲自动手才能真正掌握概念以及它们为什么重要的领域之一。建议使用一些优秀的 ML 在线资源或书籍来查看这些概念的端到端实现,并真正让您的理解更上一层楼。
机器学习的分支
不同类型的最大似然算法之间的本质区别是在这里,涵盖监督,无监督,半监督和强化学习技术。这一部分还处理回归与分类和生成与判别模型,以及额外的理论,例子和精算应用。同样,这是一个很好的主题调查,但你会想做一些进一步的研究,以巩固一些概念。观看视频,阅读书籍和博客——试着为自己建立联系,以便最大限度地利用这些材料。
机器学习过程
ML 项目的一般步骤在注释中给出了合理的范围,这是正确的。机器学习不仅仅是开发、训练和评估模型——在成功部署 ML 解决方案的过程中,还有很多事情要做。在这里我们讨论:
- 收集数据
- 探索性数据分析
- 数据准备
- 模特培训
- 验证和测试
- 提高模型性能
- 文件和再现性的重要性
精算专业的学生将会对他们在课程中遇到的模型的数学驾轻就熟——但是知道这只是 ML 故事中的一章是至关重要的。如果您想继续将您的知识应用到真实世界的业务用例中,您需要对全局有一个坚实的把握。
关键算法
接下来,我们将讨论一些关键算法,特别是:
- 惩罚广义线性模型
- 朴素贝叶斯分类
- 决策树
- k 均值聚类
这方面有大量的材料,这是一件好事——它建立在前面介绍的一些概念之上。更重要的是,它建立在本课程其他部分所涵盖的一些主题之上。那些熟悉 CS1 中的回归、广义线性模型和主成分分析以及 CS2 中其他地方的比例风险模型的人会很高兴看到这些概念的扩展。
其他定量研究者的观点
最后,我们讨论了一个 ML 从业者的观点如何不同于更传统的研究者和建模者,例如统计学家。本节讨论了团队之间沟通的困难——特别是当不同的术语可能用于本质上相同的概念时,或者当两个团队可能对分析的不同方面感兴趣时。机器学习绝对是一个跨学科的研究领域,因此从业者将经常与其他背景的专业人士交流。“缩小”来讨论一些更普遍但同样重要的问题,这些问题是在现实世界中开发和应用 ML 解决方案时出现的,这很好地完成了材料,因为我们从理论的深度开始,以务实的方式结束。
那么到底是什么出现在了考试中呢?
任何一个学生(勇于承认这一点的人)都会知道,更多的努力倾向于放在那些经过实际测试的材料上。严格来说,阅读材料中的所有内容都是可考查的,但这是自从新材料加入后,两次讨论中出现的内容。
【2019 年 4 月 —关于监督与非监督学习的简短问题以及各自的示例。关于模型性能度量的计算和解释的更长的问题。
2019 年 9 月 —讨论列车验证测试方法的一个更长的问题。评估机器学习在给定的示例场景中是否合适。讨论具有更多参数的更复杂模型的利弊。
密码在哪里?
不让学生参与一些更实用的、端到端的 Python 或 R ML 实践项目,这似乎是一个错失的机会——尤其是现在 R 的数据分析和精算统计现在已经成为不止一次而是两次 IFoA 考试的一部分。即使是该学院全新的数据科学证书也不需要编写任何代码就能完成。一方面,这可能看起来完全疯狂——毕竟,学习数据科学或机器学习的最佳方式可以说是让自己沉浸其中,并开始摆弄你感兴趣的数据集。
然而,值得注意的是,IFoA 并没有试图创造数据科学家。相反,他们的目标是“通过实例和案例研究,帮助处于职业生涯任何阶段的精算师获得对数据科学工具和技术的基本理解,以及如何将它们应用到精算实践中”(见此处,以及关于数据科学证书的其他常见问题)。从本质上来说,你不必成为机器学习的专家,但你需要知道它是什么,以及随着它在行业和整个社会中变得越来越普遍,它是如何使用的。
前景
精算的角色正在演变。IFoA 主席约翰·泰勒在去年主持了该行业内的快速数据科学扩张。很明显,这只是第一步——更新整个职业当然不是一件容易的事情,但不可否认这是正确的做法。数据科学和机器学习技术在 IFoA 学生课程中的正式化是巩固精算师作为专业人士的地位的举措,可以为客户增加真正的价值——随着精算师继续在更远的行业工作,这只会证明越来越有用。
更多信息和积分
Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。
由斯特凡·斯特凡·契克、 女同胞和前进拍摄的照片。
物体检测的新方法
center net(Objects as Points)简介,TTFNet 及其在 TensorFlow 2.2+中的实现。
来源:pexels.com
我将从简单介绍不同的物体检测方法开始。在介绍了传统方法和新方法之后,您可以阅读 CenterNet 和 TTFNet 的最重要部分。两个模型中的许多想法是相似的,因此将一起介绍它们。我们实现了一个由两个网络启发的包。如果你有兴趣,请查看我们的 GitHub 。
需要深度学习和卷积神经网络(CNN)的基础知识。
传统方法
在计算机科学中,当我们遇到一个无解的难题时,我们会试图将其转化为一个我们知道其解的问题或者一个更简单的问题。所谓的两阶段检测模型就是很好的例子。在这种情况下,更简单的问题是图像分类或标记。(将给定图像放入一个类别或给给定图像分配标签)简单地说,我们可以将图像分成多个区域,然后对这些区域进行分类,对吗?是的……但是要花很多时间。因此,你需要聪明一点。使用这种方法的算法的一个例子是 R-CNN (2014)。后来演变成快速 R-CNN (2015)甚至更快的 R-CNN (2016)。
尽管这些模型的性能相当好,但研究人员显然在问自己,这个过程是否可以变得简单,从而更有效。在一个阶段,没有区域提案。这个问题的一个可能答案是YOLO——你只看一次 (2015)。现在是第四版 (2020)。或 SSD —单次多盒探测器 (2015)。最后,还应提及 RetinaNet (2017 年),特别是因为它曾被用于引入物体检测的焦点损失,这是现在经常使用的方法。
新方法
近年来,另一个想法越来越受欢迎。物体可以被转换成一组点。并且检测任务可以被认为是关键点估计问题。这种方法在 CornerNet:将对象检测为成对关键点中有所介绍。顾名思义,一个对象被表示为一对关键点,左上角和右下角。
在介绍 CenterNet 的 Objects as Points 论文中探讨了类似的想法。在那里,我们使用热图检测包围盒的中心点。使用回归直接预测诸如边界框大小的其他属性。
来源:pexels.com
这种方法的缺点是训练速度较慢。为了解决这个问题,提出了 TTFNet(训练时间友好网络)。它遵循相同的基本思想,因此我们决定在一个包中实现来自两个网络的思想。
神经网络布局
让我们开始吧!我将从头开始,向您介绍网络布局。然后,将讨论重要的单个部分,主要是热图和不同的损失函数。
我们可以使用专门为此类任务设计的网络。例如沙漏网络。或者,正如我们已经决定要做的,选择一个标准的图像分类 CNN,并根据我们的需要进行修改。我们选择测试 ResNet (18,50)和 EfficientNet (b0,b1,b2)。
在所有标准的迁移学习任务中,我们放弃了顶部的密集层。但是留在顶部的层甚至与我们需要的输出相差甚远。因此,一些上采样是必要的。除此之外,来自较低层的连接提高了性能。当我们在网络的末端有一个正确大小的层时,我们可以将它“分割”成所需数量的头。
使用 ResNet18 简化 CenterNet 的可视化,使用上采样和连接。(黄色:卷积层,红色:最大池化,蓝色:上采样。)
为了让网络更快,热图的一边正好是输入图像的 1/4。我们每节课都有一张热图。然后,CenterNet 中有另外两个头(用于基本的对象检测),TTFNet 中有一个头。
对于中心网,有
- 一个尺寸头,包含一个边框的宽度和高度
- 偏移头,包含使用下采样热图时产生的中心的 x 和 y 偏移。
两者都只有两个过滤器——在热图的任何给定点都可能只有一个对象。如果您对一个对象的其他属性感兴趣,可以添加更多的头。
在 TTFNet 中,只有一个带有四个滤镜的额外云台来计算物体的尺寸——到侧面的距离。
热图
那么,热图是什么样子的呢?它是一个填充了从 0.0 到 1.0 的值的矩阵。这种地图上的峰表明某个物体的存在。
下面,你会看到一些生成的训练热图。只有一个点正好是 1.0。在这一点上,概率正在慢慢消失。
CenterNet(左)和 TTFNet(右)的热图。
可变形卷积
网络的上采样部分可以通过多种方式实现。我们已经向您展示了级联、上采样和标准卷积层的简单方法。为了提高性能,使用了可变形卷积。
毫无疑问,卷积神经网络给深度学习带来了一场伟大的革命。它们使我们能够提取从完全连接的层中很难得到的特征。再加上另一项布局改进,我们的网络可能会变得非常深入。尽管如此,基本思想还是一样的。特别地,过滤器的形状总是矩形的。可变形回旋正试图对此进行改进。它们学习到标准网格的偏移,并用这个“变形的”内核执行卷积。
标准与可变形卷积值的选择。船方不负担装货费用
不幸的是,可变形卷积层尚未在 TensorFlow 和 TensorFlow 插件 (TFA)中实现。我们正在使用TFA的一个分支,支持可变形 Conv2d,希望它能很快被合并。(参见拉动请求 1129 。)
损失函数
现在,当我们有了网络布局和输出的样子,只有一个关键的东西不见了。损失函数。
焦点损失
热图有一个问题——它们非常稀疏。大多数情况下,没有检测到(零),只是偶尔我们会看到一个物体(一个物体,周围的值递减)。在这种情况下,标准的度量标准不太适用。幸运的是,有一个解决方案——一个焦损失。CenteNet 和 TTFNet 都使用它。
基于并集交集的损失(IoU)
为了优化边界框的大小,中心网使用 L1 损失。它是真实边界框坐标和预测边界框坐标之差的简单总和。这似乎是合理的,但另一方面,我们并不经常使用它进行评估。我们使用 IoU 指标——并集上的交集。因此,当我们对改进这个指标感兴趣时,为什么不把它也用于优化呢?我们可以从 1 中减去借据的价值,把它变成亏损。还是没有?
可惜,如果没有交集,欠条就是零。因此,在这种情况下,损失总是 1。提出了两种基于 IoU 的损失函数。TTF net 中使用的联合损耗上的广义交集解决了这个问题。 Distance-IoU Loss 还关注于在函数中添加一个距离信息,换句话说,我们离边界框的中心有多远。
最后的想法
你可以在 GitHub 上找到我们的实现。我要感谢 Michal Lukac 与我合作这个项目,感谢 Ximilar 允许我们开源它。如果你想尝试没有任何编码的模型,请查看这篇关于 Ximilar App 中物体检测的博文。
如何打入数据科学
今年,我完成了一个训练营,并立即找到了一份深度学习的工作。如果我必须回去自学所有的东西,以下是我将学习的内容。
更新—加入脸书小组:
[## 闯入数据科学
一个分享数据科学和机器学习资源的组织。一月-概览二月-统计三月…
www.facebook.com](https://www.facebook.com/groups/breakingintodatascience)
当谈到在线学习数据科学时,这些简历代表了我在过去三年培训 Python 、分析和生产机器学习模型中遇到的最好的、大部分免费的资源。一个数据科学家应该是一个伟大的程序员,一个体面的分析师,一个相当好的工程师。你还需要对统计学有坚实的理解——为此,有 ESL 。
要了解其他一切,让我们开始吧。
免责声明: 本帖不以任何方式赞助,也不代表除本人以外任何人的观点。如果这些建议对你不起作用,就这么说吧。
Python 已经迅速成长为机器学习的通用语言。它超过了 R,为科学计算提供了丰富的软件包。数据科学家必须是熟练的 Python 程序员。
除了拥有良好的编码能力,期望数据科学家拥有一些核心分析技能也是合理的,包括数据可视化。我提供了一些关于流行的第三方工具 Tableau 的技巧,用于拖放分析。数据科学家应该能够自如地交流他们的见解,有时会使用可视化工具。
最后,要做到真正的全栈,数据科学家应该熟悉从原型到生产模型的所有步骤。我喜欢运营指南中的这句话:“将模型投入生产是模型旅程的开始,而不是结束。”数据科学家应该知道生产一个模型需要什么。
🐍学习 Python
为编码开发肌肉记忆
Codecademy 是我告诉人们在进入数据科学之前学习 Python、命令行和 Git 的第一个地方。该平台的简单界面可以帮助你练习编码,直到让计算机做你想做的事情不再是困难的部分——这释放了大脑空间,以专注于与实际数据科学相关的挑战。不免费,但值得!)
学习世界上最流行的编程语言的最新和最棒的版本!
www.codecademy.com](https://www.codecademy.com/learn/learn-python-3)
涵盖数据科学的要点
Flatiron School 是我进行数据科学训练营的神奇机构,它提供完全免费的在线迷你课程。很有帮助。
一点也不。虽然取得进展,在我们的免费课程是最好的方式,以加强您的申请,我们的全日制…
flatironschool.com](https://flatironschool.com/free-courses/data-science-bootcamp-prep)
适应机器学习
凯蒂(无与伦比的,现在不幸倒闭的,线性离题播客)和塞巴斯蒂安(T4 胜利自动驾驶汽车)提供了一个真正友好的机器学习概述。
机器学习是当今数据分析领域最令人兴奋的职业的头等舱门票。作为数据源…
www.udacity.com](https://www.udacity.com/course/intro-to-machine-learning–ud120)
发展计算机科学基础
埃里克·格里姆森有点像你那严厉而聪明的叔叔——他正从十几台不再工作的笔记本电脑中收集部件来建造一台量子计算机。他的经典课程是学习 CS 最佳实践同时加深您的 Python 知识的好方法。
麻省理工学院 edX 6.00.1x
courses.edx.org](https://courses.edx.org/courses/course-v1:MITx+6.00.1x+2T2017_2/course/)
尝试一个样本数据科学项目
以下是让你开始的几个想法:
通过 GeoPandas DataFrames 和 Google Colab 提高您对地理空间信息的理解
towardsdatascience.com](/walkthrough-mapping-gis-data-in-python-92c77cd2b87a) [## 开始使用 Spotify 的 API & Spotipy
《数据科学家快速入门指南》,指导如何浏览 Spotify 的 Web API 并使用 Spotipy Python 访问数据…
medium.com](https://medium.com/@maxtingle/getting-started-with-spotifys-api-spotipy-197c3dc6353b) [## 12 小时 ML 挑战
如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序
towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51)
通过对数据科学感到兴奋来更快地学习
选择你有激情的事情,深入钻研。首先,看看这个常规资源列表——博客、YouTube 频道和播客。您还可以在 LinkedIn 和 Twitter 上关注我,了解我最喜欢的学习资源的实时更新。
通过这个有用的期刊、视频和讲座的集合,推进你对机器学习的理解。
towardsdatascience.com](/supercharge-data-science-5bb7376d8572)
🎨学习数据,即
Tableau 工作表,尺寸为蓝色,度量为绿色。最左侧的侧栏显示了用于基本汇总统计的现成分析工具。通过画面。
当你的数据需要打扮的时候, Tableau 是一个防呆风格的服务。它提供了一个时尚的拖放式数据分析界面,通过本机集成从 CSV、JSON 文件、Google Sheets、SQL 数据库以及烘干机的后角(你不可避免地会忘记带袜子)中提取数据。
数据被自动分为维度(定性的)和度量(定量的)——并被假定为可以制作图表。当然,如果还有一些数据清理步骤要做,Tableau 也可以处理脏衣服。例如,它支持重新格式化数据类型和将数据从宽格式转换为高格式。
准备制作图表时,只需按住 ctrl 键并单击感兴趣的功能和“演示”框中的默认选项。这种交互的简单性使得即使是设计能力最差的数据科学家也能轻松地将数据整理成可展示的格式。Tableau 会把你的数据装进西装和领带里,然后发送到会议室。
遵循这些提示,让你的数据可视化能力从“好”变得“好”。
从制图员大师那里获得灵感
在我作为四大公司的商业分析师的整个时间里,这三个博客是我如何创建一个好看的、功能性的 Tableau 仪表板的指南。
Tableau 公共团队的定期派遣。
public.tableau.com](https://public.tableau.com/en-us/s/blog) [## 来自数据专家的分析技巧和见解| Evolytics 博客
Evolytics 分享操作方法文章、分析技巧、专家建议、行业见解和新闻。了解有关及时的更多信息…
evolytics.com](https://evolytics.com/blog/?blog-search=tableau) [## Tableau 档案|网络
点菜吧!我们为您准备了又一个月的最新热门数据资源。在这篇博客综述中,…
interworks.com](https://interworks.com/blog/channel/tableau/)
请记住这 4 条准则
#1 —床单是艺术家的画布,仪表板是画廊的墙壁。工作表用于创建艺术作品(咳咳,图表),然后您将这些艺术作品连同任何格式元素一起放置到仪表板上(使用带有容器的平铺布局 —稍后将详细介绍)。
2-为了节省时间,为尺寸和测量设置默认属性。这将为颜色、小数点位数、排序顺序等提供统一的方法。并防止您在每次使用给定字段时不得不摆弄这些设置。
3——按照这些思路,使用总体的格式工作簿和格式仪表板选项,而不是一次性的格式调整。
4——避免将浮动对象放入仪表盘。一旦你有两个或三个以上的图表要处理,拖动图表就变得令人头疼。你可以让你的图例成为浮动的物体,但是要远离这个“长切口”
取而代之的是使用平铺布局,如果你改变了你的仪表板的尺寸,它会强制对象对齐并自动调整大小。从长远来看更快更简单。
开始使用您的第一个仪表板
总之,Tableau 平台比手指画更容易使用,所以如果你准备好开始使用, Tableau Public 是一个免费版本,它将允许你创建可公开访问的可视化效果——就像这个我在网上搜集了一些来自华盛顿 DC 分区办公室的有问题的豁免开发项目的信息后整理出来的——并将它们共享到云上。
准备向高管们展示财务状况。由 Lisa Fotios 在像素上拍摄的照片。
在调查了来自当地社区的数据后,另一个很好的示例项目是提取您的支票账户数据,并假装您正在将其提交给 CEO 进行分析。
阅读有关数据科学家和数据分析师之间的区别的更多信息:
以田径运动会为例,探究这些常见职位之间的区别。
towardsdatascience.com](/data-analyst-vs-data-scientist-2534fc1057c3)
现在,如果你不那么秘密地热爱数据 viz,并且需要找到更多的时间投入到你的模型的生产中(🙋♀️),让我们继续…
🦁学习开发
你的机器学习模型的好坏取决于它在现实世界中对数据的预测和分类。通过至少获得对 DevOps(负责集成开发和 IT 的领域)的基本理解,给你的模型一个战斗的机会。
重新思考数据科学是什么或不是什么
在这篇精彩的文章中,深度学习的英雄 Andrej Karpathy 认为,机器学习模型是软件中的新热点——数据不是遵循如果-那么规则,而是它们的代码库。
我有时看到人们将神经网络称为“你的机器学习工具箱中的另一个工具”。他们有一些…
medium.com](https://medium.com/@karpathy/software-2-0-a64152b37c35)
了解这在企业中是如何工作的
这部巧妙的小说虚构了devo PS 手册 并且具有惊人的可读性。(不是免费的——但是如果你买了一份,给你的同事,希望他们会对生产你的模型充满热情)。
这是一个关于反叛的开发者和商业领袖与时间赛跑的故事,在一个…
itrevolution.com](https://itrevolution.com/the-unicorn-project/)
向外界介绍你的机器学习模型
查看这篇关于如何使用 Streamlit 进行部署和数据探索的文章。如果我没有提到 Docker 和 Kubernetes 作为生产化的企业级工具,那我就失职了。
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58)
如果你喜欢阅读这篇文章,请在媒体、 LinkedIn 、 YouTube 和 Twitter 上关注我,了解更多提升你的数据科学技能的想法。
当“ 资源在 2020 年 的最后几个月为您的数据科学增压”发布时,注册即可获得通知。
🤸♀️其他有用的话题
了解互联网,编程,机器学习和其他计算机科学的基础知识,通过清晰和…
medium.com](https://medium.com/coderbyte/eli5-computer-science-f8dfd7910311) [## 如何不费吹灰之力通过 AWS 云从业者认证
预测:多云,第一次尝试有 100%的机会通过。
medium.com](https://medium.com/@nicolejaneway/how-to-ace-the-aws-cloud-practitioner-certification-with-minimal-effort-39f10f43146) [## 数据仓库综合指南
了解数据仓库作为分析就绪数据集的主存储库的角色。
towardsdatascience.com](/data-warehouse-68ec63eecf78)*
新数据显示新冠肺炎死亡率较低
新的数据和分析提供了更多的准确性——它显示的死亡率是原始报告的十分之一
1 月和 2 月新冠肺炎的经验表明,该疾病的总死亡率在 3.5%至 5%之间。如此高的死亡风险是可怕的,整个世界都跑去躲避。
三月, 纽约时报 描述了一份报告,称新冠肺炎可能在美国杀死多达 220 万人。这份早期报告启动了我们当前的许多政策。
自 3 月以来,我们已经积累了大量关于该病毒的经验和更多的数据。早期的推测现在可以被明智的分析所取代。
在本文中,我将解释多个更新的数据来源如何显示新冠肺炎的总体死亡率大约是最初声称的十分之一——在 0.4%到 0.6%之间,可能接近 0.5%。
如果你研究图 4 中简单的 CFR 曲线,很明显为什么一些早期报道的死亡率如此之高。根据具体报告的时间,一个人可以察觉到几乎任何高达 35%的死亡率。
照片来自粘土堤上的 Unsplash
第一步:了解疾病的一般进展
我们现在对新冠肺炎发展的时间线的了解比 3 月份时更多。了解疾病的时间线使我们能够分析数据并得出更准确的结论。
用数学术语来说,这种疾病的一般发展过程如图 1 所示。首先,一个人被感染了。2.3 天后,此人具有传染性。4.5 天后,患者出现症状。5 天后,这个人将接受测试。在第 11 天,他们仍然生病,但不再传染。如果他们会死,他们会在 18 天后死去。否则,它们会在第 21 天恢复并产生抗体。
图 1-新冠肺炎的一般级数,基于纯数学平均时间值。
当然,每个时间段都有范围、概率和置信限。都没有我刚才描述的那么具体。真正的进展看起来更像图 2 所示,其中粉红色阴影区域代表时间线的概率。
图 2——新冠肺炎的总体发展,显示了时间段范围。平均值都是基于数据。症状和传染性的范围基于数据;其他范围是概念上的,并且是为了解释的目的而显示的。
传染性始于感染后 1 至 3 天。症状在 4-5 天左右开始。测试平均在 5 天后进行。有时在症状出现之前就进行(例如,如果一个人知道自己接触了感染者)。有时直到病人住院后才进行测试。有些人死得很快,有些人活得更久。有迹象表明传染性和抗体发展是非正态分布(它们不是钟形曲线)。
在这些范围内存在可变性的事实不会改变我们使用疾病进展数据得出结论的能力。如图 3 所示,我们知道,出于统计目的,在“A”点感染的人,要么在“B”点 18 天后死亡,要么在“C”点 21 天后康复并产生抗体。
图 3
知道了这个时间线,我们就有了计算总死亡率的基础——如果我们能找到 A 点、B 点和 c 点的数据。
根据纽约州的抗体检测计算死亡风险
由于在纽约州的一个周末进行了广泛的抗体测试,我们有了“C”点的可靠数据,即截至 2020 年 4 月 19 日,纽约州 13.9%的人口产生了抗体。我们知道这些人平均至少在 21 天前,即 3 月 29 日被感染。
为了使这个数字有用,我们需要把它与 3 月 29 日感染但后来死亡的人数放在一起。
根据图 3,我们需要查看 3 月 29 日之后 18 天的死亡人数,以便对抗体和死亡人数进行比较。18 天后是 4 月 16 日。纽约州报告的死亡人数为 12,192 人。
问题不在于是否存在可变性。问题是,“这种可变性对死亡率的计算有多大影响?”
这告诉我们,在 2020 年 3 月 29 日或之前感染新冠肺炎病毒的 271.6 万纽约州居民中,0.449%的人死亡。因此,对于纽约州的人口,新冠肺炎的总死亡率约为 0.449%(在“平均置信水平”)。这有时被称为 IFR ,或感染致死率,但该术语在许多已发表的文章中使用不一致,因此在本文中我使用术语致死率。
这种分析的精度水平并不能证明显示三位小数的结果是正确的,但是,为了那些想了解计算结果的人,我在这篇文章中使用了这种精度水平。
在最初的抗体测试项目后,纽约州继续进行抗体测试,并公布了另外两组测试结果。使用与上述相同的计算,这些测试结果意味着死亡率为 0.520%和 0.686%。
在这些后来的测试中,关于测试周期和人口抽样方法的细节较少,这使得死亡率比第一组测试结果更不确定。我没有完全排除后面的这些结果,而是计算了一个加权名义值,其中第一组结果的权重比第二组结果的权重大。这产生了 0.500%的名义死亡率。(我在文章末尾的注释部分提供了关于这个计算的注释。)
如果排除这些结果,名义利率仍为 0.449%,两个数字之间 11%的差异将贯穿本文的其余计算。
计算美国总体感染死亡率
事实证明,新冠肺炎对年龄高度敏感——它对老年人的致命性明显高于年轻人。纽约州的人口平均年龄略高于美国人口。根据该病毒特定年龄的死亡率,以及纽约州与美国整体的人口统计数据,纽约州的死亡率应该是美国整体的 1.05 倍。
然而,在纽约州,病毒一直集中在纽约市,纽约市的平均人口比美国整体人口年轻得多。再次基于特定年龄的死亡率和人口统计数据,纽约市的死亡率应该是美国整体死亡率的 0.88 倍。
为了调和这些对立的观点,我首先对纽约市的年龄进行了加权,然后根据每个地区死于新冠肺炎的人数对纽约州其他地区的年龄进行了加权。(我认为死亡比 PCR/病毒检测更能代表这两个地区的疾病流行程度,因为 PCR/病毒检测随着时间的推移一直不一致。)根据这一权重,纽约州的总人口比美国人口略年轻 0.98 倍。
详情如表 1 所示。
表 1
为了调整纽约与美国整体人口统计数据的差异,我将纽约州的死亡率除以 0.98(实际上是 0.984),得出美国的死亡率为 0.508%。
这一死亡率明显低于疫情早期报道的 3.5-5%的死亡率。
根据上周五个区的死亡人数和纽约市的总人口,即使 100%的人被感染,死亡率也不会低于 0.19%。
死亡率的可变性
如果你在想,“所有这些都有相当多的假设,一些数据点肯定有一些与之相关的可变性”,那么你是对的。
但问题不在于是否存在可变性。问题是,“这种可变性对死亡率的计算有多大的影响?”我考虑了七个可能的可变性领域。
纽约州多重抗体检测。正如我先前所述,纽约报告了三组抗体检测结果。这些结果的差异表明,总死亡率可能从 0.78 倍的标称值变化到 1.22 倍的标称值。
抗体检测中的偏倚。抗体检测的公开讨论集中在检测个体的准确性上。测试大组的精度考虑是不同的。只要我们知道测试的“敏感性”和“特异性”,我们就可以用数学方法解释测试中的不准确性。在纽约州的测试中,官员说测试已经被校准,“为了避免产生假阴性——漏掉一些可能有抗体的人。”这表明他们的测试可能低估了感染人数。我对这个因素使用了 0.9 倍标称值到 1.0 倍标称值的可变性。
额外的抗体开发。发现人们需要 21 天来产生抗体的研究特别发现,不是 100%的人在 21 天后产生抗体,而是 95%的人产生了抗体。在名义死亡率中,我没有考虑抗体阳性人数比检测阳性人数多 5%的情况。根据是否包括在内,美国的死亡率可以从名义值的 0.95 倍调整到 1.0 倍。
纽约州人口统计。我可以只使用纽约市或纽约州的人口统计数据。我可以用 PCR 检测来衡量而不是死亡。基于我如何调整纽约州的人口统计数据与美国整体人口统计数据的差异,美国的总体死亡率可以通过 0.95 至 1.14 倍的名义系数进行调整。
**感染到抗体滞后。**如果 21 天的研究平均值不正确,则会更改相关的感染日期。考虑到 3 月 27 日至 3 月 31 日的感染日期,美国的死亡率可以通过 0.89 至 1.10 倍的系数进行调整。
**感染致死滞后。**如果普通人的死亡时间长于或短于 18 天,那么相关的感染日期也会改变。计算方法与抗体滞后的可变性相同。它产生从 3 月 27 日到 3 月 31 日的相同日期范围,以及对美国死亡率 0.89x 到 1.10x 的相同调整范围。
死因。关于新冠肺炎死亡人数是被高估了还是低估了,已经有了很多讨论。有很多强烈的感觉,但很少有数据。我没有考虑到这个因素的调整。
表 2 总结了这些可变性来源及其对死亡率计算的影响。
表 2
当结合起来时,这些可变性的来源产生 0.398%到 0.619%的 95%置信范围。
正如我前面提到的,包含三个小数位是为了让对计算感兴趣的人知道。分析和数据的潜在准确性实际上只证明了 0.4%到 0.6%的粗略范围。
对于那些对统计数据感兴趣的人,我在注释部分添加了额外的注释。
纽约市人口和死亡的死亡率下限
大多数关于病死率的错误推测都过高,但也有少数过低,包括一些断言,病死率可能接近流感,即 0.1%左右。
可能的死亡率下限来自对纽约市死亡人数的分析。根据上周五个区的死亡人数和纽约市的总人口,即使 100%的人被感染,死亡率也不会低于 0.19%。如果只有 50%被感染,病死率不可能低于 0.38%。
表 3 提供了纽约市五个区和整个纽约市的死亡人数、人口和最低可能死亡率的具体情况。
表 3
最近美国阳性检测和死亡数据的死亡率上限
美国最近的测试和死亡数据为估计可能的死亡率上限提供了基础。
初始 CFR 的计算方法是将某一天的死亡人数除以 13 天前的阳性检测人数。这 13 天来自图 1-3 所示的时间表。
初始 CFR 中的 CFR 代表病死率。之所以称之为天真 CFR,是因为我们并不真正知道有多少真实病例存在,以便计算真实的病死率。我们使用阳性测试的数量作为病例数量的代表但是这个代表并不十分准确。因此,我们将结果计算称为朴素* CFR。*
在疫情的最初几个月,测试是有限的。只有病情最严重的人才被允许接受检测,因此阳性检测的数量被人为地压低,死亡率被人为地抬高。事实上,3 月份的初始 CFR 高达 35%,如图 4 所示。这种明显的高死亡率并不是由于疾病本身的致命性,而是由于当时进行的测试数量有限。
图 4。图表右侧的增加是由于新泽西增加了 1800 例被认为是来自新冠肺炎的死亡病例,全部发生在 6 月 25 日,而不是将死亡人数分配到实际发生的日期。
随着测试变得更加全面,初始 CFR 稳步下降。从图中可以看到,天真的 CFR 现在已经降到了 1.5%。如果我们目前对所有感染进行 100%的检测,这意味着死亡率的上限为 1.5%。
然而,我认为没有人相信目前的检测可以捕获多达 100%的感染,所以真正的死亡率很可能低于 1.5%。如果你认为我们目前正在检测一半的感染,那么病死率将是初始 CFR 的一半,即 0.75%。如果你认为我们目前正在测试三分之一的感染,那么病死率将是初始 CFR 的三分之一,即 0.5%。
0.5%的致死率与纽约抗体研究计算的致死率一致,我们目前正在测试三分之一感染的想法似乎是合理的。
包括表 2 中显示的可变性使我得出结论:美国新冠肺炎的总死亡率在 0.4%和 0.6%之间,可能接近 0.5%。
底线:更好的数据和提高的准确性的好处
如果你研究一下简单的 CFR 曲线,你就会明白为什么一些早期报道的死亡率如此之高。根据具体报告的时间,一个人可以察觉到几乎任何高达 35%的死亡率。
新冠肺炎致死率的底线是它比流感致命 3-4 倍。这是一种严重的疾病,但是我们现在知道它远没有致命到杀死 220 万人的地步,《纽约时报》三月份报道。我们现在可以计算出,要达到这个死亡人数,需要有 4.4 亿人受到感染。这比美国人口还多 1 亿。
至少有一件事我们不用担心。
这是关于新冠肺炎死亡率的 5 集系列报道的第 1 集:
- 第一部分 :为美国建立一个全面的基础 IFR
- 第二部分 :基于年龄的 IFRs
- 第 3 部分:基于人口统计的各州和各国 IFRs 的差异
- 第 4 部分:有和无共病的 IFRs
- 第 5 部分:按年龄和共病状况分列的 IFRs
我的背景
20 年来,我一直专注于理解软件开发的数据分析,包括质量、生产率和评估。我从处理噪音数据、坏数据、不确定性和预测中学到的技术都适用于新冠肺炎。
感谢
感谢詹姆斯·D·科顿、博士、布莱恩·唐纳森和布拉德·波特对本文早期草稿的极其有用的评论。
更多详情请访问新冠肺炎信息网站
更多美国和州级数据,请查看我的新冠肺炎信息网站。
笔记
关于参考文献的注释
新冠肺炎传染的时机这里。
纽约抗体检测时间表第一组抗体检测此处。
纽约州三套抗体检测总结这里。
测试的时间延迟。
从感染到出现症状的时间间隔这里。
产生抗体的时滞这里。
每日各州死亡人数记录此处。
关于置信区间计算的注记
我没有为每个可变性来源创建概率分布。
在考虑纽约州抗体测试结果的范围时,我根据六组结果计算了 95%的置信范围(第一组 4 次,第二组 1 次,第三组 1 次)。这产生了 0.393%至 0.608%的 95%置信区间。这些数字除以 0.984,从纽约州数字转换为美国数字。
对于表 2 所示的总体置信度范围,我通过取每个范围下限的最小调整因子与每个范围上限的最大调整因子的乘积来近似 6 ∂范围。这种方法得出调整系数为 0.504 至 1.659 的 6 ∂范围。我将这些乘数应用于 0.508%的标称(平均)值,这产生了 0.257%至 0.844%的死亡率的 6 ∂范围。将该范围除以 6 得到 0.098%的估计∂。对于置信区间的计算,我使用 0.508%作为平均值,使用值 3 作为样本数,基于 3 组抗体测试结果。使用样本大小为 1 将产生 0.317%至 0.700%的 95%置信范围。