小克资历尚浅,深度学习过程中,记录心得体会,如果有大神发现错的地方,还请麻烦告知,万分感谢!
神经网络无非扮演着非线性拟合数据的角色,每一层可以看作是拟合一部分数据信息,直至将所有数据信息都学习出来,
每个神经元都是线性函数与非线性激活函数(relu,sigmoid,tanh等)的组合,都有对应的参数要学习,
层数及神经元数目越多,则参数数量越庞大,
因为需要通过反向传递学习的损失,进而获得最优参数值,参数矩阵越大,需要的内存及计算量越大,因此,一般层数选择三层以内,也因此后续出现卷积神经网络,以谋求在尽量获取数据信息的基础上,通过过滤(卷积)及筛选(池化),尽可能减小参数数量
如果是回归模型,则最后一层可以无需非线性激活
如果是分类模型,则最后一层可以使用softmax或sigmoid激活
对于反向传播算法,其实是链式求导法则在求解损失函数对参数的导数时的公式:即,根据正向传播的计算图,可以得到各个节点的节点值,这些节点值也正可以代入链式求导过程中,从而计算出损失函数对参数的导数
由于使用numpy矩阵,因此矩阵的shape要每一步都搞清楚,这样计算才不会出错(其实所有for循环,如果对每一条数据的处理都一致,则可以使用矩阵来替代for循环,可以加快计算速度,如同分布式运算一样,N条数据同时运算当然比N条数据逐一运算更快)
如下代码参考某培训班课程讲义,自己再实现一