深度学习实战篇之(二)----- 梯度下降算法代码实现

世界地球日,奏响低碳生活进行曲,以蓝天为乐谱,以绿树为音符,以碧水为琴弦弹奏出环保最强音,为地球母亲祈祷平安吃五谷杂粮,穿天然布衣,住节能住宅,行无车之旅,用厉行节俭。让我们怀着敬畏感恩之心,向地球母亲贺寿。

沸腾是在一定温度下液体内部和表面同时发生的剧烈汽化现象。沸点是液体沸腾时候的温度,也就是液体的饱和蒸气压与外界压强相等时的温度。沸点指纯净物在1个标准大气压下沸腾时的温度。不同液体的沸点是不同的。沸点随外界压力变化而改变,压力低,沸点也低。                                                              

科普

知识

前言

深度学习实战篇系列的早期文章主要对标我们的理论篇文章,达到一个从理论到具体代码实践的效果。在前一期的深度学习理论篇文章中,我们主要学习了梯度下降算法的数学推导。今天,我们就来用代码进行实际操作,来试试我们的梯度下降算法更新权重w到底靠不靠谱,并具体了解训练过程或者学习过程的代码是怎么实现的,拭目以待吧!

一、梯度下降代码实现

本次代码实践之前,请大家一定要阅读前两期文章(深度学习理论篇之 (四) -- 梯度下降算法的魅力展现,深度学习理论篇之 (五) -- 梯度下降算法的数学推导)确保大家了解理论和数学推导后,我们才能理解今天代码,因此今天的代码是之前两期文章的代码复现,实际的例子也是我们之前举例的1M=100cm的例子,总的来说代码比较简单,主要是训练过程的步骤希望大家好好记得哦。

1.1 训练过程步骤梳理

1.学习的问题:本次代码我们将学习1M=100cm中的输入1M和目标值100cm之间的关系映射,也就是学习输入x对标的权重w,公式可以简单记为:有y = w*x。

2.权重w的学习过程采用梯度下降的方式进行不断更新,最终逼近我们的真实值。

3.具体训练过程可分为:

(1)权重w的初始化,随机赋予一个值.

(2)依据公式y = w*x,计算模型的输出(此处的模型可以简单理解为计算机,算法之类的意思就行)。

(3)误差分析,构建误差函数计算模型的输出和真实值之间的差距,误差函数为:

(4)在当前位置的权重w下对误差函数计算梯度,进行求导计算。

(5)将前面计算的梯度应用于权重w的更新公式,更新公式为:

1.2 代码实践

import numpy as np


# 我们的真实值,也就是标签
y_true = 100


# 误差函数定义(也就是之前文章中说的E)
def E_cost_fun(y_true, y_out):
  cost = 1/2*(y_true - y_out)*(y_true - y_out)
  return cost
#训练过程(学习过程)
def train(y_true,steps = 60, lr= 0.2):
   # 随机初始化权重
   w = 0.1


   for n in range(steps+1):


      #选取一个数据(它对应的标签为100,也就是说输入这个x,我们希望计算机模型的输出为标签值100)
      x = 1


      #模型的输出
      y_out = w*x


      # 误差分析
      cost = E_cost_fun(y_true, y_out)


      #梯度求导
      grad = (y_true - y_out)*x
      
      # 梯度下降应用于权重更新
      w = w + lr*grad


      # 打印每一次更新w后的结果
      print("steps:{} E_cost:{:.3f} w:{:.3f} ".format(n, cost, w))


   return w


w = train(y_true)
print("\n最终的映射关系w为:{}".format(w))




代码小结:从上面的代码来看,我们的代码实现思路简单,清晰简洁模型的输入就是x=1,输出计算公式也是按照权重w乘以输入x来进行计算的,随之的误差分析,梯度求导,权重更新也就顺理成章的往下走啦,完全是按照我们文章的思路来实现的,因此,只要仔细看了前面的文章,今天的代码理解起来非常的容易,其中需要注意的地方是,在梯度下降应用于权重更新的代码实现的时候,在代码里面是加法操作,然而在我们的公式里边却是减法,大家有注意观察吗?是不是小编写错了呢?大家有没有疑问呢?哈哈! 不是的,这是因为在我们的梯度求导公式的最后结果其实是有个负号的,忘记了的话,往前看看哦,然而我们的权重更新里面也是负号,因此负负即为正号啦,代码里面也就顺势改为加法啦,所以,在以后的学习过程中,有时候我们除了看待问题本身以外,还需要去学会审核问题里面自己不确定的,有疑问的地方,进而引起自己的进一步思考,是自己的问题还是问题本身的bug,这样的思考方式将在以后的学习中对我们的思维产生很大的帮助,不完全按照别人的思路走,时刻保留自己思考方式,进而去找出问题的答案,将会使得我们离成功更近一步。

1.3 实验结果

深度学习实战篇之(二)----- 梯度下降算法代码实现_第1张图片

深度学习实战篇之(二)----- 梯度下降算法代码实现_第2张图片

从以上的训练过程来看,程序执行54次左右的时候,也就找到了我们真正需要的权重w啦,整个过程不超过0.2s就完成了哦,看来计算机还是很厉害的吧!

结语

今天的代码实践虽然已经结束了,但是在梯度下降这一块的知识其实我们并没有学完,如果前期认真从感知机学习过来的老铁们就知道,我们的计算过程中,缺少了偏置b和激活函数的应用,为什么在后期的文章中,小编就没有讲解了呢?这是因为,小编的思路是带着大家从最简单的方式开始学习,没有讲解到的偏置和激活函数相信大家通过自主学习一定可以学会,偏置不就是除了学习w以外,多学习一个权重b而已啦,至于激活函数,也不过就是在梯度求导的时候会首先对激活函数求导吗?然后再对模型的输出进行求导吗?另外大家也可以在其他优秀的博客继续学习小编没有讲到知识哦,当然了,激活函数和偏执我们也会在后期的深度学习文章学习到,所以大家不用担心啦,如果能自己提前弄懂的话,那就再好不过啦,小编在这里只是起到一个引路人的作用哦,成长的路上,通过一定的引路人的帮助,最终通过自己的能力掌握一门技术方为成功之道。

加油,这条路,只为遇到更好的你们,我们!

编辑:玥怡居士|审核:小圈圈居士

●深度学习实战篇之(一)----- Python感知机实现

●深度学习理论篇之 (五) -- 梯度下降算法的数学推导

●深度学习理论篇之 (四) -- 梯度下降算法的魅力展现

扫码关注我们

一起开心的冲浪吧!

赞一下你最美!

你可能感兴趣的:(算法,深度学习,人工智能,神经网络,计算机视觉)