人工智能 学习笔记
本文记录了学习人工智能的心得笔记和参考教程,并包含一些编程实践。仅能帮助读者快速理解人工智能解决问题的思路、过程,其过程中存在的多种方法的讨论、优化还需要结合其他教材进行深入挖掘。
建议读者在学习人工智能理论知识时至少学会微积分和线性代数(非必要)相关知识;在实践演练时至少掌握一门编程语言的使用
注:线性代数可参考教程[P12-P17 中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili
思维导图
该思维导图展示人工智能的知识网络,并说明学习顺序
其中带数字序号部分为本文涉及内容
graph LR 人工智能AI-->1.机器学习-->2.线性回归-->3.逻辑回归-->决策树-->支持向量机 人工智能AI-->深度学习-->神经网络NN 人工智能AI-->强化学习 神经网络NN-->深度神经网络DNN-->|算法|4.反向传播算法BP 神经网络NN-->5.卷积神经网络CNN-->|处理问题|6.图像处理CV 神经网络NN-->循环/递归神经网络RNN 循环/递归神经网络RNN-->长短期记忆LSTM 循环/递归神经网络RNN-->门控循环神经网络GRU 循环/递归神经网络RNN-->|处理问题|自然语言处理NLP 神经网络NN-->生成对抗网络GAN 神经网络NN-->7.迁移学习 神经网络NN-->注意力模型
机器学习
参考教程:P2-P4 [中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili
学习目标:理解人工智能的大体思路,需要处理的问题和分类
人工智能解决问题的一般步骤
人工智能解决问题需要将实际问题转化为可计算的数学问题,并使用编程来处理数学问题求解
数学问题求解:
简单来说,解决一般数学问题时,我们需要一些输入如$x_1,x_2,…$等,并希望知道这些输入的结果如$y$。求解这个答案的过程需要通过我们进行分析并得出的函数$f(x_1,x_2,…)$来计算。
graph LR 输入(x1,x2,x3,...)-->函数("f(x1,x2,x3,...)")-->输出(y)
实际问题求解:
为了将实际问题转化为计算机能理解的数学问题,我们要找到实际问题的输入、输出和函数,并将这些内容转化为数学描述,并在计算过后再次转化为实际问题的答案。
举例:
我们可能想要计算机能识别一系列动物照片中的动物种类
那么我们获得的照片,即为输入量$x$;得到的动物种类,即为输出量$y$;识别种类的过程,即为函数$f$。
问题的转化
显然易见,将实际问题转化为数学问题存在一些问题
我们需要将实际问题中的量转化为数学变量,例如图片、声音的转化;并希望将问题的答案转化为计算机能识别的内容。
在处理一般数学问题或简单物理问题、生活问题时,我们能简单地分析出处理问题的方法,即函数。但在处理例如自动驾驶、图像识别等复杂问题时,我们几乎不能推算出这些问题的解答函数。
而人工智能所需要解决的事情,就是将实际问题的量通过一些方法量化为数学变量,并寻找解答函数的过程
举例:
- 我们可能想要将实际问题的所见所闻记录,并量化到计算机中,使得计算机能识别。我们通过学习可以知道,人眼所见的可以通过照片的形式,以数字矩阵存储在计算机中,这便是一种变量的转化。
- 我们可能想要将动物分类的目标,如鸡、鸭、狗转化为计算机能识别的数学符号。假设在此问题中只有这三个分类,我们可以构造一个向量$y$,当$y=(1,0,0)$时定义为鸡,$y=(0,1,0)$时定义为鸭,$y=(0,0,1)$时定义为狗。或者我们定义数字1为鸡,2为鸭,3为狗。
综上,人工智能解决实际问题,首先需要将实际问题的输入输出量化,其次需要从庞大的输入量中提取出与问题相关的内容(即特征量),然后通过今后学到的方法使得人工智能寻找到一个合适的函数作为解答的方法,最后我们通过获得到的方法解决问题并将量化的答案再次转化为实际问题的结果。
graph LR 实际问题-->量化为数学变量-->提取特征量-->获得函数-->得到问题的解
机器学习面对的问题分类
在分析实际问题时,我们发现这些问题可以分为两大类。第一类问题,例如将一系列动物照片识别出分别属于鸡或鸭或狗,在这个问题中我们知道问题的结果是鸡、鸭、狗,我们可以先获取一些“标准答案”,交给计算机进行学习,再给出一些样本分析结果;而第二类问题,例如将一系列动物照片分类,在这个问题中我们不关心动物分类后究竟属于什么物种,我们只关心将动物划分开,这个问题的动物种类数量可能很多,我们难以给出“标准答案”去学习。
我们将第一类问题定义为监督学习,第二类问题定义为无监督学习,这是机器学习通常要面对的两大类问题。
graph LR 样例步骤-->监督学习-->已知特征量 样例步骤-->无监督学习-->特征量未知-->搜索引擎新闻分类--->聚类算法 已知特征量-->1["通过特征量(时间)预测房价"] 已知特征量-->2["通过特征量(肿瘤大小)判断乳腺癌"] 1-->线性数据参考-->回归问题 2-->离散数据参考-->分类问题
线性回归+逻辑回归
参考教程:[中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili
单变量线性回归:P5-P11
(可选)多元线性回归:P18-P22
(可选)线性回归的正规方程解:P18-P22
逻辑回归/分类问题:P32-38
学习目标:以线性回归起始,学会数学推导和矩阵形式(可选),重点掌握其中的专有名词和梯度下降法
样例
问题描述:通过
房子尺寸
预测房价
给定数据:
设
房子尺寸
为x
,房价
为y
共m条数据 房子尺寸(x) 房价 (y) 1 2104 460 2 1416 232 3 1534 315 … … …
定义
给定的数据称为
训练集
每一组数据称为
训练样本
房子尺寸$(x)$是
输入变量
,称为特征
;房价 $(y)$是输出变量
或目标变量
第
i
组训练样本表示为:$(x^{(i)},y^{(i)})$将$x$转化为预测房价函数称为
假设函数
,表示为$h_\theta(x)=\theta_0+\theta_1x$预测房价的准确度称作
平方误差代价函数
,其值越小越准确,表示为:
$$
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)}-y^{(i)})^2
$$
求解步骤:
获取训练集
根据数据图像设定假设函数(样例为线性函数)
通过数据散点图,观察数据的单调性、形状,可以将假设函数设定为线性函数、二次函数、反比例函数、幂函数等等
多项式
- 根据训练集选择合适的模型,例如:$y=\theta_0+\theta_1x+\theta_2x^2+\theta_3\sqrt{x}+…$
- 根据模型定义新特征,例如:$x_1=x,x_2=x^2,x_3=\sqrt{x},…$
- 将模型代入新特征,例如:$y=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+…$
- 将多项式变成多元线性回归
求解假设函数的未知项,使得函数最接近样本数据
使用代价函数来判断函数是否接近样本数据,其值越小越好。
即,问题变为求解当此函数获得最小值时未知项的值
- 易证,代价函数始终存在最小值,即此函数必然存在解。通过求解代价函数必然可以得到问题的答案
方法为:梯度下降法、正规方程解
梯度下降法
学习目标:能够自己推导数学公式以及这么做的理由
目标:获得当$J(\theta_0,\theta_1,…)$取到最小值时对应的$\theta_0,\theta_1,…$值
定义:$\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1,…)$
:=
符号表示赋值α
表示学习率求解分析:
假设一个问题的代价函数如图所示,将此代价函数看作一连串的山脉,我们需要到达山脉的最低端
假设山脉上有一些人,这些人将会走到山脉低端,并取得最小值
通过图可以看出,人可以根据当前的函数斜率来判断往哪个方向行走会使得$y$的值下降,给人一定的步长,$y$越来越小,即人越走越低。
- 人的步长影响寻找到的山底位置。比较$人$和$人_2$的走向,$人_2$会由于步长过长,在第二次到第三次跨越时,会错过A点,从而比人更远离最低处
- 人的步长影响寻找到山底的时间。比较$人$和$人_1$的走向,$人_1$的步长较小,他到达C点需要走更多的回合
- 人的初始位置影响寻找到的山底位置。比较$人$和$人_1$的走向,$人_1$虽然往C点方向逐渐下降,但是他无法看到A点在更低处(由于视野被B、D遮挡)
综上三点,我们在求解函数最小值时,要充分考虑点的初始位置和步长
此处的步长即为学习率
当问题是三维或多维度函数时,参考一个三维函数下的等高线地势图,引入梯度概念。在二维函数下的切线,即为三维函数下的梯度,以二维同样的方式向山坡下走,直至最低
迭代求解:
$$
\begin{align}
&(1) temp0:=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1,…) \\
&(2) temp1:=\theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1,…) \\
&(…) \\
&(3) \theta_0:=temp0 \\
&(4) \theta_1:=temp1 \\
&(…)\\
\end{align}
$$注意:需要temp寄存函数的值。例如$\theta_0$值改变后,temp1中的$J(\theta_0,\theta_1)$会受到影响
推导:
$\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{\partial}{\partial\theta_0}\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)}-y^{(i)})^2=\frac{\partial}{\partial\theta_0}\frac{1}{2m}\sum_{i=1}^m(\theta_0+\theta_1x^{(i)}-y^{(i)})^2$
$j=0:\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}-y^{(i)})^2$
$j=1:\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)=\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}-y^{(i)})^2*x^{(i)}$
特征缩放:将不同特征的值缩放到一个相近的范围-1≤x
i≤1内,使得梯度下降收敛更快- 均值归一化:$x_i=\frac{value-average}{max} or \frac{value-average}{max-min}(-0.5\leqslant x_i\leqslant0.5)$
$\alpha$的选择:在$…,0.0001,0.001,0.01,0.1,1,…$一系列数中按
3
的倍数取值
深度学习/神经网络
学习目标:能够类比人类大脑思考过程,理解神经网络的结构
深度学习和机器学习的区别
通过对机器学习的了解,我们已经能够处理一些简单的函数回归问题。在机器学习中,我们需要给计算机一个适当的假设函数,以及契合问题的一些数据样本。但是在例如图像识别等实际问题中,我们无法直观地给出一个假设函数,也难以将图像适当地处理成训练所需数据。此时我们需要作进一步处理,使得机器学习过程中能有效地提炼出数据和设定假设函数。
深度学习属于机器学习,他能够将复杂的原始数据处理成可供机器学习训练的数据样本,并在学习中自动地找到适宜的假设函数。深度学习模仿人脑的思考过程,引入神经元的概念处理问题,称为神经网络。
神经网络的结构
神经元是神经网络的基本单元,它能够接受多个输入信号,这个信号可以是原始数据,也可以是其他神经元处理过后的信号,然后信号通过内部分析后输出结果,产生的结果信号也可以传入到另一神经元中再次分析处理,或者作为最终答案呈现出来。神经元互相连接、影响,最终形成网络,即为神经网络。
基础神经网络可以分为三部分:输入层、隐藏层、输出层
输入层是指神经网络获取的原始数据
输出层是指神经元输出信号直接作为最终答案的部分
隐藏层处于输入层和输出层之间,它负责从原始数据中提取有效信息
- 隐藏层层数如何确定
- 没有隐藏层:仅能够表示线性可分函数或决策
- 隐藏层数=1:可以拟合任何“包含从一个有限空间到另一个有限空间的连续映射”的函数
- 隐藏层数=2:搭配适当的激活函数可以表示任意精度的任意决策边界,并且可以拟合任何精度的任何平滑映射
- 隐藏层数>2:多出来的隐藏层可以学习复杂的描述(某种自动特征工程)
- 神经元个数如何确定
- 隐藏神经元的数量应在输入层的大小和输出层的大小之间。
- 隐藏神经元的数量应为输入层大小的2/3加上输出层大小的2/3。
- 隐藏神经元的数量应小于输入层大小的两倍。
- 隐藏层层数如何确定
神经网络的各个神经元都相互关联的部分,称作全连接层
用数学理解神经网络处理的过程
原始数据:例如图像的原始数据可能以矩阵的形式存储
输出结果:将结果表示为数字或数字矩阵,例如将识别某一动物类型为概率矩阵
处理过程:将前一神经元的输出作为后一神经元的输入,经过函数处理将输出传递给下一神经元。设神经元有输入$x_i$,处理函数和输出$y_i=f_i(x)$,则存在$y_j=f_j(x_j)=f_j(f_i(x_i))=f_j(f_i(f_{…}(x_{…})))$
基本组成:输入层变量$x_1,x_2,…$,输出层变量$y_1,y_2,…$,处理函数$f_{ij}$
- 如何设定处理函数
神经元的处理函数类似于机器学习中的假设函数,我们要求AI通过训练生成一个合适的函数。为了使神经网络能处理复杂的数据分析,即要求处理函数能适配任何数据产生的函数图像。类似于机器语言0和1可以构造出计算机所有的功能,现存在一类函数,可以通过搭配组合匹配出任意的函数曲线,称为激活函数(激励函数)。
激活函数 | 深度学习领域最常用的10个激活函数,详解数学原理及优缺点 - 云+社区 - 腾讯云 (tencent.com)
如何评价神经网络的性能
类似于机器学习的代价函数,神经网络也需要一个代价函数
$$
L(y,\widehat y)=distance[f(X,w),(y|X)]
$$
式中$w$表示模型参数,上式右侧具体的量化方法视问题和模型而定,但要求满足损失函数的一般定义,即样本空间的非负可测函数
反向传播算法BP
理论部分和C++实践(理论部分建议1.5倍速快速通过)
学习目标:能够推导BP算法数学公式
原始数据处理:例如机器学习中的特征缩放
确定隐藏层和神经元个数
定义变量、激活函数、代价函数
推导公式
以参考视频为例:
$$
\begin{align}
&h_i=f(x_1w_{1i}+x_2w_{2i}-\beta_i) \\
&\widehat y=f(h_1v_1+h_2v_2+h_3v_3-\lambda) \\
&Loss=\frac{1}{2}\sum_i(y_i-\widehat y_i)^2 \\
&\Delta\lambda=-\eta(y-\widehat y_i)\widehat y_i(1-\widehat y_i) \\
&\Delta v_1=\eta(y-\widehat y_i)\widehat y_i(1-\widehat y_i)h_1 \\
&\Delta\beta_1=-\eta(y-\widehat y_i)\widehat y_i(1-\widehat y_i)v_1h_1(1-h_1) \\
&\Delta w_{11}=\eta(y-\widehat y_i)\widehat y_i(1-\widehat y_i)v_1h_1(1-h_1) \\
\end{align}
$$