AI通识:机器学习和运算
配套视频课程:www.bilibili.com/video/BV1Rx…
一、人工智能简介
1、什么是人工智能
人工智能是一种 模拟人类智能的技术,它可以让计算机像人类一样 推理、规划、学习、解决问题、抽象思考、理解复杂概念。
- 推理:今天—>没有太阳, 没有太阳—>阴天,今天—>阴天
- 规划:是指通过思考制定目标、达成目标的能力,比如,设计城市规划、制定公司发展计划、规划旅游路线等等
- 学习:是指通过接收信息、经验和知识来提升自己的能力,比如,学会开车、学会游泳、练习打羽毛球获得世界冠军等等
2、人工智能发展
3、人工智能发展三要素
- 数据:用于训练AI
- 算法:用于提升效率和准确率
- 算力:用于提升速度
CPU(中央处理器)和 GPU(图形处理器)
(1)结构:CPU有几个处理器核心,每个核心可以处理多种任务;而GPU有数千个小型处理器核心,可用于高度并行的计算。
(2)用途:CPU主要用于处理通用计算任务,如浏览网页、运行办公软件等。而GPU主要用于处理专用计算任务,如图像处理、科学计算等。
(3)性能:GPU在执行大规模并行计算任务时比CPU更快,因为它可以同时处理多个数据流;但是在单线程计算和通用计算任务方面,CPU更具优势。
4、人工智能、机器学习和深度学习
-
人工智能、机器学习、深度学习的关系
- 机器学习是人工智能的一个实现途径
- 深度学习是机器学习的一个方法发展而来
5、人工智能主要分支
感知、认知与行动是人工智能的三个关键能力,在这里我们将根据这些能力/应用对这三个技术领域进行介绍:
- 计算机视觉(CV):图像采集、图像处理、图像提取、图像推理、图像生成
- 自然语言处理(NLP),含语音识别:让计算机处理、理解、生成文本的技术,语音处理部分主要包含语音识别和语音生成
- 机器人(Robot):研究机器人的设计、制造、运作和应用,以及控制它们的计算机系统、传感反馈和信息处理
二、机器学习
1、机器学习定义
机器学习是研究如何 让计算机可以像人一样进行学习 的技术、方法和理论。也就是像人可以从历史经验中,获取新的知识和技能。理论一点的说就是,让计算机对大量历史数据进行分析,提取数据中的规律,进而利用规律对未知数据进行推断。
2、机器学习主要流程
机器学习的工作流程通常可以分为以下几个步骤:
(1)数据收集:收集并整理有关问题的数据,例如图像、文本、表格等等。
(2)数据预处理:对数据进行清洗、归一化、特征提取等操作,以便于后续的建模和分析。
(3)模型选择:选择适合问题的模型,例如线性回归、决策树、神经网络等等。
(4)模型训练:使用已有数据对模型进行训练,以便于模型能够学习数据之间的关系。
(5)模型评估:使用测试数据对模型进行评估,以衡量模型的性能和准确性。
(6)模型优化:根据模型评估的结果,对模型进行优化,例如调整模型超参数、增加训练数据等等。
(7)模型部署和应用:将训练好的模型部署为服务,应用到实际问题中,例如进行图像分类、文本分类、预测等等。
3、机器学习算法分类
根据 数据集和训练方式的不同,机器学习算法一般可以分为:
- 监督学习,Supervised Learning
- 无监督学习,Unsupervised Learning
- 强化学习,Reinforcement Learning
| 类别 | 监督学习 | 无监督学习 | 强化学习 |
|---|---|---|---|
| 训练数据 | 标记的输入数据 | 未标记的输入数据 | 无特定的训练数据,通过与环境的交互获得反馈 |
| 学习目标 | 预测目标变量,例如分类或回归问题 | 发现数据内在的结构和模式,例如聚类和降维 | 学习一个策略,以最大化从环境中获得的奖励 |
| 反馈 | 明确的反馈(例如,错误的预测和实际的输出) | 无明确反馈 | 递延反馈,即动作的结果可能在未来某个时刻才体现 |
| 示例算法 | 决策树,逻辑回归,神经网络 | K-means聚类,主成分分析(PCA) | Q-Learning,Deep Q Network(DQN) |
| 应用领域 | 图像识别,语音识别,预测模型 | 客户分群,特征提取,异常检测 | 游戏AI,自动驾驶,机器人控制 |
4、欠拟合vs过拟合
模型评估用于评价训练好的的模型的表现效果,其表现效果大致可以分为3类:过拟合、欠拟合、拟合。
在训练过程中,你可能会遇到如下问题:训练数据训练的很好啊,误差也不大,但在测试集上面效果却不好,这可能就出现了拟合问题。
(1) 欠拟合 under-fitting
因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。
欠拟合:模型学习的太过粗糙,学习到的特征太少,没有把训练集中的样本数据特征关系学出来。
(2) 过拟合 over-fitting
机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。
过拟合:机器学习模型在训练样本中表现得过于优越,学习到了一些噪音规律,导致在测试数据集中表现不佳。
三、编码与运算
在AI领域,无论是传统AI,还是大模型,其本质就是对计算机可以支持的数据进行数值化处理。目前计算机能够处理的数据主要可以分为:数字、文字、图片、音频、视频,而无论哪一种数据,最终都需要转换为计算机能够进行运算的 数值。
1、为什么必须要数值
在统计学和数学领域,最简单的预测公式为一元线性回归:y=wx+b,既根据历史数据的x和y,来拟合出一个相对来说比较均衡的 w 和 b 的参数(也叫权重),比如 拟合出来为 y = 5x + 3,则要进行预测,就可以根据 x 的值,来预测 y,比如如果 x的值为 10,则 y 的预测结果为 53。是AI领域最基础最简单的一个公式。
上述图中,红点对应的就是 X 和 Y 的分布,这叫训练样本 (有 x 和 y 的值),进而拟合出差异最小的 w 和 b 的值,于是得到一条直线函数:y = 0.66x + 0.17,于是,根据 x 的值就可以预测 y 的值,如下图所示:
所以,在计算机或者AI的眼里,它并不认识文字,图片,语音这些东西,它更不知道哪张图片好看,哪张图片难看,它的眼里,只有数字。所有的AI推理,均是一种基于 输入值 的预测值,它可能简单到只有 y = wx + b (一元线性回归),也可能复杂到 (多元线性回归),当然也可以是非线性回归预测。
(1)数字如何运算
比如销售额,股票价格,利润,气象数据,成绩等等,一般针对数字来说,需要进行归一化处理,让数据最终归于0~1或-1~1的区间,比如以下是最简单的归一化公式(可以归一化到 0 - 1 区间):
也可以将上述公式的分子中,minA 换成 meanX(即集合的平均值),则可以得到一个 -1 到 1的范围。
(2)文字如何运算
文字本身不是数字,计算机无法直接进行运算,则需要将其分词处理后转换为词向量,才可以进行关联运算。
(3)图片如何运算
图片本身在计算机内部存储的就是数字(RGB像素编码,0-255的颜色值),所以只需要做归一化处理即可,确定范围 / 最大值,不确定范围则可以使用softmax进行归一化处理,但是图像颜色值都是 0-255的范围,都是这届 / 255即可实现归一化。
(4)音频与视频:
音频在计算机内部是声道频率的采样数据,本身就是数字,所以处理起来并不复杂。(请看示例)
视频是音频和图片,再加时间帧的结合,所以编码方式是三者的共同处理,所以这里也提出来一个新的数据类型:时序数据
2、文字编码与词向量
(1)、查看已经训练好的模型的词向量
比如以下LLama3大模型里面的文字编码格式(称为Token),这样的编号可以进行运算吗?
1. ` "RefPtr": 77729,`
2. ` ".globalData": 77730,`
3. ` "grave": 77731,`
4. ` "imesteps": 77732,`
5. ` "foundland": 77733,`
6. ` "Salir": 77734,`
7. ` "artists": 77735,`
8. ` "ĠcreateAction": 77736,`
9. ` "ĠSanto": 77737,`
10. ` "ĠнеÑĤ": 77738,`
11. ` "ĉĉĉĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ": 77739,`
12. ` "-song": 77740,`
13. ` "Ġnuisance": 77741,`
14. ` "Ġimpover": 77742,`
15. ` "_)čĊ": 77743,`
16. ` "Ġcrowdfunding": 77744,`
17. ` "Ġtimp": 77745,`
18. ` "Pictures": 77746,`
19. ` "Ġlodging": 77747,`
答案是:不能,所以不能说把文字转成了一个数字编号就能参与运算了,这是不行的。词向量才能进行运算。那么什么叫词向量:
人为添加一个维度标识,只是为了便于大家理解,词向量的训练和生成,不需要在意具体是什么标识,只要看得到一堆数值就行了。
使用Python的word2vec(词向量)库给大家进行一下可视化展示,我的电脑上有很多已经训练好的词向量库(基于大量的中英文语料库进行训练,得到的一个库:
现在我们挑选大小相对较小的hanlp-wiki-vec-zh.txt来打开看看,大概长这样(有大约300个数字,也就意味着是300维空间):
词向量空间在计算机内部是300维空间(没错,就是xyz的三维,对应的三百维),大约长成这个样子:
图片来源: zhuanlan.zhihu.com/p/48167933?…
事实上,人只能看得懂三维空间的数据,上图只可意会,无法真实表达300维空间的样子,大家意会其概念就行。比如我们在二维坐标系中,通过 [x, y] 两个坐标点就可以唯一确定一个点的位置,在三维坐标系中则需要通过 [x, y, z] 三个坐标点就可以唯一确定一个点的位置,以此类推,在300维坐标系统中,则需要 [x1, x2, x3, x4, x5, ……. x300] 一共300个坐标点,是不是就可以确定一个唯一点了?
上图的意思就是 “金融学” 这个词在向量空间中的坐标,先不管是什么,大家是不是能够直观的感受到,中文被转换成了数字。那么我们也可以使用Python来编程实现这个过程:
from gensim.models.keyedvectors import KeyedVectors
word_vectors = KeyedVectors.load_word2vec_format(r'G:\Other\HanLP\data\hanlp-wiki-vec-zh.txt', binary=False)
print(word_vectors['金融学'])
最终也同样可以获得上述结果。接下来我们可以来尝试一下,找到与”金融学“最相似(距离最近)的一个词:
# 找到5个与金融学距离最近的词
similar = word_vectors.most_similar(positive = ['金融学'], topn = 5)
print(similar)
输出结果为:
[('会计学', 0.6112884283065796), ('经济学', 0.5791643261909485), ('管理学', 0.522872269153595), ('管理科学', 0.4868156909942627), ('商学', 0.477636456489563)]
当然,我们也可以查看”金融学“与”管理学“和与”大象“之间的距离
# 查看 金融学 与 管理学 和与 大象 之间的距离
distance = word_vectors.similarity("金融学", "管理学")
print(distance)
distance = word_vectors.similarity("金融学", "大象")
print(distance)
输出结果为:
0.52287227
0.013983104
(2)训练自已的词向量
目前训练词向量比较主流的方案是:FastText(Facebook开源)和Word2Vec(Google开源),对于中文语料库,则需要先进行分词处理才能开始训练,训练词向量主要使用Skip-Gram和CBOW两种模型,在第三阶段NLP部分将详细介绍。
import jieba
from gensim.models import Word2Vec
# 定义语料
content = [
"长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称6300公里。流域总面积一百八十余万平方公里,年平均入海水量约九千六百余亿立方米。以干流长度和入海水量论,长江均居世界第三位。",
"黄河,中国古代也称河,发源于中华人民共和国青海省巴颜喀拉山脉,流经青海、四川、甘肃、宁夏、内蒙古、陕西、山西、河南、山东9个省区,最后于山东省东营垦利县注入渤海。干流河道全长5464千米,仅次于长江,为中国第二长河。黄河还是世界第五长河。",
"黄河,是中华民族的母亲河。作为中华文明的发祥地,维系炎黄子孙的血脉.是中华民族民族精神与民族情感的象征。",
"黄河被称为中华文明的母亲河。公元前2000多年华夏族在黄河领域的中原地区形成、繁衍。",
"在兰州的“黄河第一桥”内蒙古托克托县河口镇以上的黄河河段为黄河上游。",
"黄河上游根据河道特性的不同,又可分为河源段、峡谷段和冲积平原三部分。 ",
"黄河,是中华民族的母亲河,也是非常重要的交通要塞。"
]
# 结巴分词
seg = [jieba.lcut(sentence) for sentence in content]
# 训练模型
model = Word2Vec(seg, sg=1, window=5, min_count=2, negative=1, sample=0.001, hs=1, workers=4)
model.save("./wordvec2.bin")
上述训练的过程还存在很多需要优化的地方,比如中英文语境中有很多词是无意义的,比如about,an, do, did, etc, 的,嗯,呵,嘛,嘿嘿,在于,尚且等待,此类词称为停用词,在训练之前应将其排除。
词向量训练完成后,也可以按照上述类似的方案来查看词向量的值,代码如下:
# 加载模型
model = Word2Vec.load("./word2vec.bin")
# 查看黄河的词向量
river = model.wv.get_vector('黄河')
print(river)
# 判断相似度
sim = model.wv.similarity("黄河", "母亲河")
print(sim)
# 预测最接近的词
most_similar = model.wv.most_similar(positive=["黄河", "母亲河"], negative=["长江"])
print(most_similar)
3、计算机视觉
计算机视觉是一种⽤摄像机和电脑及其他相关设备,对⽣物视觉的模拟。它的主要任务让计算机理解图⽚或者视频中的内容,就像⼈类和许多其他⽣物每天所做的那样。可将其分为三⼤经典任务:图像分类、⽬标检测、图像分割
- 图像分类(Classification):是指将图像结构化为某⼀类别的信息,⽤事先确定好的类别(category)来描述图⽚。
- ⽬标检测(Detection):分类任务关⼼整体,给出的是整张图⽚的内容描述,⽽检测则关注特定的物体⽬标,要求同时获得这⼀⽬标的类别信息和位置信息(classification + localization)。
- 图像分割(Segmentation):分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适⽤于理解要求较⾼的场景,如⽆⼈驾驶中对道路和⾮道路的分割。
当然,随着大模型的兴起,图像描述和图像生成也可以作为计算机视觉的一个新的领域和分支来考虑。
那么针对一张图片,计算机内部又是如何将其变成数字的呢?我们可以使用OpenCV打开一张图片,就可以看到RGB的色彩像素值了:
import cv2
image = cv2.imread("./woniu_run.jpg")
# 每个像素点的RGB值(红绿蓝),范围是0-255,0代表黑色,255代表白色
print(image)
# 我们也可以打印某一个具体的像素点的值
print(image[0][9]) # 代表第(1,10)这个像素点的颜色值
输出的结果类似于:
[[[107 122 141]
[108 123 142]
[118 133 152]
...
[198 196 196]
[206 204 204]
[221 219 219]]]
[114 128 147] # 该像素点的颜色为 (114, 128 ,147),代表红色为147, 绿色为128,蓝色为114 (默认为BGR格式打开)
当然,我们也可以将图片转换为RGB打开,使用以下代码即可转换完成(但是这个过程不影响AI的运算),所以不是重点
# 将颜色值转换为RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
print(image_rgb[0][9])
重点是,为了减少运算,因为计算机识别图像不需要靠丰富的颜色,而是轮廓和距离等信息,所以通常将彩色图片转换为灰度图(单通道颜色)或进行二值化处理(颜色只有黑和白,即:只有0和255两种颜色),这样可以减少大量的运算量,使用以下代码可以处理灰度化和二值化:
(1)灰度化(颜色不区分RGB,而是在0-255之间取一个值),灰度化使用以下公式完成:
Gray=0.299×R+0.587×G+0.114×*B
import cv2
image = cv2.imread("./woniu_run.jpg")
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
print(image_gray[0][9]) # 某个像素点的颜色变成了 126
# 显示灰度图
cv2.imshow("Gray", image_gray)
cv2.waitKey(0)
(2)二值化处理
灰度图就是传统意义上的黑白照片,但是这样的运算量还是过多,因为像素值完全分布在0-255之间,特征并不明显,所以通常在进行计算机识别时,还会进一步,转换为纯粹的黑和白两种颜色:
import cv2
image = cv2.imread("./woniu_run.jpg")
# 要二值化,先灰度化,将三通道变成单通道
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 二值化时设定阈值为128,即小于128的变成0,黑色,大于128的变成255,白色
retval, image_thr = cv2.threshold(image_gray, 128, 255, cv2.THRESH_BINARY)
print(image_thr[0]) # 查看某一排像素的颜色值
# 显示灰度图
cv2.imshow("Gray", image_thr)
cv2.waitKey(0)
二值后,一个像素点的颜色,不仅从RGB的三种变成了一种,同时每一个颜色的聚会只有0和255两种,没有中间灰度,这样在计算距离或相似度时,反差就更加强烈,更便于体现差别:
[ 0 0 255 255 255 0 0 0 0 0 255 255 255 0 255 255 255 255 0 0 255 0 255 255 255 255 0 0 0 255 255 255 255 255 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 255 255 255 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ]
机器学习的六个核心算法:mp.weixin.qq.com/s/o_PPJESRF…