当前课程知识点:R语言数据分析 > 下部:博术 > 第12章 既是世间法、自当有分别 > 12.9 人工神经网络(I)
大家好
欢迎来到《R语言数据分析》课程
今天咱们一起交流一下
人工神经网络的相关内容
还是回到我们这个算法地图
咱们这个课程里面会讲近邻法
决策树
随机森林
朴素贝叶斯
逻辑斯蒂回归
人工神经网络
以及支持向量机等等
这么几种模型
在前面讲完这个逻辑斯蒂回归之后
我们就扩充一下
就开始讲我们的人工神经网络了
也就今天的主题
在讲逻辑斯蒂回归的时候
其实我们可以将它视为一个计算单元
什么意思
它这边其实就是有
X1 X2 有Xn有好多个输入
对这个输入进行加权
然后再加上这个偏置bias之后进行什么求和
这个作为一个输入
一个input
一个I
然后有了这个输入之后怎么样
我对这个进行一个非线性转换
就是一个sigmoid的函数
进行非线性转换
也就这个
1/1+e^-I
然后形成一个输出
也就是说其实我们的逻辑斯蒂回归
它本质上可以视为一个计算单元
有这个X的输入
然后进行一个转换
再输出
这么一个过程
我们今天要讲的这个人工神经网络
它其实是对这个计算单元进行了扩充
什么意思
大家看一下
这就是我们这个图里面
就是我们一个人工神经网络的图
它包含一个输入层
一个输出层
还有两个隐藏层
其实这里面除了输入层之外
其他的所有的节点都是计算节点
其实可以和我们前面的这个
逻辑斯蒂回归里面这个计算节点
可以是一样的
具体什么意思
比如说我们这个第四个节点
它其实是什么
有好多个输入
有好多个X给它进行相连
这边相应的也有相应的W
相应的权值
然后加上这个偏置之后
这就是进行了
线性求和之后怎么样
这里面作为一个input
作为一个input
而它相应的输出是
就是经过这个激活函数
比如说我们可以选用这个Sigmoid
或者其他的
进行转换之后就变成一个
进行一个输出
这里面其实就是一个计算单元
同样这个计算单元
再连到下一层的不同的
计算单元上面去
比如说他连到这个第八个计算单元的话
怎么连的
第八个计算单元
又有好多这个具体的连线输入对不对
有第四个的输出
第五个的输出
第六个的输出
第七个的输出
都作为它的一个输入的部分
就是W48乘以O4
W58乘以O5
这样一直相加
相加再加上W0作为
它这个第八个单元的input
然后这个input之后也经过一个激活函数
经过一个转换
变成output
最终怎么样
最终连到我这个输出层来
也有一个output也就我们预测的结果
这个网络其实什么
其实就是一个多个计算节点所组成的一个网络
当然我们可以将它视为一个
超级复杂的复合函数
因为我们的每个计算节点其实都是一个函数
都是一个函数
对不对
都是一个函数
然后这个所谓的不同的层级的话
其实也就是函数在不断的嵌套
不断地嵌套
所以我们用通过这边网络的方式
把它组合起来而已
我们所谓人工神经网络
其实要学习到了就是这么一个网
就这么一个网络
那其实我们可以这样考虑这个问题
一旦我们这个网络的结构确定了
比如说它究竟有几个层级
每一个层上面有多少个节点
并且它相应的激活函数确定了
那其实我这个网络要学习的话
他学习到了什么
学到就是这里面不同的W对吧
当我在W不一样的时候
那我最后网络的输出是不一样的
当这个W不一样的时候
后面的输出的结果
和实际结果的偏差是不一样的
那好
其实我所谓的训练这个网络
就是把这么多的W
这么多的权值
怎么样
给学习到
给拟合到
这就是我们所谓的机器学习
在人工神经网络这个模型里面
一个最主要的任务
我要学习到这个不同的W
我们说了它其实是一个超级复杂的函数
就是一个函数的过程
这个f
y=f(X)这个f是相对比较复杂一点
但它再怎么复杂
他其实要训练出这个W的话
其实和我们前面这个逻辑斯蒂回归
可以采用同样的思路是什么
我要么通过
这个所谓的偏差最小这么一个策略
来不断地通过类似于这种梯度下降的方法
不断地迭代 不断地寻优
也是先随机选若干个
赋若干个W
给每一个连线都赋上相应W
然后怎么样
我朝着梯度下降的最快的方向
梯度是我们这个上升最快的方向
然后反方向
然后下降最快
直到找到
我这个整个偏差最小
那相应的一个W的组合
这也就完成了我们所谓
神经网络的一个训练的过程
咱们来看一看具体的这个学习算法
我们学习的策略
可以是这个最小化误差的平方和
我这个target和我这个output
和我这个就是实际的值
也相当于这个y的取值
实际这个target
和我这个网络输出的值
它的偏差要
要尽量小
要尽量小
那好
我们学习函数
我们的学习过程
假如我们采用这个梯度下降方法的话
可以和我前面讲的逻辑斯蒂回归一致
也可以有这么一个
就是不同的W
和我这个偏差函数
这个代价函数
所组成一个像山峰一样的
这么一个曲面
我真正要做的事情是
我就是要找到这个谷底
因为这个谷底是什么
是我偏差最小的
也就符合我这个学习策略了
但具体过程也是一样
它还是 千里之行 始于随机
我刚开始先随便找一点
然后我就像这个瞎子爬山一样
到这个应该是属于瞎子下山了
怎么办
我先随机找一点之后
找到一个下降最快的方向
最快的方向一直走一直走一直走
直到走到谷底
走到谷底之后
其实也就实现了我这个
我这W的一个估算
实现这个W估算之后
其实我整个这个网络也就训练出来了
也就可以用作预测
可以用于做分类
这是一个总体的思路
当然和我们前面讲的逻辑斯蒂回归是一致的
这里面其实要找这个
有一个随机的点之后
有个随机起点之后
下一步要走的话
其实这个方向是
下降最快的方向就是梯度的反方向
所以它关键还是要求这个梯度
这里面我们引一个引入一个方法
叫什么
叫误差反向传播方法
咱们来看一看具体的思路
就是误差它的最陡的方向就是梯度
那好 其实真正梯度下降方法
这个训练过程其实就是
不断的迭代这个W
不断的更新这个W
直接往下走一直往下走一直往下走
直到走到谷底
比如说两次迭代
这个差已经小于某个阈值了
就相当于没什么变化了
我就不用再走了
或者说我的迭代次数
已经超过我事先预定设定的最大的次数
我也不再走
在这个做这个权值
或者在计算这个梯度的时候
用到一个非常重要的概念是
就是误差反向传播
当然这概念听起来比较高大上
或者是听起来比较陌生比较抽象
但其实它
本质上就是链式法则
我们看看如何来求这个相应的这个梯度
也就是说看一看这个误差反向传播
它一个具体的原理
还是以咱们刚才这个网络为例
比如说我现在要对这个W8,12进行更新的话
也就是连接到这个输出层的相应的这个线上
它这上面的权值要进行迭代进行更新的话
怎么做
毫无疑问
我这个权值更新的量是什么
就是我这个学习率乘以后面这个
这个方向
这个梯度对不对
乘以这个梯度
乘以我这个偏导数对不对
就乘以这个偏导数
那好 因为它是那个反方向下走往下走
所以它加一个负号
这个时候其实是误差的话
它毫无疑问既有这个O12和这个T12的偏差
也有O13和T13的偏差
大家注意了
无论我们这个W是多少
我们在哪个层级
求这个W
求梯度的时候
求它的偏导的时候
其实都要看
我都要视最初的这个网
最终这个网络的输出
和我实际的Y的一个取值的偏差
而不是说我某个计算单元上面
它的output的和它的什么实际取值的偏差
实际上在我们这个某个单元上面
它只有output的
并没有它实际的取值
我们正在看这个网络训练的时候
就要看最终这一层这个output和target
这个目标这个取值
也就说实际取值它就你看他偏差多少
也就说我们可以把这个E
用后面这个1/2的T12减O12括符平方
然后T13减O13
括符平方对吧
毫无疑问
这一部分其实是跟
我们这个W8,12没什么关系的
他并不是W8,12这个相应函数
对不对
所以这部分我们可以直接剔除掉它
只剩下前面这一部分
前面这一部分的话
毫无疑问我们要对这个
对这个函数要对这个w8,12求偏导的话
怎么求
还是像剥洋葱一样
从外往里剥
对不对
从外往里剥
先看这外面这一层
二分之一的T12减O12括符平方
这一部分求偏导的话就是二乘以这一部分
对吧
就T12减O12 是不是 就这部分
然后再进一步的T12减O12再对
W8,12求偏导
这个时候毫无疑问
T12属于常量
那不用管它
那个负的O12
加一个负号
然后进一步的
对 O12
对 W8,12求偏导
那这个问题我们又往下传递了
往下传递了
这个O12对这个W8,12怎么求偏导
中间再加一层这个洋葱
就是O12先对I12求偏导
I12在对W8,12求偏导
毫无疑问这个O12对I12这个求偏导的话
又用到我们这个Sigmoid函数本身的
偏导这个性质
是什么
我要求这个偏导对它进行偏导的话
其实就是
因为这个O12其实就是做了一个
对I12进行了一个挤压
1加e的-I分之一
他的求偏导的话因为
就是O12*(1-O12)
这么一部分
那后面这个更加容易求了
这个I12对这个W8,12求偏导的话
因为我们说了
这个第12个单元的input包含好多部分
W0加上W8,12乘以O8
W9,12乘以O9
类似这样的
那毫无疑问对这个w8,12求偏导的话
它只剩下这个O8是不是
剩下O8
我们将那个位置稍微调换一下
因为我们是对这个W8,12
计算它的权值的增量
所以我们
它是λ乘以O8
在我们将前面这一部分
就定义为δ12
δ12放在这个位置
δ12
其实我这里面这个点
这条线是连接
连接第8个和第12个的这么一个连线
它上面的那个权重
所以它这条线的话8,12
这个编号为8,12的这个权值应该怎么更新
就是O8乘以δ12
实际上后面的我们所有的连线
都是这么一个更新的规则
比如说要W4,8他要更新什么
就是O4乘以δ8
δ8
对不对
就这么一个过程
好
咱们再看看
这个是属于那个连接到最后面这个输出层的
这个权值更新的过程
咱们再往前看看
这个W4,8是如何更新
这个毫无疑问它的权值更新过程也是一样
也是学习率乘以后面这个偏导
这个偏导同样也是
也是这个E的话
也是要计算这个T12减O12
在T13减O13
但这个时候我们一看
W4,8的话它既跟
既对这个O12有影响也对O13有影响
所以这两部分里面都要进行一个分别进行计算
我们也采用这个剥洋葱的方法
从外往里剥
就是我们在求这个偏导的时候就从外往里剥
这部分我们直接求出来
它的偏导是两倍的T12减O12
再T12-O12对W4,8求偏导
前面这部分常量去掉
然后负号移出来
然后改成什么
就进一步的变成了这个O12对W4,8求偏导
下面的这个O13也是一样的
咱们再看看
O12对W4,8求偏导的话
我们需要在里面这个洋葱在一层层往里剥了
再往里剥
什么意思
我O12要对W4,8求偏导的话
我怎么传递的
O12先对I12进行偏导
求偏导
取完偏导之后
I12再对O8求偏导
O8在对I8求偏导
I8在对W4,8求偏导
大家看一下
这里面其实这个过程看起来比较复杂
但其实它有一个最基本的规则是
都是O-I-O-I-O-I
注意到没有
最后都是I对W4,8求偏导
这么一个过程
我们可以进一步再往下看
这个O12对I12求偏导
再乘以T12减O12
毫无疑问这是多少
δ12
这前面我们定义了
然后这个I12对O8求偏导
I12就这个
12对O8求偏导
我们也刚才看了
就是这个W8,12对不对
W8,12
然后O8对I8求偏导
这个O8对这个I8求偏导
这个I8就是我们刚才这里面所有的
W
W0加上这个W4,8乘以O4
W5,8乘以O5
W6,8乘O6等等
它对I求偏导的时候
这个也是一样
也是这个Sigmoid函数本身的性质
就是多少
O8 * (1 - O8)
O8 * (1 - O8)
再往下的话
这个I8对这个W4,8求偏导
这个就好办了
I8对W4,8求偏导的话
这个input这个input对不对
因为这个input的I8的话
就是刚才我们说了就是这个几个的线性求和
那毫无疑问那剩下多少
只剩下这个O4了
我们再用不同的颜色做了一个对应关系
方便大家看一下
用不同颜色做的对应
那这个时候我们同样还是什么
还是把它继续往下合并
这个时候我们将这个
这一部分将这一部分
我们看一下这一部分
我们重新定义一下
用这个颜色表达
这部分定义为δ8
我们看一下
将这个O4往前移
将这一部分定义为 δ8
我们可以看得出来一个最基本的规律了
这个δ8是怎么得到的
它其实基于这个δ12和δ13
δ8是基于这个δ12和δ13什么意思呢
就我这一层
它的这个δ这个值
这个δ值它是基于下一层
它所联系到的δ12 和δ13的一个取值
然后分别乘以相应的这个系数
注意到没有
分别乘相应的系数
这一条原理其实再往前走的话
比如说δ4
它同样是多少
跟这个δ8 δ9 δ10 δ11有关系
怎么样
分别乘以它相应的系数
当然前面还乘以多少
就是
对这个δ8来讲是乘以这个
O8 * (1 - O8)
然后对这个δ4来讲就多少
就是O4 * (1 - O4)
也就是说我们这个δ的时候
它其实除了最
输出层的话
再往前的每一层这个δ都怎么样
都要基于下一层的
下一层相应的δ才能算得出来
对不对
所以我们整个这个计算过程应该是
反着来求的
先求后面的最输出的层
然后再往前逐层往前求
这个过程其实就所谓误差的反向传播
咱们来稍微总结一下
稍微总结一下这个过程
所谓权值更新公式就是
在原来上一轮基础之上有一个权值的增量
所有权值的增量我们发现了
W第i个单元和第j个计算单元
进行连接的时候
连接第i个和第j个计算单元的
这个W的增量是多少
就这个学习率
乘以这个Oi
注意是Oi前面这个
再乘以δj后面这个
这就是我们权值的一个增量的公式
然后这个δ的话我们刚才讲了
它是这么一个
每一个δ
它和下一层的K个元素相连的话
K个计算单元相连的话
那好
他就δk基于后面的k个δ
分别什么
计算它相应的相应的权值
乘以相应的那个权值
然后前面再乘一个Oj(1-Oj)
这就是我们整个权值更新的过程
我们看完这个权值更新过程之后
其实基本上也就将这个误差反向传播
原理里面最核心的部分讲清楚了
其实他什么
本质上用到数学知识都是链式法则
就是剥洋葱
一层一层往里剥
整个这个过程其实就是O-I-O-I的过程
以上就是我们这个BP神经网络
这么一种最基本的原理
就是误差反向传播一个最基本原理
咱们看看通过算法语言怎么实现它
怎么描述它的
这个算法里面
它的输入是有这个训练元组
以及相应的X相应的y对吧
还有一个学习率
就是它的那个步长
另外要设定我整个这个网络的结构
它包含多少个节点
有多少层
每一层有多少个节点
包括每个节点他的激活函数是什么
就这个神经网络结构需要设定
输出是训练后它的那个网络
所谓训练后形成的网络
其实就是将相应的W进行相应的一个优选了
哪些W是最好的
咱们看看具体的步骤
首先是初始化
这个网络里面所有的权值和偏置
就是这个W的随机赋值
这里面其实也没有一个理论上一个绝对的一个
好的方法
就是先随机赋一个值
然后进行迭代
就是我先在这个误差这个山上面先找一个点
然后再通过迭代不断走不断走走到谷底
咱们看具体是如何迭代的
它一般来讲分成两个部分
分成两个部分
首先是向前传播输入
这什么意思
比如对这个输入层来讲
这个输入层其实X本身
因为咱们这个网络里面
只有输入层不是计算单元
其他的每一个节点都是计算单元
输入层的话
它这个output就是它的input
就是他input
那对这个隐藏层和输出层来讲它怎么样
它有一个input一个output
input就是将这个前面的和它相连的
前一层的所有的output
都作为进行一个求和加上偏置
然后output
output就是经过一个激活函数
比如咱们这选用的是这个Sigmoid函数
就是1加e的负I分之一
这就是向前传播一个输入的过程
从前往后逐层传
逐层传
因为你们后面每一层的计算节点的input
都是基于前一层的output的
所以是从前往后的一个过程
然后第二个阶段是什么
向后传播
或者说反向传播这个误差
这个时候我先算输出层的每个单元的这个δ
这个δ
它就是O
比如说对于第j个计算单元来讲就是
就是Oj * (1 - Oj) * (Tj - Oj)
这就是那个输出层的计算单元这个δ
然后我对于输出层
再往前的每一个隐藏层都怎么算
假如我这个编号也是j的话
它也是Oj乘(1-Oj)然后再乘以
后面的我们刚才讲了
它基于后面它相连的下一层的每一个δ
再乘以相应的权值系数
我这边是第j个那边是第k的话
那就Wj,k再乘相应δ
这个时候就相当于所有的从后往前
前面每一层的δ都要基于
基于后面它相连这个计算单元的那个δ的取值
所以它应该是从后往前的一个过程
从后往前的过程
这个计算完之后
我来进行权值的更新
我们权值更新说了
比如说对于这个
连接Di和Dj个计算单元的这个W来讲
它权值更新多少就λ
这个学习率乘以Oi乘以δj
连接第i个和第j个Ij
大家注意这个序号
Oi乘以δj
当然这个偏置
其实也可以通过相应的方法来求
也是进行更新
学习率乘以这个δ
δj
其实我们这边讲
是将这个output的视为1的话
视为1的话
其实和前面这个公式形式上是一致的
然后如此每一轮一轮一轮进行迭代
就是从前往后
从后往前
这么两个阶段
不断进行迭代
直到满足这个终止条件
我们说这个梯度下降方法终止条件是
比如有两可选的
一个是每一次进行迭代完之后
这两次
这两次它已经没有什么偏差了
就发现已经走不动了
这个时候就不再走了
还有一种情况是
就我已经走了我太多次数了
迭代次数已经达到我预先设定的最大的阈值
这时候相当于我走了好多好多步
也不再走
前面我们讲了一下神经网络它的最基本的概念
以及它一个学习的过程
通过这个误差反向传播
如何来训练这个网络
训练出相应的W出来
具体在R里面如何实现
咱们下一次课再讲
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业