迭代模型

3. DNN神经网络的正则化

不羁岁月 提交于 2020-03-30 09:42:47
1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考虑泛化,这里我们就对DNN的正则化方法做一个总结。 2. DNN的L1和L2正则化 想到正则化,我们首先想到的就是L1正则化和L2正则化。L1正则化和L2正则化原理类似,这里重点讲述DNN的L2正则化。 而DNN的L2正则化通常的做法是只针对与线性系数矩阵 \(W\) ,而不针对偏倚系数 \(b\) 。利用我们之前的机器学习的知识,我们很容易可以写出DNN的L2正则化的损失函数。 假如我们的每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为: \[J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2 \] 则加上了L2正则化后的损失函数是 \[J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2 + \frac{\lambda}{2m}\sum\limits_{l=2}^L||w||_2^2 \] 其中,$\lambda \(1即我们的正则化超参数,实际使用时需要调参。而\) w \(为所有权重矩阵\) W$的所有列向量。 如果使用上式的损失函数

详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

淺唱寂寞╮ 提交于 2020-03-25 09:36:18
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是 机器学习专题的第13篇 文章,我们来看下Kmeans算法的优化。 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我们提出了一个问题:Kmeans算法虽然效果不错,但是每一次迭代都需要遍历全量的数据,一旦数据量过大,由于计算复杂度过大迭代的次数过多,会导致 收敛速度非常慢 。 想想看,如果我们是在面试当中遇到的这个问题,我们事先并不知道正解,我们应该怎么回答呢? 还是老套路,我们在回答问题之前,先来分析问题。问题是收敛速度慢,计算复杂度高。计算复杂度高的原因我们也知道了, 一个是因为样本过大,另一个是因为迭代次数过多 。所以显然,我们想要改进这个问题,应该从这两点入手。 这两点是问题的关键点,针对这两点我们其实可以想出很多种优化和改进的方法。也就是说这是一个开放性问题,相比标准答案,推导和思考问题的思路更加重要。相反,如果我们抓不住关键点,那么回答也会跑偏,这就是为什么我在面试的时候,有些候选人会回答使用分布式系统或者是增加资源加速计算,或者是换一种其他的算法的原因。 也就是说分析问题和解决问题的思路过程,比解决方法本身更加重要。 下面,我们就上面提到的两个关键点各介绍一个优化方法。 mini batch mini batch的思想非常朴素,既然全体样本当中数据量太大

机器学习:Python实现聚类算法(二)之AP算法

吃可爱长大的小学妹 提交于 2020-03-24 18:42:52
1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法。AP算法的基本思想是将全部数据点都当作潜在的聚类中心(称之为exemplar),然后数据点两两之间连线构成一个网络(相似度矩阵),再通过网络中各条边的消息(responsibility和availability)传递计算出各样本的聚类中心。 2.相关概念(假如有数据点i和数据点j) (图1) (图2) (图3) 1)相似度: 点j作为点i的聚类中心的能力,记为S(i,j)。一般使用负的欧式距离,所以S(i,j)越大,表示两个点距离越近,相似度也就越高。使用负的欧式距离,相似度是对称的,如果采用其他算法,相似度可能就不是对称的。 2)相似度矩阵:N个点之间两两计算相似度,这些相似度就组成了相似度矩阵。如图1所示的黄色区域,就是一个5*5的相似度矩阵(N=5) 3) preference:指点i作为聚类中心的参考度(不能为0),取值为S对角线的值(图1红色标注部分),此值越大,最为聚类中心的可能性就越大。但是对角线的值为0,所以需要重新设置对角线的值,既可以根据实际情况设置不同的值,也可以设置成同一值。一般设置为S相似度值的中值。(有的说设置成S的最小值产生的聚类最少,但是在下面的算法中设置成中值产生的聚类是最少的) 4

在敏捷开发中采用演进式架构设计

跟風遠走 提交于 2020-03-11 21:46:12
在敏捷开发过程中,我们还需要对系统架构进行设计吗?事实上,Martin Fowler在《Is Design Dead?》一文中已经给出了答案,那就是我们同样不能忽略对系统架构的设计。与计划性的设计(Planned Design)不同,我们需要演进式的设计(Evolutionary Design)。在敏捷开发的生命周期中,我们通过每一次迭代来丰富与更新我们的设计方案,以使其最大限度地符合客户对系统的需求。这里所指的需求,包括 功能性需求和非功能性需求。 在Agile Journal四月刊中,IBM's Methods Group的敏捷专家Scott W. Ambler详细地阐述了在敏捷语境中的架构设计方法,他提出了所谓“架构预测(Architectural Envisioning)”的方法,以应对敏捷开发中逐步演进的架构设计过程。 Scott指出,敏捷模型驱动开发(Agile Model Driven Development,AMDD)明确地包括了初始需求分析与架构建模,这个过程发生在敏捷项目开发的第0次迭代中。所谓第0次迭代,就相当于项目的热 身活动,是项目得以启动的基础。在此迭代期间,团队需要充分地理解项目的范围,甄别可行地技术策略。这个阶段所能够收集到的信息将有助于你对整个项目最初 的粗略估计,以制定合适的项目计划,从而获得启动项目的资金与足够的支持。 更多内容

几种常见的优化算法

百般思念 提交于 2020-03-10 22:18:28
转自:http://www.cnblogs.com/maybe2030/   我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等。最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优的一些学科的总称。我们学习和工作中遇到的大多问题都可以建模成一种最优化模型进行求解,比如机器学习算法,大部分的机器学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优化,从而训练出最好的模型。常见的最优化方法有梯度下降法、牛顿法和拟牛顿法、共轭梯度法等等。 1. 梯度下降法(Gradient Descent)   梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是 凸函数 时,梯度下降法的解是 全局解 。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。 梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。 梯度下降法的搜索迭代示意图如下图所示: 梯度下降法的缺点:   (1)靠近极小值时收敛速度减慢,如下图所示;   (2)直线搜索时可能会产生一些问题;   (3)可能会“之字形

敏捷软件开发与传统软件工程概述比较

╄→尐↘猪︶ㄣ 提交于 2020-03-08 06:13:35
敏捷软件开发与传统软件工程概述比较 翁松秀 北京航空航天大学计算机学院   摘要: 软件工程的开发过程中有两种截然不同的管理和开发体系,一种是基于 “瀑布模型”的预设性传统软件工程,另一种是轻量级的适应性敏捷软件开发,本文简单阐述传统软件工程的开发方法与敏捷软件开发的异同,并通过“瀑布模型”和 SCRUM 方法的比较来探析传统软件工程与敏捷软件开发的异同。最后得出结论,把传统软件工程和敏捷软件开发相结合,将软件架构“颗粒化”,在简单可快速交付的敏捷软件开发中嵌套系统的传统软件开发方法,实现预见性和适应性折中。 关键词 :敏捷软件开发;传统软件工程;瀑布模型; SCRUM 方法;嵌套;颗粒化   0 前言   随着计算机的发展,对软件的需求越来越大,软件的规模也变得越来越大,结构越来越复杂,软件开发管理困难而复杂,在这个 “软件危机”背景下产生的传统软件工程,用工程化的方法构建和维护有效和高质量的软件。暂时解决了软件的兵荒马乱时代,但随着社会和科技的发展,对软件的需求变化越来越快,传统的软件工程很难再适应瞬息万变的客户需求,敏捷软件开发应运而生,其轻量级、简单、可快速交付、适应性强收到开发团队的青睐,与传统软件工程并肩,形成软件工程中的两大开发体系。   1 传统软件工程 1.1 传统软件工程概述   基于 “瀑布模型”的传统软件开发方法中,以软件架构 (software

第三次作业

半城伤御伤魂 提交于 2020-03-06 18:42:07
Scrum敏捷开发笔记 一、什么是敏捷开发? 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。 1.什么是敏捷? 软件开发过程是指设计软件开发过程中涉及的一系列活动,指导开发组一步一步的进行软件开发。 包括传统的瀑布过程、螺旋过程、原型过程、敏捷过程等。敏捷则是一类过程的统称。 之所以把他们都称之为敏捷,是因为它们有共同的特点。敏捷过程讲究快速迭代快速试错,将一个大的项目分解成一个一个独立的小项目,每个项目实现一定的功能,每个项目的成果物都是可以运行的软件。经过多次迭代之后完成整个项目。 2.关于敏捷方法 敏捷方法是试图通过小型的、自我管理的团队用短小的合作发布周期来鼓励迭代式软件开发方法。软件的质量贯穿敏捷软件开发每一个阶段,且非常重要,并提出很多关键的规则来保证能在每一个迭代周期内及早是的发现并及时相应消灭开发过程中出现错误。 在敏捷方法提出理念下,衍生出了很多不同敏捷软件开发方法。 如Scrum、极限编程[EXtreme Programning XP],测试驱动开发[Test Driver Development],重构和持续集成。Scrum是敏捷过程中比较著名的一个过程框架,被很多团队采用。 二、Scrum模型 3个角色 Product Owner: 产品负责人,主要负责确定产品的功能和达到要求的标准,指定软件的发布日期和交付的内容

AlphaGo Zero算法讲解

感情迁移 提交于 2020-02-27 14:45:05
   本篇博客讲解AlphaGo Zero算法。它对比于AlphaGo的改进在于它并不是学习人类棋谱。学习人类棋谱有一定的局限,第一就是人类下棋有局限,创新比较少;第二就是人类的棋谱少。AlphaGo Zero算法通过自我对弈完成棋力提高,可以克服以上两点。在学习AlphaGo Zero之前需要先学习MCTS搜索。 MCTS搜索 首先看下公式: score = w i n i + c ln ⁡ N i n i \text{score = }\ \frac{w_i}{n_i}+c\sqrt{\frac{\ln N_i}{n_i}} score = n i ​ w i ​ ​ + c n i ​ ln N i ​ ​ ​    其中, w i w_i w i ​ 是 i i i 节点的胜利次数, n i n_i n i ​ 是 i i i 节点的模拟次数, N i N_i N i ​ 是所有模拟次数, c c c 是探索常数,理论值为 2 \sqrt{2} 2 ​ 比如对于下面的棋局,对于根节点来说,有3个选择,第一个选择7胜3负,第二个选择3胜5负,第三个选择0胜3负。 见下图,如Selection,白色为白子走,黑色为黑棋走; 11 / 21 11/21 1 1 / 2 1 表示走此棋根据经验21局11胜。对于此节点来说,有3个选择,第一个选择7胜3负,第二个选择3胜5负

D2L-pytorch版 Task07笔记

情到浓时终转凉″ 提交于 2020-02-27 10:45:59
优化算法进阶 1.Momentum 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置,这可能会带来一些问题。对于noisy gradient,我们需要谨慎的选取学习率和batch size, 来控制梯度方差和收敛的结果。 g t = ∂ w 1 ∣ B t ∣ ∑ i ∈ B t f ( x i , w t − 1 ) = 1 ∣ B t ∣ ∑ i ∈ B t g i , t − 1 . \mathbf{g}_t = \partial_{\mathbf{w}} \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} f(\mathbf{x}_{i}, \mathbf{w}_{t-1}) = \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} \mathbf{g}_{i, t-1}. g t ​ = ∂ w ​ ∣ B t ​ ∣ 1 ​ i ∈ B t ​ ∑ ​ f ( x i ​ , w t − 1 ​ ) = ∣ B t ​ ∣ 1 ​ i ∈ B t ​ ∑ ​

深度学习——循环神经网络

为君一笑 提交于 2020-02-19 06:09:16
理解 循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。 递归神经网络(RNN)相对于MLP和CNN的主要优点是,它能够处理序列数据,在传统神经网络或卷积神经网络中,样本(sample)输入与输出是没有“顺序”概念的,可以理解为,如果把输入序列和输出序列重新排布,对整体模型的理论性能不会有影响。RNN则不同,它保证了输入和输出至少有一端是有序列特征的。 传统的神经网络结构可以归纳为下图左边的形式,隐藏层 h 的状态是不保存的,而在RNN中,每一个时间步的隐藏层状态都是由上一层的输入和上一个时间的状态共同计算得到。 为什么循环神经网络可以往前看任意多个输入值呢? 来看下面的公式,即 RNN 的输出层 o 和隐藏层 s 的计算方法: 如果反复把式 2 带入到式 1,将得到: RNN 的训练算法为:BPTT BPTT 的基本原理和 BP 算法是一样的,同样是三步: 1、前向计算每个神经元的输出值; 2、反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数; 3、计算每个权重的梯度。 最后再用随机梯度下降算法更新权重。 模型参数 W_xh: 状态-输入权重 W