此篇只讲解深度学习有关的基础概念和知识点
神经元
在神经网络中,把处于在活跃状态的神经元称为激活态,处于非活跃状态的神经元称为抑制态。
激活函数赋予了神经元自我学习和适应的能力。 激活函数是神经网络设计的一个核心单元。
作用(面试常问):为了在神经网络中引入非线性的学习和处理能力。 更好的实现一刀切
常用的激活函数(满足 1 非线性 2 可微性 3 单调性)
sigmoid函数
缺点:梯度饱和,两边数值的梯度都为0; 结果的平均值不为0,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。
y = l o g s i g ( x ) = 1 1 + e − x y=logsig(x)=\frac{1}{1+e^{-x}} y=logsig(x)=1+e−x1
步骤:先加权求和再带入激活函数,如下图所示
tanh函数
y = t a n s i g ( x ) = e x − e − x e x + e − x y=tansig(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} y=tansig(x)=ex+e−xex−e−x
ReLU函数 (线性整流层)
f ( x ) = m a x ( 0 , x ) f(x) = max (0, x) f(x)=max(0,x)
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被称为单侧抑制。
正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。
当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。
其他延伸:
ReLU6:
f ( x ) = { 0 , x ≤ 0 x , 0 < x < 6 6 , x ≥ 6 f(x)= \left\{ \begin{matrix} 0,x≤0\\ x,0f(x)=⎩ ⎨ ⎧0,x≤0x,0<x<66,x≥6
leaky relu:
f ( x ) = { x , x > 0 a x , x ≤ 0 ( a 为很小的数) f(x)= \left\{ \begin{matrix} x,x>0\\ ax,x≤0(a为很小的数) \end{matrix} \right. f(x)={x,x>0ax,x≤0(a为很小的数)
使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数
特征向量在被传入输入层时通常要先标准化到0-1之间(为了加速学习过程)
离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值
比如:特征值A可能取三个值(a0, a1, a2), 可以使用3个输入单元来代表A。
如果A=a0, 那么代表a0的单元值就取1, 其他取0;1,0,0
如果A=a1, 那么代表a1的单元值就取1,其他取0,以此类推 0,1,0
神经网络既可以用来做分类(classification)问题,也可以解决回归(regression)问题
(1)对于分类问题,如果是2类,可以用一个输出单元表示(0和1分别代表2类);如果多于2类,则每一个类别用一个输出单元表示 1 0 0 01 0
(2)没有明确的规则来设计最好有多少个隐藏层,可以根据实验测试和误差以及精准度来实验并改进。
深度神经网络:具有多个隐藏层的神经网络
深度学习:基于深度神经网络的机器学习研究
深度神经网络可以理解为对传统多层网络进行了结构、方法等方面的优化
深度学习,就是多层人工神经网络 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
图像识别:像素->边缘->纹理->图形->局部->物体
文字识别:字符->词->词组->子句->句子->故事
优化和泛化 :深度学习的根本问题是优化和泛化之间的对立。
优化(optimization)是指调节模型以在训练数据上得到最佳性能(准确度的好坏)(即机器学习中的学习)。
泛化(generalization)是指训练好的模型在前所未见的数据上的性能好坏。
分类:
训练集:实际训练算法的数据集;用来计算梯度,并确定每次迭代中网络权值的更新;
验证集:用于跟踪其学习效果的数据集;是一个指示器,用来表明训练数据点之间所形成的网络函数发生了什么,并且验证集上的误差值在整个训练过程中都将被监测;
交叉验证
这里有一堆数据,我们把他切成3个部分(当然还可以分的更多)
第一部分做测试集,二三部分做训练集,算出准确度;
第二部分做测试集,一三部分做训练集,算出准确度;
第三部分做测试集,一二部分做训练集,算出准确度;
之后算出三个准确度的平局值,作为最后的准确度。
测试集:用于产生最终结果的数据集 。
为了让测试集能有效反映网络的泛化能力:
BP网络(Back-Propagation Network)又称为反向传播神经网络,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。它是一种有监督的学习算法,用于函数逼近、模型识别分类、数据压缩和时间序列预测等。整个的训练过程是在基于bp神经网络上。
该算法最主要是通过误差反向传播来优化参数(权重)
一个典型的BP网络应该包括三层:输入层、隐藏层和输出层。各层之间全连接,同层之间无连接。隐藏层可以有很多层。
一个例子:我们利用神经网络去解决图像分割,边界探测等问题时候,我们的输入(假设为x),与期望的输出(假设为y)之间的关系究竟是什么?也就是y=f(x)中,f是什么,我们也不清楚,但是我们对一点很确信,那就是f不是一个简单的线性函数,应该是一个抽象的复杂的关系,那么利用神经网络就是去学习这个关系,存放在model中,利用得到的model去推测训练集之外的数据,得到期望的结果。
训练(学习)过程:
正向传播 :输入信号从输入层经过各个隐藏层向输出层传播。在输出层得到实际的响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。
反向传播 :按照梯度下降的方法从输出层经过各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。
备注:推理的过程与训练中的正向传播过程完全一样,但正向传播是属于训练过程
BP神经网络 BP算法是一个迭代算法,它的基本思想如下:
将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。
由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
在反向传播的过程中,根据误差调整各种参数的值(相连神经元的权重),使得总损失函数减小。
迭代上述三个步骤(即对数据进行反复训练),直到满足停止准则。
代(Epoch):使用训练集的全部数据对模型进行一次完整训练,被称为“一代训练”。
批大小(Batch size):使用训练集的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”
迭代(Iteration):使用一个Batch数据对模型进行一次参数更新的过程,被称为“一次训练”(一次迭代)。
每一次迭代得到的结果都会被作为下一次迭代的初始值。一个迭代=一个正向通过+一个反向通过。
N u m b e r o f B e t c h e s = T r a i n i n g S e t S i z e B a t c h S i z e Number\quad of\quad Betches=\frac{Training\quad Set\quad Size}{Batch\quad Size} NumberofBetches=BatchSizeTrainingSetSize
比如训练集有500个样本,batchsize = 10 ,那么训练完整个样本集:iteration=50,epoch=1.
粗略的训练过程
提取特征向量作为输入。
定义神经网络结构。包括隐藏层数,激活函数等等。
通过训练利用反向传播算法不断优化权重的值,使之达到最合理水平。
使用训练好的神经网络来预测未知数据(推理),这里训练好的网络就是指权重达到最优的情况。
具体的训练过程
选择样本集合的一个样本(Ai,Bi),Ai为数据、Bi为标签(所属类别)
送入网络,计算网络的实际输出Y,(此时网络中的权重应该都是随机量)
计算D=Bi−Y(即预测值与实际值相差多少) (此步骤做误差,使用具体的损失函数)
根据误差D调整权重矩阵W
对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围
更具体的过程
参数的随机初始化
前向传播计算每个样本对应的输出节点激活函数值
计算损失函数
反向传播计算偏导数
使用梯度下降或者先进的优化方法更新权值
对于所有的参数我们必须初始化它们的值
注意:它们的初始值不能设置成一样,比如都设置成0或1。 如果设置成一样那么更新后所有参数都会相等。即所有神经元的功能都相等,造成了高度冗余。所以我们必须随机化初始参数。
特别的,如果神经网络没有隐藏层,则可以把所有参数初始化为0。(但这也不叫深度神经网络了)
标准化(Normalization) 原因:由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行标准化处理,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
归一化处理,即将数据统一映射到[0,1]区间上。(最典型)
y = x − m i n m a x − m i n y=\frac{x-min}{max-min} y=max−minx−min
z-score标准化(零均值归一化zero-mean normalization): 经过处理后的数据均值为0,标准差为1(正态分布) 其中μ是样本的均值, σ是样本的标准差
y = x − μ σ y=\frac{x-μ}{σ} y=σx−μ
损失函数用于描述模型预测值与真实值的差距大小。
以下是两种常见的算法——均值平方差(MSE)和交叉熵。
均值平方差(Mean Squared Error,MSE),也称“均方误差”:
M S E = ∑ i = 1 n 1 n ( f ( x i ) − y i ) 2 MSE=\sum_{i=1}^{n}\frac{1}{n}(f(x_i)-y_i)^2 MSE=i=1∑nn1(f(xi)−yi)2
交叉熵(cross entropy)也是loss算法的一种,一般用在分类问题上。
表达意思为预测输入样本属于哪一类的概率。值越小,代表预测结果越准。
y代表真实值分类(0或1),a代表预测值
C = − 1 n ∑ x [ y l n a + ( 1 − y ) l n ( 1 − a ) ] C=-\frac{1}{n}\sum_{x}[ylna+(1-y)ln(1-a)] C=−n1x∑[ylna+(1−y)ln(1−a)]
损失函数的选取取决于输入标签数据的类型:
如果输入的实数、无界的值,损失函数使用MSE。
如果输入标签是位矢量(分类标志),使用交叉熵会更适合。
梯度∇f=(∂x1∂f;∂x2∂f;…;∂xn∂f):函数关于变量x的导数,梯度的方向表示函数值增大的方向,梯度的模表示函数值增大的速率。
不断将参数的值向着梯度的反方向更新一定大小,就能得到函数的最小值(全局最小值或者局部最小值)。
一般利用梯度更新参数时会将梯度乘以一个小于1的学习速率(learning rate),这是因为往往梯度的模还是比较大的,直接用其更新参数会使得函数值不断波动,很难收敛到一个平衡点(这也是学习率不宜过大的原因)。
θ t + 1 = θ t − α t ∇ f ( θ t ) θ_{t+1}=θ_t-α_t∇f(θ_t) θt+1=θt−αt∇f(θt)
学习率的相关知识点补充:
学习率是一个重要的超参数,它控制着我们基于损失梯度调整神经网络权值的速度(也就是学习步伐)
学习率越小,我们沿着损失梯度下降的速度越慢。
从长远来看,这种谨慎慢行的选择可能还不错,因为可以避免错过任何局部最优解,但它也意味着我们要花更多时间来收敛,尤其是如果我们处于曲线的至高点。
新权值 = 当前权值 - 学习率 × 梯度
∂ E ∂ w j k = − ( t k − o k ) ⋅ s i g m o i d ( ∑ j w j k ⋅ o j ) ( I − s i g m o i d ( ∑ j w j k ⋅ o j ) ) ⋅ o j \frac{∂_E}{∂_{w_{jk}}}=-(t_k-o_k)\cdot sigmoid(\sum_{j}w_{jk}\cdot o_j)(I-sigmoid(\sum_{j}w_{jk}\cdot o_j))\cdot o_j ∂wjk∂E=−(tk−ok)⋅sigmoid(j∑wjk⋅oj)(I−sigmoid(j∑wjk⋅oj))⋅oj
-(t_k-o_k)
:正确结果与节点输出结果的差值,也就是误差;
sigmoid(\sum_{j}w_{jk}\cdot o_j)
:节点的激活函数,所有输入该节点的链路把经过其上的信号与链路权重做乘积后加总,再把加总结果进行激活函数运算;
o_j
:链路w(jk)前端节点输出的信号值。
过拟合:给定一堆数据,这堆数据带有噪声,利用模型去拟合这堆数据,可能会把噪声数据也给拟合了。
缺点:造成模型比较复杂; 模型的泛化性能太差了,遇到了新的数据,用所得到的过拟合的模型,正确率是很差。
减少特征:删除与目标不相关特征,如一些特征选择方法 (也就是去除噪声)
Early stopping
更多的训练样本
重新清洗数据 (降噪)
Dropout (最新的算法):通过修改神经网络本身结构来实现的
Dropout步骤
在训练开始时,随机删除一些(可以设定为1/2,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变。
然后按照BP学习算法对ANN中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。这样一直进行,直至训练结束。
Dropout能减少过拟合的原因:
Dropout是随机选择忽略隐层节点,在每个批次的训练过程,由于每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以当做一个“新”模型;
隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现。
这样权值的更新不再依赖有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其他特定特征下才有效果的情况。
总结:Dropout是一个非常有效的神经网络模型平均方法,通过训练大量的不同的网络,来平均预测概率。不同的模型在不同的训练集上训练(每个epoch的训练数据都是随机选择),最后在每个模型用相同的权来“融合”。经过交叉验证,隐藏节点dropout率等于0.5的时候效果最好。
Dropout其它用法:可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)
Dropout缺点:训练时间是没有dropout网络的2-3倍。
面试会问整个过程,不需要计算,要能详细说出原理
如下图参数解释
第一层是输入层,包含两个神经元:i1,i2 和偏置b1;
第二层是隐藏层,包含两个神经元:h1,h2 和偏置项b2;
第三层是输出:o1,o2。
每条线上标的 wi是层与层之间连接的权重。
激活函数是 sigmod 函数。
我们用 z 表示某神经元的加权输入和;用 a 表示某神经元的输出。
步骤一:前向传播
然后带入激活函数输出ah1,同理可得神经元h2的输出ah2
(隐藏层→输出层)同理根据h1,h2计算输出层神经元o1和o2的值:
步骤二:反向传播
计算损失函数
E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E_{total}=\sum\frac{1}{2}(target-output)^2 Etotal=∑21(target−output)2
但是有两个输出,所以分别计算o1和o2的损失值,总误差为两者之和
(隐藏层→输出层)权值更新
以权重参数w5为例,用整体损失对w5求偏导得出w5对整体损失产生的影响
然后分别计算出每个式子的值,最后三者相乘,这样就算出整体损失E_total对w5的偏导值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
最后更新w5的值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
同理可更新w6w7w8
与上一步的权值更新步骤一样,区别是h1h2影响Eo1Eo2两个,所以要两个加起来
这样,反向传播算法就完成了,最后我们再把更新的权值重新计算,不停地迭代。
在这个例子中第一次迭代之后,总误差0.298371109下降至0.291027924。
迭代10000次后,总误差为0.000035085。输出为:[0.015912196, 0.984065734]