cs231n笔记:lecture4

Neural Networks

two-layer neural networks

在以前我们是用线性函数来得到我们的score function,现在来介绍我们的神经网络,前面我们是用一个简单的乘法线性运算就结束了评分函数的计算,现在我们在线性运算之后加入一个非线性的激活函数,例如下面图中的max函数,在加入激活函数之后我们再在经过激活之后的数值再给他进行一次线性运算,用W2作为权重。这样我们就给神经网络加入了非线性,正是因为有了激活函数的存在,我们可以像搭积木一样一层一层构建很深层的神经网络。

但是要注意,这一切都是因为有了我们的激活函数,之后会介绍更多的非线性激活函数,在下面图中,激活函数就是max函数,如果没有激活函数而是简单地在W1*x运算之后再给他用W2去乘,那只是堆叠了一系列的线性运算,是没有意义的,因为最后实际上它可以表示为一次线性运算。

在这里插入图片描述
可以看到在ppt中,X是3072维的经过拉伸之后的长输入向量,W1x是我们之前介绍过的线性评分函数,在得到W1x的结果之后我们给他套上一个max函数,这一步骤就给了网络非线性,就可以实际上一会我们可以看到对这一过程更深入的理解,这里首先知道,这一步骤引入了非线性,套上,max函数之后得到的结果就是上面的h层,然后同样的我们给h附上一个W2的权重再做一次乘法运算最后得到我们的输出s,这就是一个完整的两层神经网络的结构。

activation function

下面来介绍一些常见的非线性激活函数

在这里插入图片描述

sigmoid函数: 也称为挤压函数,因为他能把接收的输入挤压到0-1的范围内,但是有一个问题他不是关于0对称的。
tanh函数: 他跟sigmoid函数有点类似,但是他关于0对称,tanh跟sigmoid都有一个问题就是输入稍微大一点或者小一点会存在梯度消失现象,因为可以看到函数图像在x比较小和比较大的时候几乎都是平的
relu函数: 经验上来说,relu函数在大多数时候都是对于激活函数来说比较合适的选择,只要输入x值大于0,他就一直有梯度可以进行梯度反向传播,但是在x小于0时,就会梯度消失。
**leaky relu,elu:**都是在x小于0处做了一些优化,防止小于0的时候梯度消失的问题,但是我们还是一般使用relu激活函数作为默认的选择。

实现过程

接下来我们看三层神经网络的实现

在这里插入图片描述
图中给出的是有两个隐藏层的三层神经网络的前向传播的实现,使用sigmoid函数作为激活函数,首先是W1x+b再套上一个sigmoid激活函数得到第一个隐藏层的输出h1,然后给h1作为输入,让W2h1+b再天上sigmoid激活函数得到第二个隐藏层h2,最后再让W3*h2+b得到最后的输出。

下面来看一个两层神经网络具体的实现代码:

在这里插入图片描述

神经网络的层数

在这里插入图片描述
上图可以看到,神经网络的层数越多,他就能更多的拟合一些非线性的边界,网络就具有更强的能力去学习数据的一些细节,但是同时,过深的网络容易带来过拟合问题,会几乎记住训练数据的全部细节,这样会使得网络因为学习了所有数据细节甚至是一些噪声数据导致网络在训练集上表现优秀但是在测测试集上会表现的差强人意。所以选择神经网络的层数也是需要一个需要权衡的问题。

用生物神经元的思想来理解神经网络

在这里插入图片描述

我们都知道,人体的细胞神经元有强大的作用,他们互相通过轴突,树突连接,树突会收集许多许多信号信息,交给细胞体处理,然后细胞体做复杂的非线性计算处理之后把处理之后的信号传递给下一个神经元,这样一层一层走下去。当然真正的生物神经元所做的事以及进行的信号处理计算要比我们想象的复杂的多,但是把我们的神经网络与神经元的处理过程类比或许能帮助我们更好的而理解神经网络究竟在做什么。如图可以看到,激活函数做的事情实际上就是把W矩阵和输入X做乘法得到的数据进行非线性处理,然后把需要往后传递的信号向深层去传递,这实际上类似神经元做的事情。

compute gradients

在这里插入图片描述
好了 前面我们已经介绍完了多层神经网络的结构,介绍了前向传播过程,以及加入了激活函数给网络赋予非线性,让网络能学习更多细节。但是问题来了,我们最后是需要再得到loss之后使用梯度下降算法找到使得loss最小的W权重,那么怎么计算梯度呢?再深层的神经网络下如果我们试图直接计算每个W的梯度似乎表示起来有点过于复杂了,更好的方法是使用计算图的方法把网络拆解为简单的计算,并用计算图表示他们然后使用链式法则计算梯度,这可能听起来有点抽象,让我们从最简单的例子开始。

在这里插入图片描述
这个图就很好理解了,我们把计算分解成最简单的只有两个元素参与的加法或者乘法运算,因为这些运算的local gradients非常容易求得,我们只需要知道上游梯度,然后把上游梯度乘上简单的本地梯度,就能得到最终结果对于每个输入xyz的梯度,这就是梯度反向传播算法,我们先计算最上层的梯度,然后一层一层传到最下层的输入。

在这里插入图片描述
对计算图中每一个节点来说,实际上就是上图介绍的这样,这个节点由x,y经过某种简单运算得到结果输出z,在反向传播的时候应用链式求导法则,根据上游梯度和本地梯度再相乘,就很容易得到L对于x,y的梯度,以后遇到任何运算都可以采用类似的方法拆解计算梯度。

在这里插入图片描述
再看上图是另一个稍复杂一些的例子,图中的绿色数值是前向传播过程中的数值,红色数值是反向传播过程的梯度值。上图得到最后的输出结果是0.73,显然最后输出对于自己的梯度肯定是1,所以看1/x节点,他的上游梯度就是1,然后1/x的本地梯度很容易求导计算得-1/x^2,因为x的值是1.37.所以带进去得到本地梯度是-0.53,再乘上上游梯度1就得到梯度是-0.53,然后再把-0.53作为上游梯度往下传,后面的情况就类似了。

不同运算的梯度

在这里插入图片描述

反向传播过程的代码实现

在这里插入图片描述

到目前为止我们计算的都是标量的梯度,但是在真正神经网络的运算中,我们做的都是矩阵或者向量运算,那么如何计算矩阵或者是向量的梯度呢?

矩阵,向量的梯度计算和反向传播

对于矩阵和向量的梯度来说,情况要复杂的多,我们以一个矩阵乘法的例子来讲矩阵乘法的梯度 先看图

在这里插入图片描述

因为很多矩阵写起来不方便,我们把推导过程写到草稿纸上

在这里插入图片描述
最后我们详细推导得到了跟上述ppt里同样的结果。

最后我们再来看一个例子:
在这里插入图片描述

下面是推导上图中关于w的红色梯度值得过程,总之,在推导矩阵或者是向量的梯度的时候,注意矩阵形状是很重要的,可以像我草稿纸推得一样把每个相关的项都列出来得到梯度值,再用矩阵乘法凑出对应的形状和值。
在这里插入图片描述

好至此我们已经掌握了神经网络的前向传播,score function,loss function,激活函数,反向传播以及链式求梯度的内容,后面我们将开始接触卷积神经网络,以及一些训练神经网络的工程技巧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值