多层感知机:Multi-Layer Perceptron

多层感知机:Multi-Layer Perceptron多层感知机 MLP 由感知机推广而来 最主要的特点是有多个神经元层 因此也叫深度神经网络 DNN DeepNeuralNe

多层感知机:MLP

多层感知机由感知机推广而来,最主要的特点是有多个神经元层,因此也叫深度神经网络(DNN: Deep Neural Networks)。

感知机:PLA

多层感知机是由感知机推广而来,感知机学习算法(PLA: Perceptron Learning Algorithm)用神经元的结构进行描述的话就是一个单独的。

u=i=1nwixi+by=sign(u)={
+1,u>01,u0



从上述内容更可以看出,PLA是一个线性的二分类器,但不能对非线性的数据并不能进行有效的分类。因此便有了对网络层次的加深,理论上,多层网络可以模拟任何复杂的函数。


多层感知机:MLP


前向传播

y(1)2=f(u(1)2)=f(i=1nw1i2xi+b(1)2)=f(w(11)2x1+w(12)2x2+w(13)2x3+b(1)2)y(2)2=f(u(2)2)=f(i=1nw2i2xi+b(2)2)=f(w(21)2x1+w(22)2x2+w(23)2x3+b(2)2)y(3)2=f(u(3)2)=f(i=1nw3i2xi+b(3)2)=f(w(31)2x1+w(32)2x2+w(33)2x3+b(3)2)



将上述的式子转换为矩阵表达式:

y2=y(1)2y(2)2y(3)2=fw112w212w312w122w222w322w132w232w332x1x2x3+b(1)2b(2)2b(3)2=f(W2X+b2)


将第二层的前向传播计算过程推广到网络中的任意一层,则:

y(j)l=f(u(j)l)u(j)l=iLl1w(ji)ly(i)l1+b(j)lyl=f(ul)=f(Wlyl1+bl)

其中 f() 为激活函数, b(j)l 为第 l 层第

j
个节点的偏置。


反向传播

基本的模型搭建完成后的,训练的时候所做的就是完成模型参数的更新。由于存在多层的网络结构,因此无法直接对中间的隐层利用损失来进行参数更新,但可以利用损失从顶层到底层的反向传播来进行参数的估计。(约定:小写字母—标量,加粗小写字母—向量,大写字母—矩阵)

假设多层感知机用于分类,在输出层有多个神经元,每个神经元对应一个标签。输入样本为 x=[x1,x2,,xn] ,其标签为 t ;
对于层 l ,用

Ll
表示该层的所有神经元,其输出为 yl ,其中第 j 个节点的输出为

y(j)l
,该节点的输入为 u(j)l ,连接第 l 层与

(l1)
层的权重矩阵为 Wl ,上一层(第 l1 层)的第 i 个节点到第

l
层第 j 个节点的权重为

w(ji)l

对于网络的最后一层第 k 层——输出层,现在定义损失函数:



E=12jLk(t(j)y(j)k)2

Ew(ji)lEb(j)l=Ey(j)ly(j)lw(ji)l=Ey(j)ly(j)lu(j)lu(j)lw(ji)l=Ey(j)ly(j)lb(j)l=Ey(j)ly(j)lu(j)lu(j)lb(j)l

y(j)lu(j)lu(j)lw(ji)lu(j)lb(j)l=f(u(j)l)=y(i)l1=1



那么则有:

Ew(ji)lEb(j)l=Ey(j)ly(j)lu(j)lu(j)lw(ji)l=Ey(j)lf(u(j)l)y(i)l1=Ey(j)ly(j)lu(j)lu(j)lb(j)l=Ey(j)lf(u(j)l)


另有,下一层所有结点的输入都与前一层的每个结点输出有关,因此损失函数可以认为是下一层的每个神经元结点输入的函数。那么:

Ey(j)l=E(u(1)l+1,u(2)l+1,...,u(k)l+1,...,u(K)l+1)y(j)l=kLl+1Eu(k)l+1u(k)l+1y(j)l=kLl+1Ey(k)l+1y(k)l+1u(k)l+1u(k)l+1y(j)l=kLl+1Ey(k)l+1y(k)l+1u(k)l+1w(kj)l+1


此处定义节点的灵敏度为误差对输入的变化率,即:

δ=Eu


那么第 l 层第

j
个节点的灵敏度为:

δ(j)l=Eu(j)l=Ey(j)ly(j)lu(j)l=Ey(j)lf(u(j)l)


结合灵敏度的定义,则有:

Ey(j)l=kLl+1Ey(k)l+1y(k)l+1u(k)l+1w(kj)l+1=kLl+1δkl+1w(kj)l+1


上式两边同时乘上 f(u(j)l) ,则有

δ(j)l=Ey(j)lf(u(j)l)=f(u(j)l)kLl+1δkl+1w(kj)l+1


注意到上式中表达的是前后两层的灵敏度关系,而对于最后一层,也就是输出层来说,并不存在后续的一层,因此并不满足上式。但输出层的输出是直接和误差联系的,因此可以用损失函数的定义来直接求取偏导数。那么:

δ(j)l=Ey(j)lf(u(j)l)=f(u(j)l)kLl+1δkl+1w(kj)l+1lf(u(j)l)(y(j)lt(j))l

Ew(ji)lEb(j)l=Eu(j)lu(j)lw(ji)l=δ(j)ly(i)l1=Eu(j)lu(j)lb(j)l=δ(j)l


上述的推到都是建立在单个节点的基础上,对于各层所有节点,采用矩阵的方式表示,则上述公式可以写成:

EWlEblδl=δlyTl1=δl={
(WTl+1δl+1)f(ul),l(ylt)f(ul),l


其中运算符 表示矩阵或者向量中的对应元素相乘。
常见的几个激活函数的导数为:

f(ul)f(ul)f(ul)=sigmoid(ul)=sigmoid(ul)(1sigmoid(ul))=yl(1yl)=tanh(ul)=1tanh2(ul)=1y2l=softmax(ul)=softmax(ul)softmax2(ul)=yly2l

Wlbl:=WlηEWl=WlηδlyTl1:=blηEb=blηδl


References:



























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222768.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:04
下一篇 2026年3月17日 下午3:04


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号