本文介绍多层感知机,会先按照历史顺序介绍多层感知机诞生前的一些模型,后面介绍具体实现与其算法。

如上图是一个神经元,我们可以看到它的胞体、轴突、树突。
我们高中的时候学过一种东西叫做神经递质,分为抑制性神经递质和兴奋性神经递质,以及一些关于兴奋和抑制相关的知识;
我们把这些递质看作神经元的输入,则可模仿神经元建立以下模型(M-P unit):

其中:
那个方块中的符号代表阶跃函数
兴奋性输入
抑制性输入
二元化输出
- 输入与输出都是二进制的
阈值
解释如下:
我们还可以用该模型实现布尔函数:
比如一组数据 0 0 1 0,合取为0,析取为1,我们只需分别把阈值设置为4和1即可:

这样加和做非线性处理后与阈值进行比较即可得到想要的答案。
当然 若是想实现取反操作,则可以加上抑制性输入或使用非门。

单调逻辑函数: 𝑓 指的是对于给定的两组n元逻辑变量 𝒙 = (𝑥1, … , 𝑥𝑛) 和 𝒚 = (𝑦1, … , 𝑦𝑛), 当输入𝒚 中的1是输入 𝒙 的子集时,满足𝑓 𝒙 ≥ 𝑓(𝒚).
上面定义看不懂没关系,这里举个例子:x=(0,1,1,0), y=(0,0,1,0);则x构成集合{,
}, y构成集合{
} 集合2里只有1个1,集合1里有两个,集合2是集合1的子集,那就是单调的。
命题1:不受限制的McCulloch–Pitts(M-P)单元只能实现单调逻辑函数。
即我们前面学的 and 和 or 都是单调逻辑函数, 而 not nor等需要引入抑制,不是单调逻辑函数。

每个具有n元变量的逻辑函数都可以被写成列表形式。
例如, 当 𝑛 = 3 时:

比如我们自己定义一个逻辑函数:只有输入为(0,0,1) (0,1,0) 时输出结果为1,其它都为0。
则对每一组数据的x1,x2,x3执行右侧操作:
命题2:任何逻辑函数 𝐹 ∶ → {0, 1} 都能由一个两层的M-P网络计算得到。
注:这里两层指的是左右两层,第一层上下可以是多行。
什么是构造所有逻辑函数的基本单元?
我们前面所学,抑制性连接可以被非门代替;
对于一个输入:(0,0,1)为1,其它为0:

则此时x1,x2是抑制性连接,可以写成非的形式。
即右侧写法与左侧输出相同。
命题3:所有的逻辑函数都能被包含与、或、非功能的网络所实现。
命题1:不受限制的McCulloch–Pitts(M-P)单元只能实现单调逻辑函数。
命题2:任何逻辑函数 𝐹 ∶
→ {0, 1} 都能由一个两层的M-P网络计算得到。
之前我们输入的都是逻辑单元01,这次x可以为实数,对x进行加权(w),求和,与阈值(b)进行比较,同样大于的取1,不大于的取0或者-1。
这个比较操作通过移项可以写成公式 ,w和x为行或列数为1的矩阵,相乘结果为实数。

在M-P单元的输入连接上加上权重
提出监督学习:
- 对于每个数据点
及对应的标签
, 计算输出
- 更新参数:
;
- 决策表边界是一个超平面
其中𝜂为学习率且 𝜂 > 0
注:该更新参数的过程类似于梯度下降,不过对于t和y它们是离散的,但在有限距离内依旧可以收敛但正确解上:

命题 4: 如果训练数据集线性可分,则感知机必定能收敛。并且训练中需要迭代的次数存在一个上限。证明参见 (Novikoff, 1962)
命题1:不受限制的McCulloch–Pitts(M-P)单元只能实现单调逻辑函数。
命题2:任何逻辑函数 𝐹 ∶
→ {0, 1} 都能由一个两层的M-P网络计算得到。
命题3:所有的逻辑函数都能被包含与、或、非功能的网络所实现。

缺点: 决策边界通常与样本点距离很近, 因此对噪声敏感。
对于图右侧,无法寻找一个线性超平面将其分解,这也使得神经网络进入第一次低潮。
同一层内的多个感知机
当多个感知机被组合起来时, 输出神经元之间是互相独立的; 因此多个感知机的学习过程可以看成是相互独立的。

结构与感知机一致,训练算法不同。

用
而不是用𝑦来更新参数
- 最小化均方误差
.
- 学习算法:
,
- 决策表边界是一个超平面
或
𝜂为学习率且𝜂 > 0
别名: LMS规则,Delta规则,Widrow-Hoff 规则,实际上是SGD。
另一视角:

感知机:

自适应线性神经网络(ADALINE)

用ADALINE解决异或(XOR)问题:
布尔函数:
| t | ||
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
误差函数: 其中
令 𝛻𝒘𝐸 = 0, 𝛻𝑏𝐸 = 0, 则
则求得:
这样的话无论输入什么,输出都成了定值0.5,显然是错的。

在二维平面上显然无法有一条直线将0和1分开。
局限:
这个问题主要是由于它是一个单层模型,这个时候我们就要用到多层感知机,对输入进行一个非线性的转换,转换到另外的一个空间,我们称作特征空间,经过多次转换有可能在一个特征空间就可以用一个超平面把这几个点给分开了。
此外在SVM领域核函数向量机(Kernel SVM)专门用来解决这种情况。
以下是一个多层感知机的结构, 每个计算单元我们用圆圈来表示。
对于输入来讲x就是问题的一种表示,对于图像来讲的话那么x就是一个像素点(一个实数来表示灰度、一个三维向量表示RGB值),对于声音来讲的话x为每刻声音的强度,对于自然语言的话x表示每个单词...
其他层都要做计算,包括输出层,像之前所介绍的Softmax输出一个y值,与标签t进行比较。中间还有很多层,叫做隐藏层。
隐藏层的目的就是要对输入进行多次的非线性变换,期望经过多次的变换,输出能够用一个很简单的模型,比如线性回归的模型就能把类别分开。

除了输入共 𝐿 层
连接类型:
- 相邻层之间的神经元两两连接(多层感知机又叫全连接模型)
- 相邻层之间没有反馈连接(单项箭头)
- 同一层内没有横向连接
每个神经元接收前一层神经元的输出,并根据激活函数作出响应。

比如对于第l层每一个单元,它的数值yj由:
对于偏置:也可以把偏置看作每一层多出来一个神经元,这样就可以把它吸收到w里面去进行公式化简。
向量形式的前向计算

Logistic函数及其梯度
双曲正切函数及其梯度
整流线性激活函数(ReLU)及其梯度

布尔函数:
| t | ||
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
我们从多层感知机的角度考虑上述问题:

我们在输入层与输出层之间加入了一个隐藏层,权值为V,偏置为c。
则经过这一层,分别对于上表4种情况的h为:
ps: 取ReLU结果为:

此时就变得线性可分了。
继续计算得到y,分别为0,1,1,0与 t 一 一对应,相同。
这样XOR问题就可以被正确求解,但该问题比较简单,我们可以通过试一试的办法把权值和偏置试出来,但对于一个实际问题,维数很高,我们就需要让机器去学习这些算法。
我们在反向计算中就会使用BP算法来学习这些参数。
我们回顾多层感知机,其倒数第二层会把问题引入到如分类问题上去,
损失函数:
其中
是每个样本n的损失函数
以上y分别使用了 logistic/sigmoid 函数和 softmax 函数
- 如果是均方误差或欧氏距离,可以使用ReLU其它的如双曲正切。
- 而使用交叉熵函数作为损失函数,不能用ReLU。
输出层的激活函数和损失函数由任务类型决定,见下表。它们与隐藏层的激活函数的选择是独立的。

参数更新(α为学习率)
正则化(在损失函数加上额外的一项,叫做权重衰减,减轻过拟合。)
参数衰减通常作用于 (对
不必要,只有w与x相乘)
𝑤的参数更新变为:
定义局部敏感度:
对于 :
其中 f 是激活函数。
即我们求误差函数对所有参数的偏导,等价去于计算各层的局部敏感度。
从最后一层出发,最后一层损失函数可能是 MSE 或者 Softmax交叉熵层。



向量形式的反向传播

对于隐含层 1 ≤ 𝑙 < 𝐿:
则
则
对于这两个激活函数, 从第𝐿层到第一层, 𝜹 (𝑙) 变得越来越小。 浅层的梯度会逐渐接近于零。
ReLU可以缓解这一问题
前向计算 – 计算 和
, 对所有的 𝑙 = 1,2, … , 𝐿
后向计算 – 计算 和
对所有的 𝑙 = 𝐿, 𝐿 − 1, … ,1
对所有 𝑙 = 1,2, … , 𝐿, 更新 和
模块化编程
实验1:对二维平面上的点进行分类
A Neural Network Playground (tensorflow.org)


实验2: 手写体数字识别
ConvNetJS MNIST demo (stanford.edu)

输入层或隐含层
可以被解构为两层
- 全连接层:
- 激活层:
平方损失函数层
可以被解构为两层
- 激活层:
f 可以是任意函数
- 损失层:
平方损失函数需要哪些层来实现?
FC layer + activation layer + Euclidean loss layer (全连接 + 激活 + 欧式距离损失)
交叉熵损失层
可以被解构为两层
- Softmax层:
f 是Softmax函数
- 损失层:
不过并不必要
平方损失函数需要哪些层来实现?
FC layer + softmax cross-entropy layer (全连接 + softmax交叉熵损失)
例子1
带隐含层的多层感知机,使用平方误差损失。

例子2

练习

参考答案

向量形式的反向传播

𝑊 可以从某个分布中采样:
随机梯度下降中的学习率𝛼 通常远小于批量梯度下降中的,因为更新过程中存在更大的方差。
选择合适的策略
如果样本的训练顺序固定,梯度的计算可能会有偏差,并导致收敛情况变差。
通常在每轮训练前都要随机打乱(random shuffle)数据集。
目标函数的形式通常是狭长且浅的沟壑,就像 Rosenbrock 函数一样。
在深度网络中,目标函数的局部最优点经常以这种形式呈现, 所以标准的随机梯度下降算法。通常会在“沟壑”两侧反复震荡。

动量(Momentum)是一种迫使目标函数沿着“沟壑”快速下降的方法。
动量的更新过程:
例如:

我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
文章目录前言1.AI的发展历程2.我是如何接触到人工智能的概念和产品的3.对于ChatGPT的一点看法4.AI对大学毕业生的职业发展的利与弊5.对于AI的思考和问题前言随着ChatGPT的爆火,生成式AI,大模型的人工智能被越来越多的人注意到,同时他也带来了许多问题。本文将对几方面进行探讨。1.AI的发展历程远古时期在公元前第一个千禧年,中国,印度和希腊哲学家都提出了一些推理的研究理论,比如亚里士多德(Aristotle)进行了演绎推理三段论的完整分析,欧几里得(Euclid)所著Elements是一种形式推理的模型,MuḥammadibnMūsāal-Khwārizmī,发明了代数学,即我们
目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、
我有一个带有全局应用程序布局文件application.html.haml的应用程序。然后我有多个“Controller堆栈”:用于我们的主站点、我们的管理门户和我们的业务站点。对于其中的每一个,Controller都在一个模块中,并且都继承自相同的BaseController。每个堆栈都有自己的布局文件。在堆栈中,一些Controller也有布局文件。我希望所有View(除非另有说明)在多层嵌套布局中呈现:应用程序、“堆栈”、“Controller”。例如,对于Site::BlogController#show操作,我希望rails呈现:/site/blog/show.html.ha
我正在尝试使用YAML创建应用程序中使用的所有存储过程的列表以及调用它们的位置。我设想了类似下面的内容,但我认为YAML不允许多层嵌套。access_log:stored_proc:getsomethinguses:usedin:some->bread->crumbusedin:somethingelseherestored_proc:anotherspuses:usedin:blahblahreporting:stored_proc:reportingspuses:usedin:breadcrumb有没有办法在YAML中做到这一点,如果没有,还有哪些其他选择?
作者|Harper审核 |gongyouliu编辑|auroral-L机器学习的商业应用上期给大家介绍了机器学习的概念,但是理解机器学习最好方法之一,就是了解其在具体商业世界中的各种应用。在道格’罗斯的这本《认识AI,人工智能赋能商业》中,介绍了几类机器学习的商业应用,在这里我给大家归纳一下。第一,数据安全,为了避免被发现,制造恶意软件的人会不断更改代码,通常为2%~10%的修改,但是通过机器学习,安全软件可以适应这一小部分变化,并准确识别新创建的恶意软件。它还可以寻找访问方式的模式,以识别可能的安全威胁。第二,投资。机器学习使得计算机能够处理大量的财务数据,并利用其发现的规律预测市场及每只股
ChatGPT。以下为参考大佬文献的链接:jQuery实现鼠标拖动div改变位置、大小的实践-H5W3在上述大佬的方法是完全可以实现单一标签节点的大小更改和位置更改的。但是,有还是几个问题
我正在安装openshift客户端工具,如下所述:https://developers.openshift.com/en/getting-started-windows.html#client-tools.在“设置您的机器”步骤中出现错误:rhcsetupC:/Ruby22-x64/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--dl/import(LoadError)完整堆栈跟踪:C:/Ruby22-x64/lib/ruby/2.2.0/rubygems/cor