算法java人工智能_现代化的 java (三十一) ——从0开始实现一个人工智能算法...

从 0 实现一个人工智能算法

这段时间读了一本有意思的书,《深度学习的数学》。

1e1fa7761bd4cfc64f8c0439a64aeae0.png

这是一本能把复杂的事情讲简单的好书。对于深度学习这样的东西,它讲解到什么程度呢?

一本薄薄的小开本,从牛顿求根公式,到高维空间的梯度下降,再用 Excel 实现深度学习和卷积神经网络。

对,用 Excel 实现深度学习。并且给出了如何在 Excel 中实现误差反向传播,从而用简单的技术工具展示了这个算法的原理。

这本书很适合作为人工智能方向的入门书,比起一些只介绍了如何调参数和安装工具的大部头,这本手把手教会读者实现一个简单模型的小开本,更有价值。

我按照这本书的示例,在 Clojure 中实现了一遍基于误差反向传播的深度学习算法 ([https://github.com/MarchLiu/ml-sample]) 。这里,我介绍一下 Clojure 版本,有兴趣的朋友可以尝试一下用 Java 或其它语言实现一下。

其实中途不止一次,在遇到问题的时候想,如果用 Java 会不会实现起来更容易……

回过头看,总的来说用 Clojure 实现还是对的, Lisp 风格表达数据结构和数据结构的变换,实在是太方便了。当然其实它并不是总比 Java 的表达风格更好,比如在求解误差函数的时候,计算公式是基于坐标的,这个时候用 Java 可能要更方便一些,所以我并不会觉得“Java 也有它的优势”仅仅是一句漂亮话,将来我也许也会写其它语言的类似实现。

本文和后续若干篇文章,其程序原理都来自这本《深度学习的数学》,所以我不会再复述书中的内容。有兴趣的读者建议买一本参照阅读。这么高性价比的书,实在值得向大家推荐一下。

准备工作

我在上面提到的项目链接中,已经准备好了测试数据,数据集很小,就是把原书的 Excel 数据整理成了纯文本格式。

现在我们简单介绍一下加载这些代码的函数,都非常简单。下面这个函数,将指定的文件内容加载为一个整数列表:

(

有了 load-data ,我们就很容易可以写出 load-all-data :

(

除了加载训练和测试数据,当然也要能加载正值数据:

(

接下来,我们写一段代码,用于初始化神经网络。

构建神经网络

神经网络本身是一组数据定义的规则集合。每一个单元本身,是一个带权重系数和截距的多元一次方程,求出该方程的值 zeta 再加以一个点火函数处理,成为最终的输出值 alpha 。所以我们可以简单的将每个节点定义为 `{:w [...] :b}` 这这样的字典。初始化这个节点的函数,可以简单的写为:

(

这里不过多介绍神经网络的数学原理了,简单的说,神经网络是一层一层叠加起来的,每一层包含若干神经单元,每个神经单元的输入是上一层的所有单元的输出值 alpha 。故这里我们要传入上一层的单元个数。构造时,通常我们用一个正态分布的随机数发生器,这里偷懒用了 Clojure 内置的随机函数,这个随机数生成器是平均概率,对这个例子也够用了。

下面我们写一个函数,给出每一个层的节点个数,由它构造一个任意多层(n > 2)的神经网络。实际上我们这个例子只用了三层。

概念上说,神经网络的输入层、隐藏层和输出层是不一样的东西,但是在这里,隐藏层和输出层其实遵守了同样的逻辑,也可以用同样的逻辑来构建。而输入层,它永远是接收数据并原样转发。为了计算上的便利,我们把它实现成尽可能与其它层一样的结构:

(

这里 input 层我们就直接让它等效于 identity 函数,其它层的节点都是用随机数配置的 alpha 函数。

下面我们实现用于计算神经单元结果的 zeta 和 alpha 函数。

前面我们介绍过,zeta 就是一个多元一次函数:

(

Alpha 函数就是将点火函数作用在 zeta 函数的结果上。理论上说点火函数由很多选择,但是具体这个例子,我其实只用了 sigmoid 函数一种。所以我虽然写了 alpha 函数的实现,还提供了可选 fire 参数的版本,但是实践上,这个例子里完全没用到这个 alpha 函数。在每个需要 alpha 的地方,都是先调用 zeta 函数,求值后用 sigmoid 函数计算出 alpha 值。这有个很重要的原因是,我们总是需要分别保存 zeta 和 alpha 值,在误差反向传播算法中,zeta 值不仅仅是一个中间结果,它本身也有用。

(

接下来,我们可以构造出求解过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值