聊天机器人?我的第一次机器学习体验
大学最后一年,我决定放手一搏,直接投身机器学习和数据科学领域。当时我没有任何相关知识,心想,还有什么比以此为基础撰写毕业论文更好的学习方法呢?乍一看,这似乎是个愚蠢的想法,尤其考虑到它对总成绩的贡献。但经过五六年软件开发行业的工作经验,我发现压力越大,学习效率越高。
现在来说说重点。我决定挑战一下自己,让我的电脑开口说话,也就是完全使用机器学习技术开发一个聊天机器人。当然,首先我需要找到一个实质性的课题作为论文的基础,所以我决定以“解决现代聊天机器人的问题”为题。
聊天机器人的问题
聊天机器人通常被分为“开放领域”和“封闭领域”两类。前者没有特定关注点,通常被视为通用讨论机器人。后者则针对特定领域,例如SaaS网站上的客服机器人。我认为这种泾渭分明的划分应该被打破。为什么不开发一款能够跨越这两个领域的聊天机器人呢?比如说,我想和我的“友好邻居”机器人聊天,偶尔也向它请教一些健身技巧和教程?按照现有的标准,我无法做到这一点,因为这类聊天机器人无法归入任何一类。
我知道这个问题看起来并不十分重要,但它仍然是一个挑战,我决心找到解决办法!
我的“解决方案”
当然,我一直想涉足精彩纷呈的机器学习领域,所以就着手做了。经过无数个熬夜研究,我发现了一种以前从未见过的有趣的翻译方法:神经翻译机(NTM)。这是一种常用的多语言翻译技术,例如英语到西班牙语的翻译。当时的我有点天真,心想既然用这种方法把一种语言翻译成另一种语言这么容易,那么把一种语言翻译回它自己应该也不会难多少吧?哦,我错了……这种方法的弊端在于,当试图把“你好,你好吗?”这样的句子翻译回同一种语言时,会有无数个合适的答案。而当翻译成另一种语言时,这种方法就完全没问题,因为合适的翻译只会有一小部分。
在我的尝试中,使用网络训练模型(NTM)的主要优势之一在于我可以精确控制它的训练方式。为此,我决定使用多种来源,包括一些热门健身子版块的热门评论和回复,以及著名电影剧本。我希望为我的聊天机器人提供丰富的数据,使其既能进行一般对话,又能掌握健身方面的专业知识。
在深入探讨我的实现之前,理解NTM的基本概念至关重要。NTM的核心部分有两个:编码器和解码器。编码器接收输入文本,并将其编码成一个机器可以读取的大型矩阵。解码器则接收这个大型矩阵,并尝试将其解码回文本。这只是对NTM的极度简化,深入研究该模型的实际细节会发现它远比这复杂得多。然而,本文的目的并非探讨这些细节,而且有很多白皮书对这个概念的解释比我更加详尽。
经过一番研究,我立即着手使用 Keras 和 TensorFlow 实现自己的 NTM 模型。在开发完 NTM 的核心部分后,我发现自己陷入了一个相当棘手的境地:我需要训练的数据量远远超过了硬件的处理能力。幸运的是,我偶然发现了 Keras 的一个强大功能——创建自定义“数据生成器”。这让我能够以循序渐进的方式,将磁盘上的庞大数据集逐步导入到 NTM 中,而不会超出硬件的限制。
在开发和训练完我的数据之后,下一步是为用户提供与聊天机器人交互的方式。当然,凭借我的 Web 开发经验,我决定创建一个利用我训练好的模型的 Web API。我还创建了一个简单的聊天机器人用户界面,并将其集成到另一个 Web 项目中,该项目是我毕业论文的一部分,用于展示我的工作成果。
需要改进的地方
这个聊天机器人本身并不“智能”,它虽然能回复大多数句子,但大部分回复都是一堆毫无意义的乱码。这完全是我的错,因为我在训练阶段提供的数据集太差了。我发现这个项目最难的部分甚至不是创建模型并让它运行,而是找到合适的训练数据。如果让我重新做这个项目,我会确保花更多时间研究训练数据,因为这似乎是成功的关键。
除此之外,这个项目让我意识到,即使计算机科学的某些领域在你没有经验时可能看起来令人生畏,但给自己设定一个挑战并没有什么坏处,你可能会像我一样给自己一个惊喜。
自己试试吧!
我仍然将它托管在 Azure 上,与我之前设计的 Web 项目原型放在一起。如果您感兴趣,以下链接会很有帮助:
• https://github.com/AtLeastITry/seq2seq-keras-chatBot/(源代码)
• https://ce601-chatbot.azurewebsites.net(Web API)
• https://ce601-ui.azurewebsites.net(Web 应用程序)