神经网络分为学习和推理。
神经网络就是将输入变换为输出,类似函数作用。
1 神经网络的推理
结论:箭头有权重,还要加上偏置(不受前一层神经元影响的常数),该图为2层神经网络
结论:其实就是矩阵相乘,注意权重和偏置以及对于维度。
mini-batch:小批量同时对多笔样本数据进行推理和学习。
sigmoid函数:非线性激活函数,增强神经网络的表现力,接收任意大小的实数,输出0~1的实数
例子:
1.1 层的类化及正向传播的实现
正向传播:从输入层到输出层的传播
反向传播:与正向传播相反的顺序传播数据(梯度)
代码规范:
2 神经网络的学习
2.1 损失函数
损失:神经网络学习的指标,基于监督数据(学习阶段获得的正确的数据)和神经网络预测的结果,将模型的恶劣程度作为标量(单一数值)计算出来
交叉熵误差:多类别分类的神经网络的损失函数
softmax函数:
交叉熵误差:
2.2 导数和梯度
神经网络的学习目标是找到损失尽可能小的参数。
其实就是求偏导。
深度学习中的梯度一般定义为关于矩阵和张量的导数。
2.3 链式法则
链式法则就是符合函数求导法则,跟我们高数学得一个意思。
神经网络是由多个函数复合而成的。误差反向传播法会充分利用链式法则来求关于多个函数(神经网络)的梯度。
2.4 计算图
2.4.1 乘法节点
2.4.2 分支节点
分支节点也称为复制节点。
它的反向传播是上游传来的梯度之和。
2.4.5 repeat节点
复制N份,反向传播是N个梯度求和。
2.4.6 sum节点
sum节点是通用加法节点;sum节点的反向传播将上游传来的梯度分配到所有箭头上。
sum节点和repeat节点存在逆向关系。
2.4.7 matmul节点
矩阵乘积
2.5 梯度推导和反向传播的实现
2.5.1 sigmoid层
2.5.2 affine层
通过
y = np.dot(x, W) + b
实现了
Affine
层的正向传播。
通过
MatMul
节点进行矩阵乘积的计算。偏置被
Repeat 节点复制,然后进行加法运算(可以认为 NumPy
的广播功能在内部进行了Repeat 节点的计算)。
2.5.3 softmax with loss 层
Softmax
函数和交叉熵误差一起实现为
Softmax with Loss
层。
Softmax
层对输入
a
1
, a
2
, a
3
进行正规化,输出
y
1
,
y
2
, y
3
。
Cross Entropy Error
层接收
Softmax
的输出
y
1
, y
2
, y
3
和监督标签
t
1
, t
2
, t
3
,并基于这些数据输出损失
L
。
2.6 权重的更新
通过误差反向传播法求出梯度后,就可以使用该梯度更新神经网络的参数。
梯度下降法:将参数向该梯度的反方向更新,可以降低损失。
权重更新方法有很多,这里我们来实现其中最简单的
随机梯度下降法(SGD)。
3 使用神经网络解决问题
3.1 螺旋状数据集
3.2 神经网络的实现
已用下面的trainer类便捷实现。
3.3 trainer类
4 计算的高速化
4.1 位精度
NumPy
的浮点数默认使用
64
位的数据类型。
但32为更适用于神经网络推理和学习。所以可以将64位数据指定为32位。
16位不适用与计算等,但保存有用,所以本书仅在保存学习好的权重时,将其变换为
16
位浮点数。
4.2 GUP(CuPy)
深度学习的计算由大量的乘法累加运算组成。这些乘法累加运算的绝大部分可以并行计算,这是 GPU
比
CPU
擅长的地方。
CuPy
是基于
GPU
进行并行计算的库。要使用 CuPy
,需要使用安装有
NVIDIA
的
GPU
的机器,并且需要安装 CUDA
这个面向
GPU
的通用并行计算平台。
CuPy
和
NumPy
拥有共同的 API,CuPy
的使用方法与
NumPy
基本相同。