我实现了一个人工机器学习写作器

791 查看

我最近在赫尔大学完成了我的进阶人工智能模块。它特别棒。“机器学习”技术尤其吸引我,大量基于此的潜在应用看起来前途无量。当我克服了(人工神经)网络工作原理的陡峭学习曲线后,我决定是时候写点什么了。

人工神经网络(ANN)写作器

在我全力搜索互联网上来研究奇迹般的机器学习的同时,我偶然发现了个 github 上的项目,使用了递归神经网络(recurrent neural network)来模仿莎士比亚的写作风格。我喜欢这个想法,所以也试着创造一个几乎完全不一样属于我自己的版本。我决定使用 scikit 这个机器学习库。这是因为它使用和配置起来都特别顺手。

Scikit 同样有着庞大的社区,里面包含了大量的教程,还有许多可以用来训练你自己的神经网络的样本数据集(example datasets )。我创建的这个写手使用了多重支持向量机(SVM)引擎。一个向量机(vector machine)用来对句子结构化,多个小型向量机用对应从词汇表中选取单词算法。

句式结构化

句式结构化非常成功,我目前使用的算法结果准确率已经很高了。这个阶段中最打的障碍就是将训练数据归一化(normals)。我使用了 NLTK 这个自然语言的库来将训练数据转化成词性标签(phrase identifiers),例如:NN(名词),DET(限定词),$(标志)等等。

这代表着我可以利用这些标签对数据进行归一化,像下面这样:

一旦归一化以后就像下面这样:

现在我只需要得到一个目标归一化后的值(target normal),并且将它代入神经网络中开始训练即可。从 二进制大型对象(BLOB)中读取文本时,训练用词就是二进制大型对象中的下一个词,因此:

接下来要做的是拿到大量 J.K Rowling《Harry Potter》的资源并且准备开始模仿她的句式结构。

词汇

词汇在本项目中无疑是最难的部分,我很清楚没有道理不使用递归神经网络,预测每个字母也是更好的办法。然而,我选择的方法产生的结果看起来特别有趣。

词汇以词序矩阵的形式包含在训练用的 BLOB 文件中。每个词分解成了词性标签接着进行归一化。归一化后的值和词汇依然被保留着,因为稍后将归一化的值转换回单词依然要利用此作为映射表。词汇看起来像这样:

尝试应用

使用 HarryPotter(small).txt

这个数据集包含了 346 个训练向量(training vectors)。是一个最小的训练集。

你可以看出神经网络很努力想要学习却缺乏训练数据。它几乎就陷入无限循环中了。

使用 HarryPotter(medium).txt

数据集包含了 2500 个训练向量。

现在你可以看出神经网络已经生成了我们预想的结果。因为增加了训练数据,它的性能得到了大幅度提升。

使用 HarryPotter(large).txt

数据集包含了 4550 个训练向量。