# 人工智能–梯度下降法（4）

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

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

1）batch size的默认值配置为32；

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

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

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）会有更多的振荡，并且随着越来越接近最小值，需要增加学习衰减来降低学习速率。

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

2）速度比BSD快，比SGD慢；

3）精度比BSD低，比SGD高。

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

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

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

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20

2022-05-20