(一)神经网络与深度学习

一、概论

  1. 神经网络:
    神经元:◯表示非线性函数
    神经网络:像乐高积木一样堆叠神经元
  2. 用神经网络进行监督学习(目前神经网络的落地方向比较成熟)
    结构化数据(海量数据, 广告,赚钱)
    非结构化数据(图片、语音)
  3. 为什么兴起
    数据变多,计算机,算法
    image-20210110105251519

二、神经网络基础

  1. 符号标记

    image-20210110114746802

  2. logistic 回归

    回顾之前学习内容:参考线性回归:
    h θ ( x ) = g ( θ T x ) s i g m o i d 函 数 : g ( z ) = 1 1 + e − z h_\theta(x)=g(\theta^Tx)\\sigmoid函数:g(z)=\frac{1}{1+e^{-z}} hθ(x)=g(θTx)sigmoidg(z)=1+ez1

  3. 逻辑回归可以看作很小的神经网路哦image-20210110223130133
    image-20210111113901677
    image-20210111114219579
    image-20210111114429660

  4. 梯度下降法
    w : = w − α d w b : = b − α d b w := w - \alpha dw\\b := b - \alpha db w:=wαdwb:=bαdb

  5. 反向传播:

    image-20210111095721696

  6. 整体过程(使用两个for循环)
    image-20210111102055623

  7. 整体过程向量化(利用CPU和GPU的单指令流)



    image-20210111104804690
    image-20210111105426457
    image-20210111110000043

  8. python的broadcasting机制
    coding小技巧:reshape()来检验你的矩阵是否正确,有用而且几乎不费运行时间
    image-20210111111615139

    但是用不好很容易出现bug,一些编程小技巧:

    1. 不要使用秩为1的矩阵(5,),因为这种数据结构既不是行向量也不是列向量,转置是一个行向量,所以np.random.randn(5),np.random.rand(5,1)差别很大

    2. 如果不确定一个矩阵的大小,使用

      assert(a.shape == (5,1))
      
    3. np.multiply :数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致
      np.dot():对于秩为1的数组,执行对应位置相乘,然后再相加;
      对于秩不为1的二维数组,执行矩阵乘法运算;超过二维的可以参考numpy库介绍。
      星号(*)乘法运算:对数组执行对应位置相乘
      对矩阵执行矩阵乘法运算
      

三、浅层神经网络

  1. 网络结构图概览:
    image-20210111162630128

  2. 神经网络各个参数的表示:

    image-20210111163459895
    image-20210111164858031
    image-20210111165136904
    image-20210111171451457

  3. 激活函数的选择(自己尝试一下哎,怎么测试好坏呢,交叉验证集???)

    1. sigmoid函数
      σ ( z ) = 1 1 + e ( − z ) 导 数 : σ ( z ) ( 1 − σ ( z ) ) \sigma(z) = \frac{1}{1 + e^{(-z)}}\\导数:\sigma(z)(1 - \sigma(z)) σ(z)=1+e(z)1σ(z)(1σ(z))

    2. tanh函数==(是sigmoid的平移,但几乎在任何场合都比它优越,但在在二元分类输出层还是使用sigmoid,使其结果在0到1)==
      t a n h ( z ) = e z − e − z e z + e − z ( 在 − 1 和 1 之 间 取 值 ) 导 数 : 1 − ( t a n h ( z ) ) 2 tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} (在-1和1之间取值)\\导数:1-(tanh(z))^2 tanh(z)=ez+ezezez111(tanh(z))2

    3. relu函数–线性修正单元(解决1 2 的z很大时斜率接近于零问题,它的斜率为0到1)
      r e l u ( z ) = m a x { 0 , z } relu(z) = max\{0,z\} relu(z)=max{0,z}

    4. leaky relu,很少用(z为负的时候斜率很小但不为0)

  4. 为什么要使用激活函数?(引入非线性)

  5. 反向传播算法

    image-20210111204532085

  6. 随机初始化
    不能将参数全部初始化为0,原因如下:
    同一层的节点将会有相同的值,即隐藏层单元有同样的函数

    w = np.random.randn(2,2) * 0.01  \\是初始化值过大会使sigmoid函数接近零斜率小,变化慢
    b = np.zeros(2,1)
    

四、深层神经网络

  1. 符号标记:
    image-20210111213316265

  2. 核对矩阵维度:( 自己在纸上写一写)

  3. 为什么深度模型更好用

    image-20210111224707625
    image-20210111225031225

  4. 神经网络模块化:
    image-20210112092206842
    image-20210112093647591

    image-20210112093132008

  5. 参数和超参数:(保留交叉验证不断尝试)
    参数:W,b

    超参数:学习率,迭代次数,隐藏层数,隐藏单元,激活函数的选择
    后面要学的超参数:动量,批处理数,正则化参数

(二)改善深层神经网络

一、深度学习的实用层面

  1. 训练,测试,验证集(平时训练,模拟考试,考试)

    小数据集:6:2:2

    大数据集:100000个样本 98:1:1

    测试集和验证集最好有相同的分布

  2. 偏差和方差

    image-20210112220046395

  3. 机器学习基础
    image-20210112221442302

    偏差和方差的平衡 目前数据量足够网络足够深时可以做到都小

  4. 正则化:

    一般使用L2正则化(权重衰减矩阵)
    image-20210113092219341

    为什么使用正则化?

    w≈0,奥卡姆剃刀原理,消除一些隐藏单元的影响使网络不至于很复杂
    image-20210113093045473
    dropout是另一种正则化方法(反向随机失活)

    一个参数:keep-prob保留节点的概率
    image-20210113095330376

    • 这样做可以使节点不依赖于任何一个特征,因为这个特征可能会被dropout掉
    • 每一层参数不同可以设置不同的keep-prob值,参数多的值设置更小的值
    • 超参数少,通常应用于计算机视觉中
    • 画损失函数是否梯度下降时关闭Dropout,确保其单调递减后再打开dropout函数

    其他的正则化方法:

    • 数据增强:翻转,剪裁已有图片来扩增数据集

    • 早停法:缺点:不能同时减小方差和减小偏差,而L2正则化会有超参数需要调试

      image-20210113102247771

  5. 输入归一化,减少迭代时间,加速并使数值稳定,主要应用于两特征输入数值相差较大0.1-1,1-10000用就完了不会有伤害

    • 最大最小归一化
    • 正态分布归一化(一般采用)
    • l2归一化(稀疏矩阵)
  6. 梯度消失,梯度爆炸

    image-20210113111608398
    解决方法权重初始化(不能完全解决)

    image-20210113112712447

  7. 梯度检验:

    • 梯度的数值逼近

      image-20210113113706324

    • 梯度检验(检查是否反向传播有问题,可以节约很多时间)

      image-20210113114555560

    • 注意事项:

      1. 只在测试的时候使用梯度检验,在训练时不用,会减慢训练速度
      2. 如果发现有问题,怎么找到问题?追踪到相差比较大的层
      3. 注意正则化项
      4. 不能和梯度下降一同使用

二、优化算法:

作用:帮你快速训练模型

  1. mini-batch 梯度下降法(又一超参数)
    image-20210113145910352
    image-20210113150425365
    image-20210113150913715
    image-20210113151925198

    image-20210113151806998

  2. 指数加权平均
    image-20210113154625142
    计算指数加权平均只占单行数字的存储和内存,效率很高

    偏差修正:

    image-20210113160453227
    只在早期有修正效果

  3. 动量梯度下降法(一般快于标准梯度下降法)

    更加平缓: β \beta β的值一般设置为0.9

    image-20210113162418953

  4. RMSprop(root mean square prop)允许我们使用一个较大的学习率

    image-20210113165556817

  5. Adam==(RMSporp和Momentum的结合)推荐使用==

    image-20210113170600717

    一般设置参数如下:
    α 调 试 β 1 = 0.9 β 2 = 0.999 ε = 1 0 − 8 \alpha 调试\\ \beta1= 0.9\\ \beta2= 0.999\\ \varepsilon = 10^{-8} αβ1=0.9β2=0.999ε=108

  6. 学习率衰减

    • 方法一: α = α 0 1 + d e c a y r a t e ∗ e p o c h n u m \alpha = \frac{\alpha0}{1 + decayrate * epochnum} α=1+decayrateepochnumα0
    • 方法二: α = 0.9 5 e p o c h n u m ∗ α 0 \alpha = 0.95^{epochnum}*\alpha0 α=0.95epochnumα0
    • 方法三:离散衰减
    • 方法四:手动衰减
  7. 局部最优问题(优化算法面临的问题)

三、超参数调试

  1. 超参数的重要性排序:红色最重要,接着黄色,接着紫色Adma参数不用调

    随机均匀选择点

    image-20210113203431290

  2. 为超参数选择合适的范围

    • 区间两端点在同一量级则均匀随机选择
    • 区间两端点在不同量级,则取对数
      image-20210113204644862
    • image-20210113205136952
  3. 超参数搜索过程

    • 资源少硬件差:在一个模型上尝试
    • 硬件强:多个模型参数并行
      image-20210113210250831
  4. Batch 归一化

    对于逻辑回归:数据归一化为正态分布

    对于深度神经网络:对神经网络的隐藏层也要优化

    对于输入单元你想让平均值为0方差为1,对于隐藏层单元可以通过设置参数 γ , β \gamma,\beta γ,β得到合适的分布

    image-20210114150320947
    image-20210114152725275

    image-20210114154231555image-20210114154202460

    • 为什么batch norm有用?
      1. 加快网络训练
      2. 减少了输入值改变的问题,使这些值变得更稳定,后层网络更独立于前层参数
      3. 类似于Dropout,有稍微轻微的正则化作用

    image-20210114161220550

  5. softmax回归(完成多分类)

    特殊之处:输入一组数,输出一组数,其他激活函数都是输入一个数,输出一个数

    image-20210114163708159
    怎么训练带有softmax的模型

  6. 深度学习框架:(只需将正向传播写出,会自动求出反向传播)
    image-20210114172711048

  7. tensorflow(会画出计算图)

    image-20210114173940986

(三)机构化机器学习项目

一、ML策略(一)

可以调节的参数太多,怎么提高效率

  1. 正交化:每调节一个参数,只对一个方面造成影响,不然调节很困难

    image-20210114201911104

  2. 单数字评估指标:

    机器学习,你有一个idea,然后实现它,最后进行评估,评估时要使用一个指标衡量哪个模型好,而不是多个指标

    • 怎么设计这个单评估指标呢?

      满足和优化指标:共N个指标,对一个指标进行优化,对于另外N-1个指标只要满足不等式条件(即设置一个门槛)就不考虑它的具体大小。

  3. 训练、开发、测试集的划分:

    测试集和验证集要有相同的分布

    image-20210114211007419

    大小比例:
    image-20210114211558552

    对于test set 的大小,我们有时候不需要对系统有置信度很高的评价,甚至不单独分出测试集也是可以的

  4. 改变指标:

    对原来的指标评估的模型不满意要重新设计指标
    image-20210114214038346

  5. 可避免方差:(人类标记误差约等于贝叶斯方差),看出是高bias还是高variance,从而调节参数。

    image-20210114214805175

  6. 理解人的表现
    image-20210114215901050
    越接近人类水平越难

  7. 超过人类的表现:

    在超过人的表现时,进展越来越慢
    image-20210114221250809
    目前,超过人类的方面主要是有结构化数据,计算机视觉等非结构化数据的领域表现有待提高(即自然感知任务)

二、ML策略(二)

  1. 误差分析(虽然费时间,但很有必要。要迅速分析哪个方向是有希望的,不要玄学调参)

    如果你模型的准确率不高,查看100张你分错的图片分析问题
    image-20210114223149167

  2. 清楚标记错误的数据

    如果数据集很大则基本不需要修正标签,还是进行错误分析,看是否值得

    image-20210114224308747

    • 如果值得怎么修改呢?

      image-20210114224832028

  3. 快速搭建你的机器学习系统,然后不断迭代,不断改进

  4. 在不同的划分上训练并测试:

    image-20210115093031355

  5. 不匹配数据划分的偏差(训练,验证,测试集来自不同的分布)
    如果训练集和测试集来自不同的分布,而你训练好的模型在测试集上偏差不大,而在验证集上有较大偏差,则不能放心的说high variance。因为此时有两个变量:

    • 只见过测试集没见过开发集
    • 而开发数据集还来自不同的分布

    image-20210115101910269

    image-20210115102157658

  6. 解决数据不匹配问题

    • 人工分析理解测试,验证,训练集的不同

    • 训练更多相似于验证集和测试集的数据,那数据怎么来呢,可以人工合成数据(加入一些噪音)

      合成时注意过拟合问题,因为人类看起来很逼真,但实际不行

  7. 迁移学习(深度学习强大的地方可以将一个地方学到的知识应用于另外的地方,但你别期望效果有多好)

    应用于:原问题有很多数据,而迁移目标问题的数据量不多

    做法:重新训练神经网络的最后一层参数,甚至可以加几层用于训练。

    好处:训练更快,数据量需求小

    预训练和微调的概念:

    例子:图像识别应用于医疗放射科任务

  8. 多任务许学习
    (并行,试图让单个神经网络同时做几件事,每个任务都能帮助到其他任务,只要你的神经网络足够强大,就不会降低性能)

    例如:无人驾驶 ,同时要看,有没有行人,有没有车,有没有红绿灯,有没有交通标志,与softmax不同,不是只给图像一个标签,它要在一张图片上同时识别人、车、红绿灯、交通标志。

    应用:目标检测

    image-20210115113437896

  9. 端到端的深度学习(end-to-end deep learning):让数据说话,减少手工组件

    最大挑战:需要大量数据

    image-20210115115130400
    例子:门禁的人脸识别系统:

    先检测到人脸,放大剪裁人脸图像放到神经网络(没有足够数据时的做法)
    image-20210115120054737

    • ​ 你设计的可能不好,让算法自己找到更好的表示方法
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐