minibatch是咋来的呢?
这个在训练神经网络的时候仿佛已经司空见惯了,我们会根据前人的工作,惯性使然的把训练集分成一个batch,然后一轮就是个epoch,but why??
(全)梯度下降:
我们看我们之前所做的梯度下降是使用了所有的输入,也就是样本数是全部。
理论上好像我们用全部样本参与计算,得到的就应该是全部数据都符合的梯度,训练起来就像上图那样顺滑,但实际用起来完全不知这回事,特别大的batch经常难以收敛,这就完全不符合我们的常理认知。
据说这是因为损失函数不平整造成的,越大的batch 反而会收敛到局部最优解就跳不出来了。
随机梯度下降
那么当随机选一个1个样本参与计算的时候就是随机梯度下降。
Q:随机梯度下降,怎么随机的呢?
A:其实就是在求梯度的时候,不再用所有的m个样本数据来计算,而是随机的选择一条数据来计算梯度!
Q:随机梯度下降的好处是什么?缺点是什么?
A:在求梯度的时候快,迭代次数有可能更多,最终可能落不到全局最优解上
Q:Mini-Batch GD是什么?(这个效果最好)
A:就是在求梯度的时候做了一个折中,不用所有的数据,而是随机选择一部分数据来求梯度!
Q:为什么要不断的调整步长?
A:就是为了让越接近最优解的时候,调整的幅度越小,避免来回震荡!
Q:如果我们不人为的调小步长,会不会随着迭代的次数增多,调整的幅度自动减小?
A:调整的幅度取决于谁?却决于学习率和梯度,梯度事实上越接近最优解,梯度的绝对值越小
代码
import numpy as np
__author__ = 'yasaka'
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)
learning_rate = 0.1
n_iterations = 10000
m = 100
# 1,初始化theta,w0...wn
theta = np.random.randn(2, 1)
count = 0
# 4,不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,我们就认为收敛了
for iteration in range(n_iterations):
count += 1
# 2,接着求梯度gradient
gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
# 3,应用公式调整theta值,theta_t + 1 = theta_t - grad * learning_rate
theta = theta - learning_rate * gradients
print(count)
print(theta)