概述
学习课程后,在L2正则化代码的基础上完成该周作业,现将心得体会记录如下。
Mini-batch梯度下降
概念
对m个训练样本,每次采用t(1<t<m)个样本进行迭代更新。
具体过程为:将特征X分为T个batch,每个batch的样本数为t(最后一个batch样本数不一定为t)。相应的将标签Y也如此分为T个batch。然后在每次训练时,原本是对所有样本进行一次训练;该算法则是对T个batch都进行训练,因此每次训练完所有样本,实际上都进行了T次训练。
注意为了保证没批样本的一致性,在分批前应对样本进行序号进行洗牌,随机重新分配样本的序号。
实际实现时,通常将每个batch的样本数t设置为2的整数次幂(64,128,256…)这是为了节省计算机内存。
理解
不用这种方法时:
执行一次梯度下降,向量化运算需要处理所有样本,耗时长;
当处理一次所有样本时,执行了一次梯度下降。
采用批量梯度下降算法时:
执行一次梯度下降,向量化运算需要处理t个样本,耗时短;
当处理一次所有样本时,执行了T次梯度下降。
因此可知,当样本量大时,其优点显而易见!假设有1000000个样本,如果不采用批量梯度下降法,用了20000次训练(即20000次梯度下降),才得到合适的网络;如果采用批量梯度下降法,令t=1000(则T=1000000/1000=1000),则每次训练完所有样本,实际上已经执行了1000次梯度下降,如果样本在分批时进行了随机排序处理,那么在上面的假设条件下,只需要对所有样本进行20次训练(梯度下降次数=20×1000=20000),就可以找到合适的网络。其效率明显提高。
特殊情况
当t=m(总样本数)时,等于没有分批,称作批梯度下降。
优点:最小化所有训练样本的损失函数,得到全局最优解;易于并行实现。
缺点:当样本数目很多时,训练过程会很慢。
当t=1时,每次只对一个样本进行训练,称作随机梯度下降。
优点:训练速度快。
缺点:最小化每条样本的损失函数,最终的结果往往是在全局最优解附近,不是全局最优;不易于并行实现。
代码更改
代码更改如下:
- 增加分批函数:
def random_batch(X, Y, batch_size):
batchs = []
np.random.seed(0)
m = X.shape[1]
random_index = list(np.random.permutation(m)) #random_index为一维数组,大小0~m-1,顺序随机
shuffled_X = X[:,random_index] #对X按照random_index的顺序重新排序(洗牌)
shuffled_Y = Y[:,random_index] #对Y按照random_index的顺序重新排序(洗牌)
num_batchs = int(np.floor(m/batch_size)) #计算批数
for k in range(0,num_batchs): #将洗牌后的X,Y分成num_batchs个batch
start = k * batch_size
end = (k+1) * batch_size
batch_X = shuffled_X[:,start:end]
batch_Y = shuffled_Y[:,start:end]
batch = (batch_X,