作者:薰风
AutoML&NAS已经发展的十分迅速,本文主要翻译自一篇比较新的综述论文(AutoML: A Survey of the State-of-the-Art),文章对主要对原文的结构和主要内容进行了梳理和解读。
数据完了特征,特征也完了,就要生成模型并设置超参数了。
模型选择有两种两方法:
传统模型选择
NAS
传统模型选择,就是把一些传统的机器学习算法,比如SVM,KNN,决策树等等全拉过来,然后选择效果最好的。(其实门道很多,不知道之后能不能填坑)
NAS则是重点部分,本文将从两个方面介绍NAS:
模型结构最优化
生成出模型参数的方法
NAS通过选择和组合一组在搜索空间中预先定义的基本操作生成神经网络模型。
这些操作可以大致分为卷积、池化、连接、逐元素相加(elemental addition)、跳跃连接(skip connection)等。
逐元素相加和跳接最早可以追溯到ResNet。
这些操作的参数通常也是根据经验预先确定的。例如,卷积的核大小通常设置为3×3和5×5,也有一些人工设计的卷积核,如深度可分离卷积(depthwise separable convolution)、扩张卷积(dilation convolution也有叫空洞卷积的)、可变形卷积(deformable convolution)等。
而模型结构大体可以分为4类:整体结构,基于cell的结构,层级结构,基于网络态射的结构
最直观的办法就是生成整个神经网络,
Neural architecture search with reinforcement learning.
Efficient neural architecture search via parameter sharing
整体生成链式结构的例子(右上角估计凉了是截图问题……)
作为一个整体生成的链结构神经结构的例子。图中的每个节点表示一个具有特定操作的层,例如N1表示层1。每个节点的操作从搜索空间中选择,包括卷积或最大值池化等。有向的边表示信息流。例如,左图中N2到N3的边表示N3接收N2的输出作为输入。
上图就是两个不同的网络,都是链结构的,右边的相对左边的就更复杂,因为右边有很多诸如跳接或者多分枝网络。
整体结构的缺点:
当网络层数很深的时候,整体结构就需要很长时间去一点点搜索(因为整个网络的每个小部分都要单独搜索)。除此之外,这种耗时且精细的搜索就会导致网络结构的“过拟合”,即搜出的网络结构只能针对训练时的数据集,应对更大的数据集或者其他任务时就没有足够的可移植性。(这点很要命的,考虑到现在都是拿CIFAR10做搜索)
为了解决上述的问题,受到ResNet和DenseNet的启发,
Efficient neural architecture search via parameter sharing
Learning transferable architectures for scalable image recognition
Practical block-wise neural network architecture generation
等工作提出了基于cell的结构,基于cell的结构首先搜索cell的结构,然后再堆叠这些cell已生成最终的网络,这和之前提到的链式结构类似。
这种设计方法可极大地降低搜索的复杂度,举个例子:
假设现在有6种预定义的基本操作,对第 j 层
而对于基于cell的网络结构来说,一个cell有 B 个节点,一个节点由两个子节点(预定义操作)组成。由于每个结点的决策是相互独立的,节点有
除此之外,cell的功能也是有先验的,比如卷积 cell (convolution cell)和削减cell(reduction cell),输出会将空间分辨率除以2.
上图是结合卷积cell和削减cell生成了完整的网络结构。假设这里一个cell有8个节点,那么最终的搜索空间就是
除此之外,对于整体结构,每个层是一个操作。而对于基于cell的结构,每个层是很复杂的cell结构。也就是说,如果我们在一个小数据集上搜索出了一个比较小的网络,而需要迁移到更大的数据集上时,整体结构不好迁移,cell结构多怼几个cell就好了。
Efficient neural architecture search via parameter sharing
Learning transferable architectures for scalable image recognition
Practical block-wise neural network architecture generation
Designing neural network architectures using reinforcement learning,
Large-scale evolution of image classifiers
回顾上边这几篇基于cell结构的论文,我们可以发现cell结构(逻辑上的)的两个层级:
cell层找每个node的操作和链接。网络层控制分辨率变化。
不过前期的基于cell的模型的效果有点弟弟,因为对网络层级的搜索不到位,就是无脑堆堆堆
就像上面figure7所示的一样。为了联合学习可重复的cell和网络的结构,Auto DeepLab定义了一个网络层级结构的泛化表示,如下figure8。
层级结构和基于cell的结构很类似,区别在于生成cell的方法。
基于cell的结构只有两个层级,即基本操作组成cell,cell拼成网络。而层级结构则有很多个层级,每个层级都可以由一些cell组成。高层的cell就由底层的cell迭代组合而成( 禁 止 套 娃 )
Hierarchical representations for efficient architecture search
图上如Figure9所示,第一层级是基础的操作,比如1×1卷积,3×3卷积/最大值池化。
这些基础的组件组成了第二层级的cell。之后这些第二层的cell又作为基础操作生成第三层级的cell,以此类推……最高层级的cell就是整个结构的有个motif(图案?这个不知道怎么翻译……)
除此之外,一个高阶cell可以用一个可学习的邻接上三角矩阵G定义,
和基于Cell的结构相比,层级结构更加灵活,可以学习更加复杂和多变的拓扑结构。
基于Network Morphism(NM)的结构,可以将已经存在的神经网络结构中的信息迁移到一个新的神经网络,也就是说其可以对现在表现良好的网络进行更新,而不是从头搜索一个神经网络。当然,新网络的性能是要比旧网络好的,至少也不必旧的网络差。
Net2net: Accelerating learning via knowledge transfer
Network morphism
Efficient multi-objective neural architecture search via lamarckian evolution.
在定义了网络结构的表示方法之后,下一步就是从很大的搜索空间里搜索最优的网络结构。
这样的过程可以看作是对每个节点的操作和连接进行优化
我们可以认为,最终的网络结构也是一个“超参数”,而搜索网络结构和找学习率和batchsize一样,是超参数优化。
如果我们面前摆着很多超参数,那最直观的方法就是把所有参数都拿过来试试。
不过遇到参数过多(连续)的情况,一个个试是不现实的,那么就把他们的取值范围列出来,间隔相同的长度画一个网格,之后尝试里面的每一个点,这就是网格搜索。
而随机搜索(论文名Random Search for Hyper-Paramerter Optimization)认为,不是所有的超参数都那么重要,以至于你需要一个个搜。因此不如在整个空间里随机取样。
除此之外,为了找出超参数空间中表现良好的区域,
A practical guide to support vector classification
建议在整个空间先做一个比较粗粒度的网格搜索,认为那些表现较好的格点的附近是更好的区域,之后再在这些区域做更细的网格搜索。
Maximum-likelihood estimation with a contracting-grid search algorithm
提出了一个收缩网格搜索算法,其首先计算网格中每个点的似然值,之后一个新的网格就在最大似然值的中心生成。新网格中的点间距减少到旧网格的一半。对于固定次数的迭代重复此过程以收敛到局部最小值。
尽管随机搜索在经验上和理论上都比网格搜索好用,但是有个问题就是我们很难确定搜出来的点是不是效果最好的。只能认为搜的时间越长,越可能是最优解。
为了解决这个问题
Hyperband: A novel bandit-based approach to hyperparameter optimization
提出了Hyperband算法,Hyperband在资源和性能之间做了权衡。具体做法是一次训一堆,给效果好的模型资源更多。
之前说过,NAS的老祖宗Neural architecture search with reinforcement Learning 用的就是RL,其通过RL训练了一个RNN生成网络的结构。
在此之后
Designing neural network architectures using reinforcement learning
的MetaQNN提供了一个“元建模”算法(meta modeling algorithm),该算法使用Q-learning和ε-greedy探索策略和经验回放(experience replay),顺序地搜索神经结构。
总的来说,如之前的Figure1(下图)所示,基于RL的方法由两个部分组成:
控制器(如RNN),用于生成子网络奖励网络(Reward Network),用于评价生成的子网络。并根据子网络的“奖励”(如准确率)更新控制器的参数。
基于RNN和MetaQNN的两个工作都在宾州树库和CIFAR10数据集上达到了SOTA。但他们共同的问题就是太慢,太消耗资源了,大的令人发指(即使较低的MetaQNN也是100GPU days量级)
由于上述两个算法使用的是整体结构,而整体结构的搜索和训练都相当耗时,所以这两个基于RL的算法都不是那么高效。为了进一步提升效率,很多基于RL的算法改用了基于Cell的结构。包括(括号内为模型名)
(NASNet)Learning transferable architectures for scalable image recognition.
(BlockQNN)Practical block-wise neural network architecture generation.
(ENAS)Efficient neural architecture search via parameter sharing,
其中ENAS是基于cell结构的强者,用一块GPU只要十小时就可以搜索出结果了。
ENAS的创新点在于,其每个子网络看作搜索空间的子图,如此一来子模型共享参数,无需从头训练。
演化算法是一种基于种群的泛启发式优化算法。据说这是一种对各种问题都比较鲁棒的算法。
基于演化算法的网络编码表达不一样,所以对应工作的基因操作也不一样。具体有两种编码方式:
1. 直接编码
直接编码是一种广泛使用的方法,它显式地指定了网络表现型(phenotype)。
比如,
Genetic CNN
使用了一种二进制编码表示网络结构,比如“1”表示两个节点是相连的。这种二值编码的优势是易于执行,但计算的空间是节点的平方。更恐怖的是,节点的数目在一开始就是定死的。
A genetic programming approach to designing convolutional neural network architectures.
使用了笛卡尔遗传规划(Cartesian Genetic Programming, CGP),把网络描述为非循环图.有关CGP的知识可以参考(两篇文章同意作者,文章都是零几年的):
Cartesian genetic programming
Redundancy and computational efficiency in cartesian genetic programming
而下文,
Large-scale evolution of image classifiers.
就是把结构用图编码,点是3阶的张量or激活值,边是恒等映射or卷积等操作。
Neuroevolution of Augmenting Topologies(NEAT)
也是一种直接编码结构,把所有节点和边编码到了DNA里。
2. 间接编码
间接编码规定生成规则构建网络,允许网络结构的紧凑表示。
Cellular Encoding(CE)将一系列神经网络编码成一组基于简单图语法的标记树。原论文:
Cellular encoding as a graph grammar,
而最近四篇工作
Efficient multi-objective neural architecture search via lamarckian evolution,
Convolution by evolution: Differentiable pattern producing networks,
Deep clustered convolutional kernels,
Evolving multimodal controllers withhyperneat
也使用了间接编码,比如上述的第一篇,就使用了function(个人认为这里是“功能”)进行编码。每个网络用功能保留网络表型算子编码,保证子网络不比亲代网络差。
一个基本的演化算法包括以下四步:选择,交叉,突变,更新。
这一步是从所有生成的网络中选择一部分进行交叉。有三种选择单个网络的策略:
Fitness Selection:所有子网络被选择的概率是适应度(Fitness Value)在所有群体适应度之和的比例。即
Rank Selection:和第一种类似,但概率和相对排名有关,而不是绝对的值
Tournament Selection:是基于EA(演化算法)的NAS中最常用的选择策略。在每一轮种,首先在所有子网络中随机选择k(锦标赛大小)个个体。之后最优的个体就有概率 p 被选中,而对第二名的个体,概率就是 p×(1-p),以此类推……以下是使用Tournament Selection的几篇工作:
Hierarchical representations for efficient architecture search
Large-scale evolution of image classifiers
Regularized evolution for image classifier architecture search
Efficient multi-objective neural architecture search via lamarckian evolution
经过选择的每两个个体都会生成一个新的后代,后代继承了部分亲代的基因信息。这就模拟了生物学中交配的过程。而交叉的方法也根据编码的不同而不同。
对于二进制编码,网络被编码为了一个线性的bit串,因此两个亲代可以通过一点或多点交叉来结合。不过有的时候这种一个个点变动的行为会损害有用的信息。因此Genetic CNN,交叉的单位是一个由部分bit串组成的stage。
而对于Cellular Encoding(CE),一个随机选择的子树从一个父树中被切割,并替换另一个父树的子树。
NEAT,执行基于历史标记的人工配对,允许它添加新的结构而不丢失哪个基因是哪个的整个模拟。
当基因信息被遗传给下一代时,基因突变也会发生。下面是三种不同的突变形式
点突变:随机翻转每一个bit
A genetic programming approach to designing convolutional neural network architectures
Genetic CNN
连接突变:下文有两个突变方法
改变两层之间是否连接在两个节点/层之间添加/删除跳接。
Evolving deep neural networks
自定义突变:
Large-scale evolution of image classifiers
预定义了一组突变操作子,包括改变学习率和滤波器的size,移除跳接等等
虽然突变的过程可能看起来像一个错误,会导致网络结构的破坏和功能的丢失,但是探索更多的新结构和确保多样性。
上述步骤完成后,会生成许多新的网络。通常情况下,由于计算资源有限,需要删除一些网络。
Large-scale evolution of image classifiers
随机选出两个子网络,其中最差的那一个立即从种群中剔除
Regularized evolution for image classifier architecture search
移除的是最老的。
下面的三个工作,每隔一定时间删除所有网络
A genetic programming approach to designing convolutional neural network architectures.”
Evolving deep neural networks.
Genetic CNN
而下文
Hierarchical representations for efficient architecture search
谁都不删,整个种群随着时间推移慢慢生长。
BO建立目标函数概率模型,然后利用该模型选择最有希望的超参数,最后根据真实目标函数对选择的超参数进行评价。
这样做的优势在于,每一轮的网络信息都被记录在了整个概率空间当中,这样即使之前的网络被弃用,它的信息也依然通过更新概率分布得到保留。
而且,直接建立超参数到目标分数的数学映射是很帅的一件事儿。
序列模型优化(Sequential model-based optimization,SMBO)是贝叶斯优化的一种简洁形式。下面是SMBO的伪代码流程
下面用人话解释一下,
从搜索空间
其中, D 是一个由数据对
而
而模型 M 则负责拟合这个数据集 D
于是呢,就生成了一堆新的超参数,这些超参数服从模型 M 的分布,并且被一个预定义的采集函数(acquisition function) S 顺序选择。而这个采集函数 S 可以看作难搞的目标函数 f 的廉价近似
顺带一提,有4种不同的采集函数:
基于改进的(improvement-based policies)策略
乐观策略
基于信息的策略
组合采集函数(portfolios of acquisition functions)
而根据概率模型的不同,贝叶斯最优化(BO)可以被分为以下三种:
高斯过程(Gaussian Processes,GPs)
Practical bayesian optimization of machine learning algorithms
树Paezen估计量(Tree Parzen Estimators,TPE)
Making a science of model search: Hyperparameter optimization in hundreds of dimensions for vision architectures
随机森林(Random Forests)
Sequential model-based optimization for general algorithm configuration,
上表是一些BO算法的开源库,可以看出基于高斯过程的BO是最有名的。
即使目标函数是随机的、非凸的、甚至非连续的,贝叶斯优化算法也是有效的,但是呢碰到深度学习问题,BO可能就有点不行了。
除此之外,虽然Hyperband(见网格/随机搜索的最后)这类本身就做了资源性能权衡的模型可以有限资源内收敛,但我们并不知道这些收敛结果到底是不是最优的。
为了解决上述问题,
BOHB: Robust and efficient hyperparameter optimization at scale
提出了Bayesian Optimization-based Hyperband (BOHB)。BOHB算法在SVM,神经网络和深度强化学习都可以使用。
而一个更快的BO算法,名为FABOLAS,它是之前BOHB的快速版本,大概能快10到100倍。
尽管之前所有的搜索方法都可以自动生成网络结构,也都可以达到SOTA的水平,但是他们还是太慢了。因为之前的方法大多使用离散的方法搜索网络,而且把整个HPO(超参数优化)问题看作一个黑盒问题,因此需要多次消耗大量的计算资源。
DARTS: Differentiable architecture search.
Convolutional neural fabrics
Connectivity learning in multi-branch networks
Differentiable neural network architecture search,
Gradient-based hyperparameter optimization through reversible learning,
Hyperparameter optimization with approximate gradient
等文章就尝试解决离散和黑盒优化问题。特别是DARTS,它在搜索空间内做的是连续且可微分的搜索,这是由一个softmax函数软化离散的超参数超参数决策实现的:
其中
基于梯度下降的办法节省时间,但搜索空间和GPU占用呈现线性关系,搜索空间变大则GPU占用必然变大。再上图Figure13中,边上共有三种不同的操作,为了提高效率,只对最高权重的操作会被重新训练,
为了节约资源消耗,
PROXYLESSNAS: DIRECT NEURAL ARCHITECTURE SEARCH ON TARGET TASK AND HARDWARE
提出了一种新的通道层级剪枝方法(path-level pruning method),一开始设置一个大网络,逐步去掉没用的部分。(不过这个大网络也占地方)
sharpDARTS: Faster and More Accurate Differentiable Architecture Search
则解决了大网络的问题。其中采用了一个通用的、平衡的、一致的设计,即SharpSepConv块。
他们也提出了可微分超参网格搜索(Differentiable Hyperparameters Grid Search)和超立方搜索空间(HyperCuboid search space)。相较于DARTS快了50%,且精度也有较大提升。
一旦我们生成了一个网络,那么就要评价这个网络好不好。
一个直观的方法就是把这个网络拉出来训一训,从最终的训练结果确定可以不可以拿来用。但这种方法也是最花费时间和计算资源的。
为了加速模型评价的过程,研究者们采取了如下几种办法:
训练时间与数据集大小和模型大小相关,所以可以从这两个方向入手。
一方面,我们可以减少数据集中图片的数量以及图片的分辨率(那个快速贝叶斯优化FABLOAS用的就是这种办法)
另一方面,可以减少模型的大小,比如每层使用更少的滤波器(减少每个卷积层输入输出通道数)
Learning transferable architectures for scalable image recognition
Regularized evolution for image classifier architecture search.
两个工作就用了这种办法。
Multi-Fidelity Automatic Hyper-Parameter Tuning via Transfer Series Expansion
则采用了类似于集成学习的方法,提出了Transfer Series Expansion(TSE),简单的说就是对一个子网络看多种低保真度策略(比如不同的分辨率),避免某个低保真度的模型效果特别差导致的误杀。
Towards automated deep learning: Efficient joint neural architecture and hyperparameter search
这篇工作则验证了,只要训练时间足够长,那么就不需要训练太长时间(emmmm有点绕)
老祖宗论文(RNN+RL的那篇论文)每次训完的网络就直接扔掉了,新的网络要从头训练,才花费了这么多资源。因此,如果使用迁移学习的技术,把之前训练过的网络用起来也能加速搜索过程。
Transfer learning with neural automl,
就是用之前任务的知识加速网络设计。
而ENAS则在子网络之间共享权重,比之前的老祖宗快1000倍。
而一些基于网络态射的算法也继承了之前架构的权重,比如↓
Net2net: Accelerating learning via knowledge transfer
Network morphism
基于代理人的方法是另一个近似黑盒函数的有效工具,以下三篇是代理人方法的有关论文。
Surrogate benchmarks for hyperparameter optimization.
An evaluation of adaptive surrogate modeling based optimization with two benchmark problems
Efficient benchmarking of hyperparameter optimizers via surrogates,
总的来说,如果我们能找到个不错的近似,那么先近似后优化比从头优化快得多。
PNAS(原文Progressive neural architecture search)用了代理人模型控制搜索方式,比ENAS能看更多模型。
不过,如果优化的空间过大,代理人模型就遭不住了。
早停本来是一个解决过拟合的办法,却也可以用来减少学习时间。
早停法最直观的问题是,要停多“早”?如何科学“早停”?
比如可以提前通过停止预测在验证集上表现不佳的评估模型来加快速度。
Learning curve prediction with bayesian neural networks
Peephole: Predicting network performance before training
Speeding up automatic hyperparameter optimization of deep neural networks by extrapolation of learning curves,
上面三篇就是解决科学早停问题的,而且看起来十分玄学。
比如最后一篇,它提出了一种学习曲线模型,该模型是从文献中选取的一组参数曲线模型的加权组合,拿这个组合预测最终网络的效果。
在这种玄学论文的基础上,
Early stopping without a validation set,
提出一种基于快速计算梯度的局部统计数据的早停方法,它不再像以前的方法那样依赖于验证集,而是允许优化器充分利用所有的训练数据。
NAS是最近很火的研究主题,而且涉及到非常多的算法(之前提到的那些,五花八门)。
为了帮助大家更好地归纳理解NAS,我们将热门的NAS算法分为了四类:
随机搜索(RS),强化学习(RL),演化算法(EA),梯度下降(GD)
之后必须注意,这些模型报告的结果直接比较会非常不公平。就拿搜索出来网络的效果,比如CIFAR10分类的准确度举例子,这些模型的效果其实非常接近,而且也都算是SOTA了。而且我们也知道,不同的数据增广等等Trick也会影响模型的最终效果,因此,准确率这个参数看看就好。
还有花费时间举例,一百个GPU跑一天显然和一个GPU跑一天不一样,所以这里引入 GPU Days去衡量不同算法的准确率,假设由N个GPU,跑起来花了D天,那么GPU Days = N×D。
但是, GPU Days也只是个相对精准的量,因为不同模型部署的GPU型号也不一样。
最终我们整理出了不同NAS算法的图表如上所示。可以得出的结论是:
实际上CIFAR10这种数据集上效果很接近,谁也干不过谁。基于梯度下降的方法是最快的基于EA的普遍耗时,因为评估所有子网络太难了。比较有趣的是,就是随机搜索也可以得到不错的结果。
尽管现在已经有了很多开源的AutoML管道,比如TPOT和Auto-Sklearn
TPOT👉 Automating Biomedical Data Science Through Tree-based Pipeline Optimization
Auto-Sklearn👉Efficient and robust automated machine learning
不过上述的工作也不能自动收集数据,也囿于计算资源不能做什么自动化的特征工程。
不过长远来看,我们的终极目标就是将机器学习的每个流程全都自动化,并将其放入一个完整的系统。
尽管NAS总是可以找到比手工设计效果好的模型,但是现在也没有人科学/正式地证明为什么在某个地方选择某个操作会比其他的好很多。
比如BlockQNN在最后采用的是Concat操作而不是逐元素加,5×5的卷积也相比其他更少见。但是人们对这些结果的解释都是主观和直觉性的。
因此AutoML的可解释性也是一个重要的研究方向。
可复现性一直是ML领域的老大难问题,AutoML也不例外。
特别是NAS的研究,因为很多算法的源码无法下载,或者即使提供了源码,结果仍然不可复现(或者需要很长的时间搜索)。
而NASBench(NAS-Bench-101: Towards Reproducible Neural Architecture Search)缓解了不可复现性的问题,其提供了一个表格,里面有423624种神经网络在标准数据集上(CIFAR10)的结果。
当前的搜索空间碍于人们对神经网络编码的预定义,会遇到以下三个缺点:
不同工作对网络的编码不能通用搜索空间的原子是预定义的操作层(卷积,池化),则无法出现崭新的操作层(比如人们提出空洞卷积和深度可分离卷积)搜索空间上网络结构也有人为的先验,很新颖的模型结构也无法发现(跳接,Concat等结构)。
现在NAS的研究到部分都在CIFAR10上。当然,现在已经有更多的工作去研究NAS+目标检测和语义分割了
Nas-fpn: Learning scalable feature pyramid architecture for object detection,
Auto-deeplab:Hierarchical neural architecture search for semantic image segmentation
Nas-unet: Neural architecture search for medical image segmentation,
探索NAS在其他领域上的应用也是可行的研究方向。
一旦一个高质量的AutoML系统被实现,那么终生学习就不远了。
首先,这个系统应该可以有办法运用之前的先验知识解决新的问题(Learn to learn),以便将其运用在更多的跨学科领域中。
而最近已经有一些工作使用元学习技术去加速NAS了
SMASH: ONE-SHOT MODEL ARCHITECTURE SEARCH THROUGH HYPER-NETWORKS
另一方面,如果我们可以自动地持续获取数据,那么模型就可以进行持续地增量学习(Incremental learning)。
这个时候,在接受新数据同时,避免旧数据灾难性遗忘也需要研究。
LWF(Learning without forgetting)以及其基础上的ICARL(ICARL:Incremental classifer and representation learning)就是解决灾难性遗忘问题的。
欢迎社会各界加入『运筹OR帷幄』算法知识星球!
随着算法相关专业热度的提升,考研读博、留学申请、求职的难度也在相应飙升,『运筹OR帷幄』建立了【算法社区】知识星球,涵盖运筹学、数据科学、人工智能、管理科学、工业工程等相关专业,集结社区30W专业受众的力量,提供给大家一个共同的学习交流平台,结交志同道合的伙伴。
# 加入知识星球,您将收获以下福利 #
依托『运筹OR帷幄』30w+专业受众和30+细分领域硕博微信群的算法技术交流
与国内外Top名校教授|博士和名企研发高管一起交流算法相关技术干货
海量学界|业界(独家内推)招聘|实习机会发布,申请|求职面试经验交流
数学模型|算法|论文|学习资料分享与提问,倡导同行交流,寻找志同道合的“队友”
每月开展一次“人气话题”和“人气回答”评选,百元红包奖励分享和互动
每月一次“领读人”带队Paper|教学视频|原创技术推文等线上Meetup小组学习
享受『运筹OR帷幄』各大城市线下Meetup免费入场资格,拓展人脉
文章作者:薰风
联系客服