精华内容
下载资源
问答
  • 如何优化深度学习模型

    千次阅读 2019-05-01 09:48:34
    但是对于我们绝大多数只想在黑色星期五销售之后用经济型机器分类猫狗的人来说,现在是时候该弄清楚如何使这些深度学习模型真正起作用了。 超参数优化算法   网格搜索 这是获得良好超参数的最简单方法。...

    https://www.toutiao.com/a6684869494898164232/

     

    2019-04-28 17:07:47

     

    如何优化深度学习模型

     

     

    大数据文摘出品

    来源:nanonets

    编译:刘佳玮、张秋玥、毅航、夏雅薇

     

    看过了各式各样的教程之后,你现在已经了解了神经网络的工作原理,并且也搭建了猫狗识别器。你尝试做了了一个不错的字符级RNN。你离建立终端只差一个pip install tensorflow命令了对吗?大错特错。

     

    如何优化深度学习模型

     

     

    深度学习的一个非常重要的步骤是找到正确的超参数,超参数是模型无法学习的。

    在本文中,我将向你介绍一些最常见的(也是重要的)超参数,这些参数是你抵达Kaggle排行榜#1的必经之路。此外,我还将向你展示一些强大的算法,可以帮助你明智地选择超参数。

    深度学习中的超参数

     

    超参数就像是模型的调节旋钮。

    如果您将AV接收机设置为立体声,那么配备低音扬声器的7.1级杜比全景声(Dolby Atmos)家庭影院系统将对你毫无用处,尽管它的超低音扬声器可以产生低于人耳可听范围的声音。

    如何优化深度学习模型

     

     

    同样,如果你将超参数关闭,带有万亿参数的inception_v3网络甚至不会让你在MNIST数据集上测试通过。

    所以现在,让我们然后在学会如何调“旋钮”之前先看看这些“旋钮”。

    学习率

     

    学习率可以说是最重要的超参数,粗略地说,它可以控制神经网络“学习”的速度。

    那么,为什么我们不把学习率设置得非常大,体验飙车的乐趣呢?

    如何优化深度学习模型

     

     

    事情不是那么简单。请记住,在深度学习中,我们的目标是尽量最小化损失函数。如果学习率太高,我们的损失函数将开始在某点来回震荡,不会收敛。

     

    如何优化深度学习模型

     

     

    如果学习率太小,模型将花费太长时间来收敛,如上所述。

    动量

     

    由于本文侧重于超参数优化,我不打算解释动量的概念。但简而言之,动量常数可以被认为是在损失函数表面滚动的球的质量。

    球越重,下落越快。但如果它太重,它可能会卡住或超过目标。

     

    如何优化深度学习模型

     

     

     

    丢弃

     

    如果你了解这个概念,我会直接带你去看Amar Budhiraja关于丢弃(dropout)的文章。

     

    如何优化深度学习模型

     

     

    但我们做一个快速复习,dropout是Geoff Hinton提出的一种正则化技术,它将神经网络中的激活函数随机地设置为0,概率为p。这有助于防止神经网络过拟合数据而不是学习它。

    p是一个超参数。

    架构——神经网络的层数,每层神经元的个数等

     

    另一个(最近的)想法是使神经网络的架构本身成为一个超参数。

    虽然我们通常不会让机器弄清楚我们模型的架构(否则AI研究人员会丢失他们的工作),但是神经架构搜索(Neural Architecture Search)等一些新技术已经实现了这个想法并取得了不同程度的成功。

    如果你听说过AutoML,那么Google基本上就是这样做的:将所有内容都设置为超参数,然后扔大量TPU在这个问题上让它自行解决。

    但是对于我们绝大多数只想在黑色星期五销售之后用经济型机器分类猫狗的人来说,现在是时候该弄清楚如何使这些深度学习模型真正起作用了。

    超参数优化算法

     

    网格搜索

    这是获得良好超参数的最简单方法。它实际上就是暴力解决。

    算法:从一组给定的超参数中尝试一堆超参数,看看哪种方法效果最好。

    优点:五年级学生都很容易实现,而且可以轻松并行化。

    缺点:正如你可能猜到的那样,它的计算成本非常高(因为所有暴力算法都是如此)。

    我是否应该使用它:可能不会。网格搜索非常低效。即使你想保持简单,你也最好使用随机搜索。

    随机搜索

    正如它的本意,随机搜索。完全随机化。

    算法:在一些超参数空间上从均匀分布中尝试一堆随机超参数,看看哪种方法效果最好。

    优点:可以轻松并行化。就像网格搜索一样简单,但性能稍好一点,如下图所示:

     

    如何优化深度学习模型

     

     

    缺点:虽然它提供了比网格搜索更好的性能,但它仍然只是计算密集型。

    我是否应该使用它:如果琐碎的并行化和简单性是最重要的,那就去吧。但是,如果你愿意花费时间和精力,那么通过使用贝叶斯优化,你的模型效果将大大提升。

    贝叶斯优化

    与我们迄今为止看到的其他方法不同,贝叶斯优化使用了算法的先前迭代的知识。使用网格搜索和随机搜索,每个超参数猜测都是独立的。但是,使用贝叶斯方法,每次我们选择并尝试不同的超参数时,表现都在一点点提升。

     

    如何优化深度学习模型

     

     

    (如果我告诉了你,深度学习不过是贝叶斯而已)

     

    贝叶斯超参数调整背后的想法历史悠久且细节丰富。所以为了避免太多坑,我会在这里给你一个要点。但如果你感兴趣,一定要仔细阅读高斯过程和贝叶斯优化。

    请记住,我们使用这些超参数调整算法的原因是,单独实际评估多个超参数选择是不可行的。例如,假设我们想要手动找到一个好的学习率。这将涉及设置学习率,训练模型,评估它,选择不同的学习率,再次训练你从头开始模型,重新评估它,并继续循环。

    问题是,“训练你的模型”可能需要几天时间(取决于问题的复杂性)才能完成。因此,在会议提交截止日期之前,您只能尝试一些学习率。而你知道什么,你甚至没有开始设置动量。糟糕极了。

     

    如何优化深度学习模型

     

     

     

    算法:贝叶斯方法试图建立一个函数(更准确地说,是关于可能函数的概率分布),用于估计模型对于某个超参数选择的好坏程度。通过使用这种近似函数(在文献中称为代理函数),您不必在设置、训练、评估的循环上花费太多时间,因为你可以优化代理函数的超参数。

    例如,假设我们想要最小化此函数(将其视为模型损失函数的代理):

     

    如何优化深度学习模型

     

     

    代理函数来自于高斯过程(注意:还有其他方法来模拟代理函数,但我将使用高斯过程)。就像我提到的那样,我不会做任何数学上的重要推导,但是所有关于贝叶斯和高斯的讨论归结为:

     

    如何优化深度学习模型

     

     

     

    公式看上去很复杂。但是,让我们试着理解它。

    左侧告诉你涉及概率分布(假设存在P)。在括号内看,我们可以看到它是P的概率分布,这是一个任意的函数。为什么?请记住,我们正在定义所有可能函数的概率分布,而不仅仅是特定函数。本质上,左侧表示将超参数映射到模型的度量的真实函数(如验证准确性,对数似然,测试错误率等)的概率为Fn(X),给定一些样本数据Xn等于右侧的式子。

    现在我们有了优化函数,就开始进行优化吧。

    以下是在开始优化过程之前高斯过程的样子☟

     

    如何优化深度学习模型

     

     

    在利用两个数据点迭代之前的高斯过程。

    使用你最喜欢的优化器(大佬们一般喜欢最大化预期改善),但其实只需跟着信号(或梯度)引导,你还没有反应过来的时候就已经得到局部最小值。

    经过几次迭代后,高斯过程在近似目标函数方面变得更好:

     

    如何优化深度学习模型

     

     

     

    在利用两个数据点迭代三次之后的高斯过程。

    无论你使用哪种方法,你现在都找到了代理函数最小化时的参数。那些最小化代理函数的参数居然是最优超参数(的估计)哦!好极了。

    最终结果应如下所示:

     

    如何优化深度学习模型

     

     

     

    在利用两个数据点迭代七次之后的高斯过程。

    使用这些“最佳”超参数你的神经网络上进行训练,你应该会看到一些改进。但是,你也可以使用这些新信息重新一次又一次地重做整个贝叶斯优化过程。你可以想跑多少次这一贝叶斯循环就跑多少次,但还是要谨慎行事。你实际上在“跑钱”。你不要忘了AWS又不是免费的。

    优点:贝叶斯优化比网格搜索和随机搜索提供更好的结果。

    缺点:并行化并不容易。

    我应该使用它吗:在大多数情况下,是的!唯一的例外是如果:

    • 你是一个深度学习专家,你不需要一个微不足道的近似算法帮忙。
    • 你拥有庞大的计算资源,并可以大规模并行化网格搜索和随机搜索。
    • 如果你是一个频率论者/反贝叶斯统计书呆子。

     

    寻找良好学习率的可选方法

     

    我们到目前为止看到的所有方法有一个隐含主题:自动化机器学习工程师的活儿。这确实很有用很厉害——直到你的老板听说了之后决定用4个RTX Titan卡取代你。呵呵。你本应该坚持用手动搜索的。

     

    如何优化深度学习模型

     

     

    不过不要担心啊,还是有些关于让研究者少干点活但是多拿点钱的活跃研究呢。其中一个效果非常好的想法是学习率范围测试,据我所知,这首先出现在Leslie Smith的论文中。

    这篇论文实际上是关于一种随时间调度(改变)学习率的方法。LR(Learning Rate,学习率)范围测试只是个作者一不小心遗落在一旁的大宝贝。

    当你使用那种学习速率可以从最小值取到最大值的学习速率计划时(例如循环学习速率或具有热重启动的随机梯度下降),作者建议在每次迭代之后将学习速率从小数值线性增加到大数值(例如,1e-7到1e-1),评估每次迭代时的损失,并在对数刻度上绘制损失(或测试误差,或准确度)与学习率的关系。你的图像看起来应该是这样的:

     

    如何优化深度学习模型

     

     

     

    如图所示,你可以设置学习率在最小和最大学习率之间变化,这可以通过在图像上肉眼观察最陡梯度区域来找到。

    Colab Notebook上画的LR范围测试图(CIFAR10上训练的DenseNet):

    Colab Notebook

    https://colab.research.google.com/gist/iyaja/988df5818fd887cc7542074ea2bfb74e/fastai-imagefolder-playground.ipynb

     

    如何优化深度学习模型

     

     

    在CIFAR10数据集上训练的DenseNet 201的学习率范围测试

     

    根据经验,如果你没有做任何花哨的学习率安排的话,那么只需将你的恒定学习率设置为低于绘图上最小值的数量级即可。在这种情况下大约就是1e-2。

    这种方法最酷地方在于,它很好用很省时省心省计算力,它几乎不需要任何额外的计算。

    其他算法——即网格搜索、随机搜索和贝叶斯优化——要求你运行与训练良好神经网络目标相关的整个项目。LR范围测试只是执行简单定期的训练循环,并保持跟踪一些变量。

    以下是使用最佳学习速率时大致可以获得的收敛速度(来自Notebook的示例):

    Notebook

    https://colab.research.google.com/gist/iyaja/ef385db236775f881af0056d1ae8c477/kernel303b922372-2.ipynb

     

    如何优化深度学习模型

     

     

    最佳学习率拟合的模型的损失与batch大小图

    LR范围测试已经由fast.ai团队实施过了。你一定要看看他们实现LR范围测试的库(他们称之为学习速率查找器)以及许多其他算法。

    对于更复杂的深度学习实践者

     

    如果你有兴趣,这儿还有一个纯pytorch编写的notebook实现了上述功能。这可能会帮助你更好地了解幕后训练流程:

    https://colab.research.google.com/gist/iyaja/f9fc63ef65b6cc74409dc635c2d80861/hyperparameter-optimization-pytorch.ipynb

    帮你省点力气

     

     

    如何优化深度学习模型

     

     

     

    当然,所有这些算法——尽管它们都很好——并不总是在实践中起作用。在训练神经网络时还有许多其他因素需要考虑,例如你将如何预处理数据,定义模型,你还需要真的搞定足够跑这一整个流程的计算力。

    Nanonets提供易于使用的API来训练和部署自定义深度学习模型。它能负责所有的繁重工作,包括数据扩充,转移学习,以及超参数优化!

    Nanonets在其庞大的GPU集群上使用贝叶斯搜索来找到正确的超参数集,你压根不用担心得在最新的显卡上再大花一笔钱啦。

    一旦找到最佳模型,Nanonets就会把它放在云端,以便你使用其Web界面测试模型,或使用两行代码将其集成到你的程序中。

    跟不完美模型说拜拜吧。

    结论

     

    在本文中,我们讨论了超参数和一些优化它们的方法。但这一切意味着什么?

    随着人们越来越努力地使AI技术民主化,自动超参数调整可能是朝着正确方向迈出的一步。它允许像你我这样的普通人在没有数学博士学位的情况下构建厉害的深度学习应用程序。

    虽然你可能会认为,让模型重度依赖于计算立会导致只有那些能够承受如此计算力的人群获得最好的模型,但像AWS和Nanonets这样的云服务有助于实现我们普通民众对强大机器计算力的访问、使深度学习更容易普及。

    但更重要的是,我们真正在这里做什么——用数学来解决更多的数学。这很有意思,不仅因为听起来很酷炫啦,还因为它真的很容易被错误解释。

     

    如何优化深度学习模型

     

     

    从打孔卡和excel表时代,到我们”优化优化函数的函数以优化函数“的时代,我们已经走过了漫长的道路。但是,我们依然无法建造能够自己“思考”的机器。

    这一点都不令人沮丧,因为如果人类用这么少的东西就能够做到这个高度的话,当我们的愿景变成我们实际可以看到的东西时,想象一下未来会怎样吧!

    我们坐在一张衬垫网椅上,盯着一个空白的终端屏幕——每个按键都能给我们一个可以擦干净磁盘的sudo指令。

    我们会整天坐在那里一动不动——因为下一个重大突破和我们可能只差一条pip install哦。

    相关报道:

    https://blog.nanonets.com/hyperparameter-optimization/

    展开全文
  • 全文共4431字,预计学习时长9分钟 深度学习是目前在实际数据科学应用中最流行的模型之一。从图像到文本,再到语音/音乐等领域,它都是一个有效的模型。随着使用量的上升,...我们将实现一个简单的深度学习模型...

    全文共4431字,预计学习时长9分钟

    深度学习是目前在实际数据科学应用中最流行的模型之一。从图像到文本,再到语音/音乐等领域,它都是一个有效的模型。随着使用量的上升,快速且可扩展地实现深度学习变得至关重要。Tensorflow等深度学习平台的兴起可以帮助简化开发人员的实现方式。

    在本文中,我们将学习深度学习的工作原理,并熟悉相关术语,例如反向传播和批量大小。我们将实现一个简单的深度学习模型 - 从理论到scratch实现 - 使用python预定义输入和输出,然后使用Keras和Tensorflow等深度学习平台实现相同的模型。

    我们使用Keras和Tensorflow 1.x和2.0编写了这个简单的深度学习模型,该模型具有三种不同级别的复杂性和易编码性。

    Scratch的深度学习实现

    一个简单的多层感知器有4个输入神经元,隐含层有3个神经元,输出层有1个神经元。我们有三个输入数据样本,用表示,三个期望输出数据样本,用表示。因此,每个输入数据样本都有4个特征。

    # Inputs and outputs of the neural net:import numpy as
     npX=np.array([[1.0, 0.0, 1.0, 0.0],[1.0, 0.0, 1.0, 1.0],[0.0, 1.0, 0.0, 
    1.0]])yt=np.array([[1.0],[1.0],[0.0]])

    该神经网络有4个输入神经元,1个隐含层有3个神经元,输出层有1个神经元

    图中 x(m)是X的1个样本,h(m)是x(m) 输入的隐含层输出,Wi和Wh为权重。

    神经网络(NN)的目标是为给定输入获得权重和偏差,NN提供期望输出。但是,我们事先并不知道什么是适当的权重和偏差,因此我们需要更新权重和偏差,使得NN、和期望的的输出之间的误差最小化。这种用迭代的方式最小化误差过程称为神经网络训练。

    假设隐含层和输出层的激活函数都是sigmoid函数。因此,

    神经网络的权值大小、偏差以及输入和输出之间的关系

    其中,激活函数是sigmoid函数,m是第m个数据样本, yp(m) 是NN输出。

    衡量NN输出与期望输出之间差异的误差函数可以用数学方式表示为:

    神经网络所定义的误差是平方误差

    上述NN的伪代码总结如下:

    用于神经网络训练的伪代码

    通过伪代码得出,我们需要计算误差(E)相对于参数(权重和偏差)的偏导数。利用微积分中的链式法则,表示如下:

    误差函数对权重的导数

    在此我们有两种方式可以用来更新反向路径中的权重和偏差(反向路径指更新权重和偏差,从而最小化误差):

    1. 使用训练数据的全部个样本

    2. 使用一个样本或一簇样本

    第一种方式的批量大小是。如果第二种方式使用一个样本来更新参数,则其批量大小是1。因此批量大小代表用于更新权重和偏差的数据样本数量。

    从上述神经网络的实现可以得出,关于参数的误差梯度是按符号计算的,其中具有不同的批量大小。

    如上述例子所示,基于scratch创建简单的深度学习模型,方法十分复杂。下一节将介绍如何通过深度学习框架实现可扩展且简单的模型。

    Keras、Tensorflow 1.x及2.0的深度学习实现

    在上一节中,我们运用链式法则计算了误差梯度参数。这不是一种简单或可扩展的方法。同时,我们会在每次迭代时评估偏导数,因此,尽管偏导数的值很重要,但不需要梯度符号。此时Keras和Tensorflow等深度学习框架可以发挥其作用。深度学习框架使用AutoDiff方法对部分梯度进行数值计算。如果你对AutoDiff不熟悉,那么StackExchange就是一个很好的例子。AutoDiff将复杂表达式分解为一组原始表达式,即最多由一个函数调用组成的表达式。由于已知每个单独表达式的区分规则,因此可以以有效的方式计算最终结果。

    我们在Keras、Tensorflow 1.x和Tensorflow 2.0中实现了三个不同级别的NN模型:

    1. 高级(Keras和Tensorflow 2.0):

    高级Tensorflow 2.0,批量大小1

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_HighLevel_batchsize1_train_on_batch.py

    2. 中级(Tensorflow 1.x和2.0):

    中级Tensorflow 1.x,批量大小1,

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_MediumLevel_batchsize1.py

    中级Tensorflow 1.x,批量大小N,

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_MediumLevel_batchsizeN.py

    中级Tensorflow 2.0,批量大小1,

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_MediumLevel_batchsize1.py

    中级Tensorflow 2.0,批量大小N

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_MediumLevel_batchsizeN.py

    3. 初级(Tensorflow 1.x):

    初级Tensorflow 1.x,批量大小N

    https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_LowLevel_batchsizeN.py

    代码片段:

    在高级实现中,基于model.train_on_batch运用keras和Tensorflow v 2.0实现模型:

    # High-Level implementation of the neural net
     in Tensorflow:model.compile(loss=mse,optimizer=optimizer)for _ in
     range(2000):for step, (x, y) in enumerate(zip(X_data,
     y_data)):model.train_on_batch(np.array([x]), np.array([y]))

    在Tensorflow 1.x的中级实现中,定义如下:

    E = tf.reduce_sum(tf.pow(ypred - Y, 2))optimizer =
     tf.train.GradientDescentOptimizer(0.1)grads =
     optimizer.compute_gradients(E, [W_h, b_h, W_o, b_o])updates =
     optimizer.apply_gradients(grads)

    以此确保在for循环中更新需要更新的变量。在中级实现中,梯度及其更新在for循环外部进行定义,内部则为迭代更新。在Tensorflow v 2.x的中级实现中,使用如下:

    # Medium-Level implementation of the neural net in Tensorflow#
    
     In for_loop
    
    with tf.GradientTape() as tape:   x =
     tf.convert_to_tensor(np.array([x]), dtype=tf.float64)   y =
     tf.convert_to_tensor(np.array([y]), dtype=tf.float64)   ypred =
     model(x)   loss = mse(y, ypred)gradients = tape.gradient(loss,
     model.trainable_weights)optimizer.apply_gradients(zip(gradients,model.t
    rainable_weights))

    在初级实现中,分别更新每个权重和偏差。在Tensorflow v 1.x初级实现中,定义如下:

    # Low-Level implementation of the neural net in Tensorflow:E =
     tf.reduce_sum(tf.pow(ypred - Y, 2))dE_dW_h = tf.gradients(E, [W_h])
    [0]dE_db_h = tf.gradients(E, [b_h])[0]dE_dW_o = tf.gradients(E, [W_o])
    [0]dE_db_o = tf.gradients(E, [b_o])[0]# In for_loop:evaluated_dE_dW_h =
     sess.run(dE_dW_h,                 feed_dict={W_h: W_h_i, b_h: b_h_i,
     W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T})            W_h_i =
     W_h_i - 0.1 * evaluated_dE_dW_h            evaluated_dE_db_h = 
    sess.run(dE_db_h,                             feed_dict={W_h: W_h_i,
     b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T})
                b_h_i = b_h_i - 0.1 * evaluated_dE_db_h            evaluated_dE_dW_o
     = sess.run(dE_dW_o,                             feed_dict={W_h: W_h_i,
     b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T})
                W_o_i = W_o_i - 0.1 * evaluated_dE_dW_o            evaluated_dE_db_o
     = sess.run(dE_db_o,                            feed_dict={W_h: W_h_i, b_h: b_h_i, 
    W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T})    
            b_o_i = b_o_i - 0.1 * evaluated_dE_db_o

    如初级实现所述,开发人员可以更好地控制数值运算和计算的每一步。

    上述所示,在Scratch的深度学习实现中,即便只是通过使用梯度符号计算建立一个简单的深度学习模型来更新权重和偏差并不是一种简单或可扩展的方法。而使用用于更新权重和偏差的稳定数值梯度计算AutoDiff,深度学习框架可以加速此进程。

    留言 点赞 关注

    我们一起分享AI学习与发展的干货
    欢迎关注全平台AI垂类自媒体 “读芯术”

    (添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

    展开全文
  • 深度学习模型测试方法总结

    千次阅读 2019-12-17 18:06:26
    深度学习模型测试的方法和标准整理 深度学习模型测试,是指系统性地对深度学习算法的可靠性、可移植性、效率进行评估。简单来说,算法测试主要做的是三件事:收集测试数据,思考需要什么样的测试数据以及数据的标注...

    深度学习模型测试的方法和标准整理

    深度学习模型测试,是指系统性地对深度学习算法的可靠性、可移植性、效率进行评估。简单来说,算法测试主要做的是三件事:收集测试数据,思考需要什么样的测试数据以及数据的标注;跑测试数据,编写测试脚本批量运行;查看数据结果,统计正确和错误的个数,计算准确率等相关指标,查看错误数据中是否有共同的特征。

    1相关术语
    1.1Accuracy(准确率)、Precision(精确率)、Recall(召回率)

    对于二值分类器,或者说分类算法,如分类猫和狗,分类性别男和女。TP、FP、TN、FN,即:True Positive, False Positive, True Negative, False Negative。预测值与真实值相同,记为T(True);预测值与真实值相反,记为F(False);预测值为正例,记为P(Positive);预测值为反例,记为N(Negative)。具体组合见图1.1的分类结果混淆矩阵:

                                              

                                                           图1.1分类结果混淆矩阵

    根据分类结果混淆矩阵可得:

    1. 准确率:Accuracy = (TP+TN)/(P+N) ,预测正确的样本(TP和TN)在所有样本中占的比例。在各类样本不均衡时,准确率不能很好表示模型性能,因为会出现大类准确率高,而少数类准确率低。这样情况下,需要对每一类样本单独观察。
    2. 精确率(查准率): Precision = TP/(TP+FP),即所有被预测为正例的样本中,多少比例是真的正例。
    3. 召回率(查全率): Recall = TP/(TP+FN),即所有真的正例中,多少比例被模型预测出来了。

    不同的问题中,有的侧重精确率,有的侧重召回率。对于推荐系统,更侧重于精确率。即推荐的结果中,用户真正感兴趣的比例。因为给用户展示的窗口有限,必须尽可能的给用户展示他真实感兴趣的结果。对于医学诊断系统,更侧重与召回率。即疾病被发现的比例。因为疾病如果被漏诊,则很可能导致病情恶化。精确率和召回率是一对矛盾的度量。一般来说精确率高时召回率往往偏低,而召回率高时精确率往往偏低。

    1.2 F1 Score

    精确率和召回率的调和平均。F1认为精确率和召回率同等重要。计算公式为:

                                          

                                                                  图1.2   F1 Score 计算公式

    1.3 可靠性 (reliability)、可靠性评估(reliability assessment)

    可靠性指在规定的条件下和规定的时间内,深度学习算法正确完成预期功能,且不引起系统失效或异常的能

    力。

    可靠性评估指确定现有深度学习算法的可靠性所达到的预期水平的过程。

    1.4 响应时间 response time

    在给定的软硬件环境下,深度学习算法对给定的数据进行运算并获得结果所需要的时间。

     

    2深度学习算法的可靠性指标体系

    基于深度学习算法可靠性的内外部影响考虑,结合用户实际的应用场景,深度学习算法的可靠性评估指标体系如图2.1所示,包含7个一级指标和20个二级指标。在实施评估过程中,应根据可靠性目标选取相应指标。

                                                        

     

     

                                                                        图2.1 深度学习算法的可靠性评估指标体系

    2.1 算法功能实现的正确性

    用于评估深度学习算法实现的功能是否满足要求,应包括但不限于下列内容:

    a) 任务指标:用户可以根据实际的应用场景选择任务相关的基本指标,用于评估算法完成功能的能力;

    示例:分类任务中的查准率、查全率、准确率等;语音识别任务中的词错误率、句错误率等;目标检测任务中的平均正确率等;算法在使用中错误偏差程度带来的影响等。

    b) 响应时间。

    2.2 代码实现的正确性

    用于评估代码实现功能的正确性,应包括下列内容:

    a) 代码规范性:代码的声明定义、版面书写、指针使用、分支控制、跳转控制、运算处理、函数

    调用、语句使用、循环控制、类型转换、初始化、比较判断和变量使用等是否符合相关标准或

    规范中的编程要求;

    b) 代码漏洞:指代码中是否存在漏洞。

    示例:栈溢出漏洞、堆栈溢出漏洞、整数溢出、数组越界、缓冲区溢出等。

    2.3 目标函数的影响

    用于评估计算预测结果与真实结果之间的误差,应包括下列内容:

    a) 优化目标数量:包括优化目标不足或过多。优化目标过少容易造成模型的适应性过强,优化目标过多容易造成模型收敛困难;

    b) 拟合程度:包括过拟合或欠拟合。过拟合是指模型对训练数据过度适应,通常由于模型过度地学习训练数据中的细节和噪声,从而导致模型在训练数据上表现很好,而在测试数据上表现很差,也即模型的泛化性能变差。欠拟合是指模型对训练数据不能很好地拟合,通常由于模型过于简单造成,需要调整算法使得模型表达能力更强。

    2.4 训练数据集的影响

    用于评估训练数据集带来的影响,应包括下列内容:

    a) 数据集均衡性:指数据集包含的各种类别的样本数量一致程度和数据集样本分布的偏差程度;

    b) 数据集规模:通常用样本数量来衡量,大规模数据集通常具有更好的样本多样性;

    c) 数据集标注质量:指数据集标注信息是否完备并准确无误;

    d) 数据集污染情况:指数据集被人为添加的恶意数据的程度。

    2.5 对抗性样本的影响

    用于评估对抗性样本对深度学习算法的影响,应包括下列内容:

    a) 白盒方式生成的样本:指目标模型已知的情况下,利用梯度下降等方式生成对抗性样本;

    b) 黑盒方式生成的样本:指目标模型未知的情况下,利用一个替代模型进行模型估计,针对替代模型使用白盒方式生成对抗性样本;

    c) 指定目标生成的样本:指利用已有数据集中的样本,通过指定样本的方式生成对抗性样本;

    d) 不指定目标生成的样本:指利用已有数据集中的样本,通过不指定样本(或使用全部样本)的方式生成对抗性样本。

    2.6 软硬件平台依赖的影响

    用于评估运行深度学习算法的软硬件平台对可靠性的影响,应包括下列内容:

    a) 深度学习框架差异:指不同的深度学习框架在其所支持的编程语言、模型设计、接口设计、分布式性能等方面的差异对深度学习算法可靠性的影响;

    b) 操作系统差异:指操作系统的用户可操作性、设备独立性、可移植性、系统安全性等方面的差异对深度学习算法可靠性的影响;

    c) 硬件架构差异:指不同的硬件架构及其计算能力、处理精度等方面的差异对深度学习算法可靠性的影响。

    2.7 环境数据的影响

    用于评估实际运行环境对算法的影响,应包括下列内容:

    a) 干扰数据:指由于环境的复杂性所产生的非预期的真实数据,可能影响算法的可靠性;

    b) 数据集分布迁移:算法通常假设训练数据样本和真实数据样本服从相同分布,但在算法实际使用中,数据集分布可能发生迁移,即真实数据集分布与训练数据集分布之间存在差异性;

    c) 野值数据:指一些极端的观察值。在一组数据中可能有少数数据与其余的数据差别比较大,也称为异常观察值。

     

    3执行测试

    该部分主要考虑如何具体进行测试,

    3.1 测试用例的选择

    选择测试用例时,要考虑以下问题:

    1. 项目落地实际使用场景,根据场景思考真实的数据情况,倒推进行测试数据收集。
    2. 模型的训练数据有多少,训练数据的分布情况,训练数据的标注是否准确。
    3. 模型的输入和输出,图片,csv还是文本,语音等等。
    4. 算法的实现方式。
    5. 选择模型评价指标。
    6. 评价指标的上线要求。
    7. 项目的流程,数据流。
    8. 算法外的业务逻辑。

    3.2 测试中可能出现的一些问题

    实际项目中不仅是有算法相关代码还会有工程代码。如模型加载,入参的处理,异常判断,数据库相关,日志相关等等。所以项目测试,还会有工程代码功能的测试。

    举例一些常见的:

    1,有的依赖包在不同环境版本不一致,导致结果不一样。

    2,科学计算错误

    3,工程代码问题

    4,模型效果差

    科学计算即数值计算,是指应用计算机处理科学研究和工程技术中所遇到的数学计算问题。比如图像处理、机器学习、深度学习等很多领域都会用到科学计算。

    一张图片输入,卷积神经网络顺序通常为:输入-卷积层-池化层-全连接层-输出。深度学习预测的过程就有大量的数值计算。可能就会碰到一些边界数值情况,导致计算出错。

    3.3 模型结果评估

    3.3.1单个标签分类的问题

    对于单个标签分类的问题,评价指标主要有Accuracy,Precision,Recall,F-score,PR曲线,ROC和AUC。

    如果对于每一类,若想知道类别之间相互误分的情况,查看是否有特定的类别之间相互混淆,就可以用混淆矩阵画出分类的详细预测结果。对于包含多个类别的任务,混淆矩阵很清晰的反映出各类别之间的错分概率,如下图:

                       

     

                             

                                                                           图3.1 分类结果混淆矩阵

    上图表述的是一个包含20个类别的分类任务,混淆矩阵为20*20的矩阵,其中第i行第j列,表示第i类目标被分类为第j类的概率,越好的分类器对角线上的值更大,其他地方应该越小。

     

    3.3.2 ROC曲线与AUC指标

    以上的准确率Accuracy,精确度Precision,召回率Recall,F1 score,混淆矩阵都只是一个单一的数值指标,如果想观察分类算法在不同的参数下的表现情况,就可以使用一条曲线,即ROC曲线,全称为receiver operating characteristic。

    ROC曲线可以用于评价一个分类器在不同阈值下的表现情况。在ROC曲线中,每个点的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR),描绘了分类器在True Positive和False Positive间的平衡,两个指标的计算如下:

    TPR=TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。

    FPR=FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例,FPR越大,预测正类中实际负类越多。

    ROC曲线通常如下

                                             

     

                                                                                     图 3.2 ROC曲线

     

    3.3.3 图像生成评价指标

    当需要评估一个生成模型的性能的时候,有2个最重要的衡量指标。

    (1) 确定性:生成模型生成的样本一定属于特定的类别,也就是真实的图像,而且必须要是所训练的图片集,不能用人脸图像训练得到了手写数字。

    (2) 多样性:样本应该各式各样,如果用mnist进行训练,在没有条件限制的条件下,应该生成0,1,2,3…,而不是都是0,生成的各个数字也应该具有不同的笔触,大小等。除此之外,还会考虑分辨率等。

     

    4参考资料

    1、也许这有你想知道的人工智能 (AI) 测试.https://blog.csdn.net/lhh08hasee/article/details/100534862

    2、《人工智能深度学习算法评估规范》,中国人工智能开源软件发展联盟标准http://www.cesi.cn/images/editor/20180703/20180703174359294.pdf

    3、深度学习模型评估指标,https://www.cnblogs.com/tectal/p/10870064.html

    4、模型评估与调优,https://machine-learning-from-scratch.readthedocs.io/zh_CN/latest/%E6%A8%A1%E5%9E%8B%E8%AF%84%E4%BC%B0%E4%B8%8E%E6%A8%A1%E5%9E%8B%E8%B0%83%E4%BC%98.html#header-n408

    5、AI模型的黑盒测试与白盒测试实践,http://mini.eastday.com/mobile/190924064408433.html

     

    展开全文
  • 常用的深度学习模型

    万次阅读 多人点赞 2018-07-16 14:04:41
    神经网络有时可以与乐高积木进行比较,在那里你可以构建几乎任何简单到复杂的结构,你的想象力可以帮助你构建。 ...深度相机:RGB-D相机,例如手势识别、骨骼跟踪、增强现实等 视觉导航:视觉...

    神经网络有时可以与乐高积木进行比较,在那里你可以构建几乎任何简单到复杂的结构,你的想象力可以帮助你构建。

    计算机视觉任务类型

    目标识别:物体识别是得到一个原始的图像,任务是给出目标位置和识别物体属于哪个类,另外还有人脸识别,行为识别等

    三维重建:摄像机标定,立体匹配

    图像描述:根据给定图像,给出描述文字等

    深度相机:RGB-D相机,例如手势识别、骨骼跟踪、增强现实等

    视觉导航:视觉SLAM,例如ORB-SLAM

    图像分割:图像分割是一项复杂的任务,目标是将每个像素映射到它的合法类,例如语义分割、实例分割等

    深度学习模型

    现在我们已经了解了什么是高级体系结构,并探索了计算机视觉的任务,下面列出最重要的体系结构及其描述:

    AlexNet

    AlexNet是深度学习的先驱之一——Geoffrey Hinton和他的同事们引入的第一个深层架构。它是一个简单而又强大的网络架构,它为深度学习的突破性研究铺平了道路。下面是作者提出的体系结构的表示。

    AlexNet看起来是一个包含卷积层和池化层的简单架构,顶部是全连接层。区分这个模型的是它执行任务的规模和使用GPU进行训练。在20世纪80年代,CPU被用于训练神经网络。而AlexNet仅通过使用GPU提升了10倍的训练速度。

    虽然现在有点过时了,但是AlexNet仍然在所有任务上应用深度神经网络的起点,无论是计算机视觉还是语音识别。

    Paper     Code

    VGG Net

    VGG网络是由牛津大学视觉图形组的研究人员引入的(因此有了VGG这个名字)。这个网络的特点是它的金字塔形状,最接近图像的底层是宽的,而最上层是深的。

    如图所示,VGG包含随后的卷积层和池化层。池层负责使层更窄。在他们的论文中,他们提出了多种这种类型的网络,随着架构深度的变化。

    VGG的优势是:
    对于特定任务的基准测试来说,这是一个非常好的体系结构。
    此外,VGG的预培训网络在互联网上是免费的,所以它通常用于各种应用程序的开箱即用。

    另一方面,它的主要缺点是,如果从头开始训练,训练速度非常慢。即使是在一个像样的GPU上,它也需要一个多星期才能投入使用。

    Paper     Code

    GoogleNet

    GoogleNet(或先启网络)是谷歌研究人员设计的一类架构。谷歌是2014年ImageNet的赢家,在那里它被证明是一个强大的模型。

    在这种体系结构中,随着深入(它包含22层,而VGG有19层),研究人员还提出了一种叫做初始模块的新方法。

    如上所述,它与我们前面看到的顺序体系结构相比发生了巨大的变化。在单层中,存在多种类型的“特征提取器”。这间接地帮助网络更好地执行任务,因为训练网络本身在解决任务时有很多选择。它既可以选择对输入进行卷积,也可以直接将其池化。

    最终的架构包含了这些叠在一起的初始模块的多个。甚至在GoogleNet中,训练也略有不同,因为大多数最顶层都有自己的输出层。这种细微差别有助于模型更快地收敛,因为对于层本身有联合训练和并行训练。

    GoogleNet的优点是:
    谷歌的火车比VGG快。
    一个预先训练好的GoogleNet的大小比VGG要小。VGG模型可以有>500 MB,而GoogleNet只有96 MB

    GoogleNet本身并没有直接的缺点,但是它提出了对体系结构的进一步修改,从而使模型执行得更好。其中一个变化被称为Xception网络,在这个变化中,inception模块发散的极限(如上图所示,是GoogleNet中的4)增大了。它现在理论上可以是无限的(因此被称为极端的开端!)

    Paper     Code

    ResNet

    ResNet是真正定义了深度学习体系结构的深度架构之一。残差网络(简称ResNet)由多个后续残差模块组成,这些模块是ResNet体系结构的基本构件。残差模块的表示如下

    简单地说,一个残差模块有两个选项,要么它可以对输入执行一组函数,要么它可以跳过这一步。

    现在类似于GoogleNet,这些残差模块相互堆叠,形成一个完整的端到端网络。

    ResNet还介绍了一些新技术:
    使用标准的SGD而不是花哨的自适应学习技术。这是与一个合理的初始化函数,保持训练完整
    对输入进行预处理的更改,其中输入首先被划分为补丁,然后进入网络

    ResNet的主要优点是,可以使用数百甚至数千个残差层来创建网络并进行训练。这与通常的顺序网络稍有不同,在顺序网络中,随着层数的增加,性能升级会减少。

    Paper     Code

    ResNeXt

    ResNeXt据说是目前最先进的对象识别技术。它构建在inception和resnet的概念之上,以实现一个新的和改进的体系结构。下图总结了ResNeXt模块的剩余模块的外观。

    Paper     Code

    R-CNN

    基于区域的CNN架构被认为是应用于目标检测问题的所有深度学习架构中最有影响力的一个。为了解决检测问题,RCNN做的是尝试在图像中出现的所有对象上绘制一个边界框,然后识别图像中的对象。它的工作原理如下:

    Faster-RCNN结构

    Paper     Code

    YOLO

    YOLO是目前最先进的实时系统,建立在深度学习的基础上,以解决图像检测问题。如下图所示,首先将图像划分为定义好的边界框,然后并行运行所有这些框的识别算法,以识别它们属于哪个对象类。在识别了这些类之后,它继续聪明地合并这些框,以形成围绕对象的最佳边界框。

    所有这些都是平行进行的,所以它可以实时运行;每秒处理多达40幅图像。

    尽管与RCNN相比,它的性能有所下降,但它仍然具有实时性的优势,可以在日常问题中使用。下面是YOLO的架构表示

    Paper     Code

    SqueezeNet

    snizenet体系结构是一个更强大的体系结构,在移动平台等低带宽场景中非常有用。这个架构只占用了4.9MB的空间,而《盗梦空间》占用了~100MB的空间!这种剧烈的变化是由一种叫做消防模块的特殊结构引起的。下图是消防模块的表示。

    snizenet的最终架构如下:

    Paper     Code

    SegNet

    SegNet是一种用于解决图像分割问题的深度学习架构。它由一系列的处理层(编码器)和相应的一组解码器组成,按像素分类。下面的图片总结了赛格网的工作。

    SegNet的一个关键特征是它保留了分割图像中的高频细节,因为编码器网络的合用索引连接到解码器网络的合用索引。简而言之,信息传递是直接的而不是卷积的。SegNet是处理图像分割问题的最佳模型之一

    Paper     Code

    GAN

    GAN是一种完全不同的神经网络体系结构,其中一个神经网络用来生成一个全新的图像,这个新的图像没有出现在训练数据集中,但足够真实地出现在数据集中。例如,下图是对甘斯的分解。在本文中,我已经介绍了GANs是如何工作的。如果你感到好奇,请仔细阅读。

    Paper     Code

     

    展开全文
  • 深度学习模型提升性能的策略

    万次阅读 2020-04-28 14:12:45
    缺乏数据的问题是,我们的深度学习模型可能无法从数据中学习模式或功能,因此它可能无法在未看到的数据上提供良好的性能。 我们可以利用数据增强技术来代替花费数天时间来收集数据。 数据增强是在不实际收集...
  • Datawhale干货作者:黄星源、奉现,Datawhale优秀学习者本文从构建数据验证集、模型训练、模型加载和模型调参四个部分对深度学习模型训练的全流程进行讲解。一个成熟合格的深...
  • 深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数、模型在训练集和测试集拟合效果、交叉验证、激活函数和优化算法的选择等。 那如何对我们自己的模型进行判断呢?请看详细解析以及案例实战!
  • 深度学习模型加速方法

    千次阅读 2019-10-22 16:46:58
    深度学习模型加速方法 ...
  • 深度学习模型部署技术方案

    千次阅读 2020-07-12 17:13:55
    深度学习模型部署技术方案训练好的深度学习模型如何进行部署的相关技术方案1 什么是模型部署?2 数据科学项目整个开发流程3 使用flask 将 Keras深度学习模型部署为Web应用程序 训练好的深度学习模型如何进行部署的...
  • 最近在一个自然语言处理方面的项目,选用的深度学习模型有两个,一个是CNN+LSTM模型,一个是GRU模型,这两个模型在GPU服务器上训练好了,然后需要使用Java调用这两个模型,CNN+LSTM使用TensorFlow写的,GRU是用Keras...
  • 深度学习模型转换

    千次阅读 多人点赞 2019-05-24 20:44:24
    再比如某机构主要以TensorFlow作为基础的深度学习开发框架,现在有一个深度算法项目,需要将其部署在移动设备上,并希望使用速度较优的ncnn前向框架,以观测变现等等。传统地我们可能需要用tf重写Caff...
  • 基于web端的深度学习模型部署

    千次阅读 2020-11-07 19:34:02
    下面以ResNet50预训练模型为例,旨在展示一个轻量级的深度学习模型部署,写一个较为简单的图像分类的REST API。主要技术框架为Keras+Flask+Redis。其中Keras作为模型框架、Flask作为后端Web框架、Redis则是方便以...
  • 深度学习模型在移动端的部署

    万次阅读 多人点赞 2019-04-27 14:47:28
    而深度学习也成了机器学习领域内的热点,现在人工智能、大数据更是越来越贴近我们的日常生活,越来越多的人工智能应用开始在移植到移动端上,那能够快速高效地在移动端部署深度学习模型就变成亟待解决的问题了。...
  • 深度学习模型训练全流程!

    万次阅读 多人点赞 2020-06-11 20:00:00
    ↑↑↑关注后"星标"Datawhale每日干货 &每月组队学习,不错过Datawhale干货作者:黄星源、奉现,Datawhale优秀学习者本文从构建数据验...
  • 这是计算机视觉发展史上的转折点,因为它表明,深度学习模型能够以前所未有的精度完成非常困难的任务。 但是你是否知道 AlexNet有6.2千万训练参数? 另一个广为人知的模型 VGGNet 则有1.38亿训练参数,是AlexNet ...
  • 深度学习 模型 剪枝

    万次阅读 多人点赞 2018-12-19 18:58:40
    参考文章: ...为了在手机上加速运行深度学习模型,目前实现的方式基本分为两类:一是深度学习框架层面的加速,另一个方向是深度学习模型层面的加速。 深度学习模型的加速又可以分为采用新的卷...
  • 深度学习模型训练流程

    千次阅读 2018-02-02 19:02:31
    工作中训练了很多的深度学习模型,目前到了上升到方法论的角度来看了。日常工作中有的人可能已经在遵循方法论做事,可能自己没有注意,有的人可能没有遵循方法论在做事,虽然可能最后的结果差不多,但花费的时间和...
  • Spring Boot部署深度学习模型(Java/Pytorch)

    千次阅读 多人点赞 2020-06-26 22:11:13
    在之前训练好深度学习模型后,遇到了部署模型的一些问题,首先现有的很多业务都是java实现的,例如预算控制,用户限额等,图片识别直接和这些系统交互会造成一定的代码侵入,以及多个系统出现冗余,所以考虑使用...
  • 理解深度学习模型复杂度评估

    千次阅读 2020-04-25 04:11:21
    目录一.神经网络复杂度简述两个指标复杂度对模型的影响二.全连接层复杂度计算三.卷积神经网络复杂度计算单个卷积层的时间复杂度(计算量)单个卷积层的空间复杂度...在深度学习神经网络模型中我们也通过: 计算量/...
  • 主流的25个深度学习模型

    万次阅读 2019-08-19 15:50:22
    深度学习发展很快,新的模型层出不穷,所以要想全部列举是不可能的。另外,很多模型都是这里提出很长很长时间了,所以也不是说“老”模型就没用,大家学习的话,还是要全面而深入的学习。 1、 Feed forward ...
  • 深度学习-30: 基础CNN模型和深度学习模型。神经网络是人工智能启蒙,卷积神经网络是人工智能的里程碑,卷积神经网络最终演化出各种使用的基于卷积神经网络的人工智能算法。目前基于卷积神经网络的人工智能算法逐渐和...
  • 深度学习模型融合stacking

    千次阅读 2019-03-19 11:03:00
    当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题。或者你可以把他们都用起来,就进行模型融合。我主要使用stacking和blend方法。先把代码贴出来,大家可以看一下。 1 import numpy as np 2...
  • 近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势...
  • 向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx本文主要用于记录DSSM模型学习期间遇到的问题及分析、处理经验。先统领性地提出深度学...
  • 文章目录前言如何加速模型收敛增大batch sizeLinear scaling learning ratelearning rate warmupZero γγγNo bias decay实验如何提高模型的准确率Cosine Learning Rate DecayLabel SmoothingMixup Training参考...
  • 如何画出漂亮的深度学习模型图?

    千次阅读 2020-07-23 15:27:32
    最近作报告时画图感觉画的不太美观,刚刚发现了一个不错的素材方便画深度学习模型图。 在Github上找到了一个不错的内容。作者介绍了有个ML visual的利器,提供一份32页的PPT模型图素材,可以直接使用画出你要的机器...
  • 租用GPU服务器跑深度学习模型心得

    千次阅读 多人点赞 2021-01-05 15:34:16
    相信很多刚接触人工智能学习的人会遇到这个问题,当时用笔记本的CPU在跑一个Unet,19个epoch要跑半个小时,电脑内存也爆满。 先跑一个简单的网络试试看,比如Unet Unet代码可以在unet代码下载 用自己的轻薄本CPU...
  • 最近正鼓捣树莓派,想在树莓派上跑深度学习,有些坑与技巧,在此记录一下: 树莓派的python的pip源比较慢,没找到国内的用于树莓派的镜像,命令行加快网速的工具proxychains; darknet在CPU上是单线程的,很坑,...
  • 深度学习模型压缩方法综述(三)

    万次阅读 多人点赞 2017-07-24 22:43:37
    目前在深度学习领域分类两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了追求更高的性能;另一派为工程派,旨在将算法更稳定、高效的落地在硬件平台上,效率是其追求的目标。复杂的模型固然具有更...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386,594
精华内容 154,637
关键字:

深度学习模型