卡了我三天的神经网络,看了很多视频和别人写的代码,网上的优秀文章真的帮了我很多
这个文章来源于各种东拼西凑的资源和我自己的总结,希望能帮到一些跟我一样看不懂那些高深资源的小朋友
ex.4编程题的要求是使用神经网络来解决手写数字识别,题目和数据可以在这里找到:
https://www.kesci.com/home/project/5da6bd34c83fb40042068a41/dataset
一.资源地址:
1.这个是b站上面吴恩达神经网络那一章节的地址,认认真真的看完才能对神经网络的基础概念和代码流程有所了解
https://www.bilibili.com/video/BV164411b7dx?t=250&p=50
2.这个是我在b站找的一个up主,会手把手教你怎么写课后题这些代码(啊!小姐姐我i了),代码思路比较清晰,但是对于数学公式的推导比较少,一会儿我会补充
https://www.bilibili.com/video/BV1W4411o7gG?p=1
3.和鲸社区的代码风格也很好,对于这个编程题来说,在代码实现上与上面这个up主的代码实现有略微不同,主要是在反向传播部分,一个是使用比较复杂的矩阵运算,一个是for循环迭代数据,建议都看一看 (先看上面那个up主的)
https://zhuanlan.zhihu.com/p/87930731
4.如果你搞不懂神经网络的本质是什么,或者是看完吴恩达的视频之后一头雾水,看完代码也不懂为什么要这样写的话,可以来看看这几个小视频(必须去给我看!看完你会感谢我的)
https://space.bilibili.com/88461692/video?keyword=%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0
这里有三个小视频,相信我,这能很好地帮你理解神经网络的原理
5.神经网络主要就是 正向传播和反向传播,正向传播应该没什么难的,反向传播的那些求导卡了我很长时间,不知道怎么求导,知道了之后也不懂如何那些数学公式如何应用于矩阵,而且还得用代码写出来
我们一步一步来
首先是数学公式得搞懂,对权重的求导,对a值和z值的求导,误差的推理:
https://blog.csdn.net/qq_35290457/article/details/100567159
这篇文章是我觉得公式写得最清楚的,现在我们知道了对每个值来说,反向传播中的数学推导应该是什么样的
6.那将数学推导转化成公式应该是什么样呢?
接下来这些我画到纸上,尽可能讲清楚
① 前向传播:
之所以特征值要放在横着的一行是因为一行代表一个样例,初始的矩阵是m*n的,m是样例数,n是特征数
在前向传播过程中,通过一层w权值矩阵运算后,变成了m*n2,n2就是神经网络第二层的节点数,相当于从n个
特征映射到了n2个特征,同理,经过第二层w权值矩阵运算后,就变成了m*n3了,n3就是神经网络第三层的节点数
我只拿了一个样例举例,所以初始是一个1*4的矩阵(这四位中第一位是偏移值)
具体代码的话看那个up主的视频,里面有,这俩图只是讲下矩阵运算的细节,我觉得细节是最需要写一写的,因为我在网上
找不到具体的细节实现,大多数帖子会告诉我原理,然后 emmmmm,告诉我 just do it,good luck
②反向传播:
首先说一下具体的原理
反向传播首先用我们随机的权重来算出一个最终的结果y,真实值减去我们算出来的y值就是最后一层的误差,(为什么真实值减去我们算出来的y就是误差可以去看看我上面发的那个数学公式推导的网站)
然后我们用误差进行反向推导,就可以优化神经网络,为什么可以这样呢?
首先我们算出了一个误差,而我们想做的就是来缩小这个误差,误差对于每一层的权值进行链式求导,就可以得到每个权值对应
的梯度,这个梯度其实代表的就是,权值改变对于误差的影响程度,然后我们进行梯度下降,从而最终导致我们的最终误差的值缩小,我想这就是神经网络反向传播的核心思想
这里粘贴一段up主视频里面的反向传播代码:
def gradient(theta_serialize,X,y):
theta1,theta2 = deserialize(theta_serialize)
a1,z2,a2,z3,h = feed_forward(theta_serialize,X)
d3 = h - y #第三层的误差
d2 = d3 @ theta2[:,1:] * sigmoid_gradient(z2) #第二层的误差
D2 = (d3.T @ a2) / len(X)#第二层θ的梯度
D1 = (d2.T @ a1) / len(X)#第一层θ的梯度
return serialize(D1,D2)
这个是梯度下降函数,用于返回误差对于第一个权值矩阵W1和第二个权值矩阵W2的梯度,这也是反向传播中最难的地方
依然按照我画的那个图来讲
首先 theta1,theta2就是W1权值矩阵和W2权值矩阵
a1,z2,a2,z3,h就是前向传播过程中 第一层的输入值a1、第二层的输入值z2、第二层激活后的a2、第三层的输入值、
第三层的输入值z3、第三层激活后的值h(也就是a3,也就是最终结果)
d3 = h-y h是预测的值,y是真实数据y值,h-y就是第三层误差
接下来我们开始说下计算第二层误差的代码,还是以我们这个图来讲
像这种a1,a2,w1,w2之类的符号,右上角代表的是这个东西在第几层,右下角表示的是它的序号,这些东西都是实数,不是矩阵哦
第二层对每个节点的误差推导公式可以去看我上面发的那个 公式推导的网站
用代码实现矩阵运算我觉得是一个非常神奇的事情,我现在也不太懂为啥计算出来的结果和每一个节点相对应
能力有限,只能帮助各位看懂代码的运行细节
同理,第一层的误差也可以利用第二层的误差进行推导,这里就不写了...
求出误差后,就可以根据误差来计算误差对于权值的梯度
以第二层W2来说
再次强调一遍,这些图片是在理解数学推导过程,但是看不懂代码实现的前提下才有帮助,如果对反向传播过程中
的误差和权值的求导不怎么清楚的话一定要认认真真把这个网站里面的都看懂了再说:
https://blog.csdn.net/qq_35290457/article/details/100567159
这是一个样本的情况,对于多个样本的情况,其实就是把所有样本的对于权值的梯度取一个平均
如果不懂得话可以在纸上画一画,希望我这个帖子能帮到大家,转载记得把我这个链接也带上嘿嘿嘿