机器学习理论之(13):感知机 Perceptron;多层感知机(神经网络)
文章目录
- 表示学习 (representation Learning)
- 生物神经元 V.S. 人造神经元
- 感知机 (Perceptron)
- 训练感知机(Training Perceptron)
- 激活函数(Activation Function)
- 一层感知机
- 多层感知机
- 隐藏层神经元数量选择
- hidden layer 如何学习参数
- 多层感知机的性质
- 多层感知机如何具备非线性能力
- 思考
- 优缺点
表示学习 (representation Learning)
- 表示学习是神经网络的一个常见应用
- 例如图像相关的任务,数据的特征维度太高(通常在几十万上百万的维度,因为图像的每个像素点都是一个特征)
- 深度学习中常用 embedding 来对高维度数据进行处理,将其重新编码成维度较低的特征。
- 深度网络可以通过学习 embedding 后的特征来完成各种任务
生物神经元 V.S. 人造神经元
- 输入信号,输出信号,各方输入信号加权取平均,如果超过某一个阈值就将信号传向下一个神经元
- x⃗i=<xi1,xi2,...,xin>\vec{x}_i=<x_{i1},x_{i2},..., x_{in}>xi=<xi1,xi2,...,xin> 代表各方的输入组成的输入向量,bbb 是常数偏置项bias,对这些量进行加权求和(参数的权重同样是一个向量 w⃗=<w1,...,wn>∈Rn\vec{w}=<w_1,...,w_n>\in \mathbb{R^n}w=<w1,...,wn>∈Rn)然后通过一个激活函数 activation function fff 这也是个可选的超参数,可以为神经元选用不同的激活函数,激活后的值是一个标量 yi∈Rny_i\in \mathbb{R^n}yi∈Rn继续传入下一个神经元;
- 这个过程中的超参数是 fff 激活函数,需要学习的参数是 w⃗\vec{w}w 和 b(b≡w0)b(b\equiv w_0)b(b≡w0)
- 形式化的数学表示为:
感知机 (Perceptron)
- 感知机本质上就是只有单个神经元的神经网络
- 一个感知机就是一个二元的线性分类器,形式化表示如下:
- 这里的阈值是 0,也就是说只要 input 的加权和 >=0 那么感知机就输出 1
训练感知机(Training Perceptron)
- 训练感知机是试图求算最佳的参数向量 w⃗\vec{w}w 通过最小化训练误差
- 常用的方法是通过迭代(iterative)的方式对训练集上进行反复训练
- 具体的算法可以如下表示:
- 基本思想就是对于每一个训练样本(xi,yi)(x_i,y_i)(xi,yi) 得到它的预测值和实际值之间的误差,并通过这个样本的误差和优化算法来更新所有的需要求算的参数 wjw_jwj ;因为每个样本 xix_ixi 的特征维度是 jjj 因此,整个模型一共会有 jjj 个参数。
- 参数迭代的方式是梯度下降,图中使用的损失函数是:yi2−y^i2\sqrt{y^2_i-\hat{y}^2_i}yi2−y^i2,因此它的 梯度 是图中下标红线的部分
- λ\lambdaλ 是学习率,是所有参数共有的控制梯度下降速度的参数,对于每个 wjw_jwj,λ\lambdaλ 都是一样的
- 在红线下标的式子的最后一项 xijx_{ij}xij 是这个特征自身的值,如果 yi−y^iy_i-\hat{y}_iyi−y^i 是个负数,那么 wjw_jwj 就会向更小的方向更新,同时如果 xijx_{ij}xij 较大,那么这个特征梯度下降的速度就会很快。
- 这里的每个 x1,x2...x_1,x_2...x1,x2... 应该写成 xi1,xi2x_{i1},x_{i2}xi1,xi2 也就是表示的特征的值,而不是样本的值。
- 根据计算,w1,w3w_1,w_3w1,w3 下降的幅度比 w2w_2w2 大很多,因为他们的 特征值 xijx_{ij}xij 比较大
- 下面给出一个梯度更新的动态例子:
- 一共有四个训练样本 i=1...4i=1...4i=1...4,每个训练样本的特征数量是 j=1,2j=1,2j=1,2 两个
- 计算 y^i\hat{y}_iy^i 的公式在左下角,通过参数和样本向量的加权求和,通过激活函数后得到
- 通过 yi,y^iy_i, \hat{y}_iyi,y^i 我们可以计算出误差,并通过梯度下降公式来计算每个特征的参数应该如何更新
- 对于 偏置 bbb ,我们始终把它看成是参数向量 w⃗\vec{w}w 中的第一个参数 w0w_0w0,统一进行梯度更新求算;我们规定 xi0x_{i0}xi0 始终为 1.
- 在进行迭代之前需要给出一个初始化的参数向量,即 w⃗={b,w1,w2}={0,0,0}\vec{w}=\{b,w_1,w_2\}=\{0,0,0\}w={b,w1,w2}={0,0,0}
- 第一个 epoch 中:
- 前两个样本的预测值和实际值相同,因此不需要梯度更新
- 第三个样本产生了误差,因此根据梯度更新公式,参数的值被更新成w⃗={b,w1,w2}={−1,0,0}\vec{w}=\{b,w_1,w_2\}=\{-1,0,0\}w={b,w1,w2}={−1,0,0}
- 根据更新后的参数我们计算最后一个样本,发现没有误差,第一个 epoch 中所有的样本都执行了一遍,因此第一个 epoch 结束:
- 第二个 epoch
- 第一个样本就需要进行梯度更新,wj=wj+xijw_j=w_j+x_{ij}wj=wj+xij 所以 w⃗\vec{w}w 被更新成 {−1+1,0+1,0+1}={0,1,1}\{-1+1, 0+1, 0+1\} = \{0,1,1\}{−1+1,0+1,0+1}={0,1,1}
- 第二个样本是正确的,不需要更新
- 第三个样本又产生了误差,需要梯度更新 wj=wj−xijw_j=w_j-x_{ij}wj=wj−xij w⃗\vec{w}w 被更新成 {0−1,1−0,1−0}={−1,1,1}\{0-1, 1-0, 1-0\} = \{-1,1,1\}{0−1,1−0,1−0}={−1,1,1}
- 第四个样本不需要梯度更新
- epoch2 结束
- 第三个 epoch:
- 所有样本都没有发生梯度更新,这个模型已经收敛,因此不需要进行新的 epoch。迭代结束。
激活函数(Activation Function)
激活函数的作用一方面将加权求和后的信号进行归一化到 [0,1][0,1][0,1] 之间,另外一方面可以帮助 多层的感知机模型 获得非线性分类的能力。
对于感知机自身的激活函数:
这只能对线性可分的数据有一个较好的拟合结果,因为他本身基于的是线性假设,求解的总是一个 w⃗⋅xi⃗+b\vec{w}\cdot \vec{x_i}+bw
⋅xi+b 的线性方程。 感知机也不能保证分类数据有最大的决策边界(那是 svm 模型的任务)
感知机更不能够保证对非线性可分(non-linearly separable)数据拟合的很好。
感知机本质上是基于线性假设,如果把激活函数改成 sigmoid 函数,那么感知机就可以成为一个逻辑回归模型
一层感知机
- 我们上面说的概念对应的是一个感知机,对应的是一个神经元结点,那么如果有多个神经元结点,就能用他们来组成一层感知机
- 那么为什么要把 layer 的概念引入感知机呢?因为同一层内的所有感知机接受的是同样的输入,通过训练可以形成不同的参数,例如第一个节点 y1y_1y1 相关的参数是 w⃗i1={w11,w21...}\vec{w}_{i1}=\{w_{11},w_{21}...\}wi1={w11,w21...} 但第二个感知机 y2y_2y2 的相关参数是 w⃗i2\vec{w}_{i2}wi2。这样的一层感知机对于同一个输入最后就可以给出多个输出的结果,如果再结合 softmax 激活函数,就可以进行多分类任务。当然这个是后面神经网络的内容,我们在这里只是通过这种方式来认识什么是一层感知机。
- 有了一层感知机的概念,就可以扩展到多层感知机。
多层感知机
多层感知机有三个部分组成:
- 输入层
- 隐藏层
- 输出层
输入层的神经元的数量取决于输入样本的特征数
输出层的神经元数量取决于分类任务或者是回归任务。
- 在多分类任务中输出层的神经元数量与分类的类别数量一致 + softmax 激活函数
- 二分类任务中,输出层一个神经元 + 阶跃函数作为激活函数
- 回归任务中输出层只有一个神经元 + sigmoid 激活函数
隐藏层可以有很多层,图中只画了一层。每个隐藏层存在的意义都是对输入进行重新编码,编码成抽象的向量,然后输出给后面的层。
隐藏层神经元数量选择
- 取决于具体的任务的复杂程度,没有一个特定的参考
hidden layer 如何学习参数
- 通过后向传播算法 backpropagation
- 输出层的预测值和真实标签产生的误差的梯度可以通过 链式法则 传播到任意一个隐藏层,从而根据感知机更新参数的方式来更新每一个神经元的参数。这个过程是借助随机梯度下降的方式来完成的。
- 因此和单个感知机一样,也需要设置一个学习率 λ\lambdaλ
多层感知机的性质
- 通用逼近定理(Universal approximation theorem) 具有一个 hidden layer 的神经网络可以逼近任意的连续函数。
- 这意味着多层感知机(神经网络)可以拟合任何线性或者非线性的函数(不同于 逻辑回归或者 SVM 只能基于线性可分数据集)
- 上述的复杂的拟合任务必须要借助非线性!
多层感知机如何具备非线性能力
例如我们具有一个三层的感知机:一个输入层,一个输出层和一个隐藏层,三个层的参数矩阵我们分别用 wL0,wL1,wL2\textbf{w}_{L_0}, \textbf{w}_{L_1}, \textbf{w}_{L_2}wL0,wL1,wL2 表示。那么一个输入 xix_ixi 经过整个网络的过程可以表示成:
其中 fff 都是非线性的激活函数
非常清楚,这个式子可以拟合一个复杂的非线性函数。
作为对比,如果不采用任何非线性函数,只是使用上述的三层感知机,那么这个过程可以表示成:
通过最后的化简,这还是一个线性的函数,换句话说,还是只能处理线性可分的数据集。
因此我们说多层感知机必须搭配非线性的激活函数才能具有强大的非线性拟合能力。
思考
因为多层感知机有拟合复杂数据的能力,那么他就一定比线性模型的表现更好么?
- 答案是否定的,因为对于很多简单的数据集,仅用线性假设就可以很好解决, 如果采用太复杂的模型,很容易过拟合。
因为神经网络可以在隐藏层学习到他们自己的表示(representation)因此,他们不需要任何特征工程。
- 这个答案也是错的,如果不进行任何特征工程,那么很多噪声数据或者特征就容易给模型的拟合带来不利影响,garbage in garbage out。所以特征工程在很多时候都是需要的。
- 这个答案也是错的,如果不进行任何特征工程,那么很多噪声数据或者特征就容易给模型的拟合带来不利影响,garbage in garbage out。所以特征工程在很多时候都是需要的。
优缺点
- 可以适用多种任务:分类和回归任务
- 通用性很好,可以拟合多种分布
- hidden layer 可以学习到自己的特征表示
- 参数量太大,需要消耗很多的内存资源;
- 训练速度太慢,而且以为模型复杂容易过拟合
- 随机梯度下降不能保证每次都能收敛到同一结果
机器学习理论之(13):感知机 Perceptron;多层感知机(神经网络)相关推荐
- PyTorch 笔记(14)— nn.module 实现简单感知机和多层感知机
autograd 实现了自动微分系统,然而对深度学习来说过于底层,而本节将介绍 nn 模块,是构建于 autograd 之上的神经网络模块. 1. 简单感知机 使用 autograd 可实现深度学习模 ...
- 深度学习——感知机:多层感知机(multi-layered perceptron)图文详解
多层感知机 一,多层感知机 1.1 现在已有的门电路组合 1.2 异或门的实现 二,从与非门到计算机 三,总结 一,多层感知机 在上一篇深度学习--感知机(perceptron)图文详解中我们已经 ...
- 05_多层感知机_多层感知机笔记
4. 多层感知机 多层感知机:最简单的深度网络,由多层神经元组成,每一层都与下面一层(从中接收输入)和上面一层(反过来影响当前层的神经元)完全相连 训练大容量模型时,面临着过拟合的风险 4.1. 多层 ...
- 感知机和多层感知机详细学习
1. 感知机的前向推理? 感知机其实就是类似神经网络的一个神经元 w0相当于bias,也就是偏置 w1-wn是权重 step fuction是sign 前向推理的公式 2. 感知机的loss func ...
- 深度学习笔记其三:多层感知机和PYTORCH
深度学习笔记其三:多层感知机和PYTORCH 1. 多层感知机 1.1 隐藏层 1.1.1 线性模型可能会出错 1.1.2 在网络中加入隐藏层 1.1.3 从线性到非线性 1.1.4 通用近似定理 1 ...
- 什么是深度学习?kears简介,深度学习常用的三大模型,MLP(多层感知机),CNN(卷积神经网络),RNN(循环神经网络)
什么是深度学习? 简单理解深度学习就是人类容易做的事情,机器不容易完成的事情.(实例:人脸识别,这个例子很好的证明了这句话.假如你识别一个人 ,今天这个人长这个样子,明天脸上有一块伤口,我们人是不是还 ...
- 机器学习-分类之多层感知机原理及实战
多层感知机(Multi-Layer Perceptron) 简介 生物神经网络具有相互连接的神经元,神经元带有接受输入信号的树突,然后基于这些输入,它们通过轴突向另一个神经元产生输出信号.使用人工神经 ...
- 多层感知机总结-PyTorch
动手学深度学习-多重感知机笔记 多层感知机 多层感知机的从零开始实现 多层感知机的简洁实现 范数与权重衰减(weight decay) 暂退法(Dropout) 前向传播和反向传播 梯度消失和梯度爆炸 ...
- 前馈神经网络(多层感知机)基础
前馈神经网络(多层感知机)基础 1. 神经网络介绍 1.1 神经网络的生物学背景 1.2 人工神经元与感知机 1.3 常用激活函数 1.3.1 线性函数(Linear Function) 1.3.2 ...
最新文章
- linux磁盘怎么分区比较好,500G的硬盘,怎么分区比较合理?
- 太逗了,面试官让我讲线程 WAITING 状态!
- 2020 ICPC 济南 F. Gcd Product
- Transact-SQL数据类型(文本/图形/日期和时间/货币/特定类型)
- 新到的电脑BIOS中无法识别U盘
- 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解
- java 快速从树节点找到数据_14期每日分享Java程序员分享超全哈希相关的知识
- [转载] python中异常处理的四个句子_Python学习笔记总结(四)异常处理
- android 电话号码,Android中的电话号码自动格式化
- 计算机语言英语作文80词,春节英语作文80字【带中文翻译】-太平洋电脑网
- 服务器上的文件夹访问被拒绝,修改windows文件权限,解决“拒绝访问”或无法删除的问题-文件访问被拒绝...
- 计算机设计大赛 app一等奖,广商学子在大学生计算机设计大赛中喜获一等奖
- 三相全桥整流电路_什么是三相桥式全控整流电路,三相桥式全控的工作原理是什么,三相桥式全控电路电路图...
- 快来试试用 Python 将你的照片转化为“速写”
- 英语字母表及其冠词用法
- 关于安装Office之后,右键新建菜单中没有Word、PPT、Excel选项
- linux上离线安装PostgreSQL和插件PostGIS
- 计蒜客 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B coin(求乘法逆元)
- 1502: [NOI2005]月下柠檬树
- 为什么使用HashMap需要重写hashcode和equals方法_最通俗易懂搞定HashMap的底层原理...
热门文章
- 计算你恋爱谈了多长时间
- 【浏览器】ie内核等概念
- IE各版本内核(多指渲染引擎)
- eclipse启动问题:filed to load the jni shared library
- Android Studio 4.1.1 项目编译失败 一直显示 Gradle Config Projecr
- 网络安全 VS 信息安全,它们的区别是什么?
- 《JavaSE-习题篇二》之七个题目,十六张图,让你不惧递归。
- Reverse a Singly LinkedList
- 风险提示:“美食流多品牌全托管加盟”涉嫌诈骗
- 江湖小白之一起学Python (十二)开发视频网之获取m3u8真实播放地址