李宏毅机器学习二
1.误差与偏差
高偏差(Bias)对应着欠拟合,高方差(Voriance)对应着过拟合。
对于高偏差,主要的解决方法是正则化,具体可参考上一篇内容。
2.鞍点
在神经网络中的梯度下降中,梯度为0的点通常不是全局最优解,也可能会是局部最优解或者鞍点。鞍点就是在某一个范围内梯度为0,在这里梯度下降的速度会变得特别慢。当然也不需要过于纠结这个问题,我们的梯度优化算法如adam,RMSprop等或者强大的网络都可以解决这个问题。
3.梯度下降
3.1Mini-Batch
将m个样本分成T组,每组数据的大小为12的幂次方(第T组数据可能比前面的小),然后用这些数据依次去训练模型。
当每组数据的大小为1时,就是SGD,此时梯度下降的噪声会很大,不能平稳的接近最小值,但是下降速度比较快,而BGD(训练样本不分组)又能比较平稳的接近最小值,但是下降速度比较慢。所以Mini-Batch刚好综合的两者。
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
注意:每训练一次m个样本称为一次epoch,每次epcoh之前都需要将数据顺序重新打乱,重新分成T组mini-batch。
4.归一化
让所有输入归一化到同样尺度上,方便梯度下贱能更快的找到全局最优解。