bayesian optimization
几乎所有的机器学习算法都包括一些超参数。这些参数和常规参数不同,它们不是模型的一部分,不会在模型拟合中被自动调整,需要在额外的步骤中进行调整。常见的超参数有逻辑回归模型中的正则项lambda、支持向量机中的C项、基于树的算法中树的数量(如,随机森林、梯度提升机)。
一般常见的超参数优化方法主要有:
网格搜索
随机搜索
基于梯度的优化
贝叶斯优化
在这4中方法之中,我们尝试了网格搜索,随机搜索和贝叶斯优化。我们发现贝叶斯优化是最高效的,可以自动达到最优。
为什么贝叶斯优化比网格搜索和随机搜索更高效呢?
在寻找最优超参数值的时候,需要提前确定一些条件。首先,也是最重要的,任何算法都需要一个目标函数,目标是使得目标函数达到最大值;或者一个损失函数,目标是使得损失函数达到最小值。然后,需要确定搜索范围,一般通过上限和下限来确定。可能还有一些对于算法的参数,比如搜索的步长。
网格搜索可能是应用最广泛的超参数搜索算法了,因为它确实很简单。网格搜索通过查找搜索范围内的所有的点,来确定最优值。它返回目标函数的最大值或损失函数的最小值。给定较大的搜索范围,以及较小的步长,网格搜索是 ...
使用Neo4j对共同基金进行分析
就在前几天,我和一位投资风险经理谈了他的团队正在研究的一个数据问题,他想知道Neo4j是否能提供帮助。假设你有大约20,000个共同基金和ETFs,你想要追踪他们是如何衡量基准的,例如标准普尔500指数的回报率。比如说,2000个不同的基准,你想要跟踪它五年内的每一天的情况。这就有20000∗5∗252∗200020000 * 5* 252 * 200020000∗5∗252∗2000 共500亿数据点。如果我们使用关系数据库的话,这是一个很大的连接表。我们如何使用neo4j建立一个有效模型?
为了简单起见,假设我们只想追踪一个度量,这个度量是r2r^2r2。当我们比较共同基金和基准的价值变化时,变化轨迹有多近?r2r^2r2总是在0和1之间。0值意味着基准与共同基金无关,而1值意味着有关。那么我们怎么来建立模型呢?
我们的第一个选项是将该基金作为一个节点建模,基准作为一个节点,并通过他们对应的日期进行关系连接,其中日期和r2r^2r2作为关系的属性,如上所示。我们将有20,000个基金节点,2000个基准节点,以及500亿条关系。这是一个非常稠密的图。
首先我们尝试一个查询,看看 ...
使用Neo4j进行航班搜索
我想我将利用这个机会来解释为什么我喜欢这篇博文中的graphs。我将试着解释如何从graph的角度看问题,让你找到创造性的解决方案。我们这篇文章的背景是航班搜索,但我们真正的任务是如何快速有效地绘制graph,这样我们就可以将我们的知识应用到其他问题上。
之前,我给你们展示了不同的航空数据模型。当涉及到graph建模时,要认识到是没有一个完全正确的方法,需要根据你的查询目的构建模型。最优模型严重依赖于您想要查询的目的。为了证明这一点,我将向你们展示另一种方法来模拟航空公司的航班数据,并对航班搜索进行优化。如果你还记得,我们最后的模型是:
我们所做的最后一个建模优化是创建一个“目的地”节点,在特定的一天从同一个机场到同一个目的地的航班。后来,我了解到,世界上只有大约40k的商业机场,而neo4j支持64k关系类型。这是有用的,因为一旦一个节点拥有超过40个关系,而不是将关系存储在列表中,它们就会按类型和方向被分解并存储在组中。这些是graph中所谓的“密集”节点。如果我们知道关系的类型和方向,我们就可以在这些关系中指定方向,甚至不用考虑其他关系。记住,我们的遍历速度取决于我们要遍历多 ...
使用Neo4j对航空公司的航班进行建模
最近的项目需要利用到图数据neo4j,这篇主要针对航空公司的航班进行建模,根据所查询的目的合理构建一个关于航班的模型.
如果您访问过我所教过的Neo4j数据建模类,您一定听过我说“您的模型依赖于您的数据和查询”大约一百万次。让我们更深入地了解这意味着什么,看看如何在Neo4j中模拟航空公司的飞行数据。
那么我们的数据是什么呢?机场和航班数据。一开始我们的模型:
这个模型感觉有点偏离。航班的概念被表达为一种关系,但如果我们想把客户或员工与航班关联起来,或者说由于天气或任何问题,航班被改道到另一个机场,很明显由上面的模型是很难实现我们的需求的。考虑到我们对数据的一些查询,航班实际上应该是一个实例或事件,因此是一个node,所以让我们来试试这个模型:
你可能在Nicole White的graphgist或Mahesh Lal的Neo4j图数据建模书中看到过这个模型。
这不是一个坏的模型,但是我们会有非常密集的节点。想想亚特兰大、北京、迪拜、伦敦希斯罗机场,甚至是当地的芝加哥奥黑尔机场。这些将是非常大的节点,而且,若想使用少量的属性来过滤的话,很显然,没有一个快速的方法得到我们想要的数据 ...
如何用深度学习处理结构化数据
这篇博客主要关注的是深度学习领域一个并不非常广为人知的应用领域:结构化数据。本文作者为旧金山大学(USF)在读研究生 Kerem Turgutlu。
使用深度学习方法按照本文所介绍的步骤处理结构化数据有这样的好处:
1.快
2.无需领域知识
3.表现优良
在机器学习/深度学习或任何类型的预测建模任务中,都是先有数据然后再做算法/方法。这也是某些机器学习方法在解决某些特定任务之前需要做大量特征工程的主要原因,这些特定任务包括图像分类、NLP 和许多其它「非常规的」数据的处理——这些数据不能直接送入 logistic 回归模型或随机森林模型进行处理。相反,深度学习无需任何繁杂和耗时的特征工程也能在这些类型的任务取得良好的表现。大多数时候,这些特征需要领域知识、创造力和大量的试错。当然,领域专业知识和精巧的特征工程仍然非常有价值,但这篇文章将提及的技术足以让你在没有任何领域知识的前提下向 Kaggle 竞赛的前三名看齐,参阅:http://blog.kaggle.com/2016/01/22/rossmann-store-sales-winners-interview-3rd-plac ...
一个绘制neo4j数据模型工具-Arrows
Arrows是一个基于javascript的绘制neo4j数据模型的工具.可以使用它绘制整个关系图谱的数据模型,并进行演示。需要注意的是: 不支持中文.
最后呈现的效果如下所示:
Arrows页面相当简洁,如下:
主要的功能有:
使用+Node创建一个新的node
沿着node的边拖动得到节点与节点之间的关系
可以拖动得到带有关系边的node,也可以连接已有的两个node构成关系
双击node或者边可以对node或者关系进行编辑,比如命名或者增加属性(以’key’:"value"形式))
有两种不同的风格:一种是粗大风格,另一种时细小风格
可以对构建好的数据模型保存成svg格式或者截图保存.
支持导出成cypher语句并在neo4j终端运行
新建一个node
新建一个节点,可以通过+Node键增加没有带边的node,相互独立,也可以通过拖动已有的node构建一个相连并且有方向的node.比如:
通过+Node键
通过拖动已有node
拖动node,我们需要把鼠标位于node的边缘,如图所示:
拖动之后,会得到一个带有关系指向的node,如图所示 ...
Densely Connected Convolutional Networks
这篇文章是CVPR2017的oral,非常厉害。文章提出的DenseNet(Dense Convolutional Network)主要还是和ResNet及Inception网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效!众所周知,最 近一两年卷积神经网络提高效果的方向,要么深(比如ResNet,解决了网络深时候的梯度消失问题)要么宽(比如GoogleNet的 Inception),而作者则是从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。
先列下DenseNet的几个优点,感受下它的强大:
1.减轻了vanishing-gradient(梯度消失)
2.加强了feature的传递
3.更有效地利用了feature
4.一定程度上较少了参数数量
在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,尽管这些算法的网络结构有差别,但是核心都在于:create sho ...
使用Neo4j和Cypher快速批量更新图数据的5个建议
当通过程序向图数据库中写入大量数据的时候,你会希望它能够高效的处理。
下面这些方式不是十分有效:
将值直接写入到语句中,而不是通过参数的方式
每一个更新都通过一个Transaction发送一个请求
通过一个Transaction发送大量的单个请求
生成一个巨大复杂的语句(几百行),然后通过一个Transaction进行提交
在一个Transaction中,发送一个巨大的请求,会导致OOM错误
正确的方法
你需要构造尽可能小的请求,并且语句格式固定(这样可以利用缓存),然后通过参数方式进行使用。
每一个请求可以只修改一个属性,或者修改整个子图(上百个节点),但是它的语句结构必须是一致的,否则就不能使用缓存。
UNWIND
为了实现这个目标,你只需要在你单次请求的前面加上一个UNWIND语句。UNWIND会将大量的数据(高达10k或者50k条实体)分散成一行一行的,每一行都包含一次更新所需要的全部信息。
你添加一个{batch}参数,并且将它的值设置成一个Map列表,其中可以包含你的数据(10k或者50k条)。这些数据会被打包成一个完整的请求,并且符合语法结构,还 ...
TensorFlow学习笔记——深度学习中的epochs,batch_size,iterations详解
深度学习框架中涉及很多参数,如果一些基本的参数如果不了解,那么你去看任何一个深度学习框架是都会觉得很困难,下面介绍几个新手常问的几个参数。
batch
深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。 ...
Snapshot Ensembles Train 1, get M for free
Snapshot Ensembles(Huang et al,2017)是最近提出的一种聪明的技术,该方法训练一个单一的模型,使用cosine annealing learning rate schedule方法,首先使用一个较大学习率并快速收敛到一个局部最小值。然后保存模型参数,接着重新使用一个较大的学习率开始进行优化,然后重复这些步骤M次。最后,所有保存的模型Snapshot都是整体的。
摘要
众所周知,使用多个深度网络模型进行融合比单个深度网络模型更加准确和稳健,但是,独立训练多个深度网络,会存在巨大的工程量以及需要大量的时间问题. 论文作者通过训练一个神经网络来得到近似融合的效果,沿着优化路径收敛到几个局部最小值并保存模型参数.为了快速收敛,作者使用了cyclic learning rate schedules ,既简单又高效.在CIFAR-10,CIFAR-100和SVHN上都取得了最好的结果。图1很直观的展示了作者的思路.
Snapshot Ensembles
我们知道如果单个模型之间有较低的test error又保持多样性,则进行融合会得到更好的结果。在单次训练中,S ...