马上期末考试了,就用这篇博客充当一下复习记录吧。一些部分可能有误,还请各位大佬批评指正。
有关神经网络、深度学习与人工智能的关系
链接: 图片博客来源
理解:深度学习是人工智能的一个子集合,而神经网络和深度学习又有交集。
那么,为什么神经网络和深度学习不是相互包含的关系呢?
神经网络中除了深度学习还有什么?
深度学习中除了神经网络还有什么?
问题:深度学习中除了神经网络还有什么?
深度学习可以采用神经网络模型,也可以采用其他模型(比如深度信念网络是一种概率图模型). 但是,由于神经网络模型可以比较容易地解决贡献度分配问题,因此神经网络模型成为深度学习中主要采用的模型参考
又或者周志华老师的深度森林,其实也是深度学习但却不是神经网络。
问题:神经网络中除了深度学习还有什么?
个人理解,深度学习是一些比较深的模型。而一些比较简单的神经网络(如单层感知机或者2层神经网络等)这些比较“浅”的模型虽然是神经网络但却不是深度学习。
因此神经网络与深度学习并不是相互包含的关系,深度学习与神经网络彼此有交集却并不等价也不存在包含关系。
问题:机器学习的步骤
首先,什么是机器学习?
机器学习(Machine Learning,ML)是指从有限的观测数据中学习(或“猜测”)出具有一般性的规律,并利用这些规律对未知数据进行预测的方法。
那么机器学习的步骤可以表示如下:
数据预处理:进行如缺失值处理、数据格式统一、数据归一化等操作。
特征提取:根据某些方法提取出有用的特征,提取出有用的特征,去除多余的或者起到干扰作用的特征,又或者在图像分类中提取边缘、在文本分类中去除停用词等。
特征转换:对提取出来的特征进行转换,如降维(PCA或LDA等方法)或升维。使得数据具有更好的表现力。
预测:选定一个合适的模型,学习一个函数(利用优化方法将损失函数降到最小)并在测试集上进行预测。
问题:深度学习的步骤
通过多层的特征转换,把原始数据变成更高层次、更抽象的表示.这些学习到的表示可以替代人工设计的特征,从而避免“特征工程”。数据预处理去哪了?
问题:什么是机器学习
根据维基百科对机器学习的解释:
机器学习(Machine Learning,ML)是指从有限的观测数据中学习(或“猜测”)出具有一般性的规律,并利用这些规律对未知数据进行预测的方法.
问题:常见的机器学习类型
常见的机器学习有有监督学习、无监督学习、半监督学习、强化学习等。
有监督学习:对每一个样本都有“标准答案”,机器学习根据“标准答案”利用损失函数计算损失,通过对损失函数的最小化达到模型学习的目的。如分类、回归等问题。
无监督学习:每一个样本都没有“标准答案”,利用这些数据解决模式识别中的问题(如类别划分)。常见的无监督学习有PCA、聚类、核密度估计等。
半监督学习:部分样本有“标准答案”部分样本没有。利用这些数据训练一个模型来解决问题(分类、回归等)。
问题:机器学习四要素
理解机器学习的几个关键点
待定
交叉熵和MSE损失的异同:
异:交叉熵是用于分类问题的,而MSE是用于回归问题的。
同:二者都是损失函数,都通过使损失函数最小从而找到最优模型的参数。
交叉熵损失
推导待定
公式:
二分类
在二分类的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 p p p 和 1 − p 1-p 1−p ,此时表达式为( log \log log 以 e e e为底) :
L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ( p i ) + ( 1 − y i ) ⋅ log ( 1 − p i ) ] L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] L=N1i∑Li=N1i∑−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
其中:
− y i − -y_{i}- −yi− 表示样本 i i i 的label,正类为 1 ,负类为 0
− p i − -p_{i}- −pi− 表示样本 i i i 预测为正类的概率
如何直观理解:
损失函数的作用是什么?
是衡量模型表现好坏的指标,也是模型学习的目标,因此当模型表现较为好时,此时应该有较小的 L o s s Loss Loss。在上述公式中。
L i L_i Li为单个样本的损失,根据上述公式 L i = − [ y i ⋅ log ( p i ) + ( 1 − y i ) ⋅ log ( 1 − p i ) ] L_i = -\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] Li=−[yi⋅log(pi)+(1−yi)⋅log(1−pi)]
那么,当样本的真实值为1也就是 y i = 1 y_i = 1 yi=1时,此时 L i = − [ y i ⋅ log ( p i ) ] = − log ( p i ) L_i = -\left[y_{i} \cdot \log \left(p_{i}\right)\right] = -\log \left(p_{i}\right) Li=−[yi⋅log(pi)]=−log(pi)那么根据 l o g log log函数, p i p_i pi越接近于1,也就是模型认为该样本为正类的概率越大(正确的)此时 L i L_i Li越小;而若 p i p_i pi越接近于0,也就是模型认为该样本为负类的概率越大(错误的),此时 L i L_i Li越大。
当样本的真实值为0也就是 y i = 0 y_i = 0 yi=0时,此时 L i = − [ ( 1 − y i ) ⋅ log ( 1 − p i ) ] = − log ( 1 − p i ) L_i = -\left[(1-y_{i}) \cdot \log \left(1-p_{i}\right)\right] = -\log \left(1-p_{i}\right) Li=−[(1−yi)⋅log(1−pi)]=−log(1−pi)那么根据 l o g log log函数, p i p_i pi越接近于1,也就是模型认为该样本为正类的概率越大(错误的)此时 L i L_i Li越大;而若 p i p_i pi越接近于0,也就是模型认为该样本为负类的概率越大(正确的),此时 L i L_i Li越小。
多分类同理
多分类的情况实际上就是对二分类的扩展:
L = 1 N ∑ i L i = − 1 N ∑ i ∑ c = 1 M y i c log ( p i c ) L=\frac{1}{N} \sum_{i} L_{i}=-\frac{1}{N} \sum_{i} \sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) L=N1i∑Li=−N1i∑c=1∑Myiclog(pic)
其中:
参考:分类模型的 Loss 为什么使用 cross entropy 而不是 classification error 或 squared error
MSE损失
计算预测值和真实值之间的欧式距离。预测值和真实值越接近,两者的均方差就越小
均方差函数常用于线性回归(linear regression),即函数拟合(function fitting)。
J ( w , b ) = 1 2 m ∑ i = 1 m ( a i − y i ) 2 J(w, b)=\frac{1}{2 m} \sum_{i=1}^{m}\left(a_{i}-y_{i}\right)^{2} J(w,b)=2m1i=1∑m(ai−yi)2很好理解,使用( a i − y i a_i - y_i ai−yi)即可衡量第 i i i个点真实值与预测值之间的差距。
那么为什么要有平方呢?
这是因为( a i − y i a_i - y_i ai−yi)可能会出现负值,而加绝对值又不太好处理,因此用平方来表示。
那么为什么要求和之后除以 m m m呢?
m为点的个数,除以m相当于取平均,可以反映整体的拟合状况。
那么为什么除以m之后还要除以2呢?
其实除不除都可以,只不过损失函数在误差反向传播或者优化时要进行求导。那么平方项求导之后前方就会有系数2,刚好与分母上的2相消。
神经网络的主要特征:
激活函数
激活函数的几个特征
常用激活函数:S 型激活函数、斜坡型激活函数、复合激活函数
S 型激活函数
S 型激活函数是指Sigmoid型函数,常用的 Sigmoid型函数有Logistic函数和Tanh函数。
L o g i s t i c : σ ( x ) = 1 1 + e − x Logistic: \sigma(x) = \frac{1}{1+e^{-x}} Logistic:σ(x)=1+e−x1
优点:
缺点:
t a n h ( x ) = e x − e − x e x + e x = 2 σ ( 2 x ) − 1 tanh(x) = \frac{e^{x} - e^{-x}}{e^{x}+e^{x}} = 2\sigma(2x) - 1 tanh(x)=ex+exex−e−x=2σ(2x)−1
Tanh函数是 0 均值的,因此实际应用中 Tanh 会比 sigmoid 更好。但是仍然存在梯度饱和与exp计算的问题
斜坡型激活函数
斜坡型激活函数主要是 R E L U RELU RELU函数以及一系列 R E L U RELU RELU函数的改进。
RELU函数
ReLU ( x ) = { x x ≥ 0 0 x < 0 = max ( 0 , x ) \begin{aligned} \operatorname{ReLU}(x) &= \begin{cases}x & x \geq 0 \\ 0 & x<0\end{cases} =\max (0, x) \end{aligned} ReLU(x)={x0x≥0x<0=max(0,x)
优点:
缺点:
Leaky RELU
为了解决 R E L U RELU RELU函数中的死亡现象, L e a k y R E L U Leaky RELU LeakyRELU做出了适当改进:不再让小于0的部分恒等于0。
LeakyReLU ( x ) = { x if x > 0 γ x if x ≤ 0 = max ( 0 , x ) + γ min ( 0 , x ) \begin{aligned} \operatorname{LeakyReLU}(x) &= \begin{cases}x & \text { if } x>0 \\ \gamma x & \text { if } x \leq 0\end{cases} =\max (0, x)+\gamma \min (0, x) \end{aligned} LeakyReLU(x)={xγx if x>0 if x≤0=max(0,x)+γmin(0,x)其中 γ \gamma γ是一个很小的常数。而 γ \gamma γ也可以作为一个参数来学习。Parametric ReLU,PReLU,这样不同的神经元就可以有不同的激活函数,相对更加灵活。
但即使这样仍然有一个问题没有解决,输出并不是0中心化的。因此为了解决这一问题,又提出了 E L U ELU ELU
ELU
ELU ( x ) = { x if x > 0 γ ( exp ( x ) − 1 ) if x ≤ 0 = max ( 0 , x ) + min ( 0 , γ ( exp ( x ) − 1 ) ) \begin{aligned} \operatorname{ELU}(x) &= \begin{cases}x & \text { if } x>0 \\ \gamma(\exp (x)-1) & \text { if } x \leq 0\end{cases} =\max (0, x)+\min (0, \gamma(\exp (x)-1)) \end{aligned} ELU(x)={xγ(exp(x)−1) if x>0 if x≤0=max(0,x)+min(0,γ(exp(x)−1))
其中 γ ≥ 0 \gamma \geq 0 γ≥0 是一个超参数, 决定 x ≤ 0 x \leq 0 x≤0 时的饱和曲线,并调整输出均值在 0附近。虽然ELU解决了死亡RELU的问题,也解决了输出的0中心化问题,但是由于引入了e,提高了计算的复杂度,因此运行起来相对会慢一些。
复合激活函数
Swish函数
Swish 函数是一种自门控 ( Self-Gated ) 激活 函数, 定义为
swish ( x ) = x σ ( β x ) , \operatorname{swish}(x)=x \sigma(\beta x), swish(x)=xσ(βx),
其中 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 为 Logistic 函数, β \beta β 为可学习的参数或一个固定超参数. σ ( ⋅ ) ∈ ( 0 , 1 ) \sigma(\cdot) \in(0,1) σ(⋅)∈(0,1) 可 以看作一种软性的门控机制. 当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 1 时, 门处于 “开” 状态, 激活函数的 输出近似于 x x x 本身; 当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于 0 时, 门的状态为 “关”, 激活函数的输出近似 于 0 .
GELU(Gaussian Error Linear Unit,高斯误差线性单元)也是一种通过门控机制来调整其输出值的激活函数,和 Swish 函数比较
类似.
G E L U ( ) = ( ≤ ) GELU() = ( ≤ ) GELU(x)=xP(X≤x)
其中( ≤ )是高斯分布(, 2)的累积分布函数,其中, 为超参数,一般设 = 0, = 1即可.由于高斯分布的累积分布函数为S型函数,因此GELU函数可以用Tanh函数或Logistic函数来近似.
前馈神经网络结构
前向传播及反向传播算法
可以看这位大佬的博文,讲的很清楚。
神经网络BP反向传播算法原理和详细推导流程
卷积神经网络以及其三个结构特征
卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种
具有局部连接、权重共享等特性的深层前馈神经网络.
特征:
卷积过程和不同类型的卷积
当卷积核在输入图像上扫描时,将卷积核与输入图像中对应位置的数值逐个相乘,最后汇总求和,就得到该位置的卷积结果。不断移动卷积核,就可算出各个位置的卷积结果。
卷积的结果按输出长度不同可以分为三类:
掌握卷积神经网络中卷积核、卷积层、卷积网络结构
卷积层
输入:D个特征映射 M × N × D
输出:P个特征映射 M′ × N′ × P
卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成。
各种不同类型的卷积(空洞卷积等)
问题的产生:如何增加输出单元的感受野?
解决方法:
针对以上,提出了空洞卷积:
空洞卷积通过给卷积核插入“空洞”来变相地增加其大小.如果在卷积核的每两个元素之间插入 − 1个空洞,卷积核的有效大小为′ = + ( − 1) × ( − 1)其中 称为膨胀率(Dilation Rate).当 = 1时卷积核为普通的卷积核.
各种卷积的动图
附上个人感觉讲的很通俗的一篇文章卷积神经网络——介绍
残差网络机理
残差网络提出的背景。网络越深,表达性能越强。那么网络越深,就一定越优秀吗?
并不是这样的,在网络的训练过程中随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。
那么为什么会出现这种现象呢?
在一层又一层的卷积中,是特征的提取过程,但是随着特征的提取也会丢失掉很多信息。在前向传输的过程中,随着层数的加深,特征图包含的图像信息会逐层减少,因此若网络过深可能会起到反作用。
那么如何避免这种情况呢,能不能在提取特征的同时保证信息不丢失?
针对这一问题,残差网络被提了出来。
残差单元由多个级联的(等宽)卷积层和一个跨层的直连边组成,再经过ReLU激活后得到输出。
多个级联的(等宽)卷积层起到的作用是特征提取。而跨层的直连边起到的作用就是保证在本次操作之后信息不会变的更少。
而在执行加法操作融合之前,为了保证x与提取之后的特征图维度匹配,往往要对x再进行操作(如1*1卷积)以调整x的维度。
假设在一个深度网络中,我们期望一个非线性单元(可以为一层或多层的卷积层)(; )去逼近一个目标函数为ℎ().如果将目标函数拆分成两部分:恒等函数(Identity Function)和残差函数(Residue Function)ℎ() − .
呢么就有 ℎ() = + (ℎ() − )
参考详解残差网络
掌握递归神经网络(RNN)的前向传播,理解反向传播过程(BPTT)
前向传播:
其中, x t x_t xt表示 t t t时刻的输入, s t s_t st表示 t t t时刻的隐状态, o t o_t ot表示 t t t时刻的输出。
t t t 时刻 中间隐层输入为 s t = U x t + W h t − 1 s_{t}=U x_{t}+W h_{t-1} st=Uxt+Wht−1 t t t 时刻中间隐层输出为 (其中 f f f 为sigmoid 函 数) h t = f ( s t ) h_{t}=f\left(s_{t}\right) ht=f(st)
t t t 时刻输出层输出为 (其中 g g g 为 softmax 函数) o t = g ( V h t ) o_{t}=\mathrm{g}\left(V h_{t}\right) ot=g(Vht)损失函数为 L t = − [ y t log o t + ( 1 − y t ) log ( 1 − o t ) ] L_{t}=-\left[y_{t} \log o_{t}+\left(1-y_{t}\right) \log \left(1-o_{t}\right)\right] Lt=−[ytlogot+(1−yt)log(1−ot)]