【计算机视觉与深度学习】全连接神经网络(一)
计算机视觉与深度学习系列博客传送门
【计算机视觉与深度学习】线性分类器(一)
【计算机视觉与深度学习】线性分类器(二)
目录
- 从线性分类器到全连接神经网络
- 全连接神经网络的权值
- 全连接神经网络与线性不可分
- 激活函数
- 网络结构设计
- Softmax与交叉熵损失
- 计算图与反向传播
从线性分类器到全连接神经网络
首先让我们回到线性分类器的定义:fi(x,wi)=wiTx+bi,i=1,2,...,cf_i(\bm x, \bm w_i)=\bm w_i^T \bm x+b_i,i=1,2,...,cfi(x,wi)=wiTx+bi,i=1,2,...,c其中x\bm xx代表输入的ddd维图像向量,ccc为类别个数,wi=[wi1wi2...wid]T\bm w_i=\begin{gathered}\begin{bmatrix} w_{i1} & w_{i2} & ... & w_{id} \end{bmatrix}\end{gathered}^Twi=[wi1wi2...wid]T为第iii个类别的权值向量,bib_ibi为偏置。如果fi(x)>fj(x)f_i(\bm x)>f_j(\bm x)fi(x)>fj(x),则决策输入图像x\bm xx属于第iii类。
全连接神经网络通过级联多个变换来实现输入到输出的映射。如两层全连接网络的定义为f=W2max(0,W1x+b1)+b2\bm f=\bm W_2 \max(\bm 0,\bm W_1 \bm x+\bm b_1)+\bm b_2f=W2max(0,W1x+b1)+b2再如三层全连接网络定义为f=W3max(0,W2max(0,W1x+b1)+b2)+b3\bm f=\bm W_3 \max(\bm 0,\bm W_2 \max(\bm 0,\bm W_1 \bm x+\bm b_1)+\bm b_2)+\bm b_3f=W3max(0,W2max(0,W1x+b1)+b2)+b3上式中,max(0,⋅)\max(0,·)max(0,⋅)是一个激活函数(即ReLU激活函数,修正线性单元),它对线性操作后的结果进行了一次非线性操作,这个非线性操作是不可以去掉的,否则将会退化为一个线性分类器。
全连接神经网络的权值
之前在学习线性分类器的时候曾经提到过,线性分类器中的W\bm WW可以看作模板,模板个数由类别个数决定。而在全连接神经网络中,以两层全连接网络为例,W1\bm W_1W1也可以看作模板,模板个数是人为指定的,W2\bm W_2W2融合多个模板的匹配结果来实现最终的类别打分。
以CIFAR-10数据集(每张图片样本的大小为32×32×3)为例,将线性分类器的模板矩阵resize并归化后以图片的形式展示,可以得到下图的结果:
其中,horse模板出现了两个马头,这是因为在训练集中,有的图片样本中马头朝向左,有的图片样本中马头朝向右。由于线性分类器的模板个数是由类别个数决定的,所以可以分配给horse类的模板数仅有1。而在全连接神经网络中,W1\bm W_1W1模板个数是人为指定的,我们可以指定一个更大的模板个数,这样每一个类别就可以分配到更多的模板数,从而达到更好的分类效果。
全连接神经网络与线性不可分
线性可分指的是至少存在一个线性分界面能把两类样本没有错误地分开。线性分类器只能解决线性可分的问题,但在实际问题中,样本数据并不都是线性可分的。在这种情况下,我们只能依赖于一些非线性操作来实现线性不可分样本数据的学习,如全连接神经网络中的激活函数就是一种非线性操作。
如上图所示,全连接神经网络由一个输入层 (input layer)、若干个隐藏层 (hidden layer) 以及一个输出层 (output layer) 组成。输入层的神经元数量由训练样本所决定,以CIFAR-10数据集为例,输入层的维度就是3072维(即32×32×3)。隐藏层的维度就是我们人为指定的“模板”的个数。输出层的个数由类别数来决定,以CIFAR-10数据集为例,输出层的个数就是10。除输入层外,其余所有层的所有神经元都要与前一层的所有神经元一一连接,这也是全连接神经网络名字的由来。连接两个神经元的边叫做权值,两层之间的所有权值组成权值矩阵W\bm WW。
N层全连接神经网络指的是除输入层外其余所有层的数量为N的全连接神经网络,如一个全连接网络有一个输入层、两个隐藏层和一个输出层,则称之为3层全连接神经网络(或者2隐层全连接神经网络)。
激活函数
以三层全连接网络f=W3max(0,W2max(0,W1x+b1)+b2)+b3\bm f=\bm W_3 \max(\bm 0,\bm W_2 \max(\bm 0,\bm W_1 \bm x+\bm b_1)+\bm b_2)+\bm b_3f=W3max(0,W2max(0,W1x+b1)+b2)+b3为例,若去掉激活函数max(0,⋅)\max(0,·)max(0,⋅),f\bm ff的表达式变为f=W3(W2(W1x+b1)+b2)+b3\bm f=\bm W_3(\bm W_2(\bm W_1 \bm x+\bm b_1)+\bm b_2)+\bm b_3f=W3(W2(W1x+b1)+b2)+b3整理得f=W3W2W1x+(W3W2b1+W3b2+b3)\bm f=\bm W_3\bm W_2\bm W_1 \bm x+(\bm W_3 \bm W_2\bm b_1+\bm W_3\bm b_2+\bm b_3)f=W3W2W1x+(W3W2b1+W3b2+b3)令W3W2W1=W′,W3W2b1+W3b2+b3=b′\bm W_3\bm W_2\bm W_1=\bm W',\bm W_3 \bm W_2\bm b_1+\bm W_3\bm b_2+\bm b_3=\bm b'W3W2W1=W′,W3W2b1+W3b2+b3=b′,有f=W′x+b′\bm f=\bm W' \bm x+\bm b'f=W′x+b′这也就解释了前面所提到的,若去掉非线性操作(激活函数),全连接神经网络将会退化为一个线性分类器。
max(0,x)\max(0,x)max(0,x)是一种很常用的激活函数,叫做ReLU函数(修正线性单元,Rectified Linear Unit),函数图像如下所示:
除此之外,还有一些常用的激活函数,如Sigmoid函数11+e−x\frac{1}{1+e^{-x}}1+e−x1
tanh函数ex−e−xex+e−x\frac{e^x-e^{-x}}{e^x+e^{-x}}ex+e−xex−e−x
Leaky ReLU函数max(αx,x)\max(\alpha x,x)max(αx,x)
等。Sigmoid函数可以将输出结果转化到(0,1)(0,1)(0,1)区间内,输出值大于0且不中心对称。tanh函数可以将输出结果转化到(−1,1)(-1,1)(−1,1)区间内,输出值是中心对称的。tanh函数的输出值有正有负,这是它与Sigmoid函数的最大区别。ReLU函数将小于0的部分直接置为0,大于0的部分保持原输出结果。然而,ReLU函数在训练过程中存在神经元“死亡”问题,Leaky ReLU函数是在ReLU函数的基础上加了一个“泄露”,在小于0的部分并不直接置0,而是给定一个很小的斜率,从而解决了这一问题。
网络结构设计
在设计神经网络的时候,我们需要考虑如下两个问题:
- 需要设计多少个隐藏层?
- 每个隐藏层需要设计多少个神经元?
事实上,这两个问题并没有统一的答案。
在实际问题中,分类任务越难,我们设计的神经网络结构就应该越深、越宽。但是,对训练集分类精度最高的模型,在真实场景下识别性能未必是最好的。从宽度设计的角度来看,隐藏层神经元的个数越多,分界面就可以越复杂,在这个集合上的分类能力就越强。但是分界面过于复杂,对数据集的划分过于出色对分类问题不一定是好事,可能会造成过拟合。
Softmax与交叉熵损失
Softmax操作是将全连接神经网络的输出取eee的幂次方,再进行归一化操作,从而得到p\bm pp。不难发现,∑i=1cpi=1\sum_{i=1}^cp_i=1∑i=1cpi=1。进行Softmax操作后,神经网络的输出带有了概率性质,pi(i=1,2,...,c)p_i(i=1,2,...,c)pi(i=1,2,...,c)则代表样本属于第iii类的概率。
假设神经网络输出的预测分布q(x)q(x)q(x)为[0.210.010.78]\begin{gathered}\begin{bmatrix} 0.21 \\ 0.01 \\ 0.78 \end{bmatrix}\end{gathered}⎣⎡0.210.010.78⎦⎤真实分布p(x)p(x)p(x)为[100]\begin{gathered}\begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix}\end{gathered}⎣⎡100⎦⎤那么,如何度量现在的分类器输出与真实值之间的距离?
首先介绍几个定义。
- 熵:用来度量信息量的大小。熵越大,信息量越大;熵越小,信息量越小。H(p)=−∑xp(x)logp(x)H(p)=-\sum_xp(x)\log p(x)H(p)=−x∑p(x)logp(x)
- 交叉熵。H(p,q)=−∑xp(x)logq(x)H(p,q)=-\sum_xp(x)\log q(x)H(p,q)=−x∑p(x)logq(x)
- 相对熵:也叫KL散度 (KL divergence),用来度量两个分布之间的不相似性 (dissimilarity)。KL(p∣∣q)=−∑xp(x)logq(x)p(x)KL(p||q)=-\sum_xp(x)\log \frac{q(x)}{p(x)}KL(p∣∣q)=−x∑p(x)logp(x)q(x)
根据上述定义,不难推导出H(p,q)=H(p)+KL(p∣∣q)H(p,q)=H(p)+KL(p||q)H(p,q)=H(p)+KL(p∣∣q)因此,交叉熵可以用来度量两个分布之间的距离。
对于上面给出的数据,交叉熵H(p,q)=−∑i=1cp(xi)logq(xi)=log0.21H(p,q)=-\sum_{i=1}^cp(x_i)\log q(x_i)=\log0.21H(p,q)=−i=1∑cp(xi)logq(xi)=log0.21上面的p(x)p(x)p(x)只有一项为111,其余项均为000,这种形式称为one-hot。当真实分布为one-hot形式时,交叉熵损失函数可以简化为Li=−logqjL_i=-\log q_jLi=−logqj其中jjj为真实类别。
下面我们将交叉熵损失和多类支持向量机损失进行对比。假设我们有三个分类器,这三个分类器对于某个样本的类别分数分别为f1=[10−23]\bm f_1=\begin{gathered}\begin{bmatrix} 10 & -2 & 3 \end{bmatrix}\end{gathered}f1=[10−23] f2=[1099]\bm f_2=\begin{gathered}\begin{bmatrix} 10 & 9 & 9 \end{bmatrix}\end{gathered}f2=[1099] f3=[10−100−100]\bm f_3=\begin{gathered}\begin{bmatrix} 10 & -100 & -100 \end{bmatrix}\end{gathered}f3=[10−100−100]根据多类支持向量机损失定义Li=∑j≠yimax(0,sij−syi+1)L_i=\sum_{j\neq y_i}\max(0,s_{ij}-s_{y_i}+1)Li=j=yi∑max(0,sij−syi+1)易得L1多类支持向量机=L2多类支持向量机=L3多类支持向量机=0L_{1多类支持向量机}=L_{2多类支持向量机}=L_{3多类支持向量机}=0L1多类支持向量机=L2多类支持向量机=L3多类支持向量机=0根据交叉熵损失定义Li=−log(esyi∑jesj)L_i=-\log (\frac{e^{s_{y_i}}}{\sum_je^{s_j}})Li=−log(∑jesjesyi)易得L1交叉熵=0.0004L_{1交叉熵}=0.0004L1交叉熵=0.0004 L2交叉熵=0.2395L_{2交叉熵}=0.2395L2交叉熵=0.2395 L3交叉熵=1.5×10−48L_{3交叉熵}=1.5\times10^{-48}L3交叉熵=1.5×10−48这样,我们就可以根据交叉熵损失决策出最好的模型是分类器3。
计算图与反向传播
任意复杂的函数都可以用计算图的形式表示。在整个计算图中,每个门单元都会得到一些输入,然后进行下面两个计算:
- 这个门的输出;
- 其输出关于输入的局部梯度。
利用链式法则,门单元应该将回传的梯度乘以对其输入的局部梯度,从而得到整个网络的输出对该门单元每个输入值的梯度。
以函数f(w,x)=11+e−(w0x0+w1x1+w2)f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}f(w,x)=1+e−(w0x0+w1x1+w2)1为例,其计算图如下:
给定一组输入,根据计算图,我们可以很轻松地计算出函数的输出:
以下图红框处为例,计算该处的梯度。
根据链式法则,该处的梯度等于其上游梯度与局部梯度之积。易知上游梯度为111。根据函数的求导法则f(x)=1xf(x)=\frac{1}{x}f(x)=x1 dfdx=−1x2\frac{\mathrm{d}f}{\mathrm{d}x}=-\frac{1}{x^2}dxdf=−x21可以计算出局部梯度为−11.142-\frac{1}{1.14^2}−1.1421。则该处的梯度等于1×(−11.142)=−0.771\times (-\frac{1}{1.14^2})=-0.771×(−1.1421)=−0.77再继续向前传播同理,此处不再赘述。
【计算机视觉与深度学习】全连接神经网络(一)相关推荐
- 计算机视觉与深度学习-全连接神经网络
以下内容是自己学习北京邮电大学鲁鹏副教授计算机视觉与深度学习课程(A02)的一些笔记, 笔者能力有限,如有错误还望各位大佬在评论区批评指正 . 先贴一下课程官网:CV-XUEBA 篇3地址:计算机视觉 ...
- 深度学习——全连接层(Fully connected dence layers)原理解析
深度学习--全连接层(Fully connected dence layers)原理解析 一.简介 全连接层有多个神经元,是一个列向量(单个样本).在计算机视觉领域正常用于深度神经网络的后面几层,用于 ...
- 计算机视觉(四)全连接神经网络MLP
目录 多层感知器/全连接神经网络 一.全连接神经网络绘制 二.激活函数 常用的激活函数 三.网络结构设计 四.损失函数 softmax 交叉熵损失 对比多类支持向量机损失 五.优化算法 计算图与反向传 ...
- 计算机视觉与深度学习 | 基于DNN神经网络实现人的年龄及性别预测(代码类)
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 最近一段时间,大论文完稿了,可以搞 ...
- 全连接神经网络(DNN)
最近想要学习深度学习模型,没有一上来就先学习CNN.RNN.LSTM,而是先学习全连接神经网络(Fully Connected Neural Network),原因非常简单,上述所说的各种神经网络都是 ...
- 【计算机视觉与深度学习】全连接神经网络(二)
计算机视觉与深度学习系列博客传送门 [计算机视觉与深度学习]线性分类器(一) [计算机视觉与深度学习]线性分类器(二) [计算机视觉与深度学习]全连接神经网络(一) 目录 激活函数再探讨 梯度下降算法 ...
- 【简易笔记】计算机视觉与深度学习(全连接神经网络、卷积) EP2
本篇承接上文:计算机视觉与深度学习 EP1 本篇主要内容: 全连接神经网络(P4 - P6) 卷积与卷积神经网络(P7 - P8) 经典网络分析(P9 - P10) 可视化(P12 - P13) 主要 ...
- 深度学习实战1(基本概念、全连接神经网络、CNN)
一.深度学习基础 1.1 深度学习(DL)概念 深度学习是指从有限样例中通过算法总结出一般性的规律,并可以应用到新的未知数据上.神经网络与深度学习并不等价,深度学习可以采用神经网络模型,也可以采用其他 ...
- 深度学习框架 TensorFlow:张量、自动求导机制、tf.keras模块(Model、layers、losses、optimizer、metrics)、多层感知机(即多层全连接神经网络 MLP)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 安装 TensorFlow2.CUDA10.cuDNN7.6. ...
最新文章
- FDDWNET:模型参数仅为0.8M,速度和准确率综合性能在轻量级分割网络中达到SOTA
- android viewpager嵌套侧滑删除listview冲突问题
- Vector 所有元素相加求和
- matlab Tips
- vim编辑器初级(七)
- [洛谷P3829][SHOI2012]信用卡凸包
- 递归函数合式分解python_python(22)- 递归和函数式编程
- File类的创建功能
- 不定长度导航的两端对齐
- Microsoft ASP.NET 4 Step by Step
- Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得
- ensp 链路聚合的配置
- ORACLE通过身份证号计算年龄
- 关于抢购秒杀的实现思路与事例代码
- linux宝塔视频教程,linux 宝塔面板安装rtmp简陋教程 (已加视频版教程)
- 怎样清除手机上的微信小程序的缓存?
- vue router连续点击多次路由报错
- 涂鸦智能季报图解:营收5532万美元同比降3% 亏5500万美元
- axios是干什么的
- Monitor Link
热门文章
- 父---->曾孙,跨多层组件传值方法provide/inject
- 七星彩长奖表图_够力七星彩奖表长条图最新版
- SIMT与SIMD的区别?
- 这几个小妙招让你学会如何压缩图片大小
- Win8.1打开电脑时提示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的解决方法
- 马化腾:搜索、电子商务硬仗一定要坚持打
- android xmlpullparser 编译出错,将Android支持库更新为23.2.0导致错误:XmlPullParserException...
- python怎么运行代码-python如何运行代码
- 综述:人类电生理的脑连接组学
- howlerjs 音乐播放插件