深度学习基础
神经网络的数学基础
神经网络的“引擎”:基于梯度的优化
-
我们的第一个神经网络示例中,每个神经层都用下述方法对输入数据进行变换。
output = relu(dot(W, input) + b)
- 在这个表达式中,W 和 b 都是张量,均为该层的属性。
- 它们被称为该层的权重(weight)或可训练参数(trainable parameter),分别对应 kernel 和 bias 属性。
- 这些权重包含网络从观察训练数据中学到的信息。
- 一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化(random initialization)。
- 下一步则是根据反馈信号逐渐调节这些权重,这个逐渐调节的过程叫作训练,也就是机器学习中的学习。
-
训练循环(training loop)具体过程如下:
- 抽取训练样本 x 和对应目标 y 组成的数据批量;
- 在 x 上运行网络[这一步叫作前向传播(forward pass)],得到预测值 y_pred;
- 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离;
- 更新网络的所有权重,使网络在这批数据上的损失略微下降;
- 最终得到的网络在训练数据上的损失非常小,即预测值 y_pred 和预期目标 y 之间的距离非常小,网络“学会”将输入映射到正确的目标。
-
考虑网络中某个权重系数,如何知道这个系数应该增大还是减小,以及变化多少:
- 一种简单的解决方案是,保持网络中其他权重不变,只考虑某个标量系数,让其尝试不同的取值。但这种方法是非常低效的,因为对每个系数(系数很多,通常有上千个,有时甚至多达上百万个)都需要计算两次前向传播(计算代价很大)。
- 一种更好的方法是利用网络中所有运算都是可微(differentiable)的这一事实,计算损失相对于网络系数的梯度(gradient),然后向梯度的反方向改变系数,从而使损失降低。
张量运算的导数:梯度
-
导数完全描述了改变 x 后 f(x) 会如何变化。如果你希望减小 f(x) 的值,只需将 x 沿着导数的反方向移动一小步。
-
梯度(gradient)是张量运算的导数,它是导数这一概念向多元函数导数的推广。多元函数是以张量作为输入的函数。
-
假设有一个输入向量 x、一个矩阵 W、一个目标 y 和一个损失函数 loss。
-
你可以用 W 来计算预测值 y_pred,然后计算损失,或者说预测值 y_pred 和目标 y 之间的距离:
y_pred = dot(W, x) loss_value = loss(y_pred, y)
-
如果输入数据 x 和 y 保持不变,那么这可以看作将 W 映射到损失值的函数:
loss_value = f(W)
-
假设 W 的当前值为 W 0 W_0 W0。 f f f 在 W 0 W_0 W0 点的导数是一个张量 g r a d i e n t ( f ) ( W 0 ) gradient{(f)}(W_0) gradient(f)(W0),其形状与 W 相同,每个系数 g r a d i e
-