人工智能起步-反向回馈神经网路算法(BP算法)
人工智能分为强人工,弱人工。
弱人工智能就包括我们常用的语音识别,图像识别等,或者为了某一个固定目标实现的人工算法,如:下围棋,游戏的AI,聊天机器人,阿尔法狗等。
强人工智能目前只是一个幻想,就是自主意识,具有自我成长、创造力的AI。如妇联2里的奥创,各种电影都有这个概念了。
我希望不久的将来能目睹这一奇迹。
不积跬步无以至千里。
先从基础讲起。
目前比较先进的算法理论据我所知应该分成3大类
1,神经网络
2,遗传算法
3,隐马尔柯夫链
这篇的主题是神经网路,其他两种我以后可能会写出来(可能!)。
神经元生物原理
100多年前脑部的生物构造被研究出来之后,大家就幻想可以通过模拟神经系统造人了。然后就弄出各种神经网络算法。所以先讲这部分内容,之后理解BP算法会更带感。
神经元是神经网络的基本单位,先贴一张图。
可以看到神经元的主要构造分为3个部分 N个树突+细胞体 +突触
神经元之间的连接是就是树突连接(另一个神经元)的突触。这种首尾相连的结构,N个树突可以连接N个神经元。
信号的传输方式是由N个神经元通过树突传递神经递质,递质上附加了生物电,当生物电累加到一定阙值时就会激发突触发送信号出去。
基本逻辑就是这样。下面我们看看人类的脑洞。
BP算法原理
BP算法由输入层→隐层→输出层构成。
输入输出层:这里可以看到这层可以有多个入口,也可以只有1个入口。
比如要做一个根据每期福利彩票的结果预测下期的结果。
那么输入层就应该上一期的结果(N个数字)。输出层就是这期(N个数字)。
隐层:隐层可以有N个节点或者N个层次。
正向过程:
输入层分别累加到隐层的各个节点
假设 输入是x 隐层节点是s
那么
s1 = x1+x2+x3+x4+……
s2 = x1+x2+x3+x4+……
s3 = x1+x2+x3+x4+……
然后为了可以动态调整各个节点加入的权值w1 w2 w3……
就变成
s1 = w1*x1+w2*x2+w3*x3+w4*x4+……
s2 = w1*x1+w2*x2+w3*x3+w4*x4+……
s3 = w1*x1+w2*x2+w3*x3+w4*x4+……
顺便加一个偏移值b 数学公式就成了:
Sj 还要经过传递函数 f() 算出 隐层节点的值
f()传递函数对应的过程就是:
神经元累加生物电到达一定程度时触发放电。如果没到达阙值这些累积的生物电就打水漂了。
举个例子来说
常用的一种激励函数是sigmoid 函数图如下
公式 f= 1/(1+e^-x)
这个S型函数的意义只要达到某一阙值 函数就会输出1 就算超出阙值也不会影响输出值。
隐层到输出层的过程也是一样的。
不过BP算法的重点在于反向回馈。
反向:
正向传输结束之后我们能够拿到一次结果。
这个结果就可以跟预期值做比较,一般计算方差E。
那么这个误差就可以反向的传递给上一层,用来调整上层节点的权值 w 。这个过程反复执行直到方差E小于期望的最小误差。(因为现实是不可能达到0误差,所以如果不设置最小期望误差则程序结束不了。)
至于具体的权值调整的公式有完整的推导过程,过于复杂这里不讨论。
核心的概念就是通过计算整体方差E对权值变量Wj 的偏微分得出 当前权值应该增加还是应该减少,上式很像n的那个字母就是指学习率。就是这里一次要调整权值时用的基本单位。
偏微分科普:
比如 一个公式有N个变量 y = aX +bY+cZ; 这里 XYZ是变量。abc是常量。
偏微分就是求单一变量的变化对y值的影响,其他变量在此被当作常量来求导。
那么y在这里求x的偏微分,就应该是 =a ; (bY+CZ)被当作常量。
小结:
那么一次正向反馈+一次反向调整权值使得全局误差减少,做多几次直到全局误差符合期望的最小误差。这就是一次训练完成。
多次训练需要提供不同的输入值。
再拿上面的例子说:
就是我拿第1期的开奖结果作为输入值,第2期的开奖结果作为预期值计算误差,这就是一次完整的训练。
第二次训练就是拿第2期作为输入值,第3期作为预期值。
以此类推直到没有新的训练样本。训练完成的神经网络就可以用来预测往后的任何一期的开奖结果。
(当然由于福利彩票是完全随机没有规律的,所以其实预测结果很糟糕。)
BP算法理论上能够逼近所有线性函数。
通俗点讲,BP算法能够在你拥有足够的历史数据而又不知道其中规律的情况训练出能够预测结果的算法。
但是必须这个要做的事情是有规律的(只是你不知道或者太过复杂),而且你的训练集必须包含所有“有效因子”。
有效因子这个词是我造的了。比如说你的历史数据里有50%是会影响结果的,有另外50%跟结果一毛钱关系都没有。这是神经算法允许的。
但是如果这50%的数据里没有包含所有导向结果的所有因素,那么结果就会差别很大。
假设说福利彩票(又来了) 有一个因素是空气质量(假设!),比如没雾霾的情况下出现某个数字的概率很高。
然而你的训练集中没有加入这个因素,那么结果就非常不准确了。
目前存在的问题
目前BP算法有两个明显问题:
1. 容易陷入局部最小值
比如函数
整个BP算法就类似求解这个函数的最小值。
但是我们看到这个函数有2个最小值,实际的情况是可能有非常多个极小值。
当我们从右到左调整权值时会到达第一个低谷。然后继续调整权值后发现误差值变大了,算法就误以为找到了最小值解。然而却没有拿到全局的最优解。
这就是所谓的陷入局部最小值。
2.过拟合问题
过度的符合训练集。就像刚才我举例说有50%的训练数据是无关结果的。所以算法最佳的结果其实是忽略掉这50%无用训练集。但是问题在于我们不知道规律是什么,不知道那些训练集是有效因子(知道了就不会搞出来一个BP算法了)。
所以过度的符合训练集也是错误的。
PS:BP算法数学的推导过程我这里有一个PDF。有兴趣的小伙伴留下邮箱地址。
这个算法在人工智能领域还是算入门了,升级版还有卷积算法。
涉及的数学概念非常多,尤其是统计学方面。
附上BP算法相关内容的思维导图
人工智能起步-反向回馈神经网路算法(BP算法)的更多相关文章
- stanford coursera 机器学习编程作业 exercise4--使用BP算法训练神经网络以识别阿拉伯数字(0-9)
在这篇文章中,会实现一个BP(backpropagation)算法,并将之应用到手写的阿拉伯数字(0-9)的自动识别上. 训练数据集(training set)如下:一共有5000个训练实例(trai ...
- 人工神经网络反向传播算法(BP算法)证明推导
为了搞明白这个没少在网上搜,但是结果不尽人意,最后找到了一篇很好很详细的证明过程,摘抄整理为 latex 如下. (原文:https://blog.csdn.net/weixin_41718085/a ...
- 深度学习——前向传播算法和反向传播算法(BP算法)及其推导
1 BP算法的推导 图1 一个简单的三层神经网络 图1所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本,通过前向运算得到 ...
- Backpropagation反向传播算法(BP算法)
1.Summary: Apply the chain rule to compute the gradient of the loss function with respect to the inp ...
- 从 0 开始机器学习 - 神经网络反向 BP 算法!
最近一个月项目好忙,终于挤出时间把这篇 BP 算法基本思想写完了,公式的推导放到下一篇讲吧. 一.神经网络的代价函数 神经网络可以看做是复杂逻辑回归的组合,因此与其类似,我们训练神经网络也要定义代价函 ...
- 神经网络——反向传播BP算法公式推导
在神经网络中,当我们的网络层数越来越多时,网络的参数也越来越多,如何对网络进行训练呢?我们需要一种强大的算法,无论网络多复杂,都能够有效的进行训练.在众多的训练算法中,其中最杰出的代表就是BP算法,它 ...
- (转)神经网络和深度学习简史(第一部分):从感知机到BP算法
深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...
- [DL学习笔记]从人工神经网络到卷积神经网络_1_神经网络和BP算法
前言:这只是我的一个学习笔记,里边肯定有不少错误,还希望有大神能帮帮找找,由于是从小白的视角来看问题的,所以对于初学者或多或少会有点帮助吧. 1:人工全连接神经网络和BP算法 <1>:人工 ...
- 多层神经网络BP算法 原理及推导
首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于 ...
随机推荐
- VB.NET 小程序 3
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ...
- bind() to 0.0.0.0:80 failed (98: Address already in use)
You can kill it using: sudo fuser -k 80/tcp And then try restarting nginx again: service nginx start
- .NET程序编译和运行
一次面试的时候遇到的一道题目,简要说明.NET的编译过程,在网上看了很多资料,简单总结如下: 1.一般的编译过程 通常高级语言的程序编译过程是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最 ...
- Process Stats:了解你的APP如何使用内存(转)
原文地址:http://android-developers.blogspot.com/2014/01/process-stats-understanding-how-your.html?m=1 原作 ...
- DWZ(JUI) 教程 中如何整合第三方jQuery插件
Query插件一般是$(document).ready()中初始化 $(document).ready(function(){ // 文档就绪,初始化jQuery插件| }); // 或者或缩写形 ...
- 如何用C#代码查找某个路径下是否包含某个文件
string path = "f:\\哈哈"; if (Directory.Exists(path)) { MessageBox.Show("存在文件夹") ...
- 验证证书的安装之外部用户PC
背景:使用一个域外的用户进行登录并验证 1. 用户登录浏览器下载CA证书或者证书链 2. 下载 3. 安装证书 4. ...
- js数组与字符串的相互转换方法
一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); 二 ...
- vlan知识
为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...
- javaScript之 变量、作用域和内存问题
<javaScript高级程序设计>第四章 读书笔记 4.1 基本类型 和 引用类型 的值 1. 基本类型值 包括:Undefined.Null.Boolean.Number 和 St ...