cs231n#2: neural-networks-1

agenda

  • 简介
  • 神经建模
    • 生物学启发和对照
    • 常用激活函数
  • 神经网络结构
    • 表达能力
    • 设计神经网络结构

简介

和之前线性分类区别, 经过矩阵运算后后面接一个激活函数(activation function)实现非线性.比如class score = W2*(max(W1xX,0)), 注意没有激活函数(这里是max), W2xW1总是等于一个矩阵W, 正式激活函数实现了非线性.

神经建模

神经网络是从生物学神经结构迁移过来的结构

  • 生物学启发和对照

    摘自笔记的原图:
    神经元,下游的神经元释放的信号到达一定强度造成上游神经元的显性(the neuron can fire), 显性的神经元通过轴突(axon)释放信号.对于下游信号强度的控制对应数学模型就是激活函数, 由于历史原因,通常激活函数是sigmoid函数(1/1 + e^X), 简单代码如下:
    class Neuron(object):
    # ... 
    def forward(self, inputs):
      """ assume inputs and weights are 1-D numpy 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
    
  • 常用激活函数
    cs231n#2: neural-networks-1_第1张图片

    左边的是sigmod, 右边的是tanh.两个都有问题, 现在用的比较少了
    Sigmoids saturate and kill gradients.在y值接近0-1出,倒数基本为0, 反向传播时local gradient*activation out, 假如local gradient太小, 参数基于不更新, 网络难以收敛.假如参数初始化比较大, 网络也难以收敛
    Sigmoid outputs are not zero-centered. sigmod的output都是>=0的, 这样所以local gradient*activation out总是恒正或者恒负, 导致所有同向更新(zig-zagging dynamics in the gradient updates for the weights)
    Sigmoid compute expensive than relu.
    tanh除了0-1好转之外, 也存在梯度消失的问题.
    Relu之前几年比较流行, 收敛速度是sigmoid是6倍.
    计算简单, 没有梯度消失的问题, 但是需要注意网络死亡的现象,假如发现40%的参数已经再也不更新了,就需要重新设置学习率

神经网络结构

一般输入层不算,除了最终输出都是都是隐藏层.每一层神经元和下一层每一个神经元都有链接即为全连接层(FC).左边网络6个神经元,一共26个可学习的参数( [3 x 4] + [4 x 2] = 20 weights and 4 + 2 = 6 biases).右边网络9个神经元,41个参数(3x4 + 4 + 4x4 + 4 + 4x1 + 1)
- 表达能力
一言以蔽之:It turns out that Neural Networks with at least one hidden layer are universal approximators. 一层就可以任意的表示能力, 为什么还需要多层.这是一个经验科学, 更深的神经网络更容易训练(不是CNN).

the fact that deeper networks (with multiple hidden layers) can work better than a single-hidden-layer networks is an empirical observation, despite the fact that their representational power is equal.As an aside, in practice it is often the case that 3-layer neural networks will outperform 2-layer nets, but going even deeper (4,5,6-layer) rarely helps much more

设计神经网络结构

面对一个实际的问题,如何设计神经网络呢?
增加一层网络内的神经元个数可以增强网络的表达能力.假如我们有一个2分类的问题, 不同神经元数目拟合的函数如下:


这个链接 ConvNetsJS demo.可以直观的感受出神经网络表达能力.但是过于复杂的表达能力会学习到训练数据的特有特征造成过拟合(overfiting).
这不是表示每一层内要用尽量小的网络,后面会介绍克制过拟合的手段(L2 regularization, dropout).不使用小的网络的原因是小的网络难以训练,小的网络包含很少的loss低估(local minima),所以它们难以收敛. 在小的网络中陷入bad minima也可能非常幸运参数初始化非常好进入了good minima(loss方差很小).但是大的网络最终loss的方差更小
最后通过L2 regulation控制过拟合, 系数越大去除过拟合效果越强烈.

你可能感兴趣的:(cs231n#2: neural-networks-1)