zoukankan      html  css  js  c++  java
  • 深度学习-反向传播

      终于明白了反向传播的意义。
      核心要明白一个概念就是求导就是要通过构建的正向链,然后再通过反向链求导数值。
      为什么要求导数值?因为要求最小值。求什么最小值?
      求的是损失函数的最小值,可以通过数值方式(倒数公式)来进行求导,也可以通反向传播的方式来求导。
      为什么要求损失函数的极值?
      因为要通过损失函数的极值来推断出来W值。我们的终极目标其实是要求出W的最优质,这个最优质就是实现损失函数最小,为了求最小,所以我们要求损失函数的导数。
      但是有一点强调一下:求导数一定是某组数据的导数,或者说空间的某一个点的导数,离开具体的点来讲导数没有意义;所以导数的求解其实真实某个样本(空间一点)来求导;因为每个点的导数都是指向降速最快的地方,所以如果参数在迭代过程中每次都是向每个点的法向(但是什么是法向,等高线又是怎么回事),整体就是向最优解方向走。但是,有一点要注意,为了求损失函数的,而逆向求导不是损失函数(公式)本身的逆向,而是从神经网络隐藏层到loss层。
      下面是gradient的代码:

     1  def gradient(self, x, t):
     2         # 构建正向链,本身,我们是要对loss函数求导,所以这里先构建一下正向链
     3         self.loss(x, t)
     4         # 输出层(softmax)求导
     5         dout = 1
     6         dout = self.lastlayer.backward(dout)
     7         # 隐藏层求导
     8         layers = list(self.layers.values())
     9         layers.reverse()
    10         for layer in layers:
    11             dout = layer.backward(dout)
    12         grads = {}
    13         for idx in range(1, self.hidden_layer_size + 2):
    14             grads["W" + str(idx)] = self.layers["Affine" + str(idx)].dW + self.weight_decay_lambda * self.layers["Affine" + str(idx)].W
    15             grads["b" + str(idx)] = self.layers["Affine" + str(idx)].db
    16 
    17         return grads

      这里注意首先调用loss函数目的是为了先正向构建loss函数路径,这个路径包括x层经过的各个层(包括Affine层,Relu层等),最后才到来softmaxloss层,这个层里面是cross_entropy函数;注意:反向不是cross_entropy的函数的反向,而是从softmaxloss到relu到Affine,这个层之间的反向,你通过空间一点(x)正向走完了之后,反向再走一遍就可以求出来cross_entropy的导数。
    这里包括下面的是loss函数的实现:

    1     def loss(self, x, t):
    2         y = self.predict(x)
    3         weigh_decay = 0
    4         # 注意这里+2,是因为还要把lastLayer也给加上
    5         for idx in range(1, self.hidden_layer_size+2):
    6             W = self.params["W" + str(idx)]
    7             weigh_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)
    8 
    9         return self.lastlayer.forward(y, t) + weigh_decay

       最后一个问题,为什么要有Relu层呢?因为如果都是Affine层的话,训练出来的是线性函数,但是很多场景都是曲线,非线性分布,这个时候就需要为神经网络的学习增加一下非线性的层,来实现对于数据的拟合。

  • 相关阅读:
    odoo 的各种domain
    odoo search之时间搜索,时间段查询
    git 修改远程仓库地址
    Windows 挂起进程
    结构体 偏移量 (size_t)&(((s *)0)->m) , list相关
    Data Flow Diagram with Examples
    Windows环境,获取当前线程的ID,GetCurrentThreadId
    获取 保存 系统信息 [Windows]
    notepad正则删除关键词所在行
    文件或文件夹改变后,发信号让系统刷新
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/10992028.html
Copyright © 2011-2022 走看看