在深度学习模型的训练过程中,一个训练数据的各个维度对最终的结果都会产生不同的影响,这个维度的影响可以用一个具体的数来表示,这篇文章中我称之为“权重”。为了使模型的输出更符合预期的结果,我们需要不断调整权重的大小。调整权重最常用的方法就是梯度下降算法。
我们假设一个数据只有两个维度,即权重w为一个二维向量,权重调节参数b也为一个二维向量。训练的关键在于找到一组(w,b),使得损失函数loss最小,即使得损失函数L=L(w,b)最小。
一般梯度下降法:
实现梯度下降算法的步骤如下:
- 随机选取[w,b]的一组初始值;
- 寻找下一个[w,b]的值[w1,b1],使得Loss(w1,b1) < Loss(w,b)
- 重复第二步,直到Loss函数不再下降
计算梯度
(1)损失函数定义如下:
其中zi是xi的预测值:
(2)梯度定义:
由此可以计算出L对w和b的偏导数
将最终结果写成代码:
class Network(object):
def __init__(self, num_of_weights):
# 随机产生w的初始值
# 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
np.random.seed(0)
self.w = np.random.randn(num_of_weights, 1)
self.b = 0.
def forward(self, x):
z = np.dot(x, self.w) + self.b
return z
def loss(self, z, y):
error = z - y
num_samples = error.shape[0]
cost = error * error
cost = np.sum(cost) / num_samples
return cost
def gradient(self, x, y):
z = self.forward(x)
gradient_w = (z-y)*x
gradient_w = np.mean(gradient_w, axis=0)
gradient_w = gradient_w[:, np.newaxis]
gradient_b = (z - y)
gradient_b = np.mean(gradient_b)
return gradient_w, gradient_b
# 调用上面定义的gradient函数,计算梯度
# 初始化网络
net = Network(13)
# 设置[w5, w9] = [-100., -100.]
net.w[5] = -100.0
net.w[9] = -100.0
z = net.forward(x)
loss = net.loss(z, y)
gradient_w, gradient_b = net.gradient(x, y)
gradient_w5 = gradient_w[5][0]
gradient_w9 = gradient_w[9][0]
print('point {}, loss {}'.format([net.w[5][0], net.w[9][0]], loss))
print('gradient {}'.format([gradient_w5, gradient_w9]))
随机梯度下降法:
一般梯度下降法把数据集中全量数据都拿来使用,如果数据集太大,按照一般方法就会造成效率低。所以可以采用随机抽样方式,从数据集中随机取出一点作为梯度下降算法。这就是随机梯度下降算法。
来源:oschina
链接:https://my.oschina.net/u/3652287/blog/4488494