多层感知机:Multi-Layer Perceptron

本文详细介绍了多层感知机(MLP)的工作原理,包括前向传播和反向传播过程,以及梯度下降法更新参数的数学推导。

多层感知机:MLP

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

感知机:PLA

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

感知机的神经网络表示如下:

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

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


多层感知机:MLP

多层感知机的一个重要特点就是多层,我们将第一层称之为输入层,最后一层称之有输出层,中间的层称之为隐层。MLP并没有规定隐层的数量,因此可以根据各自的需求选择合适的隐层层数。且对于输出层神经元的个数也没有限制。
MLP神经网络结构模型如下,本文中只涉及了一个隐层,输入只有三个变量 [x1,x2,x3] 和一个偏置量 b ,输出层有三个神经元。相比于感知机算法中的神经元模型对其进行了集成。


前向传播

前向传播指的是信息从第一层逐渐地向高层进行传递的过程。以下图为例来进行前向传播的过程的分析。
假设第一层为输入层,输入的信息为[x1,x2,x3]。对于层 l ,用Ll表示该层的所有神经元,其输出为 yl ,其中第 j 个节点的输出为y(j)l,该节点的输入为 u(j)l ,连接第 l 层与(l1)层的权重矩阵为 Wl ,上一层(第 l1 层)的第 i 个节点到第l层第 j 个节点的权重为w(ji)l

结合之前定义的字母标记,对于第二层的三个神经元的输出则有:

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:

jetson@jetson:~$ sudo apt install ros-melodic-desktop-full ros-melodic-desktop ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助: 下列软件包有未满足的依赖关系: ros-melodic-desktop : 依赖: ros-melodic-common-tutorials 但是它将不会被安装 依赖: ros-melodic-geometry-tutorials 但是它将不会被安装 依赖: ros-melodic-robot 但是它将不会被安装 依赖: ros-melodic-ros-tutorials 但是它将不会被安装 依赖: ros-melodic-urdf-tutorial 但是它将不会被安装 依赖: ros-melodic-visualization-tutorials 但是它将不会被安装 依赖: ros-melodic-viz 但是它将不会被安装 ros-melodic-perception : 依赖: ros-melodic-image-common 但是它将不会被安装 依赖: ros-melodic-image-pipeline 但是它将不会被安装 依赖: ros-melodic-image-transport-plugins 但是它将不会被安装 依赖: ros-melodic-laser-pipeline 但是它将不会被安装 依赖: ros-melodic-perception-pcl 但是它将不会被安装 依赖: ros-melodic-ros-base 但是它将不会被安装 依赖: ros-melodic-vision-opencv 但是它将不会被安装 ros-melodic-simulators : 依赖: ros-melodic-gazebo-ros-pkgs 但是它将不会被安装 依赖: ros-melodic-robot 但是它将不会被安装 依赖: ros-melodic-rqt-common-plugins 但是它将不会被安装 依赖: ros-melodic-rqt-robot-plugins 但是它将不会被安装 依赖: ros-melodic-stage-ros 但是它将不会被安装 ros-melodic-urdf-sim-tutorial : 依赖: ros-melodic-controller-manager 但是它将不会被安装 依赖: ros-melodic-diff-drive-controller 但是它将不会被安装 依赖: ros-melodic-gazebo-ros 但是它将不会被安装 依赖: ros-melodic-gazebo-ros-control 但是它将不会被安装 依赖: ros-melodic-joint-state-controller 但是它将不会被安装
04-02
<think>好的,我需要帮用户解决在Ubuntu上安装ROS Melodic时遇到的依赖问题。用户提到在安装ros-melodic-desktop-full时遇到了依赖未满足的错误,具体涉及ros-melodic-desktop、perception、simulators和urdf-sim-tutorial这几个包。我需要根据提供的引用信息来找到解决方案。 首先,引用[3]中提到用户运行sudo apt install时出现依赖问题,错误提示这些依赖包不会被安装。引用[2]的解决方法是使用sudo aptitude install来手动安装这些依赖包。Aptitude相比apt可能更擅长处理复杂的依赖关系,因为它能提供不同的解决方案供用户选择。因此,推荐用户尝试这个方法。 另外,引用[4]提到用户通过启用系统更新并重新安装解决了问题。这说明有时候系统未更新可能导致依赖关系无法满足。因此,另一个步骤是建议用户先更新系统,确保所有仓库和已安装的包都是最新的,然后再尝试安装ROS包。 接下来,我需要整理步骤,首先更新系统,然后使用aptitude安装,或者手动安装每个依赖包。如果这些方法无效,可能需要检查软件源是否正确,确保ROS的源已经正确添加到sources.list中,并更新了apt缓存。 另外,可能需要提及如果遇到依赖冲突时,aptitude会给出解决方案,用户需要根据提示选择正确的选项,比如降级某些包或接受特定的安装方案。同时,提醒用户在操作前备份系统,以防万一。 最后,如果所有方法都无效,可能需要寻求社区支持,比如ROS的论坛或问答网站,但这种情况应该较少见,因为引用中提供的解决方案应该能解决大部分问题。 总结步骤应该是:1. 更新系统和启用更新;2. 使用aptitude安装;3. 手动安装依赖包;4. 检查软件源;5. 处理冲突。这样结构清晰,用户能一步步排查问题。</think>### 分步解决方案 #### 步骤1:确保系统更新和仓库配置 1. **启用系统更新**:在Ubuntu设置中打开系统更新选项,确保所有仓库和软件包处于最新状态。 2. **更新软件包列表**: ```bash sudo apt update ``` 3. **升级现有软件包**: ```bash sudo apt upgrade ``` #### 步骤2:使用`aptitude`解决复杂依赖 1. **安装`aptitude`工具**(若未安装): ```bash sudo apt install aptitude ``` 2. **通过`aptitude`安装ROS Melodic及相关依赖**: ```bash sudo aptitude install ros-melodic-desktop-full ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial ``` - `aptitude`会尝试自动解决依赖冲突,若失败会提供交互式解决方案。根据提示选择接受或拒绝其建议(例如输入`n`查看下一个方案,输入`y`确认)[^2]。 #### 步骤3:手动安装缺失依赖(可选) 若`aptitude`未能解决问题,可尝试手动安装每个缺失包: ```bash sudo apt install ros-melodic-desktop ros-melodic-perception ros-melodic-simulators ros-melodic-urdf-sim-tutorial ``` #### 步骤4:验证软件源配置 1. **检查ROS仓库是否已正确添加**: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' ``` 2. **添加ROS密钥**: ```bash sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 3. **再次更新仓库**: ```bash sudo apt update ``` #### 步骤5:处理依赖冲突(高级) 若仍存在冲突,可能需要手动调整依赖版本: ```bash sudo apt --fix-broken install ``` 或移除冲突的软件包(谨慎操作): ```bash sudo apt remove [冲突包名] ``` ### 引用说明 上述方法通过系统更新、工具替代安装和仓库验证,覆盖了ROS Melodic依赖问题的常见解决路径。引用[4]的案例表明,保持系统更新是修复依赖问题的关键步骤之一[^4]。
评论 3
添加红包
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值