FCNN−全连接神经网络FCNN-全连接神经网络FCNN−全连接神经网络

实例 公里
0 1 2
1 2 4
2 3 6

公里和里之间存在着某种线性关系

公里  = Cx里

假设,开始C=1.5
输入 100公里,得到计算值是150里,而真实值是200里
误差值 = 真实值 - 计算值 = 200 - 150 = 50

既然知道错了,有了误差,我们改如何调整C的值呢?

这里就是我们希望输出值从150变得更大,因此增加了C

将C 稍微增大,变为 1.6 ,误差就变为了40.

这就是使用误差值的大小指导如何改变C的值

大误差意味着大的修正值
小误差意味着小的修正值


总结:
一个模型接受一个输入,并做出预测,即输出一个结果,我们根据结果和已知的真实数据进行比较,得到误差,从而调整内部参数,使预测更加精确。



预测模型:y = Ax

实例 宽度 长度 类型
1 3.0 1.0 B
2 1.0 3.0 A

初始,A设为0.25

y = 0.25x


从图中可知结果并不好。

观察第一个训练样本:宽度为3.0,长度为1.0的B

使用预测模型得到的结果是:y = 0.25*3 = 0.75,而真实值是1.0,其误差= 真实值-预测值 = 0.25

有了误差,就可以用来调整参数A

但是我们也不希望y的输出正好是1,线直接经过样本点,而是希望线再往上升一点

所以我们的目标的期望值可以是:1.1

误差值 = (期望目标值-实际输出值)

E = 1.1 - 0.75 = 0.35

我们希望用误差值E,来进行参数A的优化调整。要做到,就要找到E和A的关联

我们这里就假设期望值为t,就是刚刚的1.1

t = (A+▲A)x,▲是一种增量符,可以是增加也可以是减少,表示微小的变化量

误差值 = (期望目标值-实际输出值)

即E = t - y = (A+▲A)x - Ax = (▲A)x

即E = (▲A)x ,我们就找到了E和A的关联

然后我们根据误差E,我们需要将A调整多少呢?

改变一下公式,我们就得到了: ▲A=E/x


开始更新最初的斜率

误差值为0.35,x =3.0,根据公式:▲A=E/x = 0.35/3 = 0.1167

所以就是A=当前值+ 变化增量▲A = 0.25 + 0.1167 = 0.3667

使用这个A( 0.3667),就得到了我们需要的期望值y = 1.1

然后我们用另一个实例数据(1.0,3.0)来训练,已知正确值为x=1.0和y=3.0

现在我们知道,进过前一个实例数据的训练,得出线性模型:y=0.3667x

然后将x=1.0输入模型,得到y=0.3667,这和y=3的真实值相差很大,因为我们一般不会希望模型直接过点,而是希望直线再往下一点,所以期望值设为2.9

我们得到误差 E = 2.9 - 0.3667 = 2.5333

根据误差E,调整A

▲A=E/x = 2.5333/1=2.5333

A = 0.3667 + 2.5333 = 2.9

得到线性模型:y = 2.9x,符合了(1,2.9)的期望

我们和之前的模型图比较:

我们发现都不是我们的理想型(下图):

这可怎么办呢?

这里我们就可以思考发现,如果我们一直这样继续操作,使用各个训练样本进行模型的改进,那么我们最终得到的直线只与最后一次训练样本非常匹配,而实际上,最终改进的直线不会顾及之前训练的所有样本,是抛弃了所有先前训练样本的学习成果。

由此引进了学习率L

我们对于A进行变化的时候,不再是直接加上▲A=E/x,而是对其加上一个调节系数L,▲A变成了L(E/x)

L的出现,保留住了先前的学习成果,这样有节制的调整可以抑制错误和噪声的影响

这里假设L = 0.5

我们再重复上诉过程:

第一次实例训练时:初始A = 0.25,使用第一个训练样本,得到y = 0.25*3=0.75,期望值1.1,得到误差值 = 1.1-0.75 = 0.35

这里▲A = L(E/x) = 0.5 *0.35/3.0 = 0.0583

更新后A = A + ▲A = 0.3083

第二次实例训练时:x=1.0 ,期望y=2.9,使用第二个样本训练,得到y=0.3083*1=0.3083,期望值2.9,得到误差值=2.9-0.3083= 2.5917

这里▲A = L(E/x) = 0.5 *0.2917/1.0 = 1.2958

更新后A = A + ▲A = 0.3083+1.2957=1.6042

由上图,我们就能看出引进学习率的重要


神经网路神经网路神经网路

前向传播

这里进行数据的假设和初始化

激活函数(Sigmoid):y=1/(1+e^(-x))

输入1.0 和 0.5

w11 = 0.9

w12 = 0.2

w21 = 0.3

w22 = 0.8


单个神经元的输入,输出的激活过程


第二层的节点1

x = (第一个节点的输出*链接权重) + (第二个节点的输出*链接权重)

x = 1*0.9 + 0.5+0.3 =1.05

y = 1/(1+e^(-1.05)) = 1/(1+0.3499) = 1/1.3499 = 0.7408


第二层的节点2

x = (第一个节点的输出*链接权重) + (第二个节点的输出*链接权重)

x = 1*0.2 + 0.5+0.8=0.6

y = 1/(1+e^(-0.6)) = 1/(1+0.5488) = 1/1.5488 = 0.6457


矩阵乘法:

(3,2),第一个数字代表行,第二个数字代表列,因为约定,我们称为2乘以3的矩阵


神经网络的矩阵乘法

X = W*I ,W是权重矩阵,I是输入矩阵,X是组合调节后的信号

最后的输出O = Sigmoid(X)

使用矩阵乘法进行三层神经网络的展示

输入矩阵I

input_hidden之间的权重矩阵W(input_hidden):



hidden_output之间的权重矩阵W(hidden_output):



计算输入到隐藏层的组合调节输入值X(hidden):

X(hidden) = W(input_hidden) * I


X(hidden)层中的元素上应用Sigmoid激活函数,生成中间隐藏层输出矩阵O(hidden)


继续计算最终层的组合调节输入X = W*I

X(output) = W(hidden_output) * O(hidden)


X(output):

O(output)


下一步,将神经网络的输出值与训练样本中的真实值进行比较,计算出误差,继而使用这个误差值来调整神经网络本身,进而改进神经网络的输出值。

误差如何反向传播误差如何反向传播误差如何反向传播

1.使用所有误差进行单权重更新(无意义)

2.等分误差,进行权重更新(不合实际)

3.根据权重对误差进行不等分,进而进行权重更新(较为合理)


多个输出节点反向传播误差



神经网络通过调整链接权重进行学习。

这种方法由误差引导,误差就是训练数据所给出正确答案和实际输出之间的差值

然而与内部节点相关联的误差并不显而易见。

一种方法是按照链路权重的比例来分割输出层的误差,然后在每个内部节点处重组这些误差。

使用矩阵乘法进行反向传播误差


使用如下矩阵的方法来向后传播误差

error(hidden) = W^T(hidden_output) * error(output)

如何更新(神经网络模型)权重

一个简单的三层,每层三个节点的神经网络的最后单个输出节点的输出值是上图的公式:O(k)

能够表示所有的权重如何生成神经网络输出的数学表达式过于复杂,难以求解

解决措施:梯度下降法(gradient decent)


一个较复杂困难的函数

举实例:用这个简单的例子来可视化说明什么是梯度下降法

y表示误差,我们希望能找到x,可以最小化y

我们对其使用梯度下降的方法

首先随机初始化一个起点,如下,当前情况下的斜率为负,我们希望沿着向下的方向,即沿着X轴向右,也就是稍微增加x的值,就这样迈出了第一步

经过一定的训练后,达到下面的情况

所处之处,斜率为正,因此我们向左移动,即稍微减少x的值,如图向真实的最小值靠近了一些

我们往梯度相反的方向增加x值,正梯度意味着减少x,负梯度意味着增加x

我们如此一直操作,直到几乎不能改进为止,这样我们就确信到了最小值

最后我们也会遇见一个问题,如果每次移动的步幅太大,就会在最小值的地方来回反弹,所以到后期,我们需要逐渐减小步幅。


使用梯度下降法,我们一般不会使用代数计算出最小值

对于一元二次函数y=ax²+bx+c(a≠0)来说:

当 x=-b/2a 时,有最值;且最值公式为:(4ac—b^2)/4a

当a>0时, 为最小值, 当a<0时, 为最大值。

当函数有很多参数时,这种方法才真正地显示出它的亮点。y也许不单单取决于x,y也可能取决于a,b,c,d,e,f…

神经网络本身的输出函数不是一个误差函数,但是由于误差是真实值与实际输出之间的差值,因此我们很容易可以把输出函数变成误差函数

观察下表中的3种误差

第一种误差函数(目标值-实际值),看似合理,却显然存在大问题,因为正负误差都是误差,却可以抵消

y = (a-b),a是实际值,b是目标值

第二种误差函数|目标值-实际值|,这样正负误差就不能抵消,可能行得通,但是斜率在最小值附近不连续,这样梯度下降法就不能很好的发挥作用了,会在V型山谷附近来回跳动

y = |a-b|,a是实际值,b是目标值

第三种误差函数是差的平方:(目标值-实际值)^2,其优点有三

  1. 容易使用代数计算出梯度下降的斜率。·
  2. 误差函数平滑连续,这使得梯度下降法很好地发挥作用——没有间断,也没有突然的跳跃。
  3. 越接近最小值,梯度越小,这意味着,如果我们使用这个函数调节步长,超调的风险就会变得较小。

误差函数是如何依赖于神经网络中的权重的

下图演示了一个权重对于神经网络误差Error的影响

下图显示了两个链接权重

目标公式

这个表达式表示了权重W(j,k)改变时,误差E是如何改变的。也就是误差函数的斜率,也就是使用梯度下降法到达最小值的方向

这里和一开始的y=Ax,差就差在上面的是输出和真实值的误差函数,而y=Ax就是输出y


首先,让我们展开误差函数,这是对目标值和实际值之差的平方进行求和,这是针对所有n个输出节点的和。

误差函数根本就不需要对所有输出节点求和。原因是节点的输出只取决于所连 接的链接,就是取决于链接权重。

现在有了一个相对简单的表达式



把在前面的2 去掉。我们只对误差函 数的斜率方向感兴趣,这样我们就可以使用梯度下降的方法,因此可以去 掉2。

最后的神奇表达式,训练神经网络的关键

我们还需要做最后一件事情。我们所得到的这个表达式,是为了优化 隐藏层和输出层之间的权重。现在,我们需要完成工作,为输入层和隐藏 层之间的权重找到类似的误差斜率。

Step1.第一部分的(目标值-实际值)误差,现在变成了隐藏层节点中重组的向后传播误差,正如在前面所看到的那样。我们称之为e(j) 。

Step2.sigmoid部分可以保持不变,但是内部的求和表达式指的是前一层,因此求和的范围是所有由权重调节的进入隐藏层节点j的输入。我们可以 称之为I(j) 。

Step3.现在,最后一部分是第一层节点的输出O(i) ,这碰巧是输入信号。

这种巧妙的方法,简单利用问题中的对称性构建了一个新的表达式, 避免了大量的工作。

一直在努力达成的最终答案的第二部分如下所示,这是我们所得到误差函数斜率,用于输入层和隐藏层之间权重调整

这样我们就得出了误差函数所有链接权重的斜率

权重更新

首先介绍一下学习因子α,作用就是避免被错误的训练样本拉得太远的一种方式,同时也为了保证权重不会由于持续的超调而在最小值附近来回摆动

如果我们试图按照矩阵乘法的形式进行运算,那么我们需要看看计算 的过程。为了有助于理解,我们将按照以前那样写出权重变化矩阵的每个 元素。

权重更新矩阵有如下的矩阵形式,这种形式可以让我们通过计 算机编程语言高效地实现矩阵运算

权重更新实例



1.第一项(t(k) -o(k) )得到误差e1 = 0.8

2.S函数内的求和Σ(j) w(j,k) o(j) 为(2.0×0.4)+(3.0×0.5)= 2.3。

3.sigmoid 1/(1 + e^-2.3 ) 为0.909。中间的表达式为0.909 *(1-0.909)= 0.083。

4.由于我们感兴趣的是权重w(1,1) ,其中j=1,因此最后一项o(j)也很简单, 也就是o(j) = 1 。此处,o(j) 值就是0.4。

5.将这三项相乘,同时不要忘记表达式前的负号,最后我们得 到-0.0265。

6.如果学习率为0.1,那么得出的改变量为- (0.1 * -0.02650)= + 0.002650。因此,新的w(1,1) 就是原来的2.0加上0.00265等于2.00265。

参考了《python实现神经网络编程》

FCNN-全连接神经网络相关推荐

  1. 深蓝学院第二章:基于全连接神经网络(FCNN)的手写数字识别

    如何用全连接神经网络去做手写识别??? 使用的是jupyter notebook这个插件进行代码演示.(首先先装一个Anaconda的虚拟环境,然后自己构建一个自己的虚拟环境,然后在虚拟环境中安装ju ...

  2. 全连接神经网络(FCNN)

    全连接神经网络(Fully Connected Neural Network),CNN.RNN.LSTM等各种神经网络都是基于全连接神经网络出发的,最基础的原理都是由反向传播而来. 1.全连接神经网络 ...

  3. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类

    )全连接神经网络(FC) 全连接神经网络是一种最基本的神经网络结构,英文为Full Connection,所以一般简称FC. FC的准则很简单:神经网络中除输入层之外的每个节点都和上一层的所有节点有连 ...

  4. 使用tensorflow实现全连接神经网络的简单示例,含源码

    看别人的代码和自己写代码,两种的难度和境界真是不一样.昨天和今天尝试着写一个简单的全连接神经网络,用来学习一个基本的模型,在实现的过程中遇到了不少的坑,虽然我已经明白了其中的原理. 我想了一个教材上面 ...

  5. Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化

    文章目录 1 可视化 神经网络的二元分类效果 2 全连接神经网络 3 TensorFlow搭建一个全连接神经网络 3.1 读取MNIST数据 3.2 建立占位符 3.3 建立模型 3.4 正确率 3. ...

  6. 图像识别python cnn_MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(一)...

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 全连接神经网络是深度学习的基础,理解它就可以掌握深度学习的核心概念:前向传播.反向误差传递.权重.学习 ...

  7. 简单的全连接神经网络(tensorflow实现)

    简单的全连接神经网络,网络结构为2-2-1 代码如下: #encoding='utf-8' """ created on 2018-08-10 @author wt &q ...

  8. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下

    TF之DNN:TF利用简单7个神经元的三层全连接神经网络实现降低损失到0.000以下(输入.隐藏.输出层分别为 2.3 . 2 个神经元) 目录 输出结果 实现代码 输出结果 实现代码 # -*- c ...

  9. 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类

    多层全连接神经网络实现MNIST手写数字分类 1 简单的三层全连接神经网络 2 添加激活函数 3 添加批标准化 4 训练网络 5 结论 参考资料 先用PyTorch实现最简单的三层全连接神经网络,然后 ...

  10. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)...

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

最新文章

  1. Linux下程序时间消耗监控与统计
  2. docker-machine为节点安装指定版本的docker-ce的思路
  3. jvm运行时数据区是干啥的?CPU切换线程会不会突然忘记程序执行到哪一步了
  4. [云炬创业基础笔记]商业模式在现代创业中的重要性
  5. git传代码到github
  6. UNIX网络编程——sockatmark函数
  7. jira使用教程pdf_jira项目管理系统使用指南.pdf
  8. 顺骐名车汽车服务器中心,骐风k7电动汽车怎么样?骐风k7电动汽车介绍
  9. 我通过了 Google 技术面试,所以你也能行!
  10. RayMarching2:给球加上光照
  11. java的HashCode方法
  12. 一个轮显插件的尝试、思考和扩展
  13. 57. mysqli 扩展库(4)
  14. 呼叫中心行业,引领时代进步
  15. 成功之路散文连载之笨人论
  16. Windows 下使用 TFTPD32+HTTP PXE引导安装linux
  17. OFDM载波间隔_OFDM基本参数选择
  18. 现代电子计算机本质工作原理,现代电子计算机的本质工作原理是()。
  19. 叶上初阳干宿雨,水面清圆,一一风荷举
  20. Java基础 学习笔记7

热门文章

  1. windows 系统默认安装路径的修改
  2. 74HC595D介绍与实现(C语言与verilog实现)
  3. 基于NSGAII的多目标遗传优化算法的matlab仿真
  4. 【工具集:在线解方程、自动解题、科学计算】
  5. 2021-2027全球与中国半导体掩膜版市场现状及未来发展趋势
  6. 【转】ROC曲线与AUC值
  7. LM2596 adj DC/DC 降压模块
  8. 《天天数学》连载17:一月十七日
  9. Lesson 13 The greenwood Boys 绿林少年
  10. 3g安卓市场_Mentor Graphics:车载安卓系统的实施方案和注意事项