单层神经网络,多组权重w,如何进行前向传播?
对于[单张图片],a0作为一个列向量,输入:
case1. 在只有一组w下,的预测结果:
case2. 在多组权重w的匹配下,判别结果(激活值activation):
对于[M张图片],X作为m个列向量的矩阵,输入:
多层神经网络,如何进行前向传播?
多层的运算:
比如:
注释:前一章,w全是列向量,w应该是wT。本章,从前向传播就能看出来,w是横向的,很多组横向的w。
多层神经网络,如何进行反向传播(公式推导)?
神经网络的偏导数是相对于损失函数L来计算的
第二层w2:与损失函数L直接相邻,所以我们就可以直接计算它的偏导数。
第一层w1:与损失函数L没有直接的联系,所以我们只能通过链式法则来计算。回顾之前单层:
多层网络,不同层的推导:
对于w2:
直接按照前一章计算,没什么好说
注释:前一章,w全是列向量,w应该是wT。而本章,从前向传播就能看出来,w都是行向量,很多组横向的w。
反而要求a[0] a[1] 转置..这个刚开始不明白,后来在“直观感受”中,可以看得出来。对"矩阵求导"也有了认识。
对于w1:
总体:
前向传播、反向传播的直观感受
对于一张图片:
前向传播:
反向传播:
---推导到这里,遇到两个大坑,最后感谢王浩楠的指导。
1. 的维度问题:它不是d向量/d向量,最后结果不是3*3的矩阵,而是3*1的列向量,对于的是每个元素
2. * 不是矩阵相乘
对于多张图片:
前向传播:
反向传播:
为什么需要激活函数
如果不用激活函数:
那怕一万层,结果也是线性的。
如果使用激活函数:
用激活函数套在前面的线性函数外面,那么整个函数就变成了非线性函数了。
非线性函数可以表示曲线,而且神经网络的层次越多(叠加起来的非线性函数越多),所表示的曲线就越复杂。
也就是说只要神经网络的层次足够多,那么就可以解决任何问题。
常见的激活函数
sigmoid函数
函数:
导数:
特点是其值域为(0,1),可以作为二分类最后一层的输出tanh函数
函数:
导数:
其值域为(-1,+1),均值接近0均值,效果要优于sigmoid,——将这些靠近0的输出值传递给下一层神经元,下一层神经元会工作得更高效
sigmoid和tanh都有一个共同的缺点:
学习速度与偏导数的大小有关,偏导数越大那么学习速度越快。前两个函数,当输入数据的值比较大时,神经网络的学习速度就很慢。通过观察sigmoid和tanh的图像可知——当输入值越来越大时,曲线的斜率越来越小,偏导数越来越小。
为了解决这个问题,研究者们创造了另一个激活函数relu。Relu函数
函数:
导数:
从图像可以看出,当输入值大于零时, relu的斜率是1;而当输入值小于零时,斜率是0。
leaky relu函数
为了解决斜率=0的问题,人们又创造了另一个激活函数leaky relu。但是这个意义不是特别大。
实际应用中,输入值一般都是大于零的。
初始化参数,需要随机,不能0
为什么单层可以0,多层不能初试为0?
反证:
若均初始化为0:
结果:
第0层是输入,第1层中,每个元素都是同样的z,同样的a
=
算出来的偏导数也是一摸一样,多次迭代后,很多神经元也等同一个神经元,计算完全一样的函数,
这么多神经元 == 一个神经元,不应该。
具体做法:
我们—般使用numpy.random.randn来进行随机初始化。
w1=numpy.random.randn((2,2))*0.01
乘0.01==想把w变得更小一点,计算得到的z就更小一点,z越小激活函数sigmoid的斜率就越大,那么在反向传播时计算得到的偏导数就越大,也就是说梯度下降会越快,那么神经网络学习的速度就越快。
b是可以为零的,因为w已经被随机初始化了,每一个神经元计算的内容已经不一样了。