对鱼书的一些地方做做摘抄


1.激活函数:
阶跃函数:超过阈值就切换输出,如大于0输出1,小于0输出0
sigmoid:1/(1+np.exp(-x)),平滑
ReLU: x(x>0); 0(x<=0)
2.恒等函数与softmax函数:
①恒等函数:直接按原样输出
②softmax函数:常用于分类任务,y_k = exp(a_k)/ Σexp(a_i)
特别的,如果softmax中运算的数值特别大,容易出现溢出问题
做法:在分子分母的a上加(减)一个常数C,得到的结果不变(数学问题)
softmax的输出总是0.0-1.0的实数,因此可以解释为:“概率”,但大小关系不改变
3.正规化,归一化(normalization)
把数据限定到某一个范围内的处理,比如都除以255,使输入在0.0-1.0之间
4.预处理
利用数据的整体均值或者标准差,移动数据,使整体以0为中心分布;或者正规化把数据延展控制在一定的范围之内;将数据整体的分布形状均匀化(数据白化)
5.批处理(batch)
打包式的输入数据,对计算机的运算大有利处,可以大幅缩短每张图片的处理时间。因为大多数处理数值计算的库都进行了能够高效处理大型数组运算的最优化,并且批处理可以减轻数据总线的负荷,将更多的时间用在计算上而不是数据传送上。
6.损失函数(loss)
①均方差损失(MSE):E=0.5 * Σ(y_k - t_k),回归任务经常使用
或者E=1/n * Σ(y_k - t_k) , n为一个batch中的样本数
第一个公式并不叫 “MSE”(严格来说),而是叫 “平方误差损失”(squared error loss),前面加了 0.5纯粹是为了数学上的便利。
②交叉熵误差
在这里插入图片描述
当t使用独热编码,只有一个t是1,其他都为0.其他对误差没有任何的贡献
所以:交叉熵误差的值是由正确解标签对应的输出结果所决定的
return -np.sum(t * np.log(y+1e-7))
y+1e-7:防止np.log(0)出现负无穷大的情况
7.为什么需要用损失函数,不用精度:
如果以精度作为指标,则参数的导数会在绝大多地方都会变成0!!
识别精度对微小的参数变化基本没有什么反应,即便有反应也不是连续的,突然的变化。比如现在精度32%,调参不会使其变成32.0123.%,大概率还是32%,即便有变化也是33%,35%等不连续,离散的值。而损失函数就能做到连续
同样的,sigmoid比阶跃函数更适合作为激活 函数
8.有关梯度:
梯度就是由所有一阶偏导数组成的列向量。
梯度法:Ⅰ梯度下降法(最小值) Ⅱ梯度上升法(最大值)
梯度表示的是各点处函数值减小最多的方向,但是无法保证梯度所指的方向就是真正应该前进的地方,因此要以梯度为线索,决定前进的方向
在这里插入图片描述
学习率η:过大则会发散成一个很大的值,过小则没怎么更新就结束了
9.epoch
epoch是一个单位,表示学习中所有训练数据均被使用过(全部看过一遍)一次的更新次数
每经过一个epoch,就对所有训练数据和测试数据计算识别精度并记录。
如果在for循环中每一次都计算精度,会花费太多时间,只需要定期把握大方向就好
loss是每一个batch就记,用于更新梯度,而训练和测试的acc精度每一个epoch记一次就好了
10.反向传播
反向传播是基于链式法则的,从右至左传递信号:先将节点的输入信号乘以节点的偏导数,,然后再传递给下一个节点
加法层:事实上不用做任何处理,直接传即可
乘法层:翻转,如x * y,对x求偏导得到y,对y求偏导得到x,那么处理乘法层只需要乘翻转的因子就可以
特别注意矩阵乘法的反转:
比如有X * W:对X求偏导是右乘W的转置,对W求偏导是左乘X的转置
X和对X求偏导形状相同,Y和对Y 求偏导形状相同
其余函数层:正常求偏导
P139,P141详细给出了RELU层和Sigmoid层的反向传播过程
11.完美的组合
使用交叉熵误差作为Softmax函数的损失函数,反向传播后,softmax输出(y1-t1,y2-t2,y3-t3)这样“漂亮的结果”,是正向Softmax输出与监督标签的差分,可以直截了当的表示误差
回归问题中,平方和误差作为恒等函数的损失函数,也可以得到如此“漂亮的结果 ”
12.参数优化方法

  • SGD(随机梯度下降法)
    W <— W - η × L对W偏导
    特点:简单且容易实现,但是处理某些问题效率不够
    如果函数的形状非均向,比如延申状,搜索的路径会非常低效,呈“之”字型移动,或者是说,梯度的方向没有指向最小值的方向
    改进:Momentum,AdaGrad,Adam
  • Momentum(动量)
    在参数更新时,不仅考虑当前的梯度,还累积之前更新的方向(即“速度”),从而获得更平滑、更快的收敛路径。
    在这里插入图片描述
    g:损失函数关于W的梯度
    v:物理上的速度
    av:物体不受任何力时,该项承担使物体逐渐减速的任务(比如a=0.9,代表动量),对应物理上的地面摩擦力或者阻力
    ①式说明:物体在梯度方向上受力,在这个力的作用下,物体速度增加这一物理法则
  • AdaGrade(适当梯度)
    会为参数的每个元素适当的调整学习率,与此同时进行学习
    学习率衰减(learning rate decay):随着学习的进行,学习率不断减少,就是一开始“多”学,然后逐渐“少”学。
    在这里插入图片描述
    在更新参数时,通过成h的式子 ,就可以调整学习的尺度
    圆圈符号代表矩阵元素的乘法
    事实上,AdaGrad会记录过去所有梯度的平方和,因此学习越深入,更新的幅度就会越小,可以用RMSProp方法改善,它能逐渐的遗忘过去的梯度,从专业上讲叫做“指数移动平均”,呈指数函数式的减小过去梯度的尺度
    h会加一个微小值(比如1e-7),为了防止0做除数
  • Adam
    将以上两种结合得到实现参数空间的高效搜索

13.权重的初始值
※为什么初始化参数不能都是0?为什么不能都初始成一个值?
首先,为了权值衰减来避免过拟合,提高泛化能力,一开始把权重的值设为较小的数才是正途。但是不能全为0,或全为一样的值。
这是因为在误差反向传播法中,所有权重值都会做相同的更新,最后权重更新完也是相同的,这使神经网络拥有许多不同权重的值的意义丧失了。
为了防止“权重均一化”,必须随机生成初始值:
比如0.01 * np.random.randn(10,100),使用高斯分布生成的值乘0.01
14.梯度消失
梯度消失是指:若使用 Sigmoid ,tanh等激活函数,在训练深层神经网络时,反向传播过程中梯度逐层变小,趋近于零,导致靠近输入层的参数几乎无法更新,从而使网络难以有效训练。
15.线性函数的权重初始值
以sigmoid为例:
如果高斯分布的标准差为1,各层的激活函数输出结果基本会偏向0和1分布,而这时的导数值逐渐接近于0,所以在反向传播中这些数据梯度的值会逐渐变小导致梯度消失。
如果高斯分布的标准差为0.01,各层激活函数输出结果集中在0.5附近,即激活值的分布有偏向,表现力可不好(因为所有都相同那和只用一个没区别),于是“表现力受限”。我们要求各层激活值分布要具有一定的广度。
Xavier初始值的解决办法:如果前一层的节点数为n,则初始值用1/sqrt(n)为标准差
16.ReLU的权重初始值
通常使用He初始值如果前一层的节点数为n,则初始值用sqrt(2/n)为标准差
17.Batch Normalization
优点有三:快速进行学习,不那么依赖初始值,抑制过拟合
能够调整各层激活值分布使其具有适当的广度
以进行学习时的mini-batch为单位,按mini-batch进行正规化
具体而言就是进行使数据分布的均值为0,方差为1的正规化,最后对正规化后的数据进行缩放和平移的变换(参数需要学习)
通过把这个处理放到激活函数的前面(后面),减小数据分布时的偏向
18.正则化
发生过拟合,泛化能力不足的原因
①模型具有大量参数,表现力强 ②训练数据少

  • 权值衰减
    在学习过程中对大的权重进行惩罚,来抑制过拟合。
    为损失函数加上权重的平方范数(L2范数)的一半,可以抑制权重变大
    ·ʎ:控制正则化的超参数,越大表明惩罚越重
    1/2是为了方便求导成ʎW

相当于给权重加了一个“阻力”,不让他跑太远,且权重值越大,惩罚项越大,把权重拉回0的力越大
对一个向量 w=[w1,w2,…,wn],,我们需要一个统一的数字来表示它整体的“大小”,在深度学习中主要用于控制模型复杂度、稳定训练过程、防止过拟合与梯度异常。——这就是范数
L2范数:各个元素的平方和的开方
L1范数:各个元素绝对值之和
L∞范数:各个元素绝对值中最大的那个

  • Dropout
    如果网络的模型变得复杂,权重衰减难以应付,引入Dropout来抑制过拟合
    旨在学习过程中随机删除神经元:正向传播时传递了信号的神经元,反向传播时按原样传递信号,正向传播时没有传递信号的神经元,反向传播时信号会停在那里
    相当于集成学习

19.超参数的验证
不能用测试集验证超参数的性能,会导致测试数据发生“过拟合”
正确做法:使用专门的验证数据来评估超参数的好坏
方法:逐渐缩小“好值”的存在范围
20.全连接层网络与CNN网络的对比
全连接层(Affine):
Affine+ReLU->Affine+ReLU->Affine+ReLU->…->Affine+Softmax
CNN:
Conv+ReLU+(Pooling)->Conv+ReLU+(Pooling)->…->Affine+ReLU->Affine+Softmax
21.为什么卷积的时候需要有填充Padding?
主要是为了调整输出的大小。不加填充的话输出会不断缩小,如果反复进行多次卷积运算会成为问题,因为某个时刻输出大小有可能变成1,导致无法再应用卷积运算。
22.卷积操作如何计算输出大小?
设输入大小(H,H),滤波器大小(F,F),填充P,步幅S
则输出大小=(H+2P-F)/S + 1
如果是3维数据卷积,输入数据的通道数要与滤波器的设为相同的值
有几个滤波器(注意是个数不是维度),得到的特征图就有几个

  • 滤波器的写法
    三维:(通道数channel,高度height,长度width)
    四维:(滤波器数output_channel,通道数input_channel,高度height,长度width)
  • 批处理的写法
    在各层间传递4维数据,可以对N个数据进行批处理
    (batch_num,channel,height,width)
    将N次的处理汇总成了1次进行
    23.池化层
    池化是缩小高、长方向上的空间的运算
  • 特征:
    不用学习参数,因为只用Max或者Average
    通道数在经过池化运算后不发生变化
    对输入数据微小的位置变化具有鲁棒性

24.CNN可视化

  • 对中间层权重的可视化
    我们将训练好的卷积核权重数值直接提取出来,按照其通道顺序排列,转化为像素值进行显示。通常主要可视化第一层卷积层(Conv1)的权重
    CNN可视化”中的卷积核可视化,本质上就是把滤波器里的数学参数“翻译”成我们能看懂的图像,本质就是滤波器
    最后得到灰度图像,主要观察它的:边缘(颜色变化的分界线),斑块(局部的块状区域)
    未学习时,黑白的浓淡上没有规律可循,但是学习之后就变成了有规律的图像,如p229,不同样子的图像(滤波器)对不同方向上的图像有响应
    层数一多,提取的信息也越来越复杂,抽象,对物体类别的响应越来越“细”,比如第3层对纹理响应,第8层对狗响应

25.CNN加深层的动机

  1. 减少网络中的参数量
    与没有加深层的网络相比,加深层的网络可以用更少的参数达到同样的水平的表现力
    eg:5×5的输入,输出1×1,参数量:(5-1+1)²=25
    5×5的输入,中间层3×3,输出1×1,参数量:(5-3+1)²×(3-1+1)²=18
    叠加小型滤波器可以减少参数的数量,扩大感受野
  2. 使学习更加高效
    通过加深层,减少了学习数据。比如分层次的学习,分层次的传递信息,即将复杂的问题进行拆分
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐