我最近在赫尔大学完成了我的进阶人工智能模块。它特别棒。“机器学习”技术尤其吸引我,大量基于此的潜在应用看起来前途无量。当我克服了(人工神经)网络工作原理的陡峭学习曲线后,我决定是时候写点什么了。
人工神经网络(ANN)写作器
在我全力搜索互联网上来研究奇迹般的机器学习的同时,我偶然发现了个 github 上的项目,使用了递归神经网络(recurrent neural network)来模仿莎士比亚的写作风格。我喜欢这个想法,所以也试着创造一个几乎完全不一样属于我自己的版本。我决定使用 scikit 这个机器学习库。这是因为它使用和配置起来都特别顺手。
Scikit 同样有着庞大的社区,里面包含了大量的教程,还有许多可以用来训练你自己的神经网络的样本数据集(example datasets )。我创建的这个写手使用了多重支持向量机(SVM)引擎。一个向量机(vector machine)用来对句子结构化,多个小型向量机用对应从词汇表中选取单词算法。
句式结构化
句式结构化非常成功,我目前使用的算法结果准确率已经很高了。这个阶段中最打的障碍就是将训练数据归一化(normals)。我使用了 NLTK 这个自然语言的库来将训练数据转化成词性标签(phrase identifiers),例如:NN(名词),DET(限定词),$(标志)等等。
这代表着我可以利用这些标签对数据进行归一化,像下面这样:
1 |
["The", "cat", "jumped"] = ['DET', 'NN', 'VP] |
一旦归一化以后就像下面这样:
1 |
['DET', 'NN', 'VP] = [0.2237823, 0.82392, 0.342323] |
现在我只需要得到一个目标归一化后的值(target normal),并且将它代入神经网络中开始训练即可。从 二进制大型对象(BLOB)中读取文本时,训练用词就是二进制大型对象中的下一个词,因此:
1 |
["The", "cat", "jumped"]["towards"] = ['DET', 'NN', 'VP]["PRP"] = [0.2237823, 0.82392, 0.342323][0.12121212] |
接下来要做的是拿到大量 J.K Rowling《Harry Potter》的资源并且准备开始模仿她的句式结构。
词汇
词汇在本项目中无疑是最难的部分,我很清楚没有道理不使用递归神经网络,预测每个字母也是更好的办法。然而,我选择的方法产生的结果看起来特别有趣。
词汇以词序矩阵的形式包含在训练用的 BLOB 文件中。每个词分解成了词性标签接着进行归一化。归一化后的值和词汇依然被保留着,因为稍后将归一化的值转换回单词依然要利用此作为映射表。词汇看起来像这样:
1 2 3 4 |
[[(cat, [0.232342]), (bat, [0.2553535]), (dog, [0.345454]), (horse, [0.4544646]) ... ] [(run, [0.12131], (jump, 0.232323), (fall, 0.43443434) ... ] ... ] |
尝试应用
使用 HarryPotter(small).txt
这个数据集包含了 346 个训练向量(training vectors)。是一个最小的训练集。
1 2 |
Input: "Harry dont look" Output: "Harry dont look had at eleven for witches had been for eleven then with nothing had been for eleven then with nothing had been for eleven then with nothing had been for eleven " |
1 2 |
Input: "Wizards sometimes do" Output: "wizards sometimes do , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been " |
你可以看出神经网络很努力想要学习却缺乏训练数据。它几乎就陷入无限循环中了。
使用 HarryPotter(medium).txt
数据集包含了 2500 个训练向量。
1 2 |
Input: "Harry don't look" Output: "Harry don't look , incredibly that a year for been parents in . followers , Harry , and Potter was been curse . Harry was up a year , Harry was been curse " |
1 2 |
Input: "Wizards sometimes do" Output: "wizards sometimes do parents." |
现在你可以看出神经网络已经生成了我们预想的结果。因为增加了训练数据,它的性能得到了大幅度提升。
使用 HarryPotter(large).txt
数据集包含了 4550 个训练向量。
1 2 div>
|