【飞桨paddlepaddle学习笔记(二)

烂漫一生 提交于 2020-08-12 18:08:47

在深度学习模型的训练过程中,一个训练数据的各个维度对最终的结果都会产生不同的影响,这个维度的影响可以用一个具体的数来表示,这篇文章中我称之为“权重”。为了使模型的输出更符合预期的结果,我们需要不断调整权重的大小。调整权重最常用的方法就是梯度下降算法。

我们假设一个数据只有两个维度,即权重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]))

随机梯度下降法:

一般梯度下降法把数据集中全量数据都拿来使用,如果数据集太大,按照一般方法就会造成效率低。所以可以采用随机抽样方式,从数据集中随机取出一点作为梯度下降算法。这就是随机梯度下降算法。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!