一、理念杂谈:
1、两大主题:
1)神经网络:一种受生物学启发的编程范式,能够让计算机从可观测数据中学习,模仿人类学习的过程;
2)深度学习:用于神经网络学习的一套强大的技术;
2、新的编程范式:神经网络是不同于以往的编程范式。传统的编程方法告诉计算机做什么,把大问题分解成许多小问题,明确任务,明确每一步,才能让计算机执行;神经网络不直接告诉计算机如何解决问题,而是让它从可观测的数据中学习,让它自己找出解决问题的方法。
3、三代神经网络的发展
1)感知机
上世纪五六十年代、拥有输入层、输出层和一个隐含层,主要是线性结构,只能实现简单的逻辑运算(与非门)
a)感知机:输入输出都是0,1
b)sigmoid神经元:输入输出都是0到1的任意值,通过sigmoid函数得到一个平滑的感知机,把输出的值映射到0-1之间。
sigmoid神经元相比于感知机可以改善:网络中的权重或者偏置做微小的改动,只会引起输出的微小的变化,这对于让拥有sigmoid神经元的神经网络正常学习至关重要。
2)多层感知机(NN)
上世纪八十年代,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。
可以输入一些非线性的结构,解决了之前无法模拟异或逻辑的缺陷。
3)深度神经网络
随着网络层数的增加,优化函数更容易陷入局部最优解,同时“梯度消失”现象逐渐加重。
为了克服梯度消失,ReLU、maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。单从结构上来说,全连接的DNN和图1的多层感知机是没有任何区别的。
深度神经网络三大算法:DNN,RNN,CNN
4、常用的神经网络学习算法
1)梯度下降算法(一种思想):模型最大化或者最小化的函数称为目标函数或者准则,当我们对其进行最小化时,我们称之为代价函数/损失函数/误差函数。
梯度下降算法就是求解损失函数的一阶导数,以便找到下降的最快的方向。
2)随机梯度下降算法:能够加速学习,思想就是通过随机选取少量的训练输入样本来计算梯度下降的方向。
一般的深度学习也都是分批训练的,随机选取一批量数据去训练,用完所有的训练输入就完成了一个轮epoch,接着就可以进行下一轮训练了。
6、常见的损失函数
1)平方损失函数(类似于最小二乘法,比较好理解)
2)交叉熵损失函数&最大似然函数:
PS:当使用sigmoid作为激活函数时,常使用交叉熵损失函数而不是均方误差损失函数,因为她可以解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新更快;误差小时,权重更新更慢”的特性。
补充.交叉熵函数与最大似然函数的联系和区别?
区别:交叉熵函数使用来描述模型预测值和真实值的差距大小,越大代表越不相近;似然函数的本质就是衡量在某个参数下,整体的估计和真实的情况一样的概率,越大代表越相近。
联系:交叉熵函数可以由最大似然函数在伯努利分布的条件下推导出来,或者说最小化交叉熵函数的本质就是对数似然函数的最大化。
7、反向传播算法
前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵,这样权重得以在信息双向流动中得到优化。
一些概念:
超参数:在开始学习之前设置的参数,而不是通过训练得到的参数数据(比如感知机的权重和偏置)。
8、正则化技术-防止过拟合
1)L2正则
在原有损失函数的基础上加上L2正则:权重的平方和一个因子
L2正则惩罚大的权重,倾向于让神经网络优先选择较小的权重,使得模型更加简单。
2)L1正则
在原有损失函数的基础上加上L1正则:权重的绝对值和一个因子
L1正则倾向于将神经网络的权重聚集在相对少量的重要连接上,而其他权重会趋近于0,因而更适合稀疏数据。
3)Dropout
随机丢弃不同的神经元集合,有点像训练不同的神经网络,因此随机丢弃过程把不同的神经网络的效果平均了。
4) 增大训练集
9、梯度消失与梯度爆炸
1)梯度消失
现象:前面几层的权重几乎不变,仍然接近初始值,这时深层神经网络就等价于只有后几层的潜层神经网络了。使用sigmoid时,更容易出现梯度消失现象。
原因:深度神经网络+反向传播机制:网络太深,网络权重更新不稳定,就容易出现梯度消失现象
措施:
a:用ReLU、LeakyRelu、Elu等激活函数代替sigmoid激活函数
【原因】
sigmoid函数收敛缓慢,计算量大;
反向传播是,很容易出现梯度消失的情况;
b:batch normorlization
c:残差网络(ResNet)
参考:
梯度消失、梯度爆炸及其解决方法_u011734144的专栏-优快云博客_梯度爆炸
2)梯度爆炸
现象和原因:前面层的神经网络的权重很大,后面的层指数级增加大,最后计算出的梯度就会很大,如果以这个梯度值进行更新,那么这次迭代的步长就很大,一下子超出合理的区域。
措施:
a:梯度裁剪:更新梯度时,如果梯度超过一个阈值,就将其限制在一定范围内;
b:正则
10、常见的深度神经网络算法
1)DNN:dnn相比于nn(神经网络)相比最大的不同就是层数增多了(多了一些隐藏层),并解决了模型可训练的问题。
弊端:只能看到预先设定长度的数据,对于语音和语言等前后相关的时序信号表达能力不强,因此出现了RNN。
2)RNN:在普通的全连接网络中,DNN的隐层只能够接受到当前时刻上一层的输入,而在RNN中,神经元的输出可以在下一时间段直接作用到本身。换句话说,就是递归神经网络它的隐层不但可以接收到上一层的输入,也可以得到上一时刻当前隐层的输入。
这一个变化的重要意义就在于使得神经网络具备了历史记忆的功能,原则上它可以看到无穷长的历史信息,这非常适合于像语音语言这种具有长时相关性的任务。
3)CNN:卷积神经网络主要是模拟人的视觉神经系统提出来的。卷积神经网络的结构依旧包括输入层、卷积层、池化层和输出层(全连接层+softmax层)。
输入层到隐含层的参数瞬间降低到了卷积核的大小*卷积核的个数。
通过卷积核池化,使得CNN模型限制参数了个数并挖掘了局部结构的这个特点
提出:全连接DNN的结构里下层神经元和所有上层神经元都能够形成连接,带来的潜在问题是参数数量的膨胀。
相比于DNN:
1)CNN的卷积层用来提取特征——压缩提纯的作用;
2)CNN卷积层级之间的神经元是局部连接和权值共享的,这样就大大减少了参数量(w,b)。
所以CNN一般比DNN要快,更小的参数量。
参考:
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? - 知乎
11、ResNet(残差网络)
参考:深度残差网络——ResNet学习笔记 - 我的明天不是梦 - 博客园
12、激活函数
1)为啥要使用激活函数
a. 不使用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
b. 使用激活函数,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以利用到更多的非线性模型中。
2)激活函数要满足的性质
1. 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参 数。
2. 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。
3)常见的激活函数
a.sigmoid
这个函数在伯努利分布上非常好用,
可以看到在趋于正无穷或负无穷时,函数趋近平滑状态,sigmoid函数因为输出范围(0,1),所以二分类的概率常常用这个函数,事实上logisti回归采用这个函数很多教程也说了以下几个优点
1 值域在0和1之间
2 函数具有非常好的对称性
函数对输入超过一定范围就会不敏感
sigmoid的输出在0和1之间,我们在二分类任务中,采用sigmoid的输出的是事件概率,也就是当输出满足满足某一概率条件我们将其划分正类;
另外LSTM的遗忘门也是用了sigmoid函数,1为记忆,0位遗忘;
b.tanh
sigmoid和tanh激活函数有共同的缺点:即在z很大或很小时,梯度几乎为零,因此使用梯度下降优化算法更新网络很慢。
c.relu
可以解决梯度消失的问题!