目录
S4.1反向传播(Backpropagation)
背景
模型 | |
SVM损失 | |
整体损失函数 | |
目标 | 找到使得L最小的W。为了找到W,需要求L在W方向上的梯度。 |
反向传播
反向传播是指在神经网络中,将上层节点的梯度值进行反向地传播,进而求解整个网络节点上的梯度。在深度网络中,反向传播递归地调用链式法则,来计算图中每个变量的梯度。下图是反向传播示意图。绿色为变量值的正向传播,用于求解函数的损失。红色为变量的反向传播。该节点从上层节点中得到z的梯度,结合节点自身输入的局部梯度函数,使用链式法则,得到x和y的梯度。
反向传播梯度,有以下模式,其中绿色为变量值,红色为变量的梯度:
链式法则
反向缠脖+链式法则(求解梯度方法)
对于复杂且庞大的网络来说,使用解析梯度法来求解梯度是一件很难的事情,因为它需要数学和微积分的知识来推导,并且推导容易出错。实际上,在深度网络中,使用反向传播与链式法则来对梯度进行求解。在使用该方法的时候,需要一张计算图。下面这张图是线性分类器的计算图。
在进行反向传播时,使用链式法则来求解下一个节点的梯度。下面两个图说明如何使用反向传播+链式法则来求解函数的解析梯度以及进行梯度的方向传播。第一个图的输入是标量。第二图的输入是向量。整个网络的输出节点的梯度值为1。对于中间节点来说,它的输出部分会接收来自上层节点的梯度值。该节点中所有的输入都有对应的局部梯度函数。对于某个输入来说,上层节点梯度值*该输入的局部梯度函数值=该输入的梯度值。在编写代码时,代码会实现一个图结构,其中节点实现了forward()和backward()方法。forward()进行计算操作,并将梯度计算所需的中间值保存在内存中。backward()应用链式法则计算损失函数相对于该节点输入的梯度。
S4.2神经网络(Neural Networks)
神经元
神经元是神经网络中的基本单元,其结构如下图所示。该神经元接收来自其他神经元的输入。输入与权重W进行函数f计算。得到的值经过激活函数进行映射,最终形成输出。激活函数一般是非线性函数,这是一种非线性机制。
神经元与生物神经元有些类似,但生物神经元更加复杂。首先,生物神经元由很多类型。其次,它们的树突会表现出异常复杂的非线性,是一个动态的非线性系统。然后,生物神经元的激发机制与非线性激活函数可能不同。最后,它们的激发阈值有可能是变化的。
激活函数
这里列出神经网络中常用的非线性激活函数,如图所示。
神经网络定义与架构
神经网络是由简单函数构成的一组函数,这些函数以层次化的方式进行堆叠,从而形成一个更复杂的非线性函数。一个简单的三层神经网络(或称为双隐层神经网络)由两个全连接的隐层,如下图所示:
该网络的前向传播代码如下(代码来自视频):
# 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)
h3 = np.dot(W3,h2) + b3 # output neuron (1*1)