神经网络基本概念

Neural Network and Deep Learning 学习笔记(1)

{\large{\text{CONTENTS}}}

  • 两种人工神经元
  • 神经网络的结构
  • 代价函数
  • 梯度下降法
  • 随机梯度下降法

两种人工神经元

感知机( Perceptron )

在神经系统中,神经元的基本功能有以下三个:
接受刺激、产生兴奋,传导兴奋。
感知机模型模拟出了这三个基本功能。
核心概念:
a) 输出为输入的加权求和(接受刺激)
o = \sum_{i=1}^n x_iw_i
b) 输入和输出均为0或1, 当输入的加权求和大于阈值时,输出为1,否则为0(神经元需要接受到达一定阈值的信号后才能产生兴奋)
O = 0 , if \sum_{i=1}^n x_iw_i \leq threshold
O = 1 , if \sum_{i=1}^n x_iw_i > threshold

单个感知机 http://neuralnetworksanddeeplearning.com/images/tikz0.png

  当使用多个感知机组合成一个基本的神经网络时, 可以粗略将网络分为三层:输入层、隐层和输出层。
  每一层的感知机处理上一层的输出信号,将整合后的信号作为下一层的输入信号,最终得到一个输出结果。(传导兴奋)
多个感知机组成的神经网络 http://neuralnetworksanddeeplearning.com/images/tikz1.png

为了简化表达,令输入和权值为向量形式
x = [x_1,x_2,.....x_n]

w = [w_1,w_2,......w_n]

引入偏置量(bias) 的概念:
b = -threshold

感知机的公式可表达为:
Output = 0 , if \ w·x +b \leq 0

Output = 1 , if \ w·x +b > 0

  到这里,我们得出了一个最为基础的神经元模型,构建出了基础的网络模型。通过设计算法,我们可以自动调整网络的权重和偏置,使输出贴近预期结果。

Sigmoid神经元(Sigmoid neurons)

  那么,要如何使网络学习呢? 即如何让网络知道输出的结果是否是正确的呢?最简单的方式就是加入一个反馈量,反馈量的大小就反映了输出结果与预期结果的差异大小。
  我们希望通过调整权值和偏置,可以让最终输出贴近正确结果,但是感知机(perceptron)很难达到我们所期望的效果。因为感知机的输出非零即一,改变权值和偏置,只能使输出结果保持或翻转,难以实现逐步接近的效果。
  通过引入一种新的神经元模型——Sigmoid神经元可以解决这个问题。

感知机与Sigmoid神经元的对比

  Sigmoid神经元相当于一个平滑的感知机。它与感知机一样,输出结果都在0~1之间,但是不同于感知机输出的非零即一,Sigmoid神经元可以输出0~1之间的任何实数结果,使得我们能够通过修改权值和偏置,达到令结果输出逼近预期的效果。
  Sigmoid函数:
、\sigma = \frac{1}{1+e^{ -z}}

  SIgmoid神经元:
Output = \frac{1}{1+e^{ -(\sum_{i=1}^n w_ix_i +b)}}

  Sigmoid函数是连续的, 这就使得求导成为可能. 我们可以将实际输出与预期结果的差值表示为:
\Delta Output =\sum_i \frac{\partial Output}{\partial w_i} \Delta w_i+ \frac{\partial Output}{\partial b} \Delta b

注: 神经元可统一表达为
Output =f(\sum_{i=1}^n w_ix_i +b)

在不同的情况下,我们可以选择不同的f(·)

神经网络的结构

基本组成

神经网络的基本结构

如上图,神经网络的基本结构为三层:输入层、隐层和输出层。

组成
输入层 若干个输入神经元
隐层 一层或多层的中间神经元
输出层 一个输出神经元

[注] 隐层并没有什么特殊的含义,仅仅表示即非输入也非输出;由于历史原因,这种神经网络也称多层感知机(multiple perceptrons,MLPs),虽然它是由Sigmoid神经元组成。

两种模型

按照信息传递的方向,神经网络可分为前馈(feedforward)神经网络和递归(recurrent)神经网络两种,具体如下

模型 特点 比较
前馈神经网络 前一层的输出为后一层的输入,网络中不存在回环。 目前为止,效果更强大
递归神经网络 让神经元在变为止之前在一段有限的时间内激发,而非持续兴奋。 网络中存在回环(循环不会在这样的模型中引起问题,因为神经元的输出仅在稍后的某个时间影响其输入,而不是瞬间影响它的输入。) 原理更贴近生物神经元的工作模式,可能在前馈无法解决的复杂问题上有良好的效果

代价函数

  我们应该如何训练神经网络呢?即如何为神经网络寻找到合适的权值和偏置,使得神经网络的输出结果接近正确结果?可引入代价函数(cost function):
C(w,b) = \frac{1}{2n}\sum_{x}||y(x)-a||^2
w: the collection of all weights in the network
b: all the biases
n: the total number of training inputs
a: the vector of outputs from the network when x is input

  上式为二次代价函数。也可以根据情况定义其他的代价函数。
  代价函数可以作为衡量神经网络性能的工具。可以看出,代价函数时偏置和权值的平滑函数,当修改权值和偏置时,可以观察到输出是否改善。当网络输出的a逐渐接近正确的y(x)时,代价函数趋于0;当a与y(x)相差大时,代价函数很大。训练目标可以明确为寻找可以令代价函数尽可能小的一个权值和偏置的集合。

梯度下降法

基本概念

  如何实现最小化?假设我们处在山谷的某处,想要到达谷底。最为直观的方法就是每次我们都往下走一点,最终就可以到达谷底。假如代价函数有两个变量,就可表示为下图:

梯度下降法

  直观地看,在代价函数C的计算中,向下就意味着选择v1v2的方向,使得代价函数C减小,即对下式
\Delta C \approx \frac{\partial C}{\partial v_1} \Delta v_1+ \frac{\partial C}{\partial v_2} \Delta v_2

  需要取合适的
\Delta v_1,\Delta v_2

  使得Delta C为负值。
  该式可扩展到多个变量
  为简化表达及编程时的运算,定义梯度向量:
\triangledown C = \lgroup \frac{\partial C}{\partial v_1} ,…, \frac{\partial C}{\partial v_m} \rgroup ^T

\Delta C \approx\triangledown C ·\Delta v

  为了令 Delta C为负值,取
\Delta v = - \eta \triangledown C

  eta 是一个小的正参数(即后文将会提及的学习率)
  通过这样的取值,我们可以得出
\Delta C \approx\triangledown C ·\Delta v = - \eta ||\triangledown C||^2 \leq 0

  于是可以计算出经过一次计算(移动)后,向量v可更新为:
v \to v^{next} = v - \eta \triangledown C

  进行下一次计算.
  最终, 经过多次迭代,可以得到使代价函数最小的一个变量取值集合。

学习率

  在梯度下降法中,学习率的取值很关键。
\Delta C \approx\triangledown C ·\Delta v = - \eta ||\triangledown C||^2 \leq 0
\eta: learning\ rate
  如下图,学习率可以理解为步距。我们期望每一步都沿着边缘下降,最终到达谷底。但是当学习率取过大,则会出现“之”字形下降的情况,可能无法到达谷底;如果学习率过小,显而易见,学习的速度可能会过慢,影响效率.

学习率过大

学习率取值 优点 缺点
过小 精细,在只有一个极值时不会错过最值 速度慢,有多个极值时可能落入局部最小值
过大 在取值合适时速度快,不易落入局部最小值 '之'字形下降,可能无法到达最值

  为了让学习率处于合适的范围,令每次下降的步距
||\Delta v|| = \epsilon , where\ fixed\ \epsilon >0
  则有
\eta = \frac{||v||}{||\triangledown C||} = \frac{\epsilon}{||\triangledown C||}
  学习率即可限定在一个合适的范围内。

随机梯度下降法

  在神经网络的训练中,我们希望得到令代价函数尽可能小的一个权值和偏置的集合。
\Delta C \approx \sum_k{\frac{\partial C}{\partial w_k} \Delta w_k}+ \sum_l{\frac{\partial C}{\partial b_l} \Delta b_l}
  w,b的更新规则为:
w_k \to w_k^{next} = w_k - \eta \frac{\partial C}{\partial w_k}
b_l \to b_l^{next} = b_l - \eta \frac{\partial C}{\partial b_l}
  当使用训练集训练神经网络时,对训练集的每一个输入x,求出代价函数Cx
C = \frac{1}{n}\sum_{x=1}^{n}C_x
\triangledown C = \frac{1}{n}\sum_{x=1}^{n}\triangledown C_x
  在实际的应用中,当训练集很大时,求梯度的过程会耗费很长时间。为了提高效率,可以使用随机梯度下降法(stochastic gradient descent )。
  随机梯度下降法的步骤如下:
  1. 从训练集中随机抽出m个样本;
  2. 将m个样本视为一个小样本数据(mini-batch)
  3. 计算小样本数据的代价函数,然后有:
\frac{\sum_{j=1}^{m}\triangledown C_{x_j}}{m} \approx \frac{\sum_{x}\triangledown C_{x}}{n} = \triangledown C
\triangledown C \approx \frac{1}{m} \sum_{j=1}^{m}\triangledown C_{x_j}
  则w,b的更新规则为:
w_k \to w_k^{next} = w_k - \frac{\eta}{m} \sum_j \frac{\partial C_{x_j}}{\partial w_k}
b_l \to b_l^{next} = b_l - \frac{\eta}{m} \sum_j \frac{\partial C_{x_j}}{\partial b_l}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容