大家好
欢迎回来
我们这一节继续
基于神经网络的人工智能系统
我们在这最后介绍反向传播
那么我们在前面的章节里头
我们介绍了
通过我们通过多层的神经网络
得到的结果和实际人们标注的
标签的结果做一个对比
做的比较得到了一个差值
这个差值就是损失函数
我们希望能够通过一些方法一些
优化来调整这些参数之后
能够让损失函数能达到最小
我们前面也介绍了梯度下降的方法
梯度下降是一种如何调整参数的一种方法
那么这个参数是如何按照什么样的顺序
以梯度下降的方法来进行调整的
那么我们实际上就是从当前的损失函数开始
从输出层一直到往前反馈
往前反馈给前面的各层
隐藏成调整各个层网络当中的
这些参数的权值
然后最后能够达到一个最小的
不断的训练
达到一个最小化的一个损失函数
那么因为是从输出往输入的方向
去进行调整
所以这个过程称之为反向传播
那么比如说我们有一个例子
看看反向传播是如何运作的
比如说我们有输入了一个数字二
那么如果对于没有训练好的网络来讲
它可能会得到这么一个结果
因为我们是希望它能够从十维向量当中
除了代表2的这一维是1.0之外
其他的都应该是零
对吧
这样一个输出
但是我们说网络可能还没有训练好
他最终得到了这么一个结果
十位向量有0.5 0.8 0.2 1.0 1.0这样的一个结果
那么这个结果显然不是我们想要的
我们想要的是这一排的结果
但是我们又不能够直接去调整结果值
因为你调了以后
你对于其他的图片其他的样本来说
你又不行了
所以我们要去调整
往前面的各层网络当中各个参数值
让它通过各层计算
得到了以后
应该要得到我们希望的结果
那么这样我们就来看看
首先我们对结果进行一个比较
比较了以后
我们发现我们应该把代表2的
神经元它的值来提高
把代表其他神经元值进行降低
那么这里就有一个提高和降低的一个幅度
比如从0.5也应该降到零
从0.8应该降到零
从0.2应该上升到1.0
然后其他比如说像3要降到0.0
那么每一个输出它的提高和降低的程度
其实是跟它的现有的值成比例了
比如说我们提高2的值
从0.2提高到1.0
那么这个就比像8从0.2降到0.0
要调整的幅度要来得大
要来的更重要一些
那么这是结果的比较
我们要调整这个结果
实际上是不能够直接去设定这个结果
因为这个结果是经过计算出来的
那么一个神经元的计算
它的输入输出可以类比成一个
多元的一次的一个线性方程
我们拿2元1次来说
比如说如果它的前一层有两个输入
还有两个数X1X2
那么它就是W1X1+W2X2
再加上一个偏移值
那么最终可以算出Y来就是算出它的输出值
那么在这当中可以调整的值
那么就是有W这两个W可以调整
甚至输入值
X1X2也可以调整
B的值也可以调整
就可以通过调整W X B这三个值来调整
最终达到调整输出这个结果
这样我们在调整的过程当中
其实因为参数特别的多
那么也要有一个选择
根据梯度下降的原则
我们说如果不同的参数对于损失
函数的影响不同的话
我们当然优先选择梯度值大的
参数来调整它
因为只有这样的调整它的影响才会大
如果梯度值比较低
那么你就即便是调整它了
它的影响也会比较小
那么这个就符合梯度下降最快
减少损失函数的这么一个原则
那么如何去调整Y那么第一个就是调整系数W
那么在2输出当中这个神经元里头
那么他一共有16个输入
就也就有16个X那么每一个X
都有一个W就有16个W那么
既然这样
我们就看这16个该调哪个
我们就去找
如果前一层它的激活值也就是它的X值越大
就表示在语义上表示
越有可能会包含了一些跟2相关的一些特征
因为它激活是高
所以我们优先调整那些激活值大
的神经元它的参数
这样它的影响会比调整激活值小的参数要来的大
所以我们优先越亮的输入值
它所对应的W调整起来
那么它的整个的变化的程度
它的影响的程度就会越大
那么所以我们16个当中选择
比较亮的这几个它的参数来进行调整
那么第二个调整方向就是调整输入X
我们同样也有16个X
就是前一层它的输出是这一层的输入
那么我们要调整哪些X呢
显然我们去观察在这个当中16个W
哪些W是正值
那么我们就应该提高相应的它的
激活值提高
因为提高了以后
因为他是正值
那么他的输出会更大
就会使得0.2往1方向增加
就会增加的更多
但当然如果这边对应的W值是负值
那就说明它是往下拉的
那么如果它的激活大
我们赶紧把它调低
那么所以这里头增加和减少的
程度和参数W具体的大小是相关的
但是我们没有办法去改变每个
神经元的激活值
那么实际上我们这里头有十个输出
那么十个都对上一层的每一个都
提出大小改变的要求
我们只有把每一个这里有对应十个
那么就把所有的大小改变了
要求进行叠加
叠加完了以后就得到了一个总的改变量
我们就希望如果想这一层输出是
我们的期望
也就是我们的倒数一层
他的前一层
他的每一个神经元除了调整自己
的W的一个权重值之外
也需要调整它的激活值
把改变量全部都给它累加在一起
这样就有一个对前一层希望的一个总的改变量
那么通过刚才的过程
我们就实现了从最后一层往前
倒数第二层的这样的一个传播
我们也就是说我们要改变最后一层
我们希望倒数第二层去如何去改变
那么就把改变传播到倒数第二层
那么同样的倒数第二层
对于倒数第三层
他要提出这个要求
这样不断的一层一层的传播回去
最后我们就能够知道该如何去
调整整个网络的参数了
那么这样我们最从最初的一个随机的参数
比如说在我们的数手写数字识别
当中有两个隐藏层
一个输入一个输出层
那么在这里头最开始的
13000多个参数都是从随机数开始赋值的
那么从随机的参数开始
经过梯度下降法和反向传播这样的一个训练
最终我们手写数字识别的准确率
从最开始随机赋值的不到10%
这是8.19%
经过2300多次的训练
最终得到了93%以上的这么一个识别率
这说明梯度下降加上反向传播
这是非常有效的一种能够对神经网络的参数进行优化的一种方式