计算机系统应用教程网站

网站首页 > 技术文章 正文

神经网络基础篇二 神经网络的基础

btikc 2024-09-30 13:10:31 技术文章 15 ℃ 0 评论

承接上文神经网络基础篇

Softmax分类器

如何把一个得分值转换成一个概率值呢?

该函数结果在0-1之间,恰好是个概率值,随便输入一个x,映射到这个函数中,就压缩成了0-1之间的概率值。通过这种方式就可以实现把得分值转换成概率值

猫属于cat分类得分是3.2,属于car分类得分是5.1,属于frog分类得分是-1.7,接下来计算猫属于每个类别的概率值。

exp表示e的x次幂,3.2和5.1之间差距1.9,差别不是明显,通过exp将这个差别放大,让结果更加明显,所以先通过e的x次幂做映射。

x越大,值的映射越大,x为负数,值越接近0,负数值代表不可能是这个类别。

exp映射之前3.1和5.2差距1.9,exp映射之后,变成了24.5和164差距就变的很明显了。

接下来就是归一化求概率

24.5/(24.5+164+0.18)得到概率值0.13,然后通过log函数计算损失

log对数函数

对数函数中的入参就是0-1之间的概率值,-log(0.13)=0.89,概率值越接近1表示越没有损失,越接近0表示损失越大。log0~1之间都是负值,所以要加一个负号,变成正数,这样才能得到一个实际的损失值。

通常情况下,都是用对数函数计算损失值,比如softmax、segmoid。

前向传播计算损失值

神经网络分为两大模块:前向传播和反向传播。


f=Wx这个是得分函数,x是数据输入,W是一组权重参数,得到一个得分值f,有了得分值之后,基于得分值和真实标签值去计算一个损失,然后加上R(W)。结果其实还是一个得分,比如猫得分500,狗得分300..,再根据得分值计算属于某一分类的概率值。回归任务最终计算一个分值,用分值去计算损失,而分类任务用概率值去计算损失。

有了x和w之后,计算损失值,计算损失值的过程就是前向传播,而神经网络的目标是更新w参数,损失很高的时候,说明w不好,怎样调节w让损失下降呢?

梯度下降(反向传播)

f=Wx 反向传播求的是W值

输入数据x,假设有A,B,C三个助手,A助手对x进行转换,得到xw1,B助手对A助手的转换结果再做转换,得到[xw1]w2,助手C对助手B的转换结果再转换,得到[xw1w2]w3。

计算梯度的过程是逐层计算的,[[xw1]w2]w3=f,反向传播首先看w3对f有多大贡献,再看w2对它后面的有多大贡献,再看w1对它后面的有多大贡献,计算过程是从后往前逐层计算。

举例说明:输入数据是一张猫的图片,A助手先分辨下图片中哪部分是前景,哪部分是背景,分辨出来之后,把背景弱化,前景突出出来。B助手认为猫的胡须比较重要些,再对猫的胡须做些处理。C助手可能更关注猫的眼睛或其他地方特征之类的。

输入数据有x,y,z

最终的结果是f(x,y,z)=(x+y)z,和每个值都有关系,想要f值调的比较小,需要分别改变x,y,z,使得f值变小。

看x或y或z对结果f的影响有多大,则计算f对x或y或z的偏导。

输入x=2,y=5,中间变量q=x+y,f=q*z

z直接对结果f产生影响,计算z的贡献有多大:δf/δz;

q直接对结果f产生影响,计算q的贡献有多大:δf/δq;

计算x的贡献:δf/δx=(δf/δq)*(δq/δx);

计算y的贡献:δf/δy=(δf/δq)*(δq/δy)。

结果L先对z求偏导,z对x或y求偏导。

前向传播就是x经过一堆w(w1,w2...)变换,得到损失loss,反向传播就是逐层往回一个一个求偏导。

x是输入的数据,计算反向传播或逐层的计算梯度值。

从后往前看,首先看1/x,1/x的导数是-(1/x^2),当x=1.37,1.37的导数是-(1/(1.37)^2)=-0.53。再往前,x+1的导数是1,-0.53*1=-0.53。

上图圈红部分:w0*x0=q,x0=δq/δw0,x0=-1,自身的数据乘以前一层传过来的梯度是0.2就得自身的梯度:x0=2 x [0.2]=0.4,w0=[-1] x [0.2]=-0.2。

不仅可以一个值一个值的从后往前计算,也可以整体框起来一大块一大块的做计算

对整体函数求偏导,计算它的梯度值。

反向传播门单元

  • 加法门单元:均等分配
    x+y=q,q无论对x求导,还是对y求导,结果都是1。1乘以后面传过来的梯度就等于梯度本身,梯度会均匀的传给x和y。
  • MAX门单元:给最大的
    max只会把梯度传给最大的值,小的值就没用了,如上图max把梯度2只传给了z。
  • 乘法门单元:互换的感觉
    x*y=q,q对x求偏导等于y,对y求偏导等于x。
  • 神经网络整体架构

输入层input layer的三个圆圈表示输入数据的列数或特征数,比如x1表示age,x2表示weight,x3表示height。

若输入数据是一张32x32x3个像素点的小猫图片,则输入层有3072个圆圈,代表当前图像数据像素点特征的输入。有多少个圆圈代表输入特征有多少个。

全连接表示输入层的每个圆圈和隐藏层的每个圆圈连接在一起

隐藏层1中的第一个圆圈:假设一组权重参数矩阵是[0.2,0.4,0.1] 则该圆圈就表示

age x 0.2 + weight x 0.4 + height x 0.1。隐藏层中的圆圈代表由不同的权重矩阵生成的。

神经网络通过反向传播计算出最好的权重参数矩阵组合方式。

batch表示一次训练或迭代多少样本数据,batch=1的话就表示一次一个样本数据。

一个样本有3个特征,定义为A、B、C,经过一个3x4的权重矩阵参数w1变换之后,得到1,2,3,4圆圈的隐藏层1。

w1举例为:

[[0.1,0.2,0.3,0.5],

[0.3,0.1,0.4,0.5],

[0.3,0.4,0.2,0.5]]

每个输入数据都对应一个权重参数,一般都是千万或亿级别的参数矩阵。

一条连线就代表一组权重参数,比如A->1的连线就代表[0.1,0.2,0.3,0.5],变换(即对特征数据进行了特征提取)了之后,得到了1x4的特征数据,对这个特征再做加工、转换即用一个4x4的权重参数矩阵w2对1x4的特征数据做处理,得到1x4的特征数据即隐藏层2,再经过4x1的权重参数矩阵w3对隐藏层2中的数据再做处理,最终结果得到一个数据。这个结果的好坏取决于w1,w2,w3,什么样的权重参数才是最适合当前任务的,这也是神经网络计算的权重参数解。

f(x)=[[xw1]w2]w3,能否用w4=w1 x w2 x w3,f(x)=xw4替换呢?

答案是否定的,因为输入层x数据经过w1转换了之后,得到的数据还需要经过一个非线性函数做个映射。

sigmoid函数是典型的非线性函数。

非线性映射这一步加在每一次矩阵计算之后,比如x和w1矩阵计算之后,做非线性映射,然后再和w2做矩阵计算。

隐藏层中的圆圈就表示神经元,神经元越多过拟和的程度越大,在计算机中得到的效果可能会更好,只是稍微多点的时候,运行速度也会很慢。

演示神经元个数对神经网络的影响

https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html

把神经元个数设置为1 num_neurons=1

样本数据为simple data

只有一个神经元的情况下,使用simple data,可以区分的开了。

再换一个环绕型的数据集,看看效果

并没有完全区分的开,这是由于神经元数据是1的原因。这里切了一刀。

将神经元个数修改2

发现被切了2刀。感觉需要切3刀(切成三角形)才能完全区分的开。将神经元个数修改为3

直接把中间的绿色的部分全部切出来了。

隐藏层的神经元个数越多,效果越好,但这也是相对来说的,因为神经元越多的前提下,过拟合的风险越大,得到的结果在测试集上可能有问题。

再看下旋螺式数据

效果不太好,增加神经元个数为5

这样红色和绿色就完全分的开了。神经元个数修改为10效果会更好一些,理论上神经元个数越多越好,但不得不考虑过拟合问题。

最后一个样本数据是随机数,每次点得到的结果都不一样。

一份数据本身是随机的,没有任何规律,让机器学习算法找规律,传统的机器学习算法实现不了,但神经网络可以,即便是拿到一份随机的数据集照样能把数据完全分开。神经元的个数多点也行,但不要太大,64、128、256、512这都是比较常见的值了,尽可能在不过拟合的情况下把事情做的更好一些。

一张800x600x3=144万个像素点的图片,输入神经网络,隐藏层中增加一个神经元,就增加了一组144万的权重参数。

惩罚力度对结果的影响

数据损失函数=训练集的数据损失+正则化惩罚项即loss+λR(W)。

惩罚力度最小的时候,奇形怪状的,看起来不是很适合,会过拟合。

某些w极高,某些w极低,但随着λ的变大,w由不稳定变的稳定,所以就变成了平滑的边界。

有些λ比较小的,训练的效果挺好,有些λ比较大的,可能在测试集上效果会好些,那要怎么选择?通常情况下,都要测试下,达到效果比较好的。训练集即使达到100%也没有多大用,实际看的还是测试集。

在使用神经网络的时候,一个经常思考的问题,不是说当前这个网络还差多少或者没表现好再怎么做个提升,而是很多时候在想这个网络能不能再弱一点,模型能不能再简单一些,正则化惩罚力度该怎样调整。到底使用什么样的参数来建立一个实际的模型,具体还是要跟业务挂在一起的。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表