人工神经网络

人工神经网络简介

  • 一大类机器学习方法: 支持处理图像, 文本, 语音以及序列等多种类型的数据
  • 支持分类, 回归, 预测 等多种应用
  • 人工神经网络基础形态是 , 同时拥有多种变形:
    • , 属于部分连接网络, 是深度学习核心结构之一.
    • , 更为复杂的网络结构, 很好的应对序列数据.
    • 自编码器 (AutoEncoder) 是一种数据特征学习, 类似 PCA 的作用.

前向全连接网络

1. 网络架构

1)基础神经单元

神经元是构成神经网络的基础单元.

Alt text|center|450*0

一个神经元的组成:

  • 输入: 维度向量
  • 线性加权:
  • 激活函数: 要求非线性, 容易求导数
  • 输出标量

即一个独立神经元包含:

激活函数

  • Sigmoid函数: .曾经是最常用的激活函数, 但现在一般只用在输出层, 中间层很少使用.

    • 缺点1: 两头过于平坦. 梯度非常小, 在后向传播 (BP) 中, 逐层之后, 达到输入层时, 权值的改动非常小, 导致学习速度很慢.
    • 缺点2: 输出值域不对称. [0,1], 只有正数, 没有负数. Alt text|center|400*0
  • tanh函数 曾经是最常用的激活函数, 中间层较少使用, 但比Sigmoid效果好.

    • 优点: 输出值域对称. [-1,1]
    • 缺点: 两头依旧过于平坦 Alt text|center|400*0
  • ReLU (Rectified Linear Unit)

    优点:

    • 不存在 饱和(saturate) 区域
    • 收敛速度比sigmoid/tannh函数快
    • 计算高效简单

      缺点:

    • Dead Area: 神经元死亡, 输出为0, 权重不更新
  • Leaky ReLU 优点:

    • 没有 Dead Area.

2) 从神经元到网络

把相同结构的单元组合在一起, 构成神经网络的层:

  • 输入层, 输入向量
  • 中间层 (隐含层)
  • 输出层, 输出向量, 用于预测, 分类以及回归

Forward计算:

2. 优化&数据

1) 损失函数/优化目标

个样本, 第 个样本的损失函数为 , 则整个样本的损失函数为:

  • Softmax/Cross-entropy loss:
  • SVM/hinge loss:
  • Least Square (L2 loss):

Example: SVM v.s. Softmax

2) 数据处理

i) 输入

输入数据应当:

  • 每个维度去掉相关性, 否则导致各个权重相互影响
  • 每个维度的scale保持一致, 否则容易出现狭长区域

Remark:对向量数据必须采用 PCA+White处理. 一般数据只用 Zero Center 和 Normalization 处理.

ii) 权重

权重初始化:

  • 方法1: 采用小的数值, 且利用随机分布, 消除对称性.
  • 方法2: 根据 Fan-in的大小计算:

3) 正则化手段

  • 方法1: 在Loss Function 增加 L2/L1 norm 项目:
  • 方法2: 对样本/权重 增加噪声
  • 方法3: Dropout, 即保持部分网络的连接

3. BP 算法

  • 训练神经网络的目的: 寻找 , 使得 Loss Function 最小
  • 优化算法需要计算 , BP算法就是计算 .
  • BP 算法的核心是链式规则:

i) 输出层

Back Propogation (反向传播) : 从输出层开始

ii) 中间层

中间层通常有激活函数, 输出层没有

iii) BP算法流程:

  • Step1: Forward计算一次, 得到最后的输出向量
  • Step2: 由输出向量和损失函数, 可以求出输出向量的导数; 逐层计算backward, 得到每个层的 $dW,db$
  • Step3: 应用 SGD 算法, 更新

    iv) 数值校验:

4. 优化算法 - Mini Batch SGD

1) SGD-Momentum

  • 不是更新 , 而是更新 "更新" 的速度
  • 位于距离较长的"坡"时, 加快滑动速度. 位于平缓区域时, 也能保持一定的速度.
  • 典型值

2) SGD-Adaptive learning rate

  • 多层神经网络中, 每个权重的梯度相差较大, 采用同一的学习率不合适
  • 对每个权重选择不同的参数

3) SGD-rmsprop

使用 recent running average 平滑

选择合适的SGD算法

  • 小批量的样本 vs 大批量样本
  • 深度网络 vs RNN vs 浅层宽网络
  • 超参取值
  • 从简单的算法试验起, 在少量样本上尝试不同的算法效果

训练过程

  • 启动试车: 确保小批量样本的收敛
  • 监控训练过程的仪表盘程序
  • Early Stop 机制 (通常由脚本来控制)

深度学习框架大战

1) Torch

需要多去实战, Torch Demos

Torch 基于 Lua语言 & CUDA后端.

Lua语言

  • 基于表的数据结构
  • 数组下标从1开始, 跟matlab一样
  • foo:bar等同于foo.bar()

Torch的核心是Tensor

Example

1) 矩阵操作:

A = torch.rand(3, 4) #创建矩阵
A:t()                  #矩阵的转置
C = torch.inverse(A) #矩阵的逆
B = A*C                 #矩阵的乘法

2) 人工神经网络包

require('nn')         #人工神经网络包
l1=nn.Linear(2,5)    #第一层是线性的(wx+b),输入是2维向量,输出是5维向量
                    #l1.weight:size()=5*2, l1.bias:size()=5
x=torch.Tensor(2)    #输入2维,给x[1],x[2]赋值
l1_out=l1:forward(x)    
#输出5维, 即5个神经元,每个神经元 w(i,1)*x[1]+w(i,2)*x[2]+b(i)

l2=nn.Sigmoid()                #第二层是激活函数
l2_out=l2:forward(x)        #即1/(1+exp(-x))

l3=nn.LogSoftmax()            
torch.exp(l3:forward(x))    #即Softmax的输出

net=nn.Sequential()            #创建一个网络
net:add(l1);
net:add(l2);
y=net:forward(x)            #整个网络进行Forward计算

反馈与建议

参考文献

results matching ""

    No results matching ""