神经网络-感知器
1986年,Rumelhart,Hinton,Williams受到医学界人脑神经网络的启发,提出了神经网络,从神经网络发展出的深度学习,更是成为了当前热点,在科研与商业领域占据重要位置。现在我们就从神经网络中最基本的感知器开始,一起揭开神经网络的神秘面纱。
感知器结构
下图展示了感知器的基本结构:
- 输入结点。表示输入属性。输入信号X是一个n维向量,n表示记录的特征数量,向量X各个维度上的分量即对应特征的值。
- 输出结点。是一个数学装置,提供模型输出。包括加权求和和激活函数两部分。
- 权重W={ω1, ω2, … , ωn}。每个输入结点通过一个加权的链连接到输出结点。权重用来模拟神经元间神经键的链接强度。
- 输出信号y。输出结点通过计算输入的加权和,加上偏置项b,根据激活函数产生输出。
感知器数学表达式
感知器模型可用如下数学式表示:
其中,
为激活函数,常用的激活函数有:ReLU,tanh,sigmoid,sign等。训练一个感知器模型,相当于根据数据不断调整权重和偏置,使得总误差尽量小。
为了使公式表达更加简洁,b可以写成权重与x分量相乘的形式,即b=x0*ω0,其中ω0=b,x0=1。因此,感知器模型可以更简洁的表达为:
感知器模拟布尔函数
布尔函数指输入与输出的取值范围都在{0,1}内的函数。现有如下数据集,包含三个布尔输入变量和一个输出变量,当三个输入变量中至少有两个为0时,y取-1,当输入变量至少有两个大于0时,y取1。
X1 |
X2 |
X3 |
y |
---|---|---|---|
1 |
0 |
0 |
-1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
-1 |
0 |
1 |
0 |
-1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
-1 |
当各输入结点到输出结点的权重全部取0.3,偏置取-0.4时,使用符号函数sign()作为激活函数,则可用如下感知器公式来模拟此布尔函数:
将数据集中每条样本带入上述公式,可以发现,均可满足相应结果。
训练感知器模型
训练阶段,就是调整参数使得输出和样例的实际输出一致。最重要的部分就是根据旧权重和每次计算的误差,调整得出新权重。
算法流程
step1
D={(xi,yi)|i=1,2,…,n}为原始数据集
ω(0)={随机初始化权重向量};
step2
repeat
for 对于每个样例(xi,yi) {
计算预测输出y*
for 每个权值ωj {
ωj(k+1) =ωj(k) +λ(yi-y*(k))xij (1)
}
}
满足终止条件结束repeat
λ为学习率,ω(k)是第k次循环后第i个输入的权值向量,xij是xi第j个属性值。从权值更新公式(1)中可以看出,新权值等于旧权值加上一个正比于误差的值,如果预测正确,权值不变;如果(y-y*)>0,则要提高正输入的权值,并降低负输入的权值来提高预测输出值;如果(y-y*)<0,则要降低正输入的权值,并提高负输入的权值来降低预测输出值。
为了控制权值每次的改变量,以免使得前面的调整失效,λ控制在0-1之间,越接近0新权重受旧权重影响越大,越接近1新权重受误差影响越大。在一些情况下可以使用自适应的λ,即前几次循环时λ相对较大,后面循环中λ逐渐减小。
使用限制
感知器的决策边界是一个超平面,对于线性可分问题,可以收敛到一个最优解,如果问题不是线性可分的,那么感知器算法不收敛。
- 在Atom中配置Python开发环境
- C++ 多进程并发框架FFLIB之Tutorial
- 从补丁到漏洞分析——记一次joomla漏洞应急
- Python中对字节流/二进制流的操作:struct模块简易使用教程
- C++ 后台程序实时性能监控
- 系统入侵后的排查思路及心得
- 记一次Linux被入侵的经历
- C++ FFLIB之ffcount:通用数据分析系统
- Python内置数据结构之迭代器知多少?
- Python之解析式您知多少?
- C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
- C++ FFLIB之FFXML: 极简化TinyXml 读取
- 架构高性能网站秘笈(五)——Web组件分离
- 安全编程-c++野指针和内存泄漏
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分 隔。
- 树莓派基础实验11:U型光电传感器实验
- java 缓冲流+原理图解
- 写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取的字符串,要 求字符串中的中文不能出现乱码
- Java 编程,打印昨天的当前时刻.
- git merge后 丢失文件 以及 代码
- 树莓派基础实验12:PCF8591模数转换器实验
- spring boot多数据源的代码实现
- 树莓派基础实验13:雨滴探测传感器实验
- Java中的TCP通信程序
- Java实现一个简单的文件上传案例
- 树莓派基础实验14:PS2操纵杆实验
- Java反射
- Java Request(域对象+请求转发+原理)详解
- PHP命令执行学习总结