全连接神经网络就是把线性分类器级联起来。
在平面上是非线性划分区域。
W1的行数不要求和最终的类别数一样,而是由人为指定,这样的话可以增加模板数,从而达到更加精确的判断。(比如增加马的模板,判断更多情况)
但是最终输出的W2则要求和最终的类别数一样。
N层全连接神经网络: 除了输入层,所有的层数(包括输出层)。每个输入和每个模板都有关(全连接)。
-
如果没有激活函数max,全连接网络还是一个线性分类器.
-
设计神经网络的深度和宽度就是设计分类划分方式。
常用的激活函数
- Sigmoid: 小于某个值→0;大于某个→1。
- tanh: 同样→1;→-1。⭐️对称
- ReLU(max): 把小于0的变为0。
- Leaky ReLU: 小于零→0.1x,变成接近0但不是0。
区分激活函数和数据预处理: 激活函数是对神经元作用的。
softmax操作:得到可能是某个结果的概率。
目的:得到模型预测结果,比较和真正的结果之间的距离——交叉熵损失。
?为什么用交叉熵
因为真实结果是one-hot向量[1,0……],本身的熵=零。又 交叉熵=熵+相对熵(也叫KL散度),所以直接用交叉熵度量真实结果和预测结果之间的KL不相似程度。
结果不是 onehot,则用相对熵。
损失衡量的比较
交叉熵比多类支撑向量机,还多了衡量结果更好还是更坏,能通过反馈进一步提升模型的精度。
总结softmax:
- 能把结果转化为概率。
- 衡量和真正结果的交叉熵损失,提升精度。
计算图
把函数用计算图表示。
节点储存 前向的函数&后向的雅各比矩阵。
计算梯度: 节点的局部梯度×上游梯度。→链式法则
要注意有的框架有直接打包的函数,能直接算梯度,不用分成小元计算→颗粒度问题。
梯度问题
-
梯度消失: 比如sigmoid函数的导数范围在[0-0.25],很小,多次梯度之后的值变得很小→0,对计算梯度很不利。
其他函数:
总结:尽量选择ReLU或 Leakly ReLU函数,让梯度流更加流畅。 -
梯度爆炸
尽量选择ReLU或 Leakly ReLU函数,让梯度流更加流畅。
梯度算法改进
问题:速度慢,精度低,会形成震荡。
改进:
动量法;自适应梯度和RMSProp;ADAM
-
动量法: 累加历史梯度,改变速度。
即使新的梯度g=0,累加值v≠0,也能继续走下去。
设置μ=1,会永远走下去;所以μ=0.9,渐渐衰减下去。
作用:防止鞍点和局部最小。 -
自适应: 不同方向迈不同步长。累加历史梯度平方。
r记录历史的梯度,当历史较小说明是平坦方向,那么w减去的值的系数就较大。
问题:多次累积后r太大,调节的值接近0。
- RMSProp
ρ: 越大,考虑的历史值越多。
- Adam
修正项: 保证初期,r=0, μ(历史的影响比例)=0.9, v(梯度g)也很大,而不是缩小到梯度的0.1。而在多次循环之后,这个修正项就不需要起作用了。
实际: 动量法+SGD调参数。结果好但是难调。
ADAM快
总结核心: 改变步长或者学习率。
权值初始化
对一些函数:
结论: 只要权值从 均值=0,方差=1/n的高斯分布来采样,输出值就和输入的方差一样,分布也一样。
对另一种函数:
批归一化(Batch normal)
直接对输出 减均值,除方法。
这里x就是输出(零均值1方差), y是再进行平移缩放(根据学习到的均值方差再次进行所需要的平移)。
权值初始化和批归一化都是为了让梯度流不断,更流畅
过拟合
开始背特定例子的答案,而不是学习规律。
解决方法:
- 约束模型储存的参数个数——正则化。
惩罚极端数值,让所有参数参与进来,分界面不会很复杂,更平滑。 - 随机失活(Dropout)
解释:
2.不要把鸡蛋放到一个篮子里。
3.是多个小网络集成。
问题: 测试的时候没有dropout,用所有的神经元。而训练阶段则会dropout,此时输出=原来×一个比例。