AI-Introduction
每羊大学 2020 级软工不做网站/应用了,改成了做一个人工智能相关的项目(亚达),这门课改名为软件工程——人工智能导论!
人工智能绪论
人工智能 > 机器学习 > 深度学习
监督学习
- 数据标记(输出空间)已知,目的在于学习输入和输出的映射
- 标注所有的数据过于庞大
无监督学习
- 数据标记未知,目的在于发现数据中的模式或者有意义的信息
半监督学习
- 数据标记部分已知,是监督学习和无监督学习的混合
强化学习
- 数据标记未知,知道与输出目标相关的反馈,适用于决策类问题
- 虽然使用未标记的数据,但可以知道离目标越来越近还是越来越远(奖励反馈)
数据分布
参数模型
对数据分布进行假设,待求解的数据模式/映射可以用一组有限且固定数目的参数来刻画
比如假设条件概率 P(Y|X) 属于高斯分布,我们就应该用一个线性回归模型来解决(对问题数据的假设后用固定数量参数的模型来解决)
非参数模型
无法得到数据的分布,所有的模型特性都从数据本身来学。非参 != 无参
建模对象
生成模型:对输入X和输出Y的联合分布P(X, Y)建模
判别模型:对已知输入X条件下输出Y的条件分布P(Y|X)建模
机器学习历史
特征
传统机器学习:人工设计特征
- 预处理:经过数据的预处理,如去除噪声等。比如在文本分析中去除停用词
- 特征提取:从原始数据中提取一些有效的特征。比如在图像分类中提取边缘,尺度不变特征变换特征等
- 特征转换:对特征进行一定的加工,比如降维和升维。降维包括:
- 特征抽取(Feature Extraction):PCA,LDA
- 特征选择(Feature Selection):互信息,TF-IDF
深度学习的不能
- 算法输出不稳定,容易被攻击(如:one pixel attack)
- 模型复杂程度高,难以纠错和调试
- 模型层级复合程度高,参数不透明
- 专注直观感知类问题,对开放性推理问题无能为力
- 人类知识无法有效引入进行监督,机器偏见难以避免
- 可解释性差
神经网络基础
浅层神经网络
启发:生物神经元
- 每个神经元都是一个多输入单输出的信息处理单元
- 神经元具有空间整合和时间整合特性
- 神经元输入分为兴奋性输入和抑制性输入
- 神经元具有阈值特性
生物神经元 -> M-P 神经元
f?激活函数,超出阈值才会被激活。为什么要引入激活函数?
- 没有激活函数就相当于矩阵相乘,只能拟合线性函数
- 加入激活函数使得对非线性函数有拟合能力
sigmoid 函数,逻辑函数: ,其导数
由于输出不对称,修改为双极S性函数
其余的还有ReLU修正线性单元 ,leaky ReLU (增加了可以跳出0的初值)
单层感知器
非线性激活函数
,当x=0时,z=10,h计算选择 sigmoid 函数,此时h近似为1,当x=1时,z=-10,h近似为0,相当于实现了逻辑非,我们只看x和h,相当于在01空间里做了一个分界面,这个面就是我们上面的函数。
但是异或就无法被划分了,单层->多层 来解决这个问题。
拿基础的逻辑or或者and组合来完成这个操作,对于原始的输入,经过第一步处理形成了一个中间层,中间层通过组合来确立最终的输出。
深度学习训练过程可视化 playground.tensorflow.org
如果一个隐层包含足够多的神经元,三层前馈神经网络(输入-隐层-输出)能以任意精度逼近任意预定的连续函数。当隐层足够宽时,双隐层感知器可以逼近任何非连续函数
为什么隐层越多越精确?
每一层的数学公式
完成输入到输出空间的变化(升维降维,放大缩小,旋转平移,弯曲)
神经网络学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投影到线性可分的空间去分类/回归。增加节点数:增加线性转换能力,增加层数:增加激活函数的次数,即增加非线性转换次数。
Fat and Short or Thin and Tall?
有论文说明:深度和宽度对函数复杂度的贡献是不同的,深度的贡献是指数增长的,而宽度贡献是线性的。
但实际我们如果用上面的网站,尝试在使用 sigmoid 激活函数做二分时,当深度在4,5时就无法分类了。
这就是多层神经网络的一个梯度消失问题
多层神经网络可以看做一个复合的非线性多元函数,但不断的传输会导致损失不断的增大。
无约束优化:梯度下降
参数沿负梯度方向更新可以使函数值下降
误差反向传播
复合函数的链式求导
代入
经过计算
残差:定义为损失函数在某个结点的偏导:
梯度消失
误差在反向传播时在乘激活函数的倒数时由于斜率过低导致误差直接消失掉了。也就是说前面的几层根本无法接收到这个传回来的误差。这样虽然更新了后面的几层,但是当新一个 x 传入时,后面的值又变了回来,相当于这次基于误差的修改并没有起到作用。
逐层预训练(layer-wise pre-training)解决局部最小值的问题和梯度消失问题,即寻找一个还不错的局部最小值。
受限波尔兹曼机和自编码器
自编码器:最初被提出来用来降维
堆叠自编码器(stacked autoencoder,SAE)
- 将多个自编码器得到的隐层串联
- 将所有层预训练完成后,进行基于监督学习的全网络微调
受限玻尔兹曼机(RBM):
目的是让隐藏层得到可见层v’ 与原来的可见层v分布一致,从而使隐藏层作为可见层输入的特征。两个方向权重w共享,偏置不同。
最终形式,条件概率建模,以 sigmoid 作为激活函数:
联合概率 -> 条件概率,即需要从联合概率里推出两个方向的条件概率
怎么推出来的?什么是波尔兹曼?
判别模型:直接建模计算条件概率
生成模型:先计算联合概率,然后通过贝叶斯公式来计算条件概率
那受限波尔兹曼的联合条件概率是什么样子的?
统计物理学:能量越低越稳定,概率越大(熵小),即我们通过熵来联系概率和能量。
把能量的玻尔兹曼分布定义联合概率
把玻尔兹曼公式代入条件概率计算:
RBM 到 DBN(深度信念网络)
一个 DBN 模型有若干个 RBM 堆叠而成,最后加一个监督层(如 BP 网络)
一般波尔兹曼机(BM):
如今,逐层预训练成为了历史…
新的激活函数 + 优化方法 + 更大的标注训练数据使得预训练很少再被使用了,逐层训练无法从本质上解决梯度消失问题。
主流的深度学习平台甚至不支持 RBM 和预训练。
自编码器的变种
- 正则自编码器(Regularized AE),使提取的特征表达式符合某种性质
- 稀疏自编码器(Sparse AE),提取稀疏特征表达(我们认为高维而稀疏的表达式是好的)
- 去噪自编码器(Denoising AE),对被破坏或者污染的数据中重构原始数据,提取特征
- 变分自编码器(Variational AE),与对抗式生成网络 GAN 关系密切,是深度学习—概率图模型的桥梁
AI-Introduction