神经网络基础

面了个极创, 学长们在搞移动端人工智障的项目. 然后我就得开始系统学人工智障了.

永凯学长给了资料, 本文是参考Victor Zhou的博客Machine Learning for Beginners: An Introduction to Neural Networks学习后的笔记.

之前听科创的学长讲过2h, 所以现在看起来好像挺简单?

神经网络的基本单位, 大致功能是 接受数据 $\to$ 处理数据 $\to$ 输出数据. 简单理解就是一个函数, 输入是一个向量$\vec x$, 输出是一个值.

两个输入的神经元
两个输入的神经元

一个神经元中还有一个大小和输入相同的 权重向量$\vec w$ 和一个 偏置值$b$, 这些值是用来处理数据的.

一个神经元的功能就是处理一下输入的数据然后输出, 写成函数的形式:

$$y = F_A(\vec x \cdot \vec w + b)$$

其中, $F_A(x)$ 是激活函数(Activation Function), 常用激活函数有 Sigmoid, tanh, ReLU 等.

由输入计算输出的过程成为 正反馈(Feedforward)

将多个神经元连接起来, 构造成的网络就称为神经网络. 神经网络不是乱连的, 有如下结构:

输入层严格来说是数值而不是网络, 就是输入的向量$x$. 只有一层输入层.

隐藏层可以有多层, 每层的神经元数量可以不同, 可以比输入少, 也可以比输入多, 或者相等

输出层只有一层, 可以有多个输出.

将相邻的层中构成的二分图连成完全二分图即可.

如图是一个2个输入, 一层2个神经元的隐藏层, 1个输出的神经网络:

2个输入, 一层2个神经元的隐藏层, 1个输出的神经网络
2个输入, 一层2个神经元的隐藏层, 1个输出的神经网络

假如现在有一个神经网络, 并且确定了每个神经元的参数($\vec w, b$), 那么对于任何一个输入, $\vec x$, 都能得到一个输出 $\vec y$

如何评估这个网络是不是预测准确了呢? 很简单, 我们只要看看 真正 的值和输出的值是不是 差不多 就行.

所以我们要量化这个 差不多 的概念.

均方误差(Mean Squared Error, MSE) 来判断是不是差不多.

$$MSE = \frac{1}{n}\sum_{i=1}^n (y_{true} - y_{pred})^2$$

我们用 MSE 来表示 损失(Loss) 这个概念, 损失越小, 预测越准.

损失越小, 预测越准, 所以要使得我们的预测准确, 就是最小化损失

训练即最小化损失

最小化损失可以用 梯度下降(Stochastic Gradient Descent, SGD) 的方法做.

神经网络实际上可以看成一个对每个神经元的复合函数, 网络结构对应的就是复合的方法. 于是我们可以得到输出对输入的函数图像, 函数的极小值点全导数为0.

全导数为0, 每个偏导数也为0. 所以我们可以对每个变量单独考虑.

假设当前考虑的变量为$\alpha$, 损失为$L$, 那么我们可以做出$L — \alpha$图像, 这是一个二维图像. 现在问题就变成, 如何在二维函数上找极小值.

如何找极小值点呢? 求导算零点? 那就变成解一个极其奇怪的方程了, 不太可行. 但我们可以随便选取一个$\alpha_0$, 算出函数在这一点的导数值 —— 这是可行的, 只需要代入$\alpha_0$计算即可. 假设当前点是$\alpha$, 求导以后, 通过导数的正负可以知道图像在$\alpha$处的"走向", 也就是说知道在$\alpha$附近, $\alpha$稍稍往哪边改变一点点, 能够使得$L$减小. 所以, 改就完事了. (和牛顿迭代求零点是一个思路)

那么问题来了, 改变的步长是多少呢? 如果步长太小, 接近极小值点的速率就很慢; 如果步长太大, 可能一步就跨过了极小值点.

在牛顿迭代中是用切线和坐标轴相交的点, 这可以快速逼近零点. 但是这里我们要找的导数的零点是从下往上穿的, 而牛顿迭代找到的零点是随便一个, 所以优秀的牛顿迭代就无了

观察可得由高数知识, 极值点的导数为0, 它附近的点导数接近0. 所以我们不妨认为, $\frac{\partial L}{\partial \alpha}$ 和0越接近, $\alpha$ 便和极值点越接近. 在极小值点附近, 我们当然希望步长能够小一点, 慢慢逼近极小值点, 而不至于在极小值点附近反复横跳.

梯度下降就利用了这一点性质. 把步长设为 $\eta \frac{\partial L}{\partial \alpha}$, 其中, $\eta$ 是一个自己设置的常数, 称为 学习率(Learning Rate) 形式化来说, 就是每次 $\alpha$ 的值都这样改变:

$$\alpha \leftarrow \alpha - \eta \frac{\partial L}{\partial \alpha}$$

然后不停迭代, 直到 $L$ 变化不大为止, 认为找到了极小值.

通过当前损失来修改参数的过程成为负反馈(Feedback)

对每一个参数都这样做, 就是训练啦.

没了, 就这么简单.