大家好,又见面了,我是你们的朋友全栈君。
一.网络的原理和结构
多层感知器(Muti-Layer Percetron)和卷积网络(Convolutional Neural Network)。这两种网络都属于前馈型网络(Feedforward network),其中多层感知器(MLP)是最简单也是最常见的一种神经网络结构,它是所有其他神经网络结构的基础,
好在我对神经网络的了解是从卷积神经网络开始的,对基本的原理和模型已经有了了解,所以学习起来相对容易,先看多层感知机的模型:
如何设计一个网络,输入代表像素的值,输出0-9之间的一个正确的数字
先把神经元当做数字
每个神经元里面是我们要提取的特征值,即像素的灰度值,0表示纯黑,1 表示纯白
这784个神经元组成了第一层,即神经网络的输入层
网络的最后一层是输出层,输出的是可能的概率,哪个概率最大,就代表识别的结果是哪个数字
网络的中间是隐藏层,包含这一些算法
比如网络的第三层,我们已经提取到局部的特征,只需要考虑将局部特征组合起来有多少 可能组成某一个数字
那再往前推,前面的一层网络就要能提取出更小的局部特征,把他们组合起来
通过权重值w,来提取我们关注的区域的值
这个加权和,再通过激活函数映射到[0,1]的区间
而通过偏置值,控制加权和不过早的激发
将加权和减去一个数,不让不必要的神经元激活,
权重代表我们关注什么样的图案,而偏置值代表加权和有多大激活神经元才有意义
在网络的第二层,每一个神经元都和上一层的784个神经元保持全连接
每个神经元都带一个权重和偏置值
用向量表示
所以,网络中每一个神经元更像一个函数,接收输入,输出0-1的值
进而整个网络也可以看成一个函数,接收输入,输出一个结果
二.网络如何学习
在网络训练的时候,我们需要定义一个代价函数,来告诉网络与正确值的差距
定义正确值1,其他为0,将网络输出的结果与实际结果相减,再将他们差的平方加起来,得到一个损失值
代价函数输出单个数值,来评价整个网络中的权重和偏置值与正确结果的差距
网络需要知道如何调整这些输入参数使输出接近正确的结果
以二维图像为例
随便 选一个输入值,然后考虑向左还是向右
计算斜率,斜率为正,表示函数是上升,那么我们梯度的反方向即向左
斜率为负,表示梯度是下降的,我们继续往右找到最低点
在每一点这样重复的计算斜率,直到找到局部最低点
在三维空间如何计算
同样也是计算梯度,沿梯度的反方向下降一小步
梯度如何计算:
梯度,就是封装了所有偏导的向量
这样我们就有了一个权重向量和一个反向梯度向量
将两个向量的对应的每一项相加,得到新的权重,再更新权重,如此循环
同时,代价值的绝对值表示每个w和B的重要程度
假如有一个函数的在点[1,1]的梯度向量是 [ 3 1 ] \begin{bmatrix} 3\\1\\ \end{bmatrix} [31]
也可以理解为改变x对函数影响更大
这样来看,网络的代价函数是把权重和偏置作为输入
三.反向传播法
通过代价函数我们得到了误差值
然后需要把所有样本的误差值平均值
我们求出的负梯度,同时反映了代价函数值的重要程度,
比如样本2,网络输出的值与正确的值差距较大,如何增大这个输出呢
如何让这个结果变大
我们知道这个结果是上一层的输出+权重+偏置再通过激活函数得到的
那么有三个方法
*增大上一层的输出
*增加权重
*增加偏置值
如何增加权重
比较亮的神经元,对应的权重对结果影响相对更大,所以增加相对亮的神经元,训练的效率会更高
所以当反向传播的时候,不仅要看高边哪些权重,还要看改变那些权重性价比高
如何改变上一层的输出
和更改权重一样,如果我们需要结果更大的时候,依据权重的大小,对上一层的结果做出呈比例的改变
结果2期待上一层的值如何改变,比如增大
结果3期待上一层的值如何改变,比如减小
…
我们把这些期待全部加起来,作为如何改变上一层的值的指示
如此往复循环,达到训练的效果
这就是反向传播的理念
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128227.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...