反向传播

Alink漫谈(十四) :多层感知机 之 总体架构

不问归期 提交于 2020-08-15 02:29:07
Alink漫谈(十四) :多层感知机 之 总体架构 目录 Alink漫谈(十四) :多层感知机 之 总体架构 0x00 摘要 0x01 背景概念 1.1 前馈神经网络 1.2 反向传播 1.3 代价函数 1.4 优化过程 1.4.1 迭代法 1.4.2 梯度下降 1.5 相关公式 1.5.1 加权求和 h 1.5.2 神经元输出值 a 1.5.3 输出层的输出值 y 1.5.4 激活函数g(h) 1.5.5 损失函数E 1.5.6 误差反向传播——更新权重 1.5.7 输出层增量项 δo 1.5.8 更新输出层权重wjk 0x02 示例代码 0x03 训练总体逻辑 3.1 总体逻辑示例图 3.2 L-BFGS训练调用逻辑概述 3.3 获取训练数据 3.4 构建拓扑 3.4.1 AffineLayer 3.4.2 FuntionalLayer 3.4.3 SoftmaxLayerWithCrossEntropyLoss 3.4.3.1 Softmax 3.4.3.2 softmax loss 3.4.3.3 cross entropy 3.4.3.4 SoftmaxLayerWithCrossEntropyLoss 3.5 构建训练器 0xFF 参考 0x00 摘要 Alink 是阿里巴巴基于实时计算引擎 Flink 研发的新一代机器学习算法平台,是业界首个同时支持批式算法

YOLOV3剪枝源码阅读---模型部署加速

被刻印的时光 ゝ 提交于 2020-08-13 09:49:13
YOLOV3剪枝 论文:Network Slimming-Learning Efficient Convolutional Networks through Network Slimming 剪枝项目参考 https://github.com/tanluren/yolov3-channel-and-layer-pruning 主要思路 1、利用batch normalization中的缩放因子γ 作为重要性因子,即γ越小,所对应的channel不太重要,就可以裁剪(pruning)。 2、约束γ的大小,在目标方程中增加一个关于γ的L1正则项,使其稀疏化,这样可以做到在训练中自动剪枝,这是以往模型压缩所不具备的。 剪枝过程 img 这里写图片描述 分为三部分,第一步,训练;第二步,剪枝;第三步,微调剪枝后的模型,循环执行 YOLOV3剪枝源码 1、正常剪枝 这部分分析来自该仓库 https://github.com/coldlarry/YOLOv3-complete-pruning ,但是更新的仓库也可以完成正常剪枝,prune.py。 使用了正常剪枝模式,不对short cut层(需要考虑add操作的维度一致问题)及上采样层(无BN)进行裁剪。 1、找到需要裁剪的BN层的对应的索引。 2、每次反向传播前,将L1正则产生的梯度添加到BN层的梯度中。 3、设置裁剪率进行裁剪。

谷歌刷新机器学习世界纪录!2 分钟搞定 ImageNet 训练

二次信任 提交于 2020-08-13 02:52:32
AI 前线导读 :随着技术、算力的发展,在 ImageNet 上训练 ResNet-50 的速度被不断刷新。2018 年 7 月,腾讯机智机器学习平台团队在 ImageNet 数据集上仅用 6.6 分钟就训练好 ResNet-50,创造了 AI 训练世界纪录;一周前,壕无人性的索尼用 2176 块 V100 GPU 将这一纪录缩短到了 224 秒;如今,这一纪录再次被谷歌刷新…… 深度学习非常依赖于硬件条件,它是一个计算密集型的任务。硬件供应商通过在大型计算集群中部署更快的加速器来做出更快的相应。在 petaFLOPS(运算能力单位,每秒千万亿次浮点数运算)规模的设备上训练深度学习模型需要同时面临算法和系统软件两方面的挑战。Google 于近日推出了一种大规模计算集群的图像分类人物训练解决方案,相关论文发表于 Arxiv: Image Classification at Supercomputer Scale 。本文的作者使用 Google TPU v3 Pod 训练 ResNet-50,在识别率没有降低的情况下,仅使用了 2.2 分钟的时间。 背景 深度神经网络的成功应用与发展离不开疯狂增长的算力,在许多领域,深度学习的发展可以说是由硬件驱动的。在深度网络的训练过程中,最关键的部分就是使用随机梯度下降算法(SGD)优化网络权重。通常情况下,模型需要使用 SGD

循环神经网络(RNN)简易教程

房东的猫 提交于 2020-08-13 01:08:33
作者|Renu Khandelwal 编译|VK 来源|Medium 我们从以下问题开始 循环神经网络能解决人工神经网络和卷积神经网络存在的问题。 在哪里可以使用RNN? RNN是什么以及它是如何工作的? 挑战RNN的消梯度失和梯度爆炸 LSTM和GRU如何解决这些挑战 假设我们正在写一条信息“Let’s meet for___”,我们需要预测下一个单词是什么。下一个词可以是午餐、晚餐、早餐或咖啡。我们更容易根据上下文作出推论。假设我们知道我们是在下午开会,并且这些信息一直存在于我们的记忆中,那么我们就可以很容易地预测我们可能会在午餐时见面。 当我们需要处理需要在多个时间步上的序列数据时,我们使用循环神经网络(RNN) 传统的神经网络和CNN需要一个固定的输入向量,在固定的层集上应用激活函数产生固定大小的输出。 例如,我们使用128×128大小的向量的输入图像来预测狗、猫或汽车的图像。我们不能用可变大小的图像来做预测 现在,如果我们需要对依赖于先前输入状态(如消息)的序列数据进行操作,或者序列数据可以在输入或输出中,或者同时在输入和输出中,而这正是我们使用RNNs的地方,该怎么办。 在RNN中,我们共享权重并将输出反馈给循环输入,这种循环公式有助于处理序列数据。 RNN利用连续的数据来推断谁在说话,说什么,下一个单词可能是什么等等。 RNN是一种神经网络,具有循环来保存信息

循环神经网络(RNN)简易教程

别等时光非礼了梦想. 提交于 2020-08-12 06:47:28
作者|Renu Khandelwal 编译|VK 来源|Medium 我们从以下问题开始 循环神经网络能解决人工神经网络和卷积神经网络存在的问题。 在哪里可以使用RNN? RNN是什么以及它是如何工作的? 挑战RNN的消梯度失和梯度爆炸 LSTM和GRU如何解决这些挑战 假设我们正在写一条信息“Let’s meet for___”,我们需要预测下一个单词是什么。下一个词可以是午餐、晚餐、早餐或咖啡。我们更容易根据上下文作出推论。假设我们知道我们是在下午开会,并且这些信息一直存在于我们的记忆中,那么我们就可以很容易地预测我们可能会在午餐时见面。 当我们需要处理需要在多个时间步上的序列数据时,我们使用循环神经网络(RNN) 传统的神经网络和CNN需要一个固定的输入向量,在固定的层集上应用激活函数产生固定大小的输出。 例如,我们使用128×128大小的向量的输入图像来预测狗、猫或汽车的图像。我们不能用可变大小的图像来做预测 现在,如果我们需要对依赖于先前输入状态(如消息)的序列数据进行操作,或者序列数据可以在输入或输出中,或者同时在输入和输出中,而这正是我们使用RNNs的地方,该怎么办。 在RNN中,我们共享权重并将输出反馈给循环输入,这种循环公式有助于处理序列数据。 RNN利用连续的数据来推断谁在说话,说什么,下一个单词可能是什么等等。 RNN是一种神经网络,具有循环来保存信息

神经网络简易教程

…衆ロ難τιáo~ 提交于 2020-08-11 23:23:01
作者|Renu Khandelwal 编译|VK 来源|Medium 在这篇文章中,我们将了解神经网络的基础知识。 这个博客的先决条件是对机器学习的基本理解,如果你尝试过一些机器学习算法,那就更好了。 首先简单介绍一下人工神经网络,也叫ANN。 很多机器学习算法的灵感来自大自然,而最大的灵感来自我们的大脑,我们如何思考、学习和做决定。 有趣的是,当我们触摸到热的东西时,我们身体里的神经元将信号传递给大脑的。然后,大脑产生冲动,从热的区域撤退。我们根据经验接受了训练。根据我们的经验,我们开始做出更好的决定。 使用同样的类比,当我们向神经网络发送一个输入(触摸热物质),然后根据学习(先前的经验),我们产生一个输出(从热区域退出)。在未来,当我们得到类似的信号(接触热表面),我们可以预测输出(从热区退出)。 假设我们输入了诸如温度、风速、能见度、湿度等信息,以预测未来的天气状况——下雨、多云还是晴天。 这可以表示为如下所示。 让我们用神经网络来表示它并理解神经网络的组成部分。 神经网络接收输入,通过使用激活函数改变状态来转换输入信号,从而产生输出。 输出将根据接收到的输入、强度(如果信号由权值表示)和应用于输入参数和权值的激活而改变。 神经网络与我们神经系统中的神经元非常相似。 x1、x2、…xn是神经元向树突的输入信号,在神经元的轴突末端会发生状态改变,产生输出y1、y2、…yn。

强化学习(十一) Prioritized Replay DQN

我的未来我决定 提交于 2020-08-11 19:52:30
    在 强化学习(十)Double DQN (DDQN) 中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。今天我们在DDQN的基础上,对经验回放部分的逻辑做优化。对应的算法是Prioritized Replay DQN。     本章内容主要参考了ICML 2016的 deep RL tutorial 和Prioritized Replay DQN的论文<Prioritized Experience Replay>(ICLR 2016)。 1. Prioritized Replay DQN之前算法的问题     在Prioritized Replay DQN之前,我们已经讨论了很多种DQN,比如Nature DQN, DDQN等,他们都是通过经验回放来采样,进而做目标Q值的计算的。在采样的时候,我们是一视同仁,在经验回放池里面的所有的样本都有相同的被采样到的概率。     但是注意到在经验回放池里面的不同的样本由于TD误差的不同,对我们反向传播的作用是不一样的。TD误差越大,那么对我们反向传播的作用越大。而TD误差小的样本,由于TD误差小,对反向梯度的计算影响不大。在Q网络中,TD误差就是目标Q网络计算的目标Q值和当前Q网络计算的Q值之间的差距。     这样如果TD误差的绝对值$|

关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach

三世轮回 提交于 2020-08-10 12:27:13
关于RNN (循环神经网络)相邻采样为什么在每次迭代之前都需要将参数detach 这个问题出自《动手学深度学习pytorch》中RNN 第六章6.4节内容,如下图所示: 当时看到这个注释,我是一脸懵逼,(难道就不能解释清楚一点嘛,让我独自思考了那么长时间,差评!!!)我主要有以下疑惑: 每次小批量反向传播之后,由于torch是动态计算图,本质上该次的计算图已经销毁,与下次小批量迭代的构建的计算没有任何关联,detach不是多此一举嘛? 按照注释所说的,难道下次小批量构建的计算图由于初始隐藏状态引用于上次小批量迭代最后的时间步长的隐藏状态,这样计算图存在分支关联,方向传播会经过以前所有批量迭代构建的计算图,导致内存和计算资源开销大? 带着这两个疑惑,我开始面向百度编程(网上的博客真的是千篇一律啊,10篇当中9篇一样,哎世风日下,我也是服了,文章转来转去有意思嘛,自己收藏着看看不好嘛,非得全篇复制还转载,真的***)百度之后,我发现了以下解释(没一个有用的) 胡说八道型 这讲的啥?按你这么说,state是叶子节点了(估计不知道从哪抄的错误博客,害人匪浅啊),既然state都是叶子节点了,那还跟上一次批量的计算图有毛关系,反向传播个屁?叶子节点的定义:一棵树当中没有子结点(即度为0)的结点称为叶子结点。除了第一次小批量的初始隐藏状态是叶子节点外,其他批量的隐藏状态都经过隐藏层的计算

第二次作业:卷积神经网络 part 2

耗尽温柔 提交于 2020-08-10 09:26:23
【第二部分】 代码练习 MobileNetV1 网络 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, 2017 https://arxiv.org/abs/1704.04861 VGG,GoogleNet,ResNet进一步提高CNN的性能。但是到ResNet,网络已经达到152层,模型大小动辄几百300MB+。这种巨大的存储和计算开销,严重限制了CNN在某些低功耗领域的应用。在实际应用中受限于硬件运算能力与存储(比如几乎不可能在手机芯片上跑ResNet-152),所以必须有一种能在算法层面有效的压缩存储和计算量的方法。而MobileNet/ShuffleNet正为我们打开这扇窗。 Mobilenet v1是Google于2017年发布的网络架构,旨在充分利用移动设备和嵌入式应用的有限的资源,有效地最大化模型的准确性,以满足有限资源下的各种应用案例。Mobilenet v1核心是把卷积拆分为Depthwise+Pointwise两部分。 Depthwise 处理一个三通道的图像,使用3×3的卷积核,完全在二维平面上进行,卷积核的数量与输入的通道数相同,所以经过运算会生成3个feature map。卷积的参数为: 3 × 3 × 3 = 27,如下所示:

第二次作业:卷积神经网络 part 2

青春壹個敷衍的年華 提交于 2020-08-10 08:36:46
一、问题总结 在深度学习模型中,为什么每次训练的测试结果不同? 二、代码练习 1、MobileNetV1 #深度可分离卷积 class Block(nn.Module): def __init__(self, in_planes, out_planes, stride=1): super(Block, self).__init__() # Depthwise 卷积,3*3 的卷积核,分为 in_planes,即各层单独进行卷积 self.conv1 = nn.Conv2d(in_planes, in_planes, kernel_size=3, stride=stride, padding=1, groups=in_planes, bias=False) self.bn1 = nn.BatchNorm2d(in_planes) # Pointwise 卷积,1*1 的卷积核 self.conv2 = nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False) self.bn2 = nn.BatchNorm2d(out_planes) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) out = F.relu