人工智能–梯度下降法(4)

人工智能之梯度下降法(4)

前言:人工智能机器学习有关算法内容,请参见公众号“科技优化生活”之前相关文章。人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下小批量梯度下降法MBGD^_^。

通过前面介绍,我们知道机器学习优化算法中,使用较多的是基于梯度下降GD的优化算法,但是一般梯度下降法会存在:靠近极小值时收敛速度减慢,“之字形”地下降等缺点。

针对一般梯度下降法的缺点,出现了不同的梯度下降法的变形或变种,即:批量梯度下降法BGD、小批量梯度下降法MBGD、随机梯度下降法SGD。其主要区别是不同的变形在训练数据的选择上。

上两篇分别介绍了批量梯度下降法BGD和随机梯度下降法SGD。BGD在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢,于是提出了随机梯度下降法SGD。然后通过对随机梯度下降法SGD介绍,发现SGD一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

对BGD和SDG优缺点,那么,有没有一个折中的办法能够结合两种方法的优点呢?答案就是小批量梯度下降法MBGD

今天我们主要介绍一下小批量梯度下降法MBGD。

小批量梯度下降法概念:

小批量梯度下降法MBGD(Mini-Batch Gradient Descent)是为了解决BGD由于样本数目众多而带来训练过程异常缓慢问题以及SGD迭代方向变化大不能很快的收敛到局部最优解问题而提出的。

小批量梯度下降法MBGD把训练集划分为很多批,对每一批(batch)计算误差并更新参数。可以选择对batch的梯度进行累加,或者取平均值。取平均值可以减少梯度的方差。

小批量梯度下降在随机梯度下降的鲁棒性和批量梯度下降的效率之间取得平衡。是如今深度学习领域最常见的实现方式。

小批量梯度下降法基本思想:

小批量梯度下降法MBGD是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样本来迭代,x满足1

其基本特点就是每一次训练迭代在训练集中随机采样batch_size个样本,其表达式为:

这个改进版本在深度学习的网络训练中有着广泛地应用,因为其既有较高的精度,也有较快的训练速度。

假设训练集中的样本的个数为1000,则每个mini-batch只是其一个子集,假设,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。伪代码如下:

迭代过程:

下图显示了梯度下降的变种方法以及它们朝向最小值的方向走势,与小批量版本相比,SGD的方向噪声很大:

小批量梯度下降法配置:

小批量梯度下降法MBGD对于深度学习大部分应用是最常用的方法。Mini-batch sizes,简称为 “batch sizes”,是算法设计中需要调节的超参数。比如对应于不同GPU或CPU硬件(32,64,128,256等)的内存要求。

batch size是学习过程中的“滑块”。较小的值让学习过程收敛更快,但是产生更多噪声。较大的值让学习过程收敛较慢,但是准确的估计误差梯度。

batch size超参数配置建议如下:

1)batch size的默认值配置为32;

2)调节batch size时,观察模型在不同batch size下的训练时间和验证误差的学习曲线;

3)调整其他所有超参数之后再调整batch size和学习率。

算法Python代码实现:

下面的Python代码实现了小批量梯度下降法:

from numpy import random

def get_mini_batches(X, y, batch_size):

random_idxs = random.choice(len(y), len(y), replace=False)

X_shuffled = X[random_idxs,:]

y_shuffled = y[random_idxs]

mini_batches = [(X_shuffled[i:i+batch_size,:],y_shuffled[i:i+batch_size]) for

i in range(0, len(y),batch_size)]

return mini_batches

def train_nn_MBGD(nn_structure, X, y, bs=100,iter_num=3000, alpha=0.25, lamb=0.000):

W,b = setup_and_init_weights(nn_structure)

cnt= 0

m =len(y)

avg_cost_func = []

print('Starting gradient descent for {} iterations'.format(iter_num))

while cnt

if cnt%1000 == 0:

print('Iteration {} of {}'.format(cnt, iter_num))

tri_W, tri_b = init_tri_values(nn_structure)

avg_cost = 0

mini_batches = get_mini_batches(X, y, bs)

for mb in mini_batches:

X_mb = mb[0]

y_mb = mb[1]

# pdb.set_trace()

for i in range(len(y_mb)):

delta = {}

# perform the feed forward passand return the stored h and z values,

# to be used in the gradientdescent step

h, z = feed_forward(X_mb[i, :], W,b)

# loop from nl-1 to 1backpropagating the errors

for l inrange(len(nn_structure), 0, -1):

if l == len(nn_structure):

delta[l] = calculate_out_layer_delta(y_mb[i,:],h[l], z[l])

else:

delta[l] =calculate_hidden_delta(delta[l+1], W[l], z[l])

# triW^(l) = triW^(l) +delta^(l+1) * transpose(h^(l))

tri_W[l] +=np.dot(delta[l+1][:,np.newaxis],

np.transpose(h[l][:,np.newaxis]))

# trib^(l) = trib^(l) + delta^(l+1)

tri_b[l] += delta[l+1]

# perform the gradient descent step for the weights in each layer

for l in range(len(nn_structure) - 1, 0, -1):

W[l] += -alpha * (1.0/bs *tri_W[l] + lamb * W[l])

b[l] += -alpha * (1.0/bs *tri_b[l])

# complete the average cost calculation

avg_cost = 1.0/m * avg_cost

avg_cost_func.append(avg_cost)

cnt += 1

return W, b, avg_cost_func

小批量梯度下降法优点:

1)比批量梯度下降更快的更新频率有利于更鲁棒的收敛,避免局部最优;

2)比随机梯度下降更具计算效率;

3)不需要把所有数据放入内存中;

4)随机选择样本有助于避免对学习没有多大贡献冗余样本或非常相似的样本的干扰;

5)当批量的大小小于训练集大小时,会增加学习过程中的噪声,有助于改善泛化误差;

6)尽管用更多的样本可以获得更低的估计标准误差,但所带来的计算负担却小于线性增长。

小批量梯度下降法缺点:

1)小批量梯度下降给算法增加了一个超参数batch size;

2)和批量梯度下降一样,每一个batch上的误差需要累加;

3)在每次迭代中,学习步骤可能会由于噪声而来回移动。因此它会在最小值区域周围波动,但不收敛;

4)会有更多的振荡,并且随着越来越接近最小值,需要增加学习衰减来降低学习速率。

与SGD、BGD比较:

1)介于BSD和SGD之间的一种优化算法,每次选取一定量的训练样本进行迭代。

2)速度比BSD快,比SGD慢;

3)精度比BSD低,比SGD高。

结语:

小批量梯度下降法MBGD是梯度下降法的一个变形或变种算法。常用于机器学习和人工智能算法求解中。小批量梯度下降法MBGD结合了SGD和BGD的一种改进版本,既有训练速度快,也有精度较高的特点。小批量梯度下降法MBGD把训练集划分为很多批,对每一批(batch)计算误差并更新参数。可以选择对batch的梯度进行累加,或者取平均值。取平均值可以减少梯度的方差。小批量梯度下降在随机梯度下降的鲁棒性和批量梯度下降的效率之间取得平衡。它是如今深度学习领域最常见的实现方式。

(梯度下降系列算法介绍完毕)

------以往文章推荐-----

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612G1X25B00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券