第二篇关于优化算法,介绍mini-batch以及momentum, RMSprop和Adam等优化算法
Mini-batch gradient descent
关于mini-batch,机器学习笔记最后一篇有所提及,不再赘述,这里强调三点:
- mini-batch size 的选择,更倾向于去选择2的次方,一般会考虑16,32,64,128,256,512等数字,这会在某种程度上相对于别的mini-batch size运算更快一点,因为更符合电脑的存储方式。
- 对于mini-batch,我们一般会进行数据shuffle来打乱数据。
- 由于样本数不会正好整除我们选择的mini-batch size,所以进行partition来处理最后一组数据。
def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):
np.random.seed(seed) # To make your "random" minibatches the same as ours
m = X.shape[1] # number of training examples
mini_batches = []
# Step 1: Shuffle (X, Y)
permutation = list(np.random.permutation(m))
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation].reshape((1,m))
# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.
num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning
for k in range(0, num_complete_minibatches):
mini_batch_X = shuffled_X[:, k * mini_batch_size : (k+1) * mini_batch_size]
mini_batch_Y = shuffled_Y[:, k * mini_batch_size : (k+1) * mini_batch_size]
mini_batch = (mini_batch_X, mini_batch_Y)
mini_batches.append(mini_batch)
# Handling the end case (last mini-batch < mini_batch_size)
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
Exponentially weighted(moving) averages
在讲解momentum,RMSprop,Adam优化算法之前,引入EMA(指数平均数指标),所谓EWA(EMA),它的公式如下图左上角所示。
在下图中关于days-temperature的图,我们看到蓝色的点代表了真实的数据,那很明显有很多噪点,那如果我们想要了解温度变化的大概趋势呢,我们就需要运用所谓local average(moving average),即对于即将要求取的temperature,我们集合之前5天、10天或者50天的温度求平均值来得到,这样曲线就会平滑。那么所谓的EMA就是一种对于moving average的近似。根据 β \beta β 的取值,EMA相当于求取的之前 1 1 − β \frac{1}{1-\beta} 1−β1 天的平均值。
如下图 β = 0.9