是否应在不进行替代的情况下抽取随机抽取的用于小批量训练神经网络的训练样本?


18

我们定义一个时期为已经遍历所有可用训练样本的全部,而最小批量大小则是我们求平均值以找到下降梯度所需的权重/偏差的样本数。

我的问题是,我们是否应该从训练示例集中取而代之,以便在一个时期内生成每个小批量生产。我觉得我们应该避免替换,以确保我们实际上“抽取了所有样本”以满足时代的要求,但是很难以一种或另一种方式找到确定的答案。

我已经尝试使用Google搜索和阅读Ch。Nielsen的《神经网络与深度学习》中的 1种,但没有找到明确的答案。在该文本中,尼尔森(Nielsen)没有指定随机抽样而不进行替换,而是暗示这样做。

如果需要,可以在这里找到更清晰的正式培训形式-https: //stats.stackexchange.com/a/141265/131630

编辑:这个问题似乎与我相似,但目前尚不清楚如何将期望的线性对独立性无视的事实应用于这种情况- 是否应在有或没有替代的情况下进行抽样


除非有特定的数据原因,否则总是绘制神经网络训练的微型批次而不用替换。这个想法是,您希望介于批处理模式之间,该模式使用整个数据集和SGD(仅使用一个随机变量)来计算梯度。
horaceT

SGD不限于使用一个随机样本。该过程称为在线培训。“梯度下降的一种极端版本是使用最小批处理大小为1。此过程称为在线学习,在线学习或增量学习。” 而且,“可以使用一种称为随机梯度下降的思想来加快学习速度。该想法是通过为随机选择的训练输入的一小部分样本进行计算来估计梯度∇C。通过对该小样本进行平均。 “我们可以很快获得对真实梯度的良好估计”。Nielsen Ch。的两个引用。1.
bobo

Answers:


13

与不更换模式中的迭代算法基于上下文的随机一个很好的理论分析得出(其中有多少区别深层神经网络(DNNs)对经过培训),可以发现这里

简而言之,事实证明,没有替换的采样比替换的采样导致收敛更快。

在此,我将基于它们提供的玩具示例进行简短分析:假设我们要优化以下目标函数:

xopt=argminx12i=1N(xyi)2

其中目标。在这个例子中,我们试图求解给定y i的 N个标签的最优xyiN(μ,σ2)xNyi

好的,所以如果我们直接在上面求解最优,那么我们将在此处采用损失函数的导数,将其设置为0,然后求解x。因此,对于上面的示例,损失为xx

L=12i=1N(xyi)2

它的一阶导数是:

δLδx=i=1N(xyi)

设置为0并求解X,产率:δLδxx

xopt=1Ni=1Nyi

换句话说,最优解只不过是y的所有样本的样本均值。Ny

现在,如果我们无法一次执行以上所有计算,则必须通过下面的梯度下降更新公式来递归执行:

xi=xi1λi(f(xi1))

只需在此处插入我们的条款即可:

xi=xi1λi(xi1yi)

如果我们运行上面所有,那么我们将有效地执行此更新而无需替换。问题就变成了,我们也可以这样得到x的最优值吗?(请记住,x的最佳值不过是y的样本均值)。答案是肯定的,如果你让λ = 1 /。要看到,我们将其扩展:i1,2,...Nxxyλi=1/i

xi=xi1λi(xi1yi) xi=xi11i(xi1yi) xi=ixi1(xi1yi)i xi=(i1)xi1+yii ixi=(i1)xi1+yi 

i=1i=2i=Nx

NxN=(N1)xN1+yN==>xN=1Ni=1Nyi=μ

xNμ

E{(xNμ)2}

这将是一个正值,这个简单的玩具示例可以扩展到更大的尺寸。这样的结果是,我们希望在不进行替换的情况下执行采样,以此作为更理想的解决方案。

希望这可以澄清更多!


该示例使用了很多假设,即使用平方误差和损耗曲线的凸度。如果不满足这些假设,结果是否成立?
bayerj

@bayerj这个特殊的玩具示例,是的。但是,本文继续将其扩展到其他一些理论上的案例。我相信其他来源(我认为是Boutou)都显示出对无替代抽样的经验支持更为出色。
Tarin Ziyaee

@TarinZiyaee感谢您的回答-您能澄清λ_k= 1 / k吗?我们在这里谈论哪个k,即上式中的k?我在这里没有关注您,这使得后续的总结和结论变得困难。谢谢。
bobo

1
@bobo我将尝试在今晚之前澄清该帖子。
Tarin Ziyaee

1
@bobo我更新了我的答案。请看一下,让我知道是否有帮助。
Tarin Ziyaee

5

根据Nielsen存储库中的代码,绘制了迷你批而不进行替换:

    def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):
    n = len(training_data)
    for j in range(epochs):
            random.shuffle(training_data)
            mini_batches = [
                training_data[k:k+mini_batch_size]
                for k in range(0, n, mini_batch_size)
            ]
            for mini_batch in mini_batches:
                self.update_mini_batch(mini_batch, eta)

我们可以看到在一个纪元内没有替换训练样本。有趣的是,我们还可以看到尼尔森选择不担心eta针对最后一个mini_batch大小进行调整(学习率),后者可能没有以前的mini-batch那样多的训练样本。大概这是他留给以后章节的高级修改。**

**编辑:实际上,此缩放发生在def update_mini_batch函数中。例如,使用权重:

self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)]     

这是必要的,因为如果每个mini_batch的训练样本数未均等地划分为可用的训练样本总数,则最后一个mini_batch可能小于先前的mini_batches。

mylist = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
n = len(mylist)
mini_batch_size = 2
mini_batches = [
    mylist[k:k+mini_batch_size]
    for k in range(0, n, mini_batch_size)
    ]
for mini_batch in mini_batches:
    print(mini_batch)

输出:

['1', '2']
['3', '4']
['5', '6']
['7', '8']
['9', '10']

更改mini_batch_size3,不能将其平均分为10个训练样本。对于输出,我们得到:

['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
['10']

在评估列表索引的范围时(形式为[x:y]where xylist中的一些索引),如果我们的右边值超出列表长度,python会简单地从列表中返回所有项目,直到该值超出索引范围。

因此,最后的迷你批处理可能比以前的迷你批处理小,但是如果将其按相同的权重进行加权,则与eta其他较大的迷你批处理中的样本相比,这些训练样本将对学习做出更大的贡献。由于这只是最后一个迷你批处理,因此可能不必担心太多,但可以通过缩放eta至迷你批处理的长度轻松解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.