深度学习 --- stanford cs231学习笔记二(神经网络和反向传播)

神经网络和反向传播


1,为什么说神经网络要比线性分类器好?优势在哪?

        线性分类器只能用直线对数据进行划分。因此当原始数据分布的比较好的时候,如下图所示,用线性分类器就能够很好的把图中的黄点和蓝点分开。

但如果不同种类的数据融合在一起时就不太好用直线去分割了,比如说下图。

或者说是下面这种数据分布

        而神经网络的出现主要是引入了非线性计算,也就是这里的max()函数。神经网络中的非线性函数被称之为激活函数activation function用于决定神经元是否有被激活。

有了神经网络以后数据分布的比较复杂的情况就能够用“曲线”去很好的分类了。


2,神经网络中的非线性激活函数

2,1 非线性激活函数有哪些?

上图给出了几个常见的非线性激活函数,上面例子中所使用的非线性激活函数用的就是ReLU函数。


2,2 引入非线性激活函数的结果是增加了隐含层

        Wx的结果本该是score,但非线性函数的引入改变了分数的概念。


2,3 神经元里面装的是什么? 

        隐含层是由若干个神经元构成的,这些神经元的值就是以wx+b为输入经过激活函数后的输出。这些值随着W的变化而变化,而W又随着损失函数L的减少而不断地修正。最终,当L减少到很小以后,就找到了一组最优的神经元的值。在深度学习中,把这一组一组通过学习后得到的神经元的值称作提取到的“高级/复杂特征”。

比如说,当只有两个两个神经元的时候,通过学习只找到了两个特征,不足以代表数据的特征。

随着神经元的增加,系统所能表征的特征也越丰富。(4个神经元)

当神经元的数量增加到6个的时候,就足以表征所有的高级特征了。 

        而且这也是深度学习要高于机器学习的地方,我们不再需要人为的去定义一些特征然后让机器去学习,取而代之的是让电脑自己去学习/去找一些他认为重要特征,而这些特征就是神经网络完成学习后的神经元。


3,神经网络的几个重要元素

3,1 神经网络的层数

 

        神经网络可以是单层也可以是多层,它决定了网络的深度。深度神经网络通常具有更多的隐藏层,这意味着它们可以学习更复杂的函数关系。 

两层或三层:

六层:

 


3,2 每个隐含层所含神经元的个数

3,2,1 对于每层神经元的个数而言
  1. 神经元个数的选择

    • 每层神经元的个数决定了该层的容量和复杂度。
    • 较多的神经元可以增加模型的容量,捕捉更多的特征,但也可能导致过拟合。过拟合的结果就是模型在训练数据上表现很好,但在新数据上表现较差。
    • 较少的神经元可能不足以捕捉复杂模式,导致欠拟合。欠拟合的结果是模型在训练数据上和新数据上都表现不好。
  2. 逐层减少神经元

    • 一种常见的策略是逐层减少神经元的数量,从输入层到输出层逐渐减少。
    • 这种方法有助于模型逐步提取高级特征,同时减少计算复杂度。

3,2,2 对于隐含层的层数而言
  1. 浅层神经网络

    • 通常指只有一到两层隐含层的神经网络。
    • 适用于简单的任务,可以通过较少的计算量解决。
    • 浅层网络较容易训练,但表达能力有限,难以捕捉复杂的模式。
  2. 深层神经网络

    • 通常指具有多层隐含层的神经网络(例如3层或更多)。
    • 适用于复杂任务,如图像识别、语音识别和自然语言处理。
    • 深层网络有更强的表达能力,可以捕捉数据的多层次特征,但训练较为困难,需要更多的计算资源和优化技巧(如正则化、批量归一化等)。

3,3 隐藏层的维度

         每一层隐藏层的维度和矩阵W的维度息息相关,因为激活函数并不会影响输出的维度,因此,隐藏层的维度应该是由于Wx的维度决定的,而Wx的维度又是由W决定的。因此,隐藏层的维度,即,神经元的个数是由矩阵W的其中一维决定的。


4,反向传播

        和线性分类器一样,神经网络也会用到Loss function,也要用梯度下降法去优化权重函数W。所不同的是,由于神经网络中的层数较多,且嵌套了很多非线性函数,因此损失函数L就变得很复杂,不太容易直接求出L关于W的梯度。

        解决这一计算梯度的难题的方式就叫反向传播,其实,我觉得反向传播只不过是个“新词”。只不过多了个链式法则+computational graphs


4,1 计算图(computational graph)

 

这是computational graph他有助于计算局部导数local gradiant。


4,2 链式法则(the chain rule)

        把复合函数的导数拆分成一连串偏导数的乘法,每个乘法的乘数分别来自于上游导数局部导数

 以下图为例:

 函数f(x,y,z)的梯度是:

\bigtriangledown f(x,y,z)=[f_{x}(x,y,z),f_{y}(x,y,z),f_{z}(x,y,z)]

用复合函数表示后函数改写为:

 f=qz,\; q=x+y

 对于其中x方向和y方向的梯度是复合函数需要使用链式法则计算复合函数的偏导:

 f_{x}(x,y,z)=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x}

f_{y}(x,y,z)=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y} 

z方向的梯度可以直接计算: 

f_{z}(x,y,z)=\frac{\partial f}{\partial z}=q

使用计算图去计算每一个节点上的local grad。

 使用链式法则,逐一代入图中的local grad和upstream grad,得到:

f_{x}(x,y,z)=\frac{\partial f}{\partial q}\frac{\partial q}{\partial x}=z*1=-4*1=-4

f_{y}(x,y,z)=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}=z*1=-4*1=-4

f_{z}(x,y,z)=\frac{\partial f}{\partial z}=q=3

        在一般的深度学习中,我们所求的梯度一般都是损失函数L关于权重矩阵W的梯度。因为,求梯度的目的就是要通过最小化L去调整权重矩阵W 。


4,3  如果函数L的自变量是一个向量,则需要用到雅可比矩阵去计算偏导。


(全文完) 

--- 作者,松下J27

 参考文献(鸣谢): 

1,Stanford University CS231n: Deep Learning for Computer Vision

2,https://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95

3,A Neural Network Playground

(配图与本文无关)

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松下J27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值