【CS231n笔记】04 Backpropagation and Neural Networks part 1

主要内容:
1.反向传播算法
2.神经网络介绍

1.反向传播算法

第二节和第三节中已经介绍了分类器的评分函数,两种常用的损失函数,以及通过梯度下降进行优化的方法,计算梯度,然后沿着梯度相反的方向进行优化,一般用解析梯度来计算,用数值梯度进行检查。但是,对于复杂的模型来说,求取每个参数的解析梯度也是非常复杂的,所以要通过另外一个角度来解决这个问题,即梯度的反向传播(Backpropagation)算法。
首先用计算图的方式来描述模型,对于线性分类器可以表示为
这里写图片描述
对于卷积神经网络(Convolutional Network),以AlexNet为例,可以表示为
这里写图片描述
另外还有更加复杂的神经图灵机(Neural Turing Machine)。
对于这种复杂的模型来说,前向(损失函数值)和反向(梯度值)的计算用表达式来描述是不现实的。
一般以计算图的方式对模型进行描述,将模型中的模块抽象成层(layer)的概念,层内实现了初始化、前向传播和反向传播,然后将不同功能的层组合,成为一个复杂的模型。这一过程即如搭积木一般
这里写图片描述
梯度在层之间从后向前计算,某参数的梯度包含两个部分,局部梯度和整体梯度,其中整体梯度即损失函数对于该参数后面所有层中相关变量的偏导数。

总结
● 神经网络模型一般都非常复杂,对每个参数写出其梯度表达式是不现实的
● 反向传播就是沿着计算图的结构递归地应用链式法则来求取输入、参数、中间件的梯度
● 用计算图结构实现模型,其中的结点/层实现了各自的前向和反向
● 前向:计算一个操作的结果,保存用于计算梯度所需的中间变量
● 反向:计算损失函数相对于输入的梯度值

2. 神经网络介绍

这里写图片描述
线性分类器评分函数: f=Wx
两层神经网络评分函数: f=W2max(0,W1x)
其中 max() 是一种激活函数(Activation),后面会介绍多种常用激活函数。神经网络的计算过程可以表示如下
这里写图片描述
以CIFAR-10数据集为训练样本,输入层为 X ,共3072(32*32*3)维,和参数W1相乘得到隐藏层 h ,隐藏层神经元经过激活函数,然后和参数W2相乘得到最后的评分。隐藏层 h 中的神经元个数是一个超参数,会影响模型性能。
第二节中讲到线性分类器可以看作模板匹配,是对训练图像的融合,得到各类的模板,如下图
这里写图片描述
以汽车为例,它需要融合多个朝向多种颜色的车,然而线性分类器的能力并不足以达到区分这么多特征,所以效果并不好。如果在中间加上一个隐藏层,构成上图所示的两层神经网络模型,那么隐层神经元就可以对多种特征进行表示,比如某个神经元代表朝向正前,某个神经元表示蓝颜色,也就是通过隐藏层进行分类,然后再经过W2的汇总整合,形成最后的评分,如此一来模型的区分能力就会得到极大的提升。神经网络通过加入隐藏层引入多样性,提高区分能力。
【学生提问】如果隐层神经元数量少于10,神经网络的性能是否还优于线性分类器?
答案是应该还是要比线性分类器更好。
扩展神经网络最简单的方法就是添加隐层,一般来说中间的隐藏层都具有相同的结构,即包含相同数量的神经元以及使用相同的激活函数,例如扩展到三层神经网络,则评分函数为 f=W3max(0,W2max(0,W1x))

下面详细讲解神经元的结构。
生物神经元如下图
这里写图片描述
细胞体(cell body)周围有很多树突(dendrites),与其他神经元相连,接受其他神经元的信号,即神经元的输入。另外还有轴突(axon),用来将该神经元的信号传递到其他神经元,即神经元的输出。由此可以构造出一个比较粗糙的神经元模型
这里写图片描述
对不同输入有不同的权重,求和并加偏置之后,通过激活函数,得到最后的输出。在生物学模型里习惯使用Sigmoid函数作为激活函数。代码如下

class Neuron:
  def neuron_tick(inputs):
    """ assume inputs and weights are 1-Dnumpy arrays and bias is a number """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
    return firing_rate

常用的激活函数
●Sigmoid函数
σ(x)=11+ex
这里写图片描述
●双曲正切函数(tanh)
tanh(x)=exexex+ex
这里写图片描述
●修正线性单元(Rectified Linear Unit, ReLU)
这里写图片描述
●Leaky ReLU
这里写图片描述
多种ReLU变种
这里写图片描述
●Maxout
max(wT1x+b1,wT2x+b2)

神经网络架构
用神经元组合成神经网络,相邻层间的神经元全部互连,所以被称为全连接层(Fully Connected Layers)
X层神经网络,这里的X是有权重的层的数量,所以不包含出入层。
将神经元分层,每层中的所有神经元具有相同的输入,可以并行运算,所以分层化是一种计算技巧。
以三层神经网络为例,前向传播代码如下

# forward-pass of a 3-layer neural network:
f = lambda x: 1.0 / (1.0 + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3*1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4*1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4*1)
out = np.dot(W3, h2) + b3 # output neuron (1*1)

Demo:http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html
通过demo可以发现隐藏层神经元数量以及正则项系数对模型的影响。
随着隐藏层神经元数量的增加,模型的区分能力更强。
这里写图片描述
随着正则项系数的减小,模型的区分能力变强。
这里写图片描述
正则项系数较大时对参数W的惩罚力度较大,那么W中的值就很小,模型实际使用的变量(输入)就很少;随着系数减小,参与决策的变量增多,提高模型的区分能力。

总结
● 将神经元组织成全连接层
● 层的概念可以利用高效的向量计算编码实现(例如矩阵相乘)
● 神经网络并不是真正的(生物)神经元
● 神经网络bigger=better,但是需要更强的正则化方法,防止过拟合

【学生提问】怎样权衡神经网络的深度(层数)和宽度(每层的神经元数量)?
这里还没有一个明确的答案,一般对于图像问题,层数会更重要一些,但是如果数据很简单的话,网络深度的作用不大。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值