100天搞定机器学习|Day36用有趣的方式解释梯度下降算法
本文为3Blue1Brown神经网络课程讲解第二部分《Gradient descent, how neural networks learn 》的学习笔记,观看地址:www.bilibili.com/video/av16144388前文我们已经搭建了一个包含两个隐藏层的神经网络,我们需要这样一种算法:网络得到训练数据后,算法会调整所有的权重和偏置值,提高网络对训练数据的表现。我们还希望这种分层结构可以举一反三,识别其他图像。训练好网络后,再给它未见过的带标记的数据作为测试,这样就能知道新图像分类的准确度。
这实际上就是找某个函数的最小值,在一开始,我们会完全随机地初始化所有的权重和偏置值。可想而知,这个网络对于给定的训练示例,会表现得非常糟糕。例如输入一个3的图像,理想状态应该是输出层3这个点最亮。可是实际情况并不是这样。这是就需定义一个代价函数。
网络可以对图像正确分类时,这个平方和就比较小,反之就很大。接下来就要考虑几万个训练样本中代价的平均值。
神经网络本身是个函数,它有784个输入值,10个输出,13000多个参数。
代价函数则要再抽象一层,13000多个权重和偏置值作为他的输入,输出是单个数值,表示参数的表现优劣程度。
代价函数取决于网络对上万个训练数据的综合表现,但是我们还需要告诉网络该如何改变这些权重和偏置值,让其表现更好。为了简化问题,我们先不去想一个有13000多个变量的函数,而考虑简单的一元函数,只有一个输入变量,只输出一个数字。
学过微积分的都知道,有时你可以直接算出这个最小值,不过函数很复杂的话就不一定能写出,而我们这个超复杂的13000元的代价函数,就更加不可能做到了。一个灵活的技巧是:以下图为例,先随便挑一个输入值,找到函数在这里的斜率,斜率为正就向左走,斜率为负就向右走,你就会逼近函数的某个局部最小值。(其实是沿着负梯度方向,函数减少的最快)
但由于不知道一开始输入值在哪里,最后你可能会落到许多不同的坑里,而且无法保证你落到的局部最小值就是代价函数的全局最小值。值得一提的是,如果每步的步长与斜率成比例,那么在最小值附近斜率会越来越平缓,每步会越来越小,这样可以防止调过头。
我们想象一个更复杂的两个输入一个输出的二元函数,代价函数是图中右侧的红色曲面。在输入空间被沿着哪个方向走,才能使输出结果下降最快?
在多元微积分领域,函数梯度指的是函数的最陡增长方向,沿着其相反的方向,函数值下降的最快,梯度向量的长度代表了最陡的斜坡的到底有多陡峭。
让函数值最小的算法其实就是先计算梯度,在按反方向走一小步,然后循环。处理13000个输入的函数也是这个道理。
只是把这些权重、偏置都放在一个列向量中,代价函数的负梯度也是一个向量。负梯度指出了在这个函数输入空间内,具体如何改变每一项参数,才能让让代价函数的值下降的最快。
对于这个我们设计的神经网络的代价函数,更新权重和偏置来降低代价函数的值,意味着输入训练集的每一份样本的输出,都会越来越接近真实结果。又因为我们选择的是所有训练样本代价函数的平均值,所以最小化即对所有样本得到的总体结果会更好。
当我们提到让网络学习,实质上就是让代价函数的值最小。代价函数有必要是平滑的,这样我们才可以挪动以找到全局最小值,这也就是为什么人工神经元的激活值是连续的。到这里,我们终于引出了梯度下降法的定义:

负梯度内每一项值的正负号告诉我们输入向量对应该调大还是调小,每一项的相对大小也告诉了我们哪个值影响更大,改变哪个参数值,性价比最高。
训练后的神经网络就可以进行数字识别了,但是当输入是一个噪音图片时,神经网络却仍很自信的把它识别成一个数字。换句话说,即使网络学会了如何识别数字,但是它却不会自己写数字。原因就在于网络的训练被限制在很窄的框架内,对于第一层网络,它的视角整个宇宙都是由小网格内清晰定义的静止数字组成的,它的代价函数则会促使它对最后的判断有绝对的自信。研究越深,你就会发现,神经网络没有那么智能。
本节完!下节课我们学习3Blue1Brown关于神经网络的第3部分《偏导数和反向传播法》。
100天搞定机器学习|Day36用有趣的方式解释梯度下降算法的更多相关文章
- 100天搞定机器学习|day37 无公式理解反向传播算法之精髓
100天搞定机器学习(Day1-34) 100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算法 本篇为100天搞定机器学习之第37天,亦 ...
- 100天搞定机器学习|day39 Tensorflow Keras手写数字识别
提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...
- 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗
100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ...
- 100天搞定机器学习|Day7 K-NN
最近事情无比之多,换了工作.组队参加了一个比赛.和朋友搞了一些小项目,公号荒废许久.坚持是多么重要,又是多么艰难,目前事情都告一段落,我们继续100天搞定机器学习系列.想要继续做这个是因为,一方面在具 ...
- 100天搞定机器学习|Day11 实现KNN
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day9-12 支持向量机
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- 100天搞定机器学习|Day16 通过内核技巧实现SVM
前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...
- 100天搞定机器学习|Day17-18 神奇的逻辑回归
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
随机推荐
- python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...
- ansible安装应用软件
1.创建相应的目录: mkdir -p /ansible/roles/{nginx,mysql,tomcat,db,zabbix}/{defaults,files,handlers,meta,task ...
- bzoj1052 9.20考试 第二题 覆盖问题
1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2004 Solved: 937[Submit][Statu ...
- vue自定义表单生成器,可根据json参数动态生成表单
介绍 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结合内置17种常用表单组件和自定义组件,再复杂的表单都可 ...
- [原创]SSH Tunnel for UDP
SSH Tunnel for UDP UDP port forwarding is a bit more complicated. We will need to convert the packet ...
- UVA12657 Boxes in a Line:题解
题目链接:https://www.luogu.org/problemnew/show/UVA12657 分析: 此题使用手写链表+模拟即可.(其实可以用list,而且更简便,但是会大大的超时) 肯定是 ...
- Linux下移动图像监测系统——motion的移植及应用
移动图像监控主系统的开发 移动图像监控的原理方法: 通过获取摄像头图像,比较前后每一帧的图像数据,从而实现移动物体监控.所有移动监控均是如此,只是图像帧的比较算法不同. 移动图像监控系统的实现 选择开 ...
- [git] 基础命令笔记
--内容整理自廖雪峰的GIT教程-- git status 查看当前工作区状态,显示未跟踪的文件以及未上传的修改记录 git init 使当前文件夹变成Git可以管理的仓库 git add xxx 将 ...
- php--学习封装类 (一)(操作mysql数据库的数据访问)
<?php class DBDA //定义一个类 { //定义成员变量,不能直接定义,前面要加上public或者是private public $host = "localhost&q ...
- Python之父新发文,将替换现有解析器
花下猫语: Guido van Rossum 是 Python 的创造者,虽然他现在放弃了"终身仁慈独裁者"的职位,但却成为了指导委员会的五位成员之一,其一举一动依然备受瞩目.近日 ...