就是寻找参数W,能够使得损失函数值最小。(简略,非数学上的定义)
1、找到目标函数(知道目标函数是什么,是cross-entropy或者其它的损失函数,都行)
2、找到一个能让目标函数最优化的方法(梯度下降)(当梯度下降应用到神经网络时,会与机器学习的梯度下降不太一样,比如加入链式法则,反向传播算法如何应对比较大的深层/浅层神经网络)
3、利用这个方法求解
当梯度下降到了神经网络,就不再是凸函数了,也不会是下图右边的碗状,而是“地形图”:
这节内容需要用到高等数学:导数等知识。链式法则则符合函数求导。反向传播即将结果+链式法则的这个过程。
一些常用的函数及其导数:
前向传播过程:
1、函数表达式
2、预测
3、确定损失函数
假设有两个特征,那么前向传播如下图所示:
反向传播:利用链式法则进行求导,更新权重参数的过程。
计算J关于Z的导数的计算公式:
假设简单的模型为 y = sigmoid(w1x1+w2x2+b),我们一开始给几个随机的输入值和权重,带入来计算一遍。其中,在点x1,x2=(-1,-2)时,目标值为1,假设一个初始化w1,w2,b=(2,-3,-3)。用代码实现上述过程:
通过结果可以看到,只是进行了一次梯度下降的循环,损失函数就能减少这么多,也就是一直朝着我们所希望的方向进行发展。
上述的情况都是一个样本,那么当我们有很多样本(m个)的时候,伪代码如下:
这是一个可行的方法2,但是会存在缺陷:在实际中,我们有成上千万个样本,都要进行for循环来计算吗?我们需要充分利用计算机CPU并行处理的优点,在python的numpy包中,有很多方便的工具,可以去菜鸟教程查看,就不一一演示了。
这里使用一些数据集以向量化的形式进行实现,数据集放在百度网盘:
链接: https://pan.baidu.com/s/1UL5FOZ7K8-yPcpt_kx8hfA
密码: 6pdr
下面的代码为自定义的模型和数据处理流程,有些内容和API里封装的不一样,当然可以往下面的模型中增加更多的内容来丰富一下结果。(比如更改梯度下降方式,增加可视化损失函数)
先大概说明一下代码思路:
1、主函数部分:
加载数据集,并且对数据集进行处理,调用模型进行训练以及预测
2、模型部分:
代码如下:
结果:
可以看出来损失结果由最初的0.01变到最后的0.004,在训练集上达到93%的准确率。由于我们是使用了单个神经元,就能达到测试集73%,如果使用更多神经元,再加上防止过拟合机制,那么这个模型会更好。
要熟悉一下内容:
1、链式法则优化
2、梯度下降
3、向量化计算