承接上篇
(因为这是学习日志(吴恩达深度学习),以下说法未必标准,也未必正确)
(ps:注意字母大小写)
1.向量化
上文中展示的程序是以显性for循坏来实现的,但for循环带来的是计算速度慢的问题,减少for,while循坏的使用可以提高算法的速度。我们的解决办法是向量化。
这里我们要使用numpy这一个类,其中的方法已经可以使用。
向量化程序如图
np.array是创立一个符合numpy的列表(或者说向量)
np.dot是里面的一个方法,可以将两个向量点乘
for和向量化版本的程序的运算速度对比如下
可以看到向量化运行速度之快
那么改进之前代码的方案如下
2.广播
过程示意图如下
这是正向传播的过程。注意这里是大写X,Z,W,代表这里是各自对应的集合
那么展示一下python程序
可以看到这里只加了一个b,并不是B。这是因为加b的时候b会自动变成规格相同的矩阵,这就是广播
3.激活函数
损失函数不只Sigmoid一种,事实上,这个函数有一个上位替代,激活函数也不止这一种。常用的有四种。
tanh函数就是sigmoid函数的上位替代,可以看作是sigmoid平移之后乘2,它是值域是(-1,1)所以平均值更接近0,以达到一种类似数据中心化的效果,这也是为什么tanh比sigmoid更好,但并不是不能用,如图所示sigmoid更多用于二分分类,但其实tanh无论在哪个场合都比sigmoid好。
但其实呃,tanh和sigmoid使用率都不高,原因是这两种激活函数在当z越来越偏离0时,导数越来越小。而Relu函数的导数唯一,并不会出现其他激活函数的情况,导数大也使得梯度下降的快,学习效率高。所以通常隐藏层使用relu,输出层则视情况选择sigmoid或tanh。那么leaky Relu解决一个z为负数的一个情况,也可以使用。
3.损失函数
之前上一篇中已经提到了损失函数。
那么为什么损失函数长这样,如图所示