目录
一、人工智能(Artificial Intelligence)
一、人工智能(Artificial Intelligence)
1.概念
人工智能是使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统。
2.人工智能的三个层面
计算智能:能存能算;感知智能:能听会说、能看会认;认知智能:能理解、思考、决策。
3.人工智能>机器学习>深度学习
人工智能是一种科技领域,机器学习是一种方法,深度学习则是应用了深度神经网络的机器学习分支。
4.知识工程/专家系统与机器学习
知识工程/专家系统是人工定义规则,机器学习则是机器基于数据自动学习训练。
二、机器学习
1.定义
- 最常用定义:计算机系统能够利用经验提高自身性能。
- 可操作定义:一个基于经验数据的函数估计问题。
- 统计学定义:提取重要模式、趋势,并理解数据,即从数据中学习。
总结:从数据中自动提取知识。
2.模型分类
2.1 数据标记
- 监督学习模型
监督学习模型的样本具有标记,从数据中学习标记分界面 (输入-输出的映射函数),适用于预测数据标记。
- 无监督学习模型
无监督学习模型的样本没有标记,从数据中学习模式,适用于描述数据。
- 半监督学习模型
半监督学习模型是监督学习模型和无监督学习模型的混合,部分数据标记已知。
- 强化学习模型
数据标记未知,但知道与输出目标相关的反馈。
2.2 数据分布
- 参数模型
对数据分布进行假设,待求解的数据模型/映射可以用一组有限且固定数目的参数进行刻画。数据需求少,训练快速,但模型复杂度有限,与真实目标函数拟合度小。
- 非参数模型
不对数据分布进行假设,数据的所有统计特性都来源于数据本身。对数据适应性强,可以拟合不同的函数形式,但数据需求大,容易过拟合。
2.3 建模对象
- 判别模型
对已知输入X条件下输出Y的条件分布P(Y|X)建模
- 生成模型
对输入X和输出Y的联合分布P(X,Y)建模
三、深度学习
1.概述
应用研究:视觉+语言
理论研究:”能“做什么→“不能”做什么
2.深度学习的“不能”
- 算法输出不稳定,容易被“攻击”
- 模型复杂度高,难以纠错和调试
- 模型层次复合程度高,参数不透明
- 端到端训练方式对数据依赖性强,模型增量型差
- 专注直观感知类问题,对开放性推理问题无能为力
- 人类知识无法有效引入进行监督,机器偏见难以避免
3.深度学习的“不能”与解释性
四、神经网络基础
1.浅层神经网络
1.1 M-P神经元
M-P神经元多输入信号进行累加对应生物神经元的多输入单输出和空间整合的特
点;
M-P神经元权值正负模拟兴奋/抑制,大小模拟强度对应生物神经元的兴奋性/抑制性输入的特点;
M-P神经元输入和超过阈值时被激活,对应生物神经元的阈值特性。
1.2 激活函数
概述
神经元继续传递信息、产生新连接的概率(超过阈值被激活,但不一定传递)。
没有激活函数相当于矩阵相乘,只能拟合线性函数。
举例
Sigmoid函数会把输出限定在0~1之间,如果是非常大的负数,输出就是0,如果是非常大的正数,输出就是1,这样使得数据在传递过程中不容易发散。但Sigmoid函数有两个缺点,一是容易过饱和,丢失梯度,二是Sigmoid不对称,输出均值不是0。针对这两个缺点,分别有双极S性函数和ReLU修正线性单元的变形函数。
1.3 感知器
感知器是首个可以学习的人工网络。单层感知器可以实现逻辑与、逻辑或和逻辑非;多层感知器是单层感知器逻辑组合实现,如三层感知器可以实现同或门。
单隐层神经网络可视化网站:http://playground.tensorflow.org.
1.4 万有逼近定理
- 定义
如果一个隐层包含足够多的神经元,三层前馈神经网络(输入-隐层-输出)能以任意精度逼近任意预定的连续函数。
- 双隐层感知器逼近非连续函数
1.5 神经网络每一层的作用
每一层的数学公式如下
在输入→输出的空间转换过程中,的作用是升维/降维和放大/缩小以及旋转,
的作用是平移,
的作用是弯曲。
神经网络学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投影到线性可分的空间去分类/回归。增加节点数会增加维度,即增加线性转换能力;增加层数则是增加激活函数的次数,即增加非线性转换次数。
1.6 深度和宽度的选择
神经元总数相当时,增加网络深度可以比增加宽度带来更强的网络表示能力:产生更多的线性区域。
深度和宽度对函数复杂度的贡献不同,深度的贡献是指数增长的,而宽度的贡献是线性的。
1.7 神经网络的参数学习:误差反向传播
多层神经网络可以看作一个复合的非线性多元函数
给定训练数据,希望损失
尽可能小。
1.8 梯度下降
多元函数f(x,y)在每个点可以有多个方向。每个方向都可以计算导数,称为方向导数。梯度为一个向量,方向是最大方向导数的方向,模为方向导数的最大值。
无约束优化:梯度下降,参数沿负梯度方向更新可以使函数值下降。
1.9 梯度消失
2. 神经网络基础
2.1 逐层预训练
2.2 解决梯度消失
Layer-wise Pre-train(DBN,2006):2006年Hinton等提出的训练深度网路的方法,用无监督数据作分层预训练,再用有监督数据fine-tune。
ReLU(AlexNet,2012):新的激活函数解析性质更好,克服了sigmoid函数和tanh函数的梯度消失问题。
辅助损失函数(Inception V1,2013):e.g. GoogLeNet中的两个辅助损失函数,对浅层神经元直接传递梯度。
Batch Normalization(Inception V2, 2014):逐层的尺度归一。
LSTM:通过选择记忆和遗忘机制克服RNN的梯度消失问题,从而可以建模长时序列。
五、 代码练习
1. Pytorch基础
PyTorch是一个python库,它主要提供了两个高级功能:
- GPU加速的张量计算
- 构建在反向自动求导系统上的深度神经网络
1.1 定义数据
一般定义数据使用torch.Tensor , tensor的意思是张量,是数字各种形式的总称。torch可以是数、一维数组(向量)、二维数组(矩阵)和任意难度的数组(张量)。
1.2 定义操作
- 基本运算,加减乘除,求幂求余
- 布尔运算,大于小于,最大最小
- 线性运算,矩阵乘法,求模,求行列式
matplotlib展示生成随机数的直方图
from matplotlib import pyplot as plt
# matlabplotlib 只能显示numpy类型的数据,下面展示了转换数据类型,然后显示
# 注意 randn 是生成均值为 0, 方差为 1 的随机数
plt.hist(torch.randn(1000).numpy(), 100);
![](https://img-blog.csdnimg.cn/c5a7e98dbec84e909796848e03a6abbc.png)
plt.hist(torch.randn(10**6).numpy(), 100);
![](https://img-blog.csdnimg.cn/9de2f98f15d24e79808e3cf47152c71d.png)
2. 螺旋数据分类
-
线性模型分类
learning_rate = 1e-3
lambda_l2 = 1e-5
# nn 包用来创建线性模型
# 每一个线性模型都包含 weight 和 bias
model = nn.Sequential(
nn.Linear(D, H),
nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上
# nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
criterion = torch.nn.CrossEntropyLoss()
# 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)
# 开始训练
for t in range(1000):
# 把数据输入模型,得到预测结果
y_pred = model(X)
# 计算损失和准确率
loss = criterion(y_pred, Y)
score, predicted = torch.max(y_pred, 1)
acc = (Y == predicted).sum().float() / len(Y)
print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
display.clear_output(wait=True)
# 反向传播前把梯度置 0
optimizer.zero_grad()
# 反向传播优化
loss.backward()
# 更新全部参数
optimizer.step()
# Plot trained model
print(model)
plot_model(X, Y, model)
Sequential( (0): Linear(in_features=2, out_features=100, bias=True) (1): Linear(in_features=100, out_features=3, bias=True) )
-
构建两层神经网络分类
和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数。
learning_rate = 1e-3
lambda_l2 = 1e-5
model = nn.Sequential(
nn.Linear(D, H),
nn.ReLU(),
nn.Linear(H, C)
)
model.to(device)
# 下面的代码和之前是完全一样的,这里不过多叙述
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2
# 训练模型,和之前的代码是完全一样的
for t in range(1000):
y_pred = model(X)
loss = criterion(y_pred, Y)
score, predicted = torch.max(y_pred, 1)
acc = ((Y == predicted).sum().float() / len(Y))
print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))
display.clear_output(wait=True)
# zero the gradients before running the backward pass.
optimizer.zero_grad()
# Backward pass to compute the gradient
loss.backward()
# Update params
optimizer.step()
# Plot trained model
print(model)
plot_model(X, Y, model)
Sequential( (0): Linear(in_features=2, out_features=100, bias=True) (1): ReLU() (2): Linear(in_features=100, out_features=3, bias=True) )