复杂度

经典分类模型(七):ResNext(2017)

拈花ヽ惹草 提交于 2019-12-17 01:26:31
Aggregated Residual Transformations for Deep Neural Networks----2017ResNext Abstract 我们提出了一种用于图像分类的简单, 高度模块化 的网络体系结构。我们的网络是通过 重复构建模块 来构建的,该模块聚合具有相同拓扑的一组转换。我们的简单设计导致了同类的多分支架构,仅需设置几个超参数。 此策略提供了一个新维度,我们将其称为“基数”(转换集的大小),它是深度和宽度维度之外的一个重要因素。 在ImageNet-1K数据集上,我们根据经验表明,即使在保持复杂性的限制条件下, 增加基数也可以提高分类精度 。此外,当我们增加容量时,增加基数比深入或更广泛更有效。我们的模型名为 ResNeXt ,是我们进入2016年ILSVRC分类任务的基础,我们获得了第二名。我们进一步在ImageNet-5K集和COCO检测集上对ResNeXt进行了研究,其结果也比ResNet同类要好。该代码和模型可以在线公开获得1。 1.Introduction 视觉识别的研究正在经历从“功能工程”到“网络工程”的转变[25、24、44、34、36、38、14]。与传统的手工设计特征(例如,SIFT [29]和HOG [5])相反,神经网络从大规模数据中学习的特征[33]在训练过程中所需的人力最少,并且可以转移到各种识别任务中[7,10

2018-8-10考试 T3. 朝暮(akekure)

岁酱吖の 提交于 2019-12-16 21:20:45
题目大意: 有$n$个点和$m$条边的图($n - 1 \leq m \leq n + 5$),每个点要么黑要么白,两个黑点不可以相邻,问方案数 题解: 可以发现当图为一棵树的时候只需要一个树形$DP$ $$令f_{i,j}表示在第i个点,它的状态为j(1为黑,0为白)$$ $$f_{i,0}=\prod\limits_{j为i的儿子}(f_{j,0}+f_{j,1})(因为它的儿子没有限制,可以黑可以白)$$ $$f_{i,0}=\prod\limits_{j为i的儿子}f_{j,0}(它的儿子有限制,必须为白)$$ 再来考虑不为树的情况,可以发现这个图最多有$6$条返祖边,我们可以暴力枚举这几条边两端的情况,这样复杂度是$O(4^{m-n+1}\times n)$。 明显是不行的,可以发现两端为黑是一定不可能的,这样复杂度成为了$O(3^{m-n+1}\times n)$。 看来可以的,但是遍历图的常数太大,还是过不了,考虑优化。 发现其实对于一条边,可以变成只处理其中的一个点,这样就只有两种状态了,一种是这个点白点,另一个点就无限制;另一种是这个点为黑点,另一个点就是白点,复杂度就成了$O(2^{m-n+1}\times n)$,轻松$AC$ 卡点: 1.考试时复杂度为$O(3^{m-n+1}\times n)$ C++ Code: #include <cstdio>

拆分复杂度(三):拆分路由

旧城冷巷雨未停 提交于 2019-12-14 09:38:17
场景 大多数前端开发者在开发应用时,习惯了在一个路由配置文件中大量的引入组件和配置组件,但当路由多了,就会变得不可维护,尤其在pc端比较明显,可能涉及到10 的业务模块,每个业务模块都涉及了3-5个路由地址,甚至更多。因此按照业务拆分路由是我们降低复杂度的必然方式。 备注:本文分享的是你的router使用的为react-router这个库,版本3.2.1 原来的版本 缺点:当分业务之后,每个业务都有很多子路由,并且因为对应的组件一般都是不同的,要都维护在一个文件中,文件会比较大,不方便对应和查看。 function RouterConfig() { return ( <Router history={hashHistory}> <Route path="login" component={Login} /> <Route path="/" component={Main}> <IndexRoute component={ApplyList} /> <Route path="index" component={Index} /> <Route path="apply-list" component={ApplyList} /> </Route> </Router> ); } export default RouterConfig; 在每个feature中定义自己的路由 目录结构

Factorization Machine 学习笔记

我是研究僧i 提交于 2019-12-14 07:22:42
FM 的 优点: 解决了特征稀疏的问题,能在非常系数数据的情况下进行预估。 解决了特征组合的问题,研究了特征与特征之间的向量,不像LR线性回归那样没有组合 FM使一个通用模型,适用于大部分场景,而其他因式分解模型只能用于一些输入数据比较固定的情况 训练速度快,线性复杂度是线性的,优化效果很好 一般的线性回归: 考虑了特征组合: 缺点:复杂度太高,复杂度n^2,wij只能在xi,xj不同时为0的情况下训练,特征稀疏的情况下,大多数情况下xi,xj大多数情况下为0,训练不充分 FM的推导: 引入一个变量 V i V_i V i ​ ,让 V i V_i V i ​ 等于 V i = ( v i 1 , v i 2 , v i 3 , . . . , v i k ) T V_i = (v_{i1},v_{i2},v_{i3},...,v_{ik})^T V i ​ = ( v i 1 ​ , v i 2 ​ , v i 3 ​ , . . . , v i k ​ ) T 所以当 i =1或者n时: V 1 = ( v 11 , v 12 , v 13 , . . . , v 1 k ) T V_1 = (v_{11},v_{12},v_{13},...,v_{1k})^T V 1 ​ = ( v 1 1 ​ , v 1 2 ​ , v 1 3 ​ , . . . , v 1 k ​ )

350. 两个数组的交集 II

旧巷老猫 提交于 2019-12-13 21:08:54
ID: 350 TITLE: 两个数组的交集 II TAG: Java,Python,Map 方法一:哈希映射 前面的问题 349. 两个数组的交集 ,我们使用 set 来实现线性时间复杂度。在这里,我们需要使用 HashMap 来跟踪每个数字出现的次数。 我们先在 HashMap 记录一个数组中的存在的数字和对应出现的次数。然后,我们遍历第二个数组,检查数字在 HashMap 中是否存在,如果存在且计数为正,则将该数字添加到答案并减少 HashMap 中的计数。 检查数组的大小并对较小的数组进行哈希映射是一个小细节,当其中一个数组较大时,会减少内存的使用。 算法: 如果 nums1 元素个数大于 nums2 ,则交换数组元素。 对于 nums1 的每个元素,添加到 HashMap m 中,如果元素已经存在则增加对应的计数。 初始化 k = 0 ,记录当前交集元素个数。 遍历数组 nums2 : 检查元素在 m 是否存在,若存在且计数为正: 将元素拷贝到 nums1[k] ,且 k++ 。 减少 m 中对应元素的计数。 返回 nums1 前 k 个元素。 vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { if (nums1.size() > nums2.size()) { return intersect

架构学习笔记

こ雲淡風輕ζ 提交于 2019-12-11 13:31:03
架构设计的主要目的是为了解决软件系统复杂度带来的问题 当我们对这样一个系统进行架构设计的时候,首先应识别其复杂度到底体现在哪里。 复杂度来源: 高性能 单机性能,集群性能 高可用 计算(轮询,分发)的高可用,存储的高可用 高扩展 提炼出一个“抽象层”和一个“实现层”,依赖接口,不要依赖具体实现 低成本 低成本与高性能相冲突 安全 功能安全,常见的 XSS 攻击、CSRF 攻击、SQL 注入、Windows 漏洞、密码破解等 架构安全 防火墙 规模 功能越来越多,导致系统复杂度指数级上升 数据越来越多,系统复杂度发生质变 架构设计的三个原则 1,合适原则 人力物力,合适优于业界领先 2,简单原则 简单优于复杂 3,演化原则 版本迭代,演进,演化优于一步到位 架构设计流程 1,排除法识别复杂度 对于架构师来说,关注的不是一天的数据,而是 1 秒的数据,即 TPS 和 QPS 2,设计架构的备选方案 3,详细方案设计 高性能数据库集群 1,读写分离 2,分库分表 3,NoSQL 高性能缓存架构 1,更新锁 对缓存更新操作进行加锁保护,保证只有一个线程能够进行缓存更新 2,后台更新 后台线程除了定时更新缓存,还要频繁地去读取缓存(例如,1 秒或者 100 毫秒读取一次),如果发现缓存被“踢了”就立刻更新缓存,这种方式实现简单,但读取时间间隔不能设置太长,因为如果缓存被踢了

分块入门

北城以北 提交于 2019-12-11 12:11:12
分块就是乱搞(确信 啥是分块 分块本质就是优雅的暴力,通过预处理和根号平衡(玄学地)让复杂度降低 比如我们考虑一个 线段树裸 题: 区间加,区间查询, \(n<=1e5\) 显然暴力的做法是 \(n^2\) 的,那么我们有没有什么优化方法呢? 我们可以将整个序列分为若干块,提前预处理出每个块的和,每次修改如果包含一个整块就直接打标记,非整块范围就暴力修改 时间复杂度 假设我们将 \(k\) 个元素分成一块,那么将一共分出 \(\frac{n}{k}\) 个块 对于修改和查询操作:整块 \(O(1)\) 标记或查询,散块暴力修改,那么一次操作复杂度最高为 \(O(\frac{n}{k}+k)\) 根据均值不等式,当 \(\frac{n}{k}=k\) 时, \(\frac{n}{k}+k\) 最小,也就是说当 \(k=\sqrt{n}\) 时总复杂度最低为 \(O(n\sqrt{n})\) 虽然相比 \(n^2\) 很优秀,但是为啥我不写线段树呢??? 相比其他数据结构优势 众所周知,线段树维护的信息需要能够区间快速合并,但是分块由于过于暴力,可以忽略这个条件 如这道例题: 区间加,区间小于 \(k\) 的个数 线段树已经去世,但是分块仍然可以胜任: 预先将每个块内数字排序,对于修改操作,显然不会影响整块的有序性,对于散块我们可以暴力重构,复杂度 \(O(\sqrt{n}logn)\

分布式系统与架构

落爺英雄遲暮 提交于 2019-12-10 11:29:57
1. 分布式系统架构有哪些优势? 1)增大系统容量 2)加强系统可用性 3)因为模块化,所以系统模块重用度更高 4)因为软件模块化被拆分,开发和发布速度可以并发而变得更快 5)系统扩展性更高 6)团队协作流程也会得到改善 2. 分布式系统架构有哪些劣势? 1)架构设计变得复杂(尤其是其中的分布式事务) 2)部署单个服务会比较快,但如果一次部署多个服务,流程会变得复杂 3)系统的吞吐量会变大,但响应时间会边长。 4)运维复杂度会因为服务变多而变得复杂 5)架构复杂导致学习曲线变大 6)测试和查错的复杂度增大 7)技术多元化,这会带来维护和运维的复杂度 8)管理分布式系统中的服务和调度变得困难和复杂 来源: https://www.cnblogs.com/Jtianlin/p/12015390.html

「主定理」

不问归期 提交于 2019-12-09 20:03:08
    假设现在你一个程序,共循环n次,第一次所用时间为1,     第i次循环所用时间是前一次的x倍      为了好算 假定x<1,那么可以猜到这个时间是收敛的     $T=\sum\limits_{i=0}^n x^i$     根据等比数列球和公式     $T=\frac{1-x^n}{1-x}$     当n趋于$\infty$时,     $T=\frac{1}{1-x}$          根据常识这个值在$x<0.9$时和$1$没什么区别     而且$n$根本不用到$\infty$而是很快就收敛到那个地方     例如$x=0.5$时$5$次就收敛到了$1.96(2)$     $x=0.7$时$10$次$3.26(3.33)$     即使$x=0.99$也在$500$次是就到了$99.34(100)$          所以在有限次递归的程序里,     近似可以看成整个程序的复杂度就是     第一次循环的复杂度与一个常数相乘     (哪怕$x$开到$0.99$这个常数才到$100$)     反过来,如果每一次循环都是前一次的$x$倍$(x>1)$     近似可以看成最后一层的复杂度与一个常数相乘,     有了这个认识可以来看主定理     现有一个递归问题,每个大小为n的节点需要$n^d$的复杂度     然后分裂成$a$个大小为$n/b

Hierarchical Softmax(分层Softmax)

余生长醉 提交于 2019-12-09 19:34:54
Hierarchical Softmax(分层Softmax): 使用分级softmax分类器(相当于一个树型分类器,每个节点都是可能是一个二分类器),其计算复杂度是前面的log⁡级别。在构造分级softmax分类器时,仿造哈夫曼树,一般常用的词会放在树的顶部位置,而不常用的词则会放在树的更深处,其并不是一个平衡的二叉树。 按照这种规律,常用的靠近树根,因此走的路少,总体上会降低复杂度,而不常用的靠近叶子,走的路多,总体上会降低复杂度。 来源: CSDN 作者: Wanderist_ZK 链接: https://blog.csdn.net/m0_37922734/article/details/100768818