前言:
感知器作为连接主义学派的最经典的最美妙的一个成果,也成为了万千想要进入人工智能领域的学生所一定绕不开的一个学习项目。很多学校的专业课都会要求选修的学生们手写完成感知器这一算法。用我们助教老师的话来说就是:这是你自己造的第一个轮子。虽然这个轮子可能没有那么圆,也不能让你的车跑的很快,同时现在python的torch包也提供了一个梯度计算工具,但是这毕竟是你自己做的轮子,你一定需要让他能跑起来。
但是这个轮子好造嘛?非常困难。这是因为以下这几个原因:
1.反向传播的算法的核心是数学。
反向传播是计算梯度再加上链式法则。同时这其中的计算梯度还比大家一般学的高等数学中的微积分要求更高些。因为在大多实际运用之中的问题之中,我们基本需要的是对于图片的识别,这也就意味着很多求导针对的不是一个数,而是一个矩阵。矩阵求导的解决方式只有两个:
(1)直接使用网上寻找的公式,比如"The matrix cookbook"中的已知结论
(2)使用代数的方式分别求导,看对于一个矩阵的每一个元素上梯度和求导的结果是什么样的。
所有的论坛上提供的反向传播算法的文章,即使是某些称自己是“手把手教导”的文章也没有做到说清楚为什么梯度是这样。这是作者自己在做的时候面对的问题,也是本文章想要填补的空缺,已提供给初学者一些学习的方式。
2.难以调试:
一般来说,对于感知机,project的要求一般是用感知机分类图片。输入感知机的图片的要求是必须是展开成一个列向量才能进行运算。那么如果一张28*28的图片我们就需要784维度的列向量进行学习。这么大的输入向量,即使只有一层,分成10个类别,那么我们也至少需要10+