IT互联网行业有个有趣现象,玩资本的人、玩产品的人、玩技术的人都能很好的在这个行业找到自己的位置并取得成功,而且可以只懂其中一样,不需要懂其余两样。玩技术的人是里面最难做的,也是三者收益最低的,永远都要不停学习,不停把画饼变成煎饼。
在今年5月底,Alphago又战胜了围棋世界冠军柯洁,AI再次呈现燎原之势席卷科技行业,吸引了众多架构师对这个领域技术发展的持续关注和学习,思考AI如何做工程化,如何把我们系统的应用架构、中间件分布式架构、大数据架构跟AI相结合,面向什么样的应用场景落地,对未来做好技术上的规划和布局。
之前发表过一篇文章《如何用70行Java代码实现深度神经网络算法》(点击「阅读原文」获得文章),记录了深度神经网络的计算过程和程序实现,本文再进一步研究一下背后的数学原理。
为了彻底理解深度学习,我们到底需要掌握哪些数学知识呢?经常看到会列出一系列数学科目:微积分、线性代数、概率论、复变函数、数值计算等等。这些数学知识有相关性,但实际上这是一个最大化的知识范围,学习成本会非常久,本文尝试归纳理解深度学习所需要的最小化数学知识和推导过程。
(以下根据作者的学习理解整理,有误之处,欢迎专家学者提出指导批评)。
多层神经网络的函数构成关系
多层神经网络从输入层,跨多个隐含层,到最后输出层计算误差,从数学上可以看做一系列函数的嵌套组合而成,上一层函数输出做为下一层函数输入,如下图1所示。
先从误差函数说起,深度学习的误差函数有典型的差平方函数,也有交叉熵函数,本文以差平方函数为例:
Tj代表每个神经元目标值,Oj代表每个神经元输出值
这里Oj=f(Zj),f是激活函数,一般是s函数:
或者relu函数:
Zj是线性函数(Wij泛指i层和j层节点连接权重,bj泛指j层节点截距):
Oi再往前依次类推,整个神经网络都可以由上面的函数嵌套去表达。
现在我们的问题是,如何通过多次调整上面的Wij和bj,能让误差函数E达到最小值