人工智能起步-反向回馈神经网路算法(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层(输入层+隐藏层(大于 ...
随机推荐
- 详细js中(function(window,document,undefined))的作用
在jquery插件中我们经常看到以下这段代码 对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用. 1.代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而 ...
- Backbone.js学习之初识hello-world
说了好久好久要学习Backbone.js,现在终于下定决心开始学习了.然后呢,就根据我的学习进度在这里做个简单的记录,方便新人,也方便我自己以后回忆. 准备 用bower下载这几个库或框架也是醉了.. ...
- Android ViewFlipper用法浅析
在Android应用开发中,我们经常会需要实现左右切换视图的功能,这通常需要在LinearLayout.RelativeLayout等布局中添加ImageView来实现.如果每次只需展示一张图片,并可 ...
- A*算法的实现
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...
- 十八、Android引导界面
一.所需素材 很有必要整理一下,里面附带友盟的社会化分享组件,我就不去掉了. 二.代码 import com.umeng.update.UmengUpdateAgent; import android ...
- SQLSERVER 启用跨库查询脚本
启用Ad Hoc Distributed Queries的方法,执行下面的查询语句就可以了: exec sp_configure 'show advanced options',1reconfigur ...
- pip在windows域下使用代理安装package方法
首先说明下,本人在公司使用windows域账户代理上网,用pip在线安装package 返回ProxyError,类似Tunnel connection failed: 407 authenticat ...
- Cocos2d-JS中的Sprite精灵类
精灵类是cc.Sprite,它的类图如下图所示.cc.Sprite类直接继承了cc.Node类,具有cc.Node基本特征. 创建Sprite精灵对象 创建精灵对象可以使用构造函数实现,它们接受相同的 ...
- 《HTML5与CSS3基础教程》学习笔记 ——Two Day
第七章 1. 样式表:选择器和生命块 2. !important: 某条声明的重要程度比其他高,在末尾添加 3. 属性值:inherit; 是强制继承 4. 1em=16px; 5. 可以 ...
- POJ 1285 确定比赛名次
Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...