此文主要分享了一个非IT专业本科生的故事,关于他在AI领域摸爬滚打的经历。
这里为了节约大家时间,请大家在阅读前看一下目录,从目录中选择需要的开始看起。
这篇文章针对的读者是完全不懂行的小白或者开始学习的同学,高手们你们说什么都是对的:p
我和AI之间的关系
为了给读者们提供些代入感,我想在文章的开头说说自己的故事,给读者一点学习AI的想法。
我是怎么和AI扯上关系的?
本人近年本科毕业。毕业于XX的XX大学,专业机电一体化,主修机器人专业。讲心里话,这个专业不是一个好专业。学的东西非常杂:机械工程、电子工程、软件工程、项目管理等,样样学,但是样样不精通,大三前基本没有IT相关的课程,不是CAD就是逻辑电路、工程力学等。涉及的编程课只限于Matlab、C、Assembly (是的你没有听错,这是一个比C更基础的编程语言,只限于嵌入式)。但是我们专业的导师都是机器人相关的领域,使用的不是python/c++,就是人工智能、控制系统,而且都是课程所涵盖不到的高阶用法。。。
所以为了保证成绩良好、也为了保证有较好的就业方向,不得已在大一转大二的假期中开始接触AI领域,直到现在。
我在上大学时和AI有关的主要经历包括但不限于:
-
在微软的Microsoft Accelerator Program中,以non-technical方向参与了机器学习对于不同红酒图片分类。
-
在学校假期的Research实习中,分析研究了医院大数据中糖尿病III期药物对病人不同时间的指标影响。
-
在实习经历中,研究了机器学习替代深度学习预测激光雷达point pillar的对象,并且设计了预标注模型。
-
在论文研究中,探讨了少样本在流行模型中的目标检测(针对植物病害),并且参与了创业比赛、一些农业方面的学术交流。
-
在学校最后一年的项目中,使用Yolov5设计人机围棋检测及算法应用。
-
在学校最后一年中使用Matlab完成computer vision项目(是的,为什么学校要用Matlab而不是其他语言,我也想知道)。
-
在实习中,参与了自动驾驶领域的算法工作。
这些经历虽然不算多,但是已经和AI有关系了吧。。。
AI和我的相杀
是的,不是相爱相杀,是相杀,没有爱。。。
先谈一点接触AI前对于它的误解,相信有同学和我有类似的经历(不感兴趣的可以直接跳过)。
没上大学前,我是非常排斥AI的,有如下几个原因:
- 家庭因素:因为家里有一个学IT的亲戚,明明对我们家极差无比,还一天到晚炫耀她读IT的儿子怎么怎么好、怎么怎么对AI了解。父亲甚至为了讨好他们不让我学习AI,认为会抢他们饭碗。我打心底希望AI马上没落。
- 生活因素:每天都是刷题的日子,而且理科男还被分到了文科班,大多数时间都被按着头皮被语文历史,没有时间接触AI,只是拿AI作为作文的素材,而且还是硬背的,和AI没有任何的感情。
- 内因:我对于机械感兴趣,其实我甚至对于编程也是非常讨厌的,认为总有一天人们会不得不过上没有电子产品的日子,所以觉得编程没意义。
很遗憾,天不随人愿,到目前为止还没有见到AI没落的趋势,甚至电动车正快速地替代者传统的汽车。。。。。。
回到正题。AI对于生活的影响越来越明显,在我生活中遇到了下列和AI有关的故事:
-
ChatGPT:作为目前全球最火的大语言模型,已经开始替代许多职业和功能,目前可以做到根据文字成图、输入关键字进行知识整理解答、自动生成代码等操作。
-
自动驾驶:配合着新能源快速地取代传统油车,像特斯拉、国内的蔚来、理想、比亚迪等自动驾驶。
-
电商及短视频:像京东、阿里这些电商,使用深度学习对客户进行商品预测、强化学习及其他算法设置。
AI领域包括什么?
AI领域可以包括很多东西。如果用百度搜索一下,就可以看到很多回答,就如下图所示:
但是在我的经历中,AI大致分为几个大类:机器学习、深度学习、大数据、及强化学习。下面将通过自身经历介绍接触这些领域的过程。
大数据
其实从专业的角度来说,大数据(Big Data)并不属于AI领域。因为大数据属于数据科学(Data Science),AI的大部分方向(像深度学习、机器学习等)属于计算机科学(computer science)或者是计算机视觉(computer vision)一类的。但是从客观角度来说,研究AI的人非常需要大数据,并且越来越多的领域开始将大数据和AI联系起来。
而且,从个人角度来说,这也是我真正接触AI领域的敲门砖。指导我进行大数据研究的导师也带我走进机器学习。
回到正题,什么是大数据?
许多领域都有所谓的"大数据"。比如通信领域,认为1M的数据就是"大数据"。但是这里讲的大数据,更多的是指需要使用到云端的、或者需要建立数据库的大数据。
如何使用大数据?
平常可以通过SQL、MongoDB等编程语言使用到它。对于用户端,更多地操作是提取数据做 数据分析 ,而不是输入数据。
如何学习大数据?
我主要讲一下目前接触最多的SQL 吧。SQL的话我之前使用过**PostgreSQL和 BigQuery**。这两个在使用SQL的语法上基本没有差别,区别更多地在于大数据的数据量上,BigQuery因为是使用web形式,使用的是Google的云端,可以支持的数据量更大,但是可能存在需要付费的情况,如果没有相关机构支持的话可能有点问题。
然后是关于SQL的语法。PostgreSQL很贴心地提供了一个SQL 的documentation,只要下了就可以从本地打开,如下图所示。
从上面也可以看出SQL的套路,就是遵循下面的结构,只不过在使用时更复杂。
vbnet
SELECT ${contents}
FROM ${SOURCE}
WHERE ${conditions}
ORDER BY ${another_condition};
其中${contents}非常可能是复数个,所以这里就需要用其他语言如PHP等提取需要的内容title。
对于想找点实战例子的同学,这里我提供一个牛客网上关于SQL的教程:
上面有编程用的编辑版和问题,使用时也有答案校对。
而对于MongoDB这类的编程语言,使用的就是NOSQL(Not Only)方法。平常SQL所储存的数据都是放在.data这类的文件里面,使用起来非常麻烦,都是NOSQL也可以使用.json等这类操作相对简单的文件格式,所以更受欢迎。
大数据提取后怎么办?
这里提供一个SQL和Python对接的方法,使用的是BigQuery和Python的Panda。接口代码如下。
perl
# Import google big query from panda
from pandas.io import gbq
# Import data
data_frame = gbq.read_gbq("SELECT CONTEXT FROM `SOURCE` ",project_id = "XXX")
其中,gbq.read_gbq里面引用SQL完整语句,project_id就是数据集名字,输入后可以生成panda形式的data frame,然后我们就可以愉快地操作了:)。
除了编程类的大数据还有云端
除了上文提到的编程类的大数据(主要还是像CSV这类的简单但量大的数据),还有像图片这种不容易使用编程语言存放的数据集,可以使用华为云、roboflow等储存并提取。
机器学习
机器学习和深度学习的本质就是fitting,只不过次元不同。这里我主要讲的是Image Classification相关的。
在看后面的内容前我先总结一下机器学习比较明显的特点:
-
所用数据量/资源较小(这里我理解为训练的数据量,而非测试的)。
-
强调线性、较为简单的问题。
-
可解释性强,具体体现在layer上。
机器学习更强调线性的问题,就像下面的示意图,针对的是这种界限较为明了、可以简单区分的特征。
常见区分算法的有如下几种:
-
k-Nearest Neighbours (KNN)
-
Decision Trees
-
Support Vector Machines (SVMs)
简易图解区分算法
篇幅有限,我就通过几个图来解释吧。
KNN就是通过设置K指(目前训练的对象周围有K个以上?以下?)来分割界限。K是我们定的。
Decision Trees就是用二叉树的方法输入layer来区分。
SVM就是一个wX-b=0的关系式,w是变量(layer)X的参数,b是常量。
也有X^n次方的:
实际项目中我感觉Decision Tree其实是效果最好的。
使用难点 --- 如何设计layer?
可以考虑下列思路:
-
切割图像做出layer:把图像切割成垂直/横向的上中下部分,提取每一部分的精华做layer。
-
使用统计的方法改造layer:histogram、standard deviation、percetile等方法。
-
使用深度学习的convloution方法计算周围一圈的平均值或者最大值是多少。
-
加filter:如noise, blur, rotation等操作,但是作用是数据增强。
使用难点 --- 如何测试?
最好的测试方法是Cross Validation,测试参数包括True Positive、True Negative、False Positive、False Negative、Percision、Accuracy等。
使用难点 --- 有什么系统化的教程吗?
如果有同学还想对机器学习有更深入的了解但是苦于没有资源,可以尝试一下下面的教程。
深度学习
几乎可以说,很少有人能够完整地用人类语言解释为什么深度学习能够从图片等数据输入中提取这么多特征,大部分时间都是通过测试来看这些black box的性能。
深度学习是什么?就是通过卷积的方式来提取不固定的特征,也就是当前pixel和周围的关系,这层关系决定了目标对象潜在的特征潜力,这是和机器学习有所区分的,其他的无外乎就是使用非常多的数据来训练参数;以及可解释性非常差。
作为兵家必争之地的深度学习,目前在学习上存在着几个瓶颈:
-
学历瓶颈:国内大部分都在研究生、或者IT专业最后一年研究,而且都是针对最基础的CNN、RNN这类的原理来说,很少具备实战性。
-
经验瓶颈:最前沿的知识都是靠项目或者进一步的学术研究了解到的,对于菜鸟们其实蛮有困难的。
-
专家与菜鸟的隔阂:正所谓教会徒弟饿死师傅,在职场/学术领域中,许多人把跑通深度学习的repo作为自己学会算法的标准,并且以此刚愎自用、欺负新人,这是一个非常不好但是现实的情况;而且他们明明东西不多还喜欢藏着,也萌发出了许多的野路子,实属可笑。
-
菜鸟找人:会有什么都不懂的HR/技术顾问问一些深度学习背书的题目来侮辱人,遇到这种企业(尤其是QC行业中搞CS的和搞KY的),求职者可以直接关掉了,背出来的知识没有什么用处,只是用来侮辱你、贬低你身价的。即使装傻装不会也要想办法拒绝;剽别人方案的人见多了就知道了。
考虑到会有无数的文章讨论深度学习,并且会有一批人否定别人的东西(不管它对不对),这里就不展开了,
包括关于tensoRT、 DLA 、DriveOS、
cuda ****C++ (会有不太懂的同行把这个和cuda编程弄混,cuda编程包括cuda c++ & python,像cuda python更多地是用 pytorch , tensorflow这种的,如果连这都搞混怕不是用 CPU 训练模型的吧。。。) ,
这里我只提供点实用的材料,方便 深度学习 普及大众。
使用难点 --- 如何学习?
首先得有一个Nvidia带GPU的硬件,可以使用下面的方法在terminal检查。
nvidia-smi
注意:只有Nvidia的是可以的的,其他GPU的目前测过是不能用做深度学习的。
可以学习一下李沐的课程,在业内许多人在学习,可以对深度学习有一个较为通透的概念。
使用难点 --- 如何上手?
这里我推荐OpenMMLab。从市面上大部分的深度学习项目来看,OpenMMLab几乎起到了垄断的地位,因为基本上90%的项目都需要openMMLab的安装包和checkpoints。另外10%包括YOLOv5、YOLOv8的作者ultralytics,但是后者去年也和OpenMMLab进行过YOLO算法会议。
可以根据下列资料学习:
-
微调相关 --- InternLM。
-
自定义模型评测 --- OpenCompass。
-
目标检测 --- MMDetection、MMYOLO。
-
BEV算法(自动驾驶)--- MMDetection3D。
使用难点 --- 如何看模型?
可以使用netron来看。安装方式非常简单:
pip3 install netron
强化学习 --- 局限性
强化学习我是在control system和Optimisation这类的课程中接触的,所以主旨思想就是设计一个和机器学习/深度学习结合的、与外界环境所联系的控制系统。印象中像我们机器人专业可能会比较多的涉及到,但是其他领域不多,或者说刚刚开始。
关于这个领域的局限性包括如下几条:
- 论文多余开源:你可以看到许多关于强化学习的论文和教学视频,但是很难看到有关的开源项目。
- 目前Matlab上有相应的Simulink教程,但是除此之外很少看到有不错的教程。
AI菜鸟需要克服的困难 --- 极快的知识迭代
AI是个知识更新迭代非常快的领域。举个自己的例子吧。大四那年毕设论文选题材时,导师给我安利了少样本学习作为一个热门方向,但是在我毕业论文答辩前后(也就是短短1年不到时),少样本已经被许多机构研究,甚至连喵喵Lab都出了专门服务于少样本研究的MMFewShot,给我本不充裕的研究雪上加霜。。。接着,刚刚毕业还在经历实习转正时,ChatGPT问世了,紧接着多模态、大语言模型等新名词等映入眼帘,之前的少样本学习已经不知道到哪里去了。。。。。
所以AI领域有一个避免不了的问题:你跟得上新的知识吗?
而且对于刚入门、或者说还在AI领域外观望的人来说可能需要短时间内,从零开始学习这些知识。但明眼人都看得出来,这很难!!!这就会造成越来越多的人不愿意真正学习AI,而是粗糙地使用AI的成果。所以很容易就看到一些人高谈阔论地跟你讲AI,但详谈之后发现都是皮毛,有些人甚至连基础都没学完。。。。。。
所以,对于我们这些菜鸟们,该怎么做?
编程基础,重中之重
虽然AI领域不断地有弄潮儿出现,但是归根结底都有一个共同点:他们的创新主要体现在数学模型上,对于编程而言大多还是停留在Python和 C++ 上。
所以从另一个角度来说,只要编程底子够好,总有跟得上的一天。
而且从实际情况着手,学习模型时,大部分难点都在编译、运行上:不是这个包版本不对、就是脚本运行有问题,像什么路径不对,GPU设置不对,改算子时尺寸错了等等。。。都是一些最基础的问题。
再者说,就算哪一天不再从事这一行了,如果继续做和IT相关的也离不开编程。之前身边有很多做算法的同事,离开算法部门做其他工作时力不从心,很大原因在于平常编程底子不稳,一换领域那些之前掩盖的问题就都出来了。
所以,还是基础最重要。
多看看外面的世界
除了前文讲到的一些学习资料,还有其他和AI有关的机会,包括但不限于:
-
参加AI相关的比赛。
-
参加AI有关的会议、产品推广活动。
-
参与AI有关的课程、多学习开源的模型。
下面将提供一些资源给大家。
参加AI相关的比赛
通过微信、或者一些大厂的官网可以看到很多比赛。下面给几个最近有的活动(到底适不适合请自行斟酌):
-
Kaggle比赛。
-
Nvidia Hackathon相关的比赛。
需要注意的是,因为个人时间精力有限,最好选择时间较短、难度不要太大 的。如果是团体比赛就更好了,可以拓展人脉。
参加AI有关的会议、产品推广活动
关于AI的会议不外乎于两种形态:学术研究,产品推广。
产品推广就看英伟达系列的就行。
学术研究可以跟进一下最近OpenMMLab的大语言模型开放麦。
参与AI有关的课程、多学习开源的模型
下面提供几个现成的资源。
- 英伟达系列课程,b站上可以看。
- OpenMMLab和交大的课程 --- 这个仔细地讲了如何使用OpenMMLab的repo以及改测试方法、改数据集、该backbone model等方法,我觉得是最实用的一类。
- 之前在文章中提到的OpenMMLab相关的开源,非常值得一学,但是最好考虑一下自己的cuda。