Deep Learning with Python 读书笔记(三)神经网络的引擎:梯度优化

我们知道神经网络的每个层(layer)都会对输入数据做如下的转换:

output = relu(dot(W, input) + b)
上面表达式中的W和b都是张量数据(tensor),它们代表这个神经网络层的属性,也被称作权重(weights)。这些权重数据就是神经网络通过学习训练数据而获得的。

在神经网络开始学习的时候,这些权重信息只是一些随机数,这一步被称作随机初始化(random initialization)。在这一步,神经网络层处理出来的输出数据没有太大的意义,但是作为学习的起点。在接下来的过程中,神经网络会根据一个反馈信号慢慢调整这些权重,而这个调整过程就是我们常说的“训练”或“学习”过程,这也是机器学习中最重要的一个环节。

这个训练过程可以根据需要重复多次,但其中的步骤包括:

  1. 从训练数据集中抽取一批(batch)训练数据x和它们相对应的标签数据y
  2. 在神经网络中运行处理这些数据并获得相应的预测数据y_pred
  3. 计算这批数据预测结果的损失值(loss value),这个损失值代表预测数据y_pred和y之间的偏差
  4. 调整这个神经网络层的权重数据,使得损失值会进一步降低

经过多次重复上面的过程,你最终会得到一个把损失值最小化的神经网络。当然这个“最小化”的损失值是针对训练数据而言,我们希望在处理新数据的时候这个损失值仍然很小,否则就是大家常说的overfitting。我们现在先不探讨overfitting以及解决的办法,过后我们会专门讨论这个话题。

上面的前3步都比较容易实现,但是第4步的实现不是那么直截了当。如果我们天真的想每次调整一个参数(其他参数全部冻结),看看如何调整才能降低损失值。看起来这是个可行的办法,但是在实现起来,这个方法非常低效,因为它需要大量的运算才能完成。另外一个方法是利用导数(derivative)的知识来计算损失函数针对每个参数的梯度(gradient),然后沿着梯度相反的方向调整参数就可以降低损失值。如果你还不能理解为什么,我们会在下一次读书笔记中详细讨论这个问题。

posted @ 2020-02-22 01:15  吕汉鸿  阅读(181)  评论(0编辑  收藏  举报
Save on your hotel - hotelscombined.com