[代码+浅析]批梯度下降法batch gradient desc

2019-05-27  本文已影响0人  霞客环肥

我们在训练神经网络模型时,最常用的就是梯度下降,接下俩主要介绍下mini-batch gradient descent。关于Batch gradient descent(批梯度下降,BGD)就不细说了(一次迭代训练所有样本),因为这个大家都很熟悉,通常接触梯队下降后用的都是这个。这里主要介绍Mini-batch gradient descent和stochastic gradient descent(SGD)以及对比下Batch gradient descent、mini-batch gradient descent和stochastic gradient descent的效果。

  1. Batch gradient descent

Batch gradient descent 就是一次迭代训练所有样本,就这样不停的迭代。

  1. stochastic gradient descent

为了加快收敛速度,并且解决大数据量无法一次性塞入内存(显存)的问题,stochastic gradient descent(SGD)就被提出来了,SGD的思想是每次只训练一个样本去更新参数。

  1. Mini-batch gradient descent

mini-batch gradient descent 是batch gradient descent和stochastic gradient descent的折中方案,就是mini-batch gradient descent每次用一部分样本来更新参数。因此,若batch\_size = 1则变成了SGD,若batch\_size = m则变成了batch gradient descent。

batch\_size通常设置为2的幂次方,通常设置2, 4, 8, 16, 32, 64, 128, 256, 512(很少设置大于512)。因为设置成2的幂次方,更有利于GPU加速。 现在深度学习中,基本上都是用 mini-batch gradient descent,(在深度学习中,很多直接把mini-batch gradient descent(a.k.a stochastic mini-batch gradient descent)简称为SGD,所以当你看到深度学习中的SGD,一般指的就是mini-batch gradient descent)。

接下来,进入代码部分。

def create_mini_batches(X, Y, mini_batch_size=64, seed=0):
      """
      X--输入数据, shape = (m, H, W, C)
      Y--真实值, shape = (m, n_y)
      
      返回:
      mini_batches--同步列表(mini_batch_X, mini_batch_Y)
      """
      m = X.shape[0]
      mini_batches = []
      np.random.seed(seed)

      #Step1: Shuffle (X, Y)
      permutation = list(np.random.permutation(m))
      shuffled_X = X[permutation, :, :, :]
      shuffled_Y = Y[permutation, :]

      #Step2: Partition
      num_complete_minibatches = math.floor(m/mini_batch_size)
      for k in range(0, num_complete_minibatches):
            mini_batch_X = shuffled_X[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:,:,:]
            mini_batch_Y = shuffled_Y[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:]
            mini_batch = (mini_batch_X, mini_batch_Y)
            mini_batches.append(mini_batch)

      if m%mini_batch_size != 0:
            mini_batch_X = shuffled_X[num_complete_minibatches * mini_batch_size : m,:,:,:]
            mini_batch_Y = shuffled_Y[num_complete_minibatches * mini_batch_size : m,:]
            mini_batch = (mini_batch_X, mini_batch_Y)
            mini_batches.append(mini_batch)

      return mini_batches
上一篇下一篇

猜你喜欢

热点阅读