从零推导神经网络之入门篇
从零推导神经网络之入门篇
什么是神经网络?
可以先看逼乎这个问题下的答案:(https://www.zhihu.com/question/22553761)。
在有了基本概念后(没有也ojbk),我们往下走。
为了实现上述分类功能,我们可以采用如下的一种模型:
假设输入向量为,我们让输出为y=1或y=0(二分类问题)
以垃圾邮件识别为例,输入向量即为每个词汇出现的次数(频率),让输出y=1为垃圾邮件,为普通邮件。
【Tips:这种分类模型可以使用感知器或者逻辑回归(感兴趣的可以看历史文章了解更多)】
这种单个的模型,我们将其称为神经元,模型所使用的方法,称为激活函数。通过激活函数对输入向量的计算,我们就能得到分类结果(第二部分有解释)。
单个神经元能应付很多日常的问题,但是,有时候,单独的一个神经元并不能实现某些功能,如。
然而机智的人们发现,用两个神经元拼接起来就能实现这个功能。
进一步的,多个神经元,很多个神经元,非常多个神经元,当一家人整整齐齐团团圆圆时,我们虽然不知道发生了什么,但他们就是可以实现很神奇的功能。
所以,神经网络就引入了出来。
同样的输入,同样的输出,只不过过程变得复杂,让很多个神经元一起工作,其中一些神经元为另一些神经元服务罢了。
·神经网络的基础函数
1、Sigmoid函数
在神经网络中,我们一般采用Sigmoid函数作为激活函数。
Sigmoid函数也称为Logistic函数,它可以将数字转换到区间(0,1)之间,并且具有可求导等良好的数学特征。
【TIPS:感兴趣的可以看Logistic Regression逻辑回归】
函数公式:
函数图像:
然后,我们来看看PPT的这张图(emmm,其实画的挺好的)。这是一个神经元的计算例子:
具体点的例子,仍然是上面那个孤独的神经元:(两张图片是等价的)
每个神经元发生了两步:
每一层的神经元都这样计算一遍~
这就是前向传播,简单的1b,套公式就行:
这就是前向传播。
额外的,Sigmoid函数求导(后面要用):
2、损失函数
在一般模型中,我们都会定义一个Cost Function损失函数。
这样的模型中,最优化问题最小化损失函数。
【TIPS:感兴趣的可以看看Gradient Descent梯度下降
Convex optimization凸优化】
为了方便计算,神经网络中,我们定于Cost Function为
【TIPS:真的只是为了方便计算,因为平方误差对于逻辑回归是非凸的)】
(损失函数可以理解为真实值与预测值的差,故只看输出层)
·后项传播推导
Emmm,是这样的,我们站在宏观上来看,如果要使一个模型尽量好,那么我们认为可以调节的只有参数,所以后向传播是“用来调整参数的值”从而“提高模型精度”。
比如:
PPT的这个ANN中,InputVector输入向量已经确定了,为(1,0,1),我们要做的就是调整
这些玩意儿,从而使输出和预期的一样。
开始推导:
单个神经元如下:
我们来看看,对于一个神经元(PPT中的神经元6),他的输入我们当成是Z(PPT中为I),(bias跟着别人跑路了,就不管他了),通过激活函数,那么输出是。
时刻记住,后向传播本质只是链式求导
我们定义每个结点的误差(the error at each node),也就是PPT中的Err为
(Z=PPT中的I)。
【这就是Err的数学来源】
这么做1是因为,方便后续计算,2是因为对输入求导符合直观理解。
以输出层为例子:神经元j(可以直接替换成j=6)Err6的来源:
同样的,各个隐藏层也是这么推导的
对于神经元4,就是神经元4的输入():
推导出来后,那么对各个参数的导数就很容易得到啦~比如:
,一阶求导就是答案
最后,就是更新权重(即w家族了)
PPT上直接更新了参数值:l是步长;
为什么这么做呢,感兴趣的查查看梯度下降法,我就不多讲了,不感兴趣的知道公式为:
即可。
——————————————————————————————————
GG,看到这,也大概知道放弃了吧!
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- 【Java学习笔记之二十五】初步认知Java内部类
- AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
- 浅析ASCII、Unicode和UTF-8三种常见字符编码
- 【Java学习笔记之三十一】详解Java8 lambda表达式
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
- 【Code】关关的刷题日记21——Leetcode 485. Max Consecutive Ones
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
- 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
- Linux上访问SQL Server数据库
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
- 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java面试高频知识点总结 Spring
- 杂谈小程序
- pytest封神之路第四步 内置和自定义marker
- (译)SDL编程入门(3)事件驱动编程
- 一个简单的Angular search UI实现
- (译)SDL编程入门(2)在屏幕上显示图像
- 【Vue进阶】手把手教你在 Vue 中使用 JSX
- (译)SDL编程入门(1)Hello SDL
- Django使用Channels实现websocket
- (译)SDL编程入门(6)扩展库SDL_image
- 牛客网剑指offer-2
- 牛客网剑指offer-1
- (译)SDL编程入门(5)Surface 优化和软拉伸
- (译)SDL编程入门(4)按键操作
- webpack实战——生产环境配置【中】