tnblog
首页
视频
资源
登录

python 梯度下降和反向传播(上)(学习笔记)

3450人阅读 2023/4/6 13:22 总访问:3475748 评论:0 收藏:0 手机
分类: AI

python 梯度下降和反向传播(上)(学习笔记)

基本定义


在开始之前我们来学习一些求导(斜率)定义与公式。

求斜率求导(第一种)


当有两个点在一个三角形上,我可以通过如下公式进行求导(斜率)。
简单来讲通过纵坐标的差值除以横坐标的差值就是求导,这种方式也叫定义法。


举例:


这里当取极限为0时,结果为2aw+b

求斜率求导(第二种)


求导公式,C表示常函数,X表示冥函数:


求导法则:


计算导数,举例:


看第一个aw的平方,这里a为常函数导数为0,w的平方为幂函数通过第二个函数得出导数2w。
又根据导数的第一个求导法则得出公式,以及结果为2aw。

简化计算

求斜率


由于我们通过大规模的计算达到一步到位的方式计算量过于复杂,所以我们可以通过挪动的方式来解决这样的问题。
当在中线左边时w不断的增大,当中线在右边时w不断减小。
如下图所示:


那么通过什么来进行调整呢?
可以通过斜率来进行调整,当为直线的时候斜率为0,左边的斜率为负数,右边的斜率为正数。
这样我们就可以判断w的值是在最低点的左边还是右边。


那么我们如果要获得斜率,就需要将一个曲线无限的放大让它趋近于一条直线,那么我们就可以在这上面取两个点并求斜率(也就是求导)。


需要注意的是,我们在进行直线来求斜率就必须要保证其两条线段的距离足够小?
足够小是多小啊?他更是数学上讲的极限,当极限值足够小的时候的a^w就为0,得出来的结果2aw+b
这一过程就被称为求导。
简单来讲通过纵坐标的差值除以横坐标的差值就是求导,这种方式也叫定义法。


还有另一种就是通过求导法则。

每次调整多少合适?


如果我们每次调整的误差是0.1那么速度上又太慢了。
那么我们可以当w离最低点远时我们可以加快它的调整速度,在快要到达最低点时速度放慢。
如何达到这样的效果呢?当w离开最低点远时,斜率的绝对值就越远,反之w离最低点越近时,斜率的绝对值就越小;为0时就到达了最低点。


理想很美好,现实很残酷。
当我们通过程序去调整时,w无法调整到最低点,因为调整到幅度太大,所以我们可以通过阿尔法参数来进行误差的调整。


这种通过曲线不同斜率去调整的方式又被称为梯度下降。
接着我们可以对比一下梯度下降的想法与Roseblat的想法,发现仅仅是多了一步将导数除以了二。
那如何凸显出它的优势呢?


正规公式:一次性带入所有的进行计算。
批量梯度下降:使用全部样本进行梯度下降。
随机梯度下降:每次取一个样本进行梯度下降找到最优点。
mini梯度下降:综合上面的优点进行,分批次梯度下降比如一次性100个进行梯度下降。

编程实践

随机梯度下降算法

  1. import dataset
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 获取100个豆豆
  5. xs,ys = dataset.get_beans(100)
  6. # 配置图像
  7. # 设置图像名称
  8. plt.title("Size-Toxicity Function",fontsize=12)
  9. # 设置横坐标的名字
  10. plt.xlabel("Bean Size")
  11. # 设置纵坐标的名字
  12. plt.ylabel("Toxicity")
  13. # 设置散点
  14. plt.scatter(xs,ys)
  15. # 设置权重为0.1
  16. w = 0.1
  17. # 获取预测值
  18. y_pre = w*xs
  19. # 按照预测值绘制图案
  20. plt.plot(xs,y_pre)
  21. # 显示图案
  22. plt.show()
  23. # 10000次学习
  24. for _ in range(100):
  25. for i in range(100):
  26. # 获取散点的值
  27. x = xs[i]
  28. y = ys[i]
  29. # 代价函数,e表示平方误差
  30. # e=(y - w * x)^2 = x^2*w^2 + (-2xy)*w + y^2
  31. # a = x^2*w^2
  32. # b = -2xy
  33. # c = y^2
  34. # 梯度下降的斜率为k=2aw+b,注意这里w不会算进来因为在刚刚计算时已经省略了
  35. k = 2*(x**2)*w+(-2*x*y)
  36. # 设置阿尔法
  37. alpha = 0.1
  38. # 获取新误差值
  39. w = w - alpha * k
  40. # 清除绘图窗口
  41. plt.clf()
  42. # 重新绘制
  43. plt.scatter(xs,ys)
  44. y_pre = w*xs
  45. plt.plot(xs,y_pre)
  46. # 暂停0.01秒,不暂停看不到绘制图
  47. plt.pause(0.01)


通过随机梯度下降慢慢的移动到我们想要的位置上,在最后的我们发现它会产生抖动。
其实是由于预测曲线调整的时候触及到比较大的值,就不断的调整坐标的范围。
我们可以通过xlimylim来慢慢调整。

  1. import dataset
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. # 获取100个豆豆
  5. xs,ys = dataset.get_beans(100)
  6. # 配置图像
  7. # 设置图像名称
  8. plt.title("Size-Toxicity Function",fontsize=12)
  9. # 设置横坐标的名字
  10. plt.xlabel("Bean Size")
  11. # 设置纵坐标的名字
  12. plt.ylabel("Toxicity")
  13. # 设置散点
  14. plt.scatter(xs,ys)
  15. # 设置权重为0.1
  16. w = 0.1
  17. # 获取预测值
  18. y_pre = w*xs
  19. # 按照预测值绘制图案
  20. plt.plot(xs,y_pre)
  21. # 显示图案
  22. plt.show()
  23. # 10000次学习
  24. for _ in range(100):
  25. for i in range(100):
  26. # 获取散点的值
  27. x = xs[i]
  28. y = ys[i]
  29. # 代价函数,e表示平方误差
  30. # e=(y - w * x)^2 = x^2*w^2 + (-2xy)*w + y^2
  31. # a = x^2*w^2
  32. # b = -2xy
  33. # c = y^2
  34. # 梯度下降的斜率为k=2aw+b,注意这里w不会算进来因为在刚刚计算时已经省略了
  35. k = 2*(x**2)*w+(-2*x*y)
  36. # 设置阿尔法
  37. alpha = 0.1
  38. # 获取新误差值
  39. w = w - alpha * k
  40. # 清除绘图窗口
  41. plt.clf()
  42. # 重新绘制
  43. plt.scatter(xs,ys)
  44. y_pre = w*xs
  45. plt.xlim(0,1)
  46. plt.ylim(0,1.2)
  47. plt.plot(xs,y_pre)
  48. # 暂停0.01秒,不暂停看不到绘制图
  49. plt.pause(0.01)

批量梯度下降


直接通过sum计算出所有的梯度下降。

  1. # 10000次学习
  2. for i in range(100):
  3. # 获取散点的值
  4. x = xs[i]
  5. y = ys[i]
  6. # 代价函数,e表示平方误差
  7. # e=(y - w * x)^2 = x^2*w^2 + (-2xy)*w + y^2
  8. # a = x^2*w^2
  9. # b = -2xy
  10. # c = y^2
  11. # sum 总计算一百次
  12. k = 2*np.sum(x**2)*w+(-2*x*y)
  13. w = w - alpha * k
  14. plt.clf()
  15. plt.scatter(xs,ys)
  16. y_pre = w*xs
  17. plt.plot(xs,y_pre)
  18. plt.pause(0.01)

固定步长下降


就是0.1,0.1的靠近。

  1. # 设置阿尔法
  2. alpha = 0.1
  3. step = 0.01
  4. # 10000次学习
  5. for i in range(100):
  6. # 获取散点的值
  7. x = xs[i]
  8. y = ys[i]
  9. # sum 总计算一百次
  10. k = 2*np.sum(x**2)*w+(-2*x*y)
  11. k = k/100
  12. if k > 0:
  13. w = w - step
  14. else:
  15. w = w + step
  16. y_pre = w*xs
  17. # 预测
  18. plt.clf()
  19. plt.xlim(0,1)
  20. plt.ylim(0,1.2)
  21. plt.scatter(xs,ys)
  22. plt.plot(xs,y_pre)
  23. plt.pause(0.01)

小结


通过这三次的观察,发现随机梯度下降算法比较可观。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

python实例 1-日志抓取处理 补错附日志小技巧

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

python安装pip以及使用pip安装requests等模块

pip很简单的介绍pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。如果想...

python数据集合区别

列表(list):可读写,值可以重复,有序排列,初始化语法:['tom',‘jerry’]元组(tuple):只读,值可以重复,...

python实例 2-12306抢票(二) 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

使用VS Code开发python

Vs Code开发Python可以很好的支持代码调试、智能提示、代码对齐等1:下载VS Codehttps://code.visualstudio.com/Downloadvs ...

python变量与命名

Python使用等号 ( = ) 作为赋值运算符,例如a = 66 就是一条赋值语句,作用就是将66赋值给变量a。Python是弱类型语言,弱类...

python关键字和内置函数

Python中包含了如下所示的关键字:上面这些关键字都不能作为变量名。另外,Python 3还提供了如下表所示的内置函数:也不能...

python基础输入和输出

Python使用print()函数向打印程序输出,采用input()函数接收程序输入。print()函数的语法格式如下:print(value,...,sep=&#...

python基本数据类型

Python包含两大类基本数据类型:数值类型、字符串类型,三大类组合数据类型:集合类型、序列类型和字典类型.数值类型:整型...

python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---> https://github.com/hellysmile/fake-useragent安...

python 升级pip

一条命令即可: python -m pip install --upgrade pip 安装成功后,一般是在python目录下面的Scripts里边的

python html编码解码

使用方法:html.escape(s)与html.unescape即可 import html s="<div>jsdlfjsl</div>" #html编...
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术