张量运算的导数:梯度
梯度(gradient)是张量运算的导数。它是导数这一改你那向多元函数导数的推广。多远函数是以张量作为输入的函数。
对于一个函数f(x),你可以通过将x向导数的反方向移动一小步来减小f(x)的值。同样,对于张量的函数f(w),你也可以通过将w向梯度的反方向移动来减小f(w),比如W1 = W0 - step*gradient(f)(W0) ,其中step是一个很小的比例因子。也就是说,沿着曲率的反方向移动,直观上来看在曲线上的位置会更低。注意,比例因子step是必需的,因为gradient(f)(W0) 只是W0附近曲率的近似值,不能离W0太远。
随机梯度下降
给定一个可微函数,理论上可以用解析法找到它的最小值:函数的最小值是导数为0的点,因此你只需要找到所有导数为0的点,然后计算函数在其中哪个点具有最小值。
将这一方法应用于神经网络,就是用解析法求出最小损失函数对应的所有权重值。可以通过对方程 gradient(f)(W) = 0 求解W来实现这一方法。这是包含N个变量的多项方程式,其中N是网络中系数的个数。N = 2,N = 3 时可以这样求解,但是实际的神经网络参数可能有上千上万个,所以这样是无法求解的。
我们可以这样做,基于当前在随机数据批量上的损失,一点一点地对参数进行调节。由于处理的是一个可微函数,你可以计算出他的梯度,从而有效地实现第四步。沿着梯度的反方向更新权重,损失每次都会变小一点:
(1)抽取训练样本x和对应目标y组成的数据批量。
(2)在x上运行网络,得到预测值y_pred。
(3)计算网络在这批数据上的损失,用于衡量y_pred 和 y之间的距离。
(4)计算损失相对网络参数的梯度[一次反向传播(backward pass)]。
(5)将参数沿着梯度的反方向移动一点,比如 w -= step * gradient,从而使这批数据上的损失减小一点。
以上描述的方法叫作小批量随机梯度下降(mini-batch stochastic gradient descent,又称为小批量SGD)。术语随机(stochastic)是指每批数据都是随机抽取的(stochastic是random在科学上的同义词)。
步长step,也叫做学习率(learning rate),为step因子选取合适的值很重要。取值太小,则沿着曲线的下降需要很多次迭代,而且可能会陷入局部极小点。取值太大,则更新权重之后可能会出现在曲线上完全随机的位置。
神经网络的每一个权重参数都是空间中的一个自由维度,网络中可能包含数万个甚至上百万个参数维度。
小批量SDG算法的变体:
1)每次迭代时只抽取一个样本和目标,也叫真SDG
2)每次迭代都在所有数据上运行,叫批量SDG
3)带动量的SDG,动量解决了SDG的两个问题:收敛速度和局部极小点
eg:
训练模型 model.fit(x=x, y=Y, epochs=500, batch_size=20)
网络开始在训练数据上进行迭代(每个小批量包含20个样本),共迭代500次(在所有训练数据上迭代一次叫做一个轮次,即epochs)。在每次迭代过程中,网络会计算批量损失相对于权重的梯度,并相应的更新权重。
参考:深度学习中的Epoch,Batchsize,Iterations,都是什么鬼
梯度下降法
梯度下降法是机器学习中经典的优化算法之一,用于寻求一个曲线的最小值。所谓"梯度",即一条曲线的坡度或倾斜率,"下降"指代下降递减的过程。
梯度下降法是迭代的,也就是说我们需要多次计算结果,最终求得最优解。梯度下降的迭代质量有助于使输出结果尽可能拟合训练数据。
梯度下降法中有一个称为学习率的参数,如上图左所示,在算法开始时,步长更大,即学习率更高。随着点的下降,步长变短,即学习率变短。此外,误差函数也在不断减小。在训练模型时,如果训练数据过多,无法一次性将所有数据送入计算,那么我们就会遇到epoch,batchsize,iterations这些概念。为了克服数据量多的问题,我们会选择将数据分成几个部分,即batch,进行训练,从而使得每个批次的数据量是可以负载的。将这些batch的数据逐一送入计算训练,更新神经网络的权值,使得网络收敛。
Epoch
一个epoch指代所有的数据送入网络中完成一次前向计算及反向传播的过程。由于一个epoch常常太大,计算机无法负荷,我们会将它分成几个较小的batches。那么,为什么我们需要多个epoch呢?我们都知道,在训练时,将所有数据迭代训练一次是不够的,需要反复多次才能拟合收敛。在实际训练时,我们将所有数据分成几个batch,每次送入一部分数据,梯度下降本身就是一个迭代过程,所以单个epoch更新权重是不够的。
Batch Size
所谓Batch就是每次送入网络中训练的一部分数据,而Batch Size就是每个batch中训练样本的数量上文提及,每次送入训练的不是所有数据而是一小部分数据,另外,batch size 和batch numbers不是同一个概念~Batch size大小的选择也至关重要。为了在内存效率和内存容量之间寻求最佳平衡,batch size应该精心设置,从而最优化网络模型的性能及速度。
Iterations
所谓iterations就是完成一次epoch所需的batch个数。刚刚提到的,batch numbers就是iterations。
简单一句话说就是,我们有2000个数据,分成4个batch,那么batch size就是500。运行所有的数据进行训练,完成1个epoch,需要进行4次iterations。