文章同步发布于我的博客
未经许可,不得转载。

最近工作上的内容开始向数据挖掘转换。其中一项主要的任务就是用 Deep Knowledge Tracing 分析学生的学习数据(其实就是简单的 LSTM)。已经有论文发布了相关算法,需要我做的就是将算法进行 GPU 优化,并将我们的数据转换成需要的格式。最后,再跑一下算法,将结果存储下来,供以后使用。

主要流程

有了明确的任务定义,接下来的主要流程可以分成这样几步:

  1. 从 AWS (Amazon Web Services) 上读取数据
  2. 清洗数据
  3. Data Transformation
  4. LSTM 算法
  5. 保存模型文件,更新训练记录

获取、清洗数据通过本地使用 aws-cli 执行 SQL 语句完成。学生的原始学习数据存储在 AWS 上,每一行记录了学生每一次与系统有意义的交互(比如某时间点完成某道题中的某一步,结果正确与否)。当然,Knowledge Tracing 相关的算法并不需要所有的步骤,因此需要仅保留那些所需的数据。通过 SQL 条件语句来筛选相应行即可。

Data Transformation 这一步在本地完成。主要是值的转换、数据格式转换。值的转换包括正确/错误值转换为 1 和 0,数据格式转换则是由之前的二维表,转换成每一行对应一个学生的序列。这样,每一行的长度就不一样了。同时,关于数据的一些整体数据,也会更新在数据库中。由于数据量不大(一个单元大概不到 1G),下载到本地不是很费时间。加上算法需要一些奇怪的文件格式,如果每次都要在云上将数据转换也比较浪费时间,就选择本地处理 + 保存了。现在回想一下,其实数据转换也可以在云上进行,算力大的话会更节省时间。不过,在本地进行还有一个好处就是方便随时监测、调试,在项目初期也算一个优势。

LSTM 算法训练这一步也是在本地完成。项目初期只训练了一部分数据(大约15%),预计耗时也不是很长。加上正好有一台带 NVIDIA GPU 的机器,在代码中加上针对 GPU 的优化设置后(对 Tensor 使用 .cuda() 方法),训练速度有显著提升。训练的每一个 Epoch 都存储了相应的文件,采取了 Early Stopping 机制,节省训练时间,获取表现最好的模型。

每一次训练结束,会产出相应的处理好的数据以及模型文件,方便以后读取、使用,如果需要重新训练在上次模型的基础上训练,读取速度会因免去重新处理数据加快不少。

整个流程用一个 Shell 脚本运行,中间不再需要任何输入。(本地训练如果想早点结束可以 ctrl + C 结束)。针对是否需要读取原始数据,是否需要处理已下载好的原始数据,还是直接使用处理好的数据,都有相应的判断语句,以最大化节省时间。

这个就是本项目初期的一个简单的 Data Pipeline 了。通过总结反思,可以发现能够改进提升的点,以更高效地完成任务。

和 Full Data Pipeline 对比

一个完整的 Data Pipeline 有如下五个部分(包含几个示例问题或主题):

  • 定义问题
    • 这个问题是否是对的问题?
    • 这个问题可能有答案吗?
  • 数据收集
    • 收集到的数据是能够回答这个问题的吗?
    • 收集数据的难度?
  • 数据清洗
    • 数据有什么缺陷?
    • 缺陷如何处理?
  • 数据探索
    • 直观观察
    • 统计分析、图表、机器学习算法
  • 数据使用
    • 预测
    • 生成结果报告
    • 可视化

由于本项目的问题已界定清晰、数据已经收集好,所以不是太需要关心前两步。只需要确认收集到的数据是否能够回答问题、满足算法需要即可。

问题

一边完成项目,获得想要的结果的同时,我也也一边在反思过程中遇到的困难和解决的办法。

既然都在 AWS 上,有没有更快速的读取数据的方法?是否还需要保存本地文件?

文件存储、数据库。不同的输出以不同的方式存储。AWS 上还是有不少功能我们没有探索并加以利用的,在后续的工作中也会继续挖掘。

Data Pipeline 应用于特定领域时,有哪些需要调整的地方?

获得的结果最后还是要应用于产品当中。要向让这次训练的模型能够更好地预测学生知识点掌握情况,节约学习时间,并发掘出新的知识点,则还需要进一步的开发、应用。Data Pipeline 的最后一步,还有待完成。

Data Pipeline 可视化能够帮助团队成员快速理解代码。一个比较简单的 Data Pipeline,实现起来已经需要用不少代码做数据转换了。很多中间步骤都需要进行读写,也需要频繁查看每个数据表的格式。如果是自己写的代码还好,脑子里大体有印象,但一个大的项目,要是从头读别人写的代码,如果注释不够清晰,就需要耗费很长时间理解整个流程都做了什么。目前能想到的是将整个流程可视化,纸笔或者是思维导图软件,但是纸笔不好拓展,思维导图不支持代码格式。如果能有一个更方便的工具,能够大大提升工作效率。


以上就是这次 Data Pipeline 在实际工作中的应用总结了。由于这是我毕业后第一个项目,加上小公司对于这方面还没有太明确的流程,很多方面都还在探索中。欢迎大家提提建议、一起交流。