#8 人工智能
”人工智能为什么好呢,对编程有要求但不高,对数学有要求但也不高,同时还要白唬的能力”
在某期焦糖radio中毛佬如是说到(欢迎b站搜索UP主“焦糖radio”收听)
Background
人脸识别、机器学习、深度学习、……各种与AI有关名词的热度越发高涨;Alpha GO制霸围棋界、物体识别走进千家万户、科大讯飞的自动语音识别、APP基于用户特征的智能推荐,人工智能的强大早已不言而喻。如果你也对人工智能充满兴趣,想要一探计算机利用数据思考、做出决策背后的秘密,不妨跟着我们一步步了解这门充满魅力的科学。AI是一个非常庞大的领域,相信你可以找到somewhere you are really devoted to.
完成度要求
严格来说没有硬性要求(多多益善手动狗头),只是希望能看到同学们的学习能力与理解、应用程度,以下是一些建议和希望。
- 对于没有基础的大一同学,建议从Task1到Field1逐步学习,若有余力可以对Field2、Field3做一些了解。
- 对于有些基础的大二同学,希望能在完成Task1和Field1的基础上,任选Field2或Field3其一探究,当然也欢迎有大佬能全部做完orz
- 不论完成度如何,请仔细阅读每小题的提交内容,并且提供一个可访问的GitHub地址,里面应当有你想要提交的**.md文件、截图、源代码**。
TASK1
提交内容
- 使用你喜欢的资料大致了解机器学习,关注重点概念与基本思想,并将学习笔记写入一个markdown文件。
- 然后完成以下代码补全题,将补全后的代码存为一个名为iris的python文件。
- 将代码执行结果记录在markdown文件中。(注意markdown中插入图片能否在其他设备上访问!!!)
- 将文件归纳到名为Task1的文件夹中。
开始之前,请你先稍稍了解神经网络的基本概念以及pytorch又是什么~~
重点关注对象:(还有别的你觉得有趣得内容也写上哦)
好啦,基本的概念在你的脑海里开始生根发芽了,那就开始机器学习的"hello world"吧!
在自己动手之前还有个小小的问题有待解决——环境搭建。
我们需要在自己的电脑上搭建一个python环境(建议python=3.7),可以使用anaconda搭建虚拟环境,配置下面项目所需要深度学习框架。
在神奇的泥电校园有一种神奇的名为iris的小草,它分为A、B、C这三个品种,每棵草都有四个典型属性,tsundere studio某个醉心花草的人采集了一百五十棵草,并记录下了每棵草的属性和品种,制作成了一个数据集。接下来,我们的任务便是补充一段代码,让你的专属神经网络学会根据属性判断小草的品种哦~~
代码框架地址:百度网盘 请输入提取码
代码中标有 “?” 便是需要填充代码的地方。当然也可以尝试自己修改神经网络结构看看效果如何(加分项~)。
虽然说大部分同学可能没有专门学习过python,但深度学习代码所需要的语法并不难,并且python本身简洁的特性也降低了初学者运用的难度,稍加学习语法也能handle!
参考资料
TIPS
- python的语法其实相当简单,大一的同学不用担心,稍微学习一下就能运用,不要放弃啊😭
- 配置环境可能遇到非常多小问题,善用搜索引擎,耐心解决。
TASK2
Field 1 Computer Vision
视觉对人类可太重要啦,作为AI怎能不升级出这个技能点呢!计算机是怎么处理图像信息的?计算机视觉(Computer Vision)将回答这个问题
在做题之前我们可以先了解了解以下问题:
- 计算机以怎样的方式存储一张图片,又是怎样显示它的?
- 作为一名 programmer,我们在代码中采用什么数据结构将图片读入?
- 如今CV领域已然发展得非常成熟,有哪些研究领域(目标检测、图像生成……)?
- 了解一个非常重要的库OpenCV
相信前面的小问题一定难不倒你!那先在就让我们尝试复现一个有趣的计算机视觉项目吧!需要注意的是本项目使用的是keras框架,尽量重新搭建一个新环境,避免和上道题目的环境版本产生冲突。(不同项目使用独立的环境是版本管理的好习惯)
识别自己的表情符号!在这个项目中,我们可以利用摄像头实时识别人脸的表情种类。可能发现全是英文觉得有点哈人hhh。阅读英文文本是我们的一项必备技能噢,冷静下来看并不难理解。相信通过本题,你可以更好的理解深度学习模型的工作流程与效果。
题目要求
我们的任务是复现这个开源项目,下面是几点要求:
-
我们在复现时可能会发现一些代码的错误,库版本不兼容的问题,这些都是复现工作的常见问题,尝试自己解决他们吧。
-
基本要求是成功运行train.py,将训练的结果的评价指标记录下来。
-
我们发现执行本项目的gui.py很可能无法显示gui界面,如果你也遇到了此类问题,尝试对它进行修改,使之实现识别表情符号的功能。这其实和深度学习算法没有什么关系。主要是调用cv2的函数,使摄像头捕捉图像,传到train.py训练好的模型中做出分类。(因此本要求作为加分项,不硬性要求)
-
如果成功运行了gui.py,控制表情,让摄像头识别到尽可能多的emoji种类吧!(同上为选做)
-
没有成功完善gui.py也没有关系,尽可能看懂train.py的源码并回答——它是如何载入数据,如何设计trainer,采用怎样的网络结构?
提交内容
- 相信在环境配置和修改过程中遇到了很多令人抓狂的问题吧,记录在markdown文件中,分享让痛苦减半~
- 尽量给修改后的源码加上注释,比如遇到了什么问题,如何修改的之类。形成自己的python文件。
- 将复现成功的画面截图下来,我们一起分享喜悦!(尽可能多种表情识别成功的截图)
- 将对第五个问题的回答记录在markdown文件中。
- 上述文件统一在一个名为Task2_1的文件夹中。
参考资料
TIPS
- 不明白的库函数、网络结构,用好搜索引擎大概率能找到答案。
Field 2 Natural Language Processing
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。这一领域的研究主要是为了让计算机能够像人一样听懂、处理和生成“自然语言”,即人们日常用于交流的各种媒介,例如文字、语音、旋律等等,综合来看他们有一种特点,那就是他们是以序列的形式传递信息的,这也是为什么NLP能作为一个独立的深度学习分支发展至今。
☆☆☆☆☆注:该题可能题目略长,还请同学们不要一看感觉害怕就划走了哈,该题重点在工程实现上,不需要学习太多的数学理论,所以只要各位好好读题,理清关系,相信各位一定能慢慢攻克本题的,而到那时我相信你也能大致了解一个炼丹项目究竟需要做些什么了。
(咳咳,正文开始)
澳焦银行作为一个“大公司”,每年都会有相关的交易或者营收账务记录和报表,但是如此大量的财务报表和账务记录会让潜在的“投资者”难以非常方便地了解和分析企业的财务状况,这样澳焦银行就割不了韭菜(bushi就不能帮助大老板们合理管理他们的闲置资金,不能为他们创造更多的利润和回报了。我们工作室准备实现一个自动问答的AI(FinQA),当老板们想了解澳焦的相关财务状况而提出一个有关公司财务状况的简单数学逻辑问题时,比如 :
what is the the interest expense in 2020?
该AI可以自动的根据问题读取公司的所有财务记录和报表,从中筛选出需要的内容和数据,并最终形成一个program序列,例如:
divide(100, 100), divide(3.8, #0)
这里做一些解释,#0表示第一个操作得到的结果,#1表示第二个操作得到的结果以此类推。这样一个program序列经过一些传统算法的识别和计算,就可以自动的得到上述问题的答案,即3.8。
该任务因为比较复杂且工程量大,我们将其勾画成一个分步任务来实现,基于一篇名为FinQA: A Dataset of Numerical Reasoning over Financial Data的论文,首先我们有一个retriever来筛选需要的内容和数据(在此我们暂且不管他的实现,我们已经为各位做了初步的数据清洗,为各位筛选出了需要的数据,详情可见题目最后提供的数据集),然后我们需要构建一个generator读取需要的内容和数据来实现program序列的形成,在本次考核中,我们只将重点放在generator这一模块的部分实现上。
generator的构建中我们除了论文提供的文本生成方案之外,还自行构建了很多种其他方案,其中一种方案也是一个分步方案(分类+序列标注),考虑到题量问题,我们主要考察他的第一步也就是分类,它的第一步是根据文本和数据进行一个operation组成方式的分类(concat_operation),举个栗子,比如上文的program: divide(100, 100), divide(3.8, #0),我们可以把它当作一个“divide0_divide1“的组合,不妨把这种格式的组合叫做concat_op,而“divide0_divide1“这个符号表示这个程序第一位是divide,第二位也是divde,这样我们就可以确定一个程序的大致模板。假设数据集涵盖的concat_op有100种,那我们只要将需要的文本内容 + 问的问题打包输入给一个模型,并且模型能够相对正确的从100种concat_op中选出一种组合,那么我们这一步的任务就完成了。
题目基本要求(数据清洗):
人工智能本质还是属于一门数据科学,优质的数据来源以及完善的数据清洗是一个炼丹项目能否炼成的第一道难关。我们将相关论文源码进行了一部分的删改,各位仅需完善代码即可,但我们的方案并不完全基于论文方案,所以会有一些额外的代码要写。本题需要各位同学完成以下两个基本要求:
-
下载题目最后给的百度云盘链接中的NLP-Part 1,自己写一个 statistics.py 文件,用来统计train数据集中的所有concat_op类别,并整合成一个数组。
-
学习研究并完善数据清洗部分代码(prepro.py)(从文件第115行开始),尝试将你之前用来统计concat_op所有类别的算法代码插入其中,使得prepro.py在进行数据预处理的时候能够对数据集中的每个program进行分析和识别,生成与之对应的concat_op。
进阶要求(炼丹开始啦):
我们在研究的过程中得知一个非常牛逼的神器————Bert模型,Bert全称为 Bidirectional Encoder Representation from Transformers,Bert凭借其出色的性能让如今NLP领域几乎成为Bert+时代,使用bert模型可以让你的项目达到一个比较优秀的分类效果。
在本题中你需要完成:
-
下载题目最后给的百度云盘链接中的NLP-Part 2,学习pytorch相关用法,实现一个基于bert的文本分类模型,将它引入你的model.py中并尝试跑通它。也可以网上搜寻相关源码,但需要修改相关参数还有输入量哦。
- 注意运行本代码是使用文档内的sh脚本,脚本需要先修改他的权限为可执行,之后才能执行使用。具体使用的话,如果是windows本地环境那么需要安装git,使用git bash后在弹窗内使用脚本即可。如果用的网上的linux服务器,那么直接使用即可。
- 运行的时候可能会遇到apex包的安装问题,这个包用一般的pip安装是没用的,我在项目包中放了一个apex的本地安装包,需要各位同学自行本地安装(如何安装查查博客吧)
-
继续完善整个项目,研究并完善trainer.py部分代码,自行完成accuracy函数(文件第18行位置)的编写(计算准确率),并尝试提高模型准确率到70%以上,推荐萌新们可以使用矩池云、Colab或者kaggle等在线训练平台进行训练(如果是土豪爷爷自己有3080的当我没说)
- 注意你的服务器是否有使用显卡进行计算,观察你的GPU使用率等等,如果你的计算过于缓慢,有可能因为你的代码问题导致服务器在使用CPU超频计算。
提交要求
- 完整的项目代码(放在一个名为fenlei的文件夹中)。
- 一个markdown说明文档,包括但不限于以下部分:
- 整体项目的各模块的大致介绍,各部分代码的思路走向以及大体作用。
- 你所修改的代码部分的说明
- 你在研究源码&&调试中所遇问题和解决方案。
- 如果你已经做到了进阶要求中的训练部分,请附上你的训练过程图和最终的accuracy结果截图
- 上述文件统一放在一个名为Task2_2的文件夹中。
参考资料
Field 3 Graph Neural Network
CV和NLP处理的都是结构化数据,而Graph和他们很不一样。此图非图像的图,回想离散数学中的“图”,这是一种非结构化的数据。现实世界许多数据都是非结构化的,例如社交网络、复杂的文件系统、分子结构等等,如何处理这类数据对我们实现产品精准推荐、分子结构预测等现实问题大有帮助。我们使用APP时收到的很多相关推荐,内容推送,广告投放等等很可能背后用到的都是图神经网络噢。
由于接下来的任务需要用到GPU,搭建环境的方式有两种(推荐后者):
- 如果你的电脑拥有独显,那么可以在自己的电脑上搭建一个深度学习所需的python环境(建议python=3.7),并且配置好显卡版本对应的CUDA(血泪教训😭)。可以使用anaconda搭建虚拟环境,深度学习框架墙裂建议使用Pytorch!!!
- 如果没有独显,那就需要借助各种人工开放平台啦,例如colab、矩池云(还有很多很多,随便使用哪一个啦,并没有要求) 可别被这些名字吓住噢,其实配置起来并不麻烦,不仅免费,而且速度可不是一般游戏本显卡能比的。掌握此类平台也会让你日后的研究工作更加便捷,一劳永逸,何乐而不为呢。
在进一步了解之前,可以先理解以下几个问题:
- 如何将现实生活中的数据抽象为图?例如引文网络、社交网络、分子结构……
- 我们是采用什么数据结构来完整存储一个图的信息的。
- 图神经网络的输入和输出是什么,它的作用是什么(类似普通的神经网络)
由于graph的非结构特性,如何高效提取其中的信息一直是个大问题。直到卷积神经网络在graph上运用成功,GCN正式成为主流(见参考资料3)。
我们常说深度学习,那么它的重点应该在于深,似乎网络层数越深,提取语义信息的能力越好。但实践发现并非如此,随着深度增加,神经网络的表现并不是单增的,甚至到达一定深度后效果越来越差。这是为什么呢?
我们回到Graph领域。作为深度学习在图领域的一种范式,GCN的网络深度越深越好吗?随着深度增加会不会出现什么问题?
为了回答这些问题,我们找到了一篇经典论文Tackling Over-Smoothing for General Graph Convolutional Networks.
论文中冗杂的数学证明和理论假设大可全部跳过,重点关注他提出的几个结论性论述:
- 过平滑是什么?为什么GCN加深会导致过平滑?
- 文中提出的DropEdge机制是如何工作的?能概述即可。
- TABLE 2 的实验结果说明了什么?(随深度增加,Original和DropEdge的accuracy变化情况)
题目要求
为了更好体会过平滑的影响,我们来复现论文中的一部分实验吧!
没有完全看懂这篇论文也不必担心,明白它大概在做什么便足够。
- 弄懂GCN里面的几个比较常见的数据集(论文中采用了三个引文网络数据集)。我们后续的实验在Cora数据集上开展,请尽量搞懂原始数据集里面的 ‘y’ , ‘ty’ , ‘ally’ , ‘x’ , ‘tx’ , ‘allx’ , ‘graph’ 是什么。(需要离散数学中图论的一点点知识)
-
基于GCN的节点分类. 理解GCN的框架和代码结构,这是下面实验的基础。
- 在Cora数据集上,网络采用Original GCN进行实验,通过修改GCN层数,类似TABLE 2中探究GCN深度对节点分类准确率的影响。
- 同样在Cora数据集上,探究加入DropEdge机制后,GCN深度对准确率的影响。
进阶要求
(不得不说这次AI模块的题量有点大,如果你成功做到了这已经非常不错了orz,以下部分为选做)
如果上述要求都轻松完成的话,不妨让我们做些进一步的探究:
- 解决过平滑问题的研究其实一直在进行,尝试调研还有哪些研究过平滑问题的paper,简述他们的method。
-
Simple and Deep Graph Convolutional Networks. 这篇文章提出的GCNII方法基本上解决了网络层数加深导致的过平滑问题。同样尝试在Cora数据集上复现它的实验,并简述它的模型结构。
提交内容
- 包含但不限于——对题目要求中各个问题回答的markdown文件,希望能看到你的思考。
- 复现论文实验的源代码。
- 实验结果的记录表格,并将你的结论记录在markdown文件中。
- 上述文件统一在一个名为Task2_3的文件夹中。
参考资料
TIPS
- 有很多功能强大的库函数,善于使用他们来减少代码量。
- 参考资料非常有用,同时也要善用搜索引擎,提高自己检索信息的能力。
- 整体代码量其实很小,重在自己的理解与思考,加油吧少年!
NOTICE
万事开头难,初看可能觉得满篇是不熟悉的名词,一旦入门就会发现并没有那么高深。努力学习,认真答题,我们会看到你的态度!
如果大一同学觉得题目有点难,欢迎私信我要些提示,不要放弃😭;
关于题目有任何疑问可以联系我:3175595221@qq.com;
同时也感谢郑嘉睦和杨欣瑞同学的友情参与,对Field2有问题的可以联系:2944334243@qq.com