- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解使用 miinibatch SGD 时如何计算梯度。我已经在 CS231 在线类(class)中实现了它,但后来才意识到,在中间层中,梯度基本上是为每个样本计算的所有梯度的总和(与 Caffe 或 Tensorflow 中的实现相同)。仅在最后一层(损失)中,它们才按样本数量进行平均。它是否正确?如果是这样,是否意味着由于在最后一层中它们被平均,所以在进行反向传播时,所有梯度也会自动平均?谢谢!
最佳答案
最好先了解 SGD 为何有效。
通常,神经网络实际上是一个非常复杂的复合函数,由输入向量 x、标签 y(或目标变量,根据问题是分类还是回归而变化)和一些参数向量 w 组成。假设我们正在进行分类。我们实际上正在尝试对变量向量 w 进行最大似然估计(实际上是 MAP 估计,因为我们肯定会使用 L2 或 L1 正则化,但目前技术性太强)。假设样本是独立的;那么我们有以下成本函数:
p(y1|w,x1)p(y2|w,x2) ... p(yN|w,xN)
将 wrt 优化为 w 是一团糟,因为所有这些概率都相乘(这将产生 wrt w 的极其复杂的导数)。我们使用对数概率代替(取对数不会改变极值点,并且我们除以 N,因此我们可以将训练集视为经验概率分布 p(x))
J(X,Y,w)=-(1/N)(log p(y1|w,x1) + log p(y2|w,x2) + ... + log p(yN|w,xN))
这是我们实际的成本函数。神经网络实际上所做的是对概率函数 p(yi|w,xi) 进行建模。这可以是一个非常复杂的 1000 多个分层 ResNet,也可以只是一个简单的感知器。
现在 w 的导数很容易表述,因为我们现在有了一个加法:
dJ(X,Y,w)/dw = -(1/N)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(yN|w,xN)/dw)
理想情况下,上面是实际的渐变。但这种批量计算并不容易计算。如果我们正在处理包含 100 万个训练样本的数据集怎么办?更糟糕的是,训练集可能是样本 x 的流,其大小无限。
SGD 的随机部分在这里发挥作用。从训练集中随机均匀地选取 m << N 的 m 个样本,并使用它们计算导数:
dJ(X,Y,w)/dw =(approx) dJ'/dw = -(1/m)(dlog p(y1|w,x1)/dw + dlog p(y2|w,x2)/dw + ... + dlog p(ym|w,xm)/dw)
请记住,我们有一个经验(或无限训练集情况下的实际)数据分布 p(x)。上述从 p(x) 中抽取 m 个样本并对它们进行平均的操作实际上产生了实际导数 dJ(X,Y,w)/dw 的无偏估计量 dJ'/dw。这意味着什么?采取许多这样的 m 个样本并计算不同的 dJ'/dw 估计值,对它们进行平均,然后在无限采样的限制下,您会得到非常接近甚至精确的 dJ(X,Y,w)/dw 。可以证明,从长远来看,这些有噪声但无偏的梯度估计将表现得像原始梯度一样。平均而言,SGD 将遵循实际梯度的路径(但它可能会陷入不同的局部最小值,这一切都取决于学习率的选择)。小批量大小 m 与噪声估计 dJ'/dw 中的固有误差直接相关。如果 m 很大,你会得到低方差的梯度估计,你可以使用更大的学习率。如果m很小或者m=1(在线学习),估计器dJ'/dw的方差非常高,你应该使用较小的学习率,否则算法很容易发散失控。
现在理论已经足够了,你的实际问题是
It is only in the last layer (the loss) that they are averaged by the number of samples. Is this correct? if so, does it mean that since in the last layer they are averaged, when doing backprop, all the gradients are also averaged automatically? Thanks!
是的,在最后一层除以 m 就足够了,因为一旦最下层乘以因子 (1/m),链式法则就会将因子 (1/m) 传播到所有参数。您不需要为每个参数单独执行,这将是无效的。
关于machine-learning - 小批量 SGD 梯度计算 - 平均值或总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41145831/
我有一个大小为 320x320 像素的阈值图像。我通过设置 ROI 以 20x20 像素的 block 循环遍历整个图像。我需要找到每个 block 的平均值。所以我将这些图像 block 传递给函数
我正在尝试学习 Javascript。我已经构建了以下代码来从一组数字中找到平均值。它有效除了最后返回的值总是 NaN。我不知道为什么。如果我将这 block 移到 block 外,它似乎完全忘记了变
假设我的数据已经分组,我该如何计算中位数和其他统计数据? Index Value Count 0 6 2 1 2 3 2 9 8 在上面
我试图计算的有趣情况。基本上在一行中,我有产品名称,其右侧的行是自首次收到产品以来经过的天数。 为 ex 计算的天数是 =TODAY()-BB2 我现在要做的是识别让我们说产品词“卡车”,然后计算卡车
我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我在寻找什么。 我有以下号码 vec 1) 为您的向量(或列表、一维数组或您如何称呼它)的每个元素评估此表达式,您将获得累积平均值。
我正在尝试对数据库表中的每一行进行平均。但它不能正常工作我想忽略该值,如果为空,它不会计算为零。使用我的代码,它将空值计算为零我想这样做 MS Excel 如果行/单元格为空,它将忽略。 Contro
我有以下信息(按 View 返回): DateTime ItemID UserTyp Seconds 2012-01-01 10 S 12 2012-01-01
我正在使用excel的average函数来获取欧洲各个城市一系列酒店价格的平均值。 =average(21,42,63,84,105) 我希望能够计算每个平均函数中的变量数量(例如,在上面的示例中有
我有一长串列,我想一次性计算非零中位数、平均值和标准差。我不能只删除基于 1 列的 0 行,因为同一列中另一列的值可能不是 0。 下面是我目前的代码,用于计算中位数、平均值等,包括零。 agg
这是我的问题: 我有一张这样的 table : Table Log int id; int time; timestamp DATE; int sid (FK to table Site);
JSON: [{"id":"1","user":"001","answer":"1,1,3,2,2,1,3,2"}, {"id":"2","user":"002","answer":"2,3,3,2,
有个问题: 使用适当的列名称,显示 obs 类型“CONT”的允许 ID 和平均 obs 值,其中 CONT 的平均 obs 值 >= 40。 假设承认是表1,观察是表2,但具有相同的主键Admit_
我有一个记录传感器数据的应用程序,我希望能够从多个传感器生成平均值,可以是一个、两个、三个或很多... 编辑:这些是温度传感器,因此 0 是传感器可能作为值存储在数据库中的值。 我最初的出发点是这个
我有这样一个数据框 id power flag 0 20 0 1 25 0 2 26 1 3 30 1 4 18 0 5
我想计算所有事件 blob 的平均位置。为此,首先我需要所有 X 和 Y 位置的总和。在这种情况下我该怎么做? contourFinder.findContours(grayImg, minB
我是一个十足的 Java 新手。上周一开始,之前从未用任何语言进行过任何编程。因此,如果我发现简单的事情变得复杂,请耐心等待。 我收到了一个文本文件。如下图: 第一个数据是时间(午夜过后的秒数),第二
我正在尝试为 Audacity 编写一个简单的测量插件,它就像用石头砸我的头骨一样有趣。我想要做的就是获取一段音频并找到所有样本的平均值(该 block 的 DC offset ),这样我就可以将它作
我正在尝试计算给定多边形内的值: 实际上我正在使用这个管道: 'aggregation': { 'pipeline': [ { "$match" : {
我有一个 pandas DataFrame,其中包含包含列表的列。我正在尝试获取此专栏中列表的方法。 这是我的 DataFrame 的示例: Loc Background 0
我尝试加速计算放置在数组中的4d向量的平均值。这是我的代码: #include #include #include #include #include #include typedef f
我是一名优秀的程序员,十分优秀!