神经网络入门回顾(感知器、多层感知器)

神经网络属于“连接主义”,和统计机器学习的理论基础区别还是很不一样。

以我自己的理解,统计机器学习的理论基于统计学,理论厚度足够强,让人有足够的安全感;而神经网络的理论更侧重于代数,表征能力特别强,不过可解释性欠佳。

这两个属于机器学习的两个不同的流派,偶尔也有相互等价的算法。

本文回顾神经网络最简单的构件:感知器、多层感知器。

感知器

感知器是二类分类的线性分类模型,将实例划分为正负两类的分离超平面(separating hyperplane),属于判别模型。

感知器基于线性阈值单元(Linear Threshold Unit, LTU)构件的。以下是 LTU:

LTU 相当于对输入做一个线性组合,再加一个阶跃函数

常用的阶跃函数是 Heaviside 和 Sign。

哪怕只有一个 LTU 也可以作为简单的线性二分类器,类似于逻辑回归或者线性 SVM

感知器就是由一层 LTU 组成。以下是一个多输出分类器。

为了求得感知器的权重参数,需要确定一个学习策略,即定义损失函数并将损失函数极小化。有这样几种选择:

1. 误分类点的总数:损失函数不是 w, b 的连续可导函数,不易优化。
2. 误分类点到超平面的总距离:感知器所采用的损失函数。

感知器的损失函数是:

$$-\frac{1}{\left \| w \right \|}\sum_{x_i\in M}y_i(wx_i+b)$$

感知器学习问题转化为上式损失函数的最优化问题,最优化的方法是随机梯度下降法(stochastic gradient decent)。

感知器收敛性:当训练数据集线性可分时,感知器学习算法原始形式是收敛的。

感知器的具体算法分为两种形式:

1. 原始形式
2. 对偶形式:暂不介绍

原始形式算法:

$$w\leftarrow w+\eta y_ix_i$$
$$b\leftarrow b+\eta y_i$$

使用 sklearn 使用感知器算法:

 1 import numpy as np
 2 from sklearn.datasets import load_iris
 3 from sklearn.linear_model import Perceptron
 4
 5 iris = load_iris()
 6 X = iris.data[:, (2, 3)] # petal length, petal width
 7 y = (iris.target == 0).astype(np.int) # Iris Setosa?
 8 per_clf = Perceptron(random_state=42)
 9 per_clf.fit(X, y)
10
11 y_pred = per_clf.predict([[2, 0.5]])
12
13 print(y_pred)

输入如下:

[1]

与逻辑回归相比,感知器不能输出概率

多层感知器

MLP 的组成:

  • 1 个输入层
  • 1 个以上的隐藏层
  • 1 个输出层

当隐藏层多于 2 层时,又叫深度神经网络(Deep Neural Network, DNN)。

训练 MLP 的算法是后馈训练算法(backpropagation training algorithm)。后馈训练算法也就是使用反向自动求导(reverse-mode autodiff)的梯度下降法

1. 前馈:在每个连接层计算每个神经元的输出。
2. 计算网络的输出误差,并且计算最后一层的每个神经元对于误差的贡献程度。
3. 继续计算上一层的每个神经元对于误差的贡献程度。
4. 直到算法到达输入层。

为了很好地实施后馈训练算法,D. E. Rumelhart 对于神经网络架构做了重大的改变:把阶跃函数改为了几率函数(logistic function)$f(z)=\frac{1}{1+e^{-z}}$。因为阶跃函数导数都为 0,无法实施梯度下降;而几率函数处处可导。

除了用几率函数作为激活函数之外,还有:

- 双曲正切函数:tanh (z) = 2σ(2z) – 1。S 形状、连续、可导,不过输出值在 -1 到 1 之间,使得训练开始时神经层输出更加正则化,常常加速收敛。
- ReLU 函数:ReLU (z) = max (0, z)。连续,但是在 z=0 处不可导,可能使梯度下降震荡。但在实际中,ReLU 效果不错,速度也快。此外,由于它没有最大值,可以缓解一些梯度下降的问题。

MLP 常常用于分类问题,每个输出对应一个不同的二值类别。如果类别太多了(比如数字图片 0~9),输出层常常用另一个共用的激活函数来代替:Softmax 函数

原文地址:https://www.cnblogs.com/noluye/p/11246251.html

时间: 2024-10-23 12:02:07

神经网络入门回顾(感知器、多层感知器)的相关文章

RBF神经网络学习算法及与多层感知器的比较

对于RBF神经网络的原理已经在我的博文<机器学习之径向基神经网络(RBF NN)>中介绍过,这里不再重复.今天要介绍的是常用的RBF神经网络学习算法及RBF神经网络与多层感知器网络的对比. 一.RBF神经网络学习算法 广义的RBF神经网络结构如下图所示: N-M-L结构对应着N维输入,M个数据中心点centers,L个输出. RBF 网络常用学习算法 RBF 网络的设计包括结构设计和参数设计.结构设计主要解决如何确定网络隐节点数的问题.参数设计一般需考虑包括3种参数:各基函数的数据中心和扩展常

人工神经网络入门(4) —— AFORGE.NET简介

范例程序下载:http://files.cnblogs.com/gpcuster/ANN3.rar如果您有疑问,可以先参考 FAQ 如果您未找到满意的答案,可以在下面留言:) 0 目录人工神经网络入门(1) -- 单层人工神经网络应用示人工神经网络入门(2) -- 人工神经基本概念介绍人工神经网络入门(3) -- 多层人工神经网络应用示例人工神经网络入门(4) -- AForge.Net简介 1 介绍这篇文章中,我们将介绍一个用C#实现的框架AForge,利用这个框架,您可以方便地操作人工网络,

TFboy养成记 多层感知器 MLP

内容总结与莫烦的视频. 这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层.代码的目的是你和一个二次曲线.同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声. 添加层代码: def addLayer(inputs,inSize,outSize,activ_func = None):#insize outsize表示输如输出层的大小,inputs是输入.activ_func是激活函数,输出层没有激活函数.默认激活函数为空 with tf.name_sco

多层感知器学习

1.多层感知器简介 多层感知器(MLP)可以看做一个逻辑回归,不过它的输入要先进行一个非线性变换,这样数据就被映射到线性可分的空间了,这个空间我们称为隐藏层.通常单层隐藏层就可以作为一个感知器了,其结构如下图所示: 这里输入层首先通过权重矩阵和偏置得到总输出值并且通过tanh函数作一个非线性变换就可以得到hidden layer,然后从hidden layer到output layer可以使用之前的逻辑回归进行操作. 这里我们同样使用SGD算法来对参数进行更新,参数共有四个,分别是input-h

DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.创建应用程序并添加报表 启动 MS Visual Studio (2005.2008.或 2010). 在 Visua

Struts2整体回顾 之 Action,拦截器,值栈及关联关系

一.首先看一下当我们使用Struts时,一个请求所走的流程. 二.值栈的示意图 三.一个请求中,拦截器和值栈的时序图 4.请求.值栈结合图 Struts2整体回顾 之 Action,拦截器,值栈及关联关系,布布扣,bubuko.com

UWP入门(十一)--使用选取器打开文件和文件夹

原文:UWP入门(十一)--使用选取器打开文件和文件夹 很漂亮的功能,很有趣 重要的 API FileOpenPicker FolderPicker StorageFile 通过让用户与选取器交互来访问文件和文件夹. 你可以使用 FileOpenPicker 和 FileSavePicker 类访问文件,并使用 FolderPicker 访问文件夹 1. 文件选取器 UI 文件选取器显示信息以引导用户并在打开或保存文件时提供一致性体验 该信息包括: 当前位置 用户选取的项 = 用户可以浏览到的位

day05 Python多层装饰器、模块、字符串格式化、生成器和迭代器、递归

一.多层装饰器 需求如下:     程序运行时需判断当前是否有用户登录,以及当前登录的用户名是否为管理员账户,但有的函数只需判断当前是否有用户登录就可以,有的函数两个都需要判断,所以将这两个判断分开写成两个装饰器,在需要判断时直接使用相应的一个或两个装饰器即可,具体代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- #保存当前登录的账户名及账户类型(管理员为2,普通用户为1) USER_INFO = {} def check_login(func

python装饰器详解,多层装饰器,及带参数的装饰器。

pyhon学习有一段时间了,今天又碰到了Django的中间件,其实Django里面的中间件,就是用了多层的装饰器,然后去了解了一下多层装饰器,感觉有写东西差不多快忘了,也可能前面没学好. 现在重新记录,学习下. 普通装饰器: def warp(func): print('我是装饰器,碰到需要装饰的函数,一开始执行这里') def inner(*args, **kwargs): print('这里才是真正的装饰开始!') res = func(*args, **kwargs) print('装饰结