人工神经网络
人工神经网络简介
- 一大类机器学习方法: 支持处理图像, 文本, 语音以及序列等多种类型的数据
- 支持分类, 回归, 预测 等多种应用
- 人工神经网络基础形态是 , 同时拥有多种变形:
- , 属于部分连接网络, 是深度学习核心结构之一.
- , 更为复杂的网络结构, 很好的应对序列数据.
- 自编码器 (AutoEncoder) 是一种数据特征学习, 类似 PCA 的作用.
前向全连接网络
1. 网络架构
1)基础神经单元
神经元是构成神经网络的基础单元.
一个神经元的组成:
- 输入: 维度向量
- 线性加权:
- 激活函数: 要求非线性, 容易求导数
- 输出标量
即一个独立神经元包含:
激活函数
Sigmoid函数: .曾经是最常用的激活函数, 但现在一般只用在输出层, 中间层很少使用.
- 缺点1: 两头过于平坦. 梯度非常小, 在后向传播 (BP) 中, 逐层之后, 达到输入层时, 权值的改动非常小, 导致学习速度很慢.
- 缺点2: 输出值域不对称. [0,1], 只有正数, 没有负数.
tanh函数 曾经是最常用的激活函数, 中间层较少使用, 但比Sigmoid效果好.
- 优点: 输出值域对称. [-1,1]
- 缺点: 两头依旧过于平坦
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后端.
- 基于表的数据结构
- 数组下标从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计算
反馈与建议
- 微博:@Girl_AI