神经网络
参考链接:
神经网络15分钟入门!足够通俗易懂了吧 - 知乎 (zhihu.com)
任务背景
如下图,我们已知四个数据点(1,1)(-1,1)(-1,-1)(1,-1),这四个点分别对应I~IV象限,如果这时候给我们一个新的坐标点(比如(2,2)),那么它应该属于哪个象限呢?(没错,当然是第I象限,但我们的任务是要让机器知道)
“分类”是神经网络的一大应用,我们使用神经网络完成这个分类任务。
两层神经网络
理论上可以拟合任意函数(万能近似定理),结构如下:
1.简化的两层神经网络
1.1输入层
输入元素的维度和输入量的特征息息相关,如果输入一张32*32的灰度图像,那么输入层的维度就是32*32;如果输入的是一个二维坐标值,如(1, 1),那么输入维度就是1*2。
1.2从输入层到隐藏层
输入层和隐藏层之间由W1和b1连接,计算方式为:
H=X*W1+b1
1.3从隐藏层到输出层
连接隐藏层和输出层的是W2和b2,计算方式为:
Y=H*W2+b2
1.4分析
根据线性代数的知识,可知:一系列线性方程的运算最终都可以用一个线性方程表示。
因此,上述两个式子联立后可以用一个线性方程表示,并且就算网络深度再增加,结果也是一样,如此一来神经网络就失去了意义。
为了改变这一局面,需要使用网络的灵魂组件:激活层。
2.激活层
激活层的作用是为矩阵运算添加非线性成分。常用激活函数有三种:阶跃函数、Sigmoid、ReLU。对应的函数曲线如下图所示:
- 阶跃函数:
$$
y= \begin{cases} 0 & \text{if } x \leq 0
\\ 1 & \text{if } x > 0 \end{cases}
$$ - Sigmoid:输入接近 $\infty$ ,输出趋向1;输入接近$-\infty$ ,输出趋向0
- ReLU:
$$
y=\begin{cases} 0 & \text{if } x <0
\\ x & \text{if } x \geq0 \end{cases}
$$
阶跃函数的输出是跳变的,使用较少;Sigmoid在x的绝对值较大时,曲线斜率变化很小,出现梯度消失,并且计算复杂;ReLU是当前较为常用的激活函数。
每个隐藏层计算(矩阵线性运算)之后,都需要加一层激活层,否则该线性层的计算是没有意义的
加上激活层后的两层神经网络如下图:
神经网络分为“训练”和“使用”两个步骤,上图已经完成了“使用”步骤的全部内容。在求得的Y矩阵中,数值最大的就代表当前的分类。
但是对于“训练”网络来说,当前输出的Y还远远不够。
3.输出正规化
在上面的输出层中,输出的内容并不规范,可能是任何数字。为了让最终的输出的概率,需要进行进一步转化。
计算公式如下:
$S_i = \frac{e^i}{\sum_j{e^j}}$
简单来说分三步:
- 以e为底对所有元素求指数幂
- 将所有指数幂求和
- 分别将这些指数幂与该和做商
这一正规化处理的层叫做Softmax
层,此时神经网络如下图所示:
4.输出好坏的衡量方式
Softmax
的输出结果与真实结果存在一定差距,例如输出的结果是(90%,5%,3%,2%),真实的结果是(100%,0,0,0)。优秀的神经网络对结果的预测要无限接近于100%,因此需要对Softmax
输出结果的好坏进行量化。
可以使用一种直观的量化方式:用1减去Softmax
输出的概率,例如1-90%=0.1。但更为常用且巧妙的方法是,求对数的负数。例如90%对数的负数就是$-log0.9=0.046$。
这个值就是交叉熵损失,概率越接近于100%,这个值越接近0。训练神经网络最终的目的就是尽可能减少“交叉熵损失”。
此时的网络如下图:
5.反向传播与参数优化
前面4节讲了神经网络的正向传播过程,总结如下:
神经网络的传播都是形如Y=WX+b的矩阵运算;为了给矩阵运算加入非线性,需要在隐藏层中加入激活层;输出层结果需要经过Softmax层处理为概率值,并通过交叉熵损失来量化当前网络的优劣。
算出交叉熵损失后,就要进行反向传播,这一过程就是参数优化的过程,优化对象是网络中所有的W和b(因为其它参数均确定)。
神经网络的奇妙之处就在于,它可以自动做W和b的优化,在深度学习中,参数的数量有时会以亿记,但其优化原理和这个两层的神经网络是相同的。
这里举一个形象的例子描述一下这个参数优化的原理和过程:
假设我们操纵着一个球型机器行走在沙漠中
我们在机器中操纵着四个旋钮,分别叫做W1,b1,W2,b2。当我们旋转其中的某个旋钮时,球形机器会发生移动,但是旋转旋钮大小和机器运动方向之间的对应关系是不知道的。而我们的目的就是走到沙漠的最低点。
此时我们该怎么办?只能挨个试喽。
如果增大W1后,球向上走了,那就减小W1。
如果增大b1后,球向下走了,那就继续增大b1。
如果增大W2后,球向下走了一大截,那就多增大些W2。
。。。
这就是进行参数优化的形象解释(有没有想到求导?),这个方法叫做梯度下降法。
当我们的球形机器走到最低点时,也就代表着我们的交叉熵损失达到最小(接近于0)。
6.迭代
神经网络需要反复迭代。
每次计算得到一组概率和交叉熵损失值,将该损失值反向传播,使W1,b1,W2,b2做相应微调;再做第二次运算,和第一次操作相同。最红损失值越来越小,直到达到预期效果。
迭代完成后我们就得到了理想的W1,b1,W2,b2。
此时将任意一组坐标输入,利用最终的神经网络,就能得到分类结果。