梯度下降python函数 梯度下降算法 python代码( 二 )


神经网络可以通过学习得到函数的权重 。而我们仅靠观察是不太可能得到函数的权重的 。
让我们训练神经网络进行 1500 次迭代 , 看看会发生什么 。注意观察下面每次迭代的损失函数,我们可以清楚地看到损失函数单调递减到最小值 。这与我们之前介绍的梯度下降法一致 。
让我们看看经过 1500 次迭代后的神经网络的最终预测结果:
经过 1500 次迭代训练后的预测结果
我们成功了!我们应用前向和方向传播算法成功的训练了神经网络并且预测结果收敛于真实值 。
注意预测值和真实值之间存在细微的误差是允许的 。这样可以防止模型过拟合并且使得神经网络对于未知数据有着更强的泛化能力 。
下一步是什么?
【梯度下降python函数 梯度下降算法 python代码】幸运的是我们的学习之旅还没有结束 , 仍然有很多关于神经网络和深度学习的内容需要学习 。例如:
? 除了 Sigmoid 以外,还可以用哪些激活函数
? 在训练网络的时候应用学习率
? 在面对图像分类任务的时候使用卷积神经网络
我很快会写更多关于这个主题的内容 , 敬请期待!
最后的想法
我自己也从零开始写了很多神经网络的代码
虽然可以使用诸如 Tensorflow 和 Keras 这样的深度学习框架方便的搭建深层网络而不需要完全理解其内部工作原理 。但是我觉得对于有追求的数据科学家来说,理解内部原理是非常有益的 。
这种练习对我自己来说已成成为重要的时间投入,希望也能对你有所帮助
一文搞懂梯度下降&反向传播 如果把神经网络模型比作一个黑箱 , 把模型参数比作黑箱上面一个个小旋钮,那么根据通用近似理论(universal approximation theorem),只要黑箱上的旋钮数量足够多,而且每个旋钮都被调节到合适的位置,那这个模型就可以实现近乎任意功能(可以逼近任意的数学模型) 。
显然,这些旋钮(参数)不是由人工调节的,所谓的机器学习,就是通过程序来自动调节这些参数 。神经网络不仅参数众多(少则十几万,多则上亿) , 而且网络是由线性层和非线性层交替叠加而成,上层参数的变化会对下层的输出产生非线性的影响,因此,早期的神经网络流派一度无法往多层方向发展,因为他们找不到能用于任意多层网络的、简洁的自动调节参数的方法 。
直到上世纪80年代 , 祖师爷辛顿发明了反向传播算法,用输出误差的均方差(就是loss值)一层一层递进地反馈到各层神经网络,用梯度下降法来调节每层网络的参数 。至此 , 神经网络才得以开始它的深度之旅 。
本文用python自己动手实现梯度下降和反向传播算法 。请点击这里 到Github上查看源码 。
梯度下降法是一种将输出误差反馈到神经网络并自动调节参数的方法,它通过计算输出误差的loss值( J )对参数 W 的导数,并沿着导数的反方向来调节 W,经过多次这样的操作 , 就能将输出误差减小到最小值,即曲线的最低点 。
虽然Tensorflow、Pytorch这些框架都实现了自动求导的功能,但为了彻底理解参数调节的过程,还是有必要自己动手实现梯度下降和反向传播算法 。我相信你和我一样,已经忘了之前学的微积分知识,因此,到可汗学院复习下 Calculus
和 Multivariable Calculus 是个不错的方法,或是拜读 这篇关于神经网络矩阵微积分的文章。
Figure2是求导的基本公式,其中最重要的是 Chain Rule ,它通过引入中间变量,将“ y 对 x 求导”的过程转换为“ y 对中间变量 u 求导,再乘以 u 对 x 求导”,这样就将一个复杂的函数链求导简化为多个简单函数求导 。

推荐阅读