神经网络 (NN) 算法入门简介——深度学习 (DL) 理论基础

/ Deep Learning / 没有评论 / 577浏览

神经网络简介

以人脑中的神经网络为启发,历史上出现过很多不同版本。最著名的算法是1980年的 Back Propagation

组成结构

每层由单元 (units) 组成,每个单元 (unit) 也可以被称作神经结点,根据生物学来源定义

一层的输出是下一层的输入,经过结点间的权重 (weight) 加权求和后, 传入下一层,然后做非线性变换

每层单元的个数

使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数

特征向量标准化

特征向量在被传入输入层时通常被先标准化 (normalize)到 0 和 1 之间 (为了加速学习过程)

离散型变量编码

离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

特征值 A 可能取三个值 $(a_0, a_1, a_2)$ , 可以使用 3 个输入单元来代表 A。
如果 $A=a_0$, 那么代表 $a_0$ 的单元值就取1,其他取 0;
如果 $A=a_1$, 那么代表 $a_1$ 的单元值就取1,其他取 0,以此类推

神经网络即可以用来做分类 (classification) 问题,也可以解决回归 (regression)问题

没有明确的规则来设计最好有多少个隐藏层,理论上,如果有足够多的隐藏层 (hidden layers) 和足够大的训练集, 可以模拟出任何方程

根据实验测试和误差,以及准确度来实验并改进

多层向前神经网络

英文名:Multilayer Feed-Forward Neural Network

由输入层向前传送,输入层 $I = (I_1, I_2, ..., I_m)$,表示 m 个特征。

输入层传播

$$z_j^1 = \sum_i w_{ij}^1 I_i + b_j^1$$

$z_j^1$ 表示第一层隐藏层的第 j 个神经元经权重和偏执计算后得到的结果

再经过 sigmoid 函数得到激活函数

$$a_j^1 = \sigma(z_j^1)$$

隐藏层传播

对于第 $l$ 层的第 j 个神经元

$$z_j^l = \sum_i w_{ij}^l a_i^{l-1} + b_j^l, \qquad a_j^l = \sigma(z_j^l)$$

输出层传播

$$z_j^L = \sum_i w_{ij}^L a_i^{L-1} + b_j^L, \qquad o_j = a_j^L = \sigma(z_j^L)$$

向量化方程

英文名:Vectorizing a function

由于 $\sigma(v)_j = \sigma(v_j)$,那么

$$a_j^l = \sigma \left ( \sum_i w_{ij}^l a_j^{l-1} + b_j^l \right )$$

可写为

$$a^l = \sigma \left ( w^l a^{l-1} + b^l \right )$$

用矩阵和向量表示简单很多,对于每一层,只需要乘以权重的矩阵,加上偏向的向量

模型参数训练

损失函数

$$C(w, b) = \frac{1}{2n} \sum_x \parallel y(x) -a^L \parallel^2$$

n 是训练数据集的实例个数

$C(w,b)$越小越好,可以用梯度下降算法训练参数

如果想了解梯度下降算法,请查看梯度下降算法 (Gradient) 原理——机器学习常用模型训练法

参数更新

$$w_{ij}^l = w_{ij}^l - \eta \frac{\partial C}{\partial w_{ij}^l}$$

$$b^l = b^l - \eta \frac{\partial C}{\partial b^l}$$

偏导如何计算

关于偏导数的计算,请查看反向传播 (BP) 算法深入理解——神经网络偏导数的计算

未完待续