人工智能的发展过程
人工智能:
机器学习->表示学习->深度学习
机器学习
通过硬编码的知识体系面对的困难表明,AI系统需要具备自己获取知识的能力,即从原始数据中提取模式的能力,这种能力被称为机器学习。
机器学习算法的性能很大程度上依赖于给定数据的表示,在整个计算机科学乃至日常生活中,对表示的的依赖是一个普遍的现象,表示的选择会对机器学习算法的性能产生巨大的影响。例如合适的数据结构可以加速搜索的性能等。
机器学习面临的现状是许多人工智能的任务的解决方式是先提取一个合适的特征集,然后将这些特征提供给简单的机器学习算法。但问题是很难知道应该提取那些特征
表示学习
表示学习使用机器学习来发掘表示本身,而不仅把表示映射到输出,这种方法我们称之为表示学习
表示学习算法学习到表示往往比手动设计的表示表现得更好,并且它们只需要最少的人工干预,就能让AI系统迅速适应新的任务
典型的例子是自编码器,由一个编码器和一个解码器函数组合而成。编码器将输入数据转换为一种不同的表示,解码器将这个新的表示转换到原来的形式。期望当输入数据经过编码和解码器后尽可能地保留信息,同时新的表示有各种好的特性,是自编码器的训练目标。

当设计特征或设计用于学习特征的算法时,表示学习的目标通常是分离出能解释观察数据的差异因素。但问题是
- 很多差异因素影响着能够观察到的每一个数据—数据受到更多重差异因素影响
- 从原始数据中提取更高层次、抽象的特征是非常困难的
深度学习
深度学习通过其他较简单的表示来表示复杂表示,解决了表示学习中的核心问题
深度学习让计算机通过较简单概念构建复杂的概念,典型的例子是多层感知机,它仅仅是一个将一组输入值映射到输出值的数学函数,由较多简单的数学函数复合而成。可以认为不同数学函数的每一次应用都为输入提供了新的表示

总结


深度学习的历史趋势
神经网络

人的思维,是由850亿-1000亿个神经元组成,神经元之间相互连接,之后进行学习,随着大脑不断暴露在刺激之下,这些神经元改变了它们的互联结构,建立了新的连接,加强了现有连接,删除了那些未使用的连接。

通常一个神经网络由一个输入层(Input Layer),多个隐藏层(Hidden Layer)和一个输出层(Output Layer)
- 图中的圆圈可以视为一个神经元
- 设计神经网络的重要工作是设计隐藏层,及神经元之间的权重
- 添加少量隐藏层获得浅层神经网络,隐层很多时就是深层神经网络
神经网络的三要素:神经元的激活规则(激活函数),网络的拓扑结构(神经元之间的连接方式),学习算法
一些概念
激活函数
为什么需要激活函数
在神经网络中,激活函数通过引入非线性打破线性叠加的限制
假设一个两层神经网络(无激活函数)
第一层的输出为
::: align-center
z_1=\omega_1x+b_1
:::
第二层输出
::: align-center
z_2=\omega_2z_1+b_2=\omega_2(\omega_1x+b_1)+b_2=(\omega_1\omega_2)x+(\omega_2b_1+b_2)
:::
其中\omega_1,\omega_2是权重矩阵,b_1,b_2是偏置向量,x为输入
这种情况下,无论叠加多少层,最终的输出仍然为线性组合,无法表示非线性关系
但是若考虑在每一层后添加激活函数
第一层的输出为
::: align-center
a_1=f(\omega_1x+b_1)
:::
第二层为
::: align-center
a_2=f(\omega_2a_1+b_2)=f(\omega_2f(\omega_1x+b_1)+b_2)
:::
由于f是非线性函数,a_2不是一个线性组合,因此网络就有了非线性表达能力
如何评判激活函数
为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质
- 连续并可导(允许少数点上不可导)的非线性函数,可以直接利用数值优化的方法来学习网络参数
- 激活函数及其导数要尽可能的简单,有利于提高网络计算效率
- 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,防止训练过程中出现梯度消失或者爆炸,影响训练效率和稳定性
一些激活函数 (重要)
Sigmoid函数
Sigmoid型函数是指积累S型曲线函数,为两端饱和函数
i. Logistic函数 \sigma=\frac{1}{1+\exp(-x)}
此函数可以看成是一个挤压函数,它把实数域输入“挤压”到(0,1),在输入0附近时近似为线性函数,两端时对输入进行抑制(越小越趋近0,越大越趋近1),Logistic函数是可导的,数学性质很好
使用了Logistic函数的神经元有以下性质
- 其输出可以直接看作概率分布,使得神经网络可以更好地和统计学习模型进行结合
- 其可以看作是一个软性门,用来控制其他神经元输出信息的数量
ii. Tanh函数tanh(x)=\frac{\exp(x)-\exp(-x)}{\exp(x)+\exp(-x)}
可以看作是放大并平移的Logistic函数,其值域是(-1,1)

ReLU函数
ReLU(修正线性单元),也叫Rectifier函数
它实际上是一个斜坡函数
::: align-center
ReLU(x)=\left\{\begin{matrix}x&x\ge 0\\0&x<0\end{matrix}\right.
:::
优点:(重要)
- 具有生物学合理性,比如单侧抑制,宽兴奋边界
- 采用ReLU的神经元只需要进行加、乘和比较的操作,相比较于Sigmoid型函数需要进行幂计算,ReLU在计算上更高效
- Sigmoid函数会导致一个非稀疏的神经网络,而ReLU单侧抑制的性质可以有很好的稀疏性
- 在优化方面,相比较Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,且在正半轴导数一直为1,在一定程度上缓解了神经网络梯度消失的问题
缺点:(重要)
- 输出是非零中心化的,也就是函数不关于原点对称。这会导致后层神经网络在获得导数时引入偏置偏移,一定程度上也会影响梯度下降的效率
关于非零中心化,它会导致激活函数的输出均值不为零,叠加到原输入输出到下一层神经元,这会导致下一层神经元的输入分布整体偏离于零,从而导致下一层的权重更新被迫适应这种偏移,参数调整的自由度会下降,也就是说,参数优化的自由度下降了
非零中心化还会导致“锯齿现象”,因为整体分布的偏移,进行梯度更新时,优化的方向可能需要多次调整方向,产生冗余的更新步骤,导致收敛速度的一定程度下降

- 可能会导致死亡ReLU问题。在训练时,如果参数在一次不恰当的更新后,上一个隐藏层中的某个ReLU在所有训练数据上都不能激活,那么该神经元自身参数的梯度将永远是零,在以后的训练过程中永远不能被激活
ReLU函数的变种如下


Swish函数
Swish函数是一种自门控激活函数
::: align-center
swish(x)=x\sigma(\beta x)
:::
其中\sigma(\cdot)为Logistic函数,\beta为一个固定的超参数
使用Swish函数后,当\sigma(\beta x)接近1时,门处于“开”状态,激活函数的输出近似x本身,当\sigma(\beta x)接近于0时,门的状态为“关”,激活函数的输出近似为0

GELU函数
高斯误差线性单元(GELU)也是一种通过门控机制来调整其输出值的激活函数,和Swish函数比较类似
::: align-center
GELU(x)=xP(X\le x)
:::
P(X\le x)是高斯正态分布的累计分布函数N(\mu,\sigma^2),这里\mu,\sigma都是超参数,一般是标准正态分布\mu=0,\sigma=1
由于搞死分部的累计分布函数为S型函数,所以它可以用Tanh或者Logistic函数近似
::: align-center
\begin{aligned}
&GELU(x)\approx 0.5x(1+tanh(\sqrt{\frac{2}{\pi}}(x+0.044715x^3)))\\
&GELU(x)\approx x\sigma(1.702x)
\end{aligned}
:::
可以看到,使用Logistic函数近似时,GELU相当于一种特殊的Swish函数
各激活函数的导数

卷积 (计算)
卷积是卷积神经网络(CNN)的核心操作,通过滑动一个可学习的滤波器(卷积核)对输入数据进行局部特征提取。其数学本质是对输入数据于滤波器进行矩阵内积运算,生成特征图,反映输入中如边缘、纹理等特定模式

池化
池化是CNN中的降采样操作,通过汇聚局部区域的统计值(如最大值或均值)压缩特征图,降级计算复杂度并增强模型的鲁棒性。如下面图中的是最大池化(取窗口内最大值,保留显著特征如边缘,常用于图像任务),此外还有平均池化(计算窗口内均值,平滑噪声但可能丢失细节,常用于背景信息提取)等

遇到的问题
深度学习神经网络的参数学习比线性模型更加困难,主要原因有两点
- 非凸优化问题
由于神经网络的函数多是非凸函数,对其的优化可能存在局部而非全局最优解,这将影响迭代准确性 - 梯度弥散问题
由于部分激活函数(如Sigmoid型函数)的饱和性,使得在饱和区函数的导数趋近于零,当神经网络层数很深时,只要有一层梯度趋于零,整体的梯度均会趋于零,使得整个网络很难训练。使用ReLU等激活函数部分解决了这个问题
全部评论 (0)
暂无评论,快来抢沙发吧~