机器学习与深度学习

深度学习

        1.采样、反卷积

        3.神经网络不收敛

        4.优化器和优化算法

        7.多任务学习

        8.文本分类不均衡问题

机器学习

        5. Flocal Loss

        6.文本分类数据不均衡

        9.集成学习

        10.K-means

        11.KNN

        12.AUC曲线

工程

        2.分布式训练

1. 采样、反卷积

(下采样就是抽取、上采样就是插值)

通常所说的采样指的是下采样,也就是对信号的抽取。其实,上采样和下采样都是对数字信号进行重采,重采的采样率与原来获得该数字信号(比如从模拟信号采样而来)的采样率比较,大于原信号的称为上采样,小于的则称为下采样。上采样的实质也就是内插或插值。

下采样的定义:对于一个样值序列间隔几个样值取样一次,这样得到新序列就是原序列的下采样。下采样就是抽取,是多速率信号处理中的基本内容之一。

上采样是下采样的逆过程,也称增取样(Upsampling)或内插(Interpolating) 。增取样在频分多路复用中的应用是一个很好的例子。如果这些序列原先是以奈奎斯特频率对连续时间信号取样得到的,那么在进行频分多路利用之前必须对它们进行上采样。

下采样原理:对于一副图像I尺寸为M*N,对起进行s倍下采样,即得到(M/s)*(N/s)尺寸的分辨率图像,当然,s应该是M和N的公约数才可以,如果考虑是矩阵形式的图像,就是把原始图像s*s窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值。

上采样原理:图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。插值算法还包括了传统插值,基于边缘图像的插值,还有基于区域的图像插值。

上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling),我们这里只讨论反卷积。这里指的反卷积,也叫转置卷积,它并不是正向卷积的完全逆过程,用一句话来解释:

  • 反卷积是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核,再进行正向卷积。

参考:反卷积(Transposed Convolution)详细推导

反卷积只能恢复尺寸,不能恢复数值。(反卷积就是填充0, 再通过卷积核正向卷积的过程)

负采样(Negative Sampling): 选择一个正样本,随机采样K个负样本

参考:负采样(Negative Sampling)

过采样和欠采样

欠采样和过采样解决分类样本不平衡问题 

欠采样和过采样 - 知乎 (zhihu.com)

2. 分布式训练

数据并行、模型并行

一文说清楚Tensorflow分布式训练必备知识 - 知乎 (zhihu.com)

pytorch中的分布式训练之DP VS DDP - 知乎 (zhihu.com)

pytorch中的有两种分布式训练方式,一种是常用的DataParallel(DP),另外一种是DistributedDataParallel(DDP),两者都可以用来实现数据并行方式的分布式训练,DP采用的是PS模式,DDP采用的是ring-all-reduce模式,两种分布式训练模式主要区别如下:

  • DP是单进程多线程的实现方式,DDP是采用多进程的方式
  • DP只能在单机上使用,DDP单机和多机都可以使用
  • DDP相比于DP训练速度要快

分布式训练架构(略)

3. 神经网络不收敛的常见问题

神经网络不收敛的11个常见问题 - 知乎 (zhihu.com)

My Neural Network isn't working! What should I do?

  • 没有对数据进行归一化
  • 忘记检查输入和输出
  • 没有对数据进行预处理
  • 没有对数据正则化
  • 使用过大的样本
  • 使用不正确的学习率
  • 在输出层使用错误的激活函数
  • 网络中包含坏梯度
  • 初始化权重错误
  • 过深的网络
  • 隐藏单元数量错误

4. 优化器和优化算法

鞍点:【最优化】鞍点介绍 - 知乎 (zhihu.com)

  • 极值点:一阶导数等于0;
  • 驻点:二阶导数等于0;
  • 鞍点:目标函数在此点上的梯度(一阶导数)值为0,但从该点出发的一个方向是函数的极大值点,而在另一个方向是函数的极小值点;

深度学习——优化器算法Optimizer详解​​​​​​

梯度下降法:BGD、SGD、MBGD

梯度下降法的缺点:

  • learning rate如果选择的太小,收敛速度会很慢;如果太大, loss function就会在极小值处不停地震荡甚至偏离。(梯度下降法在鞍点或者局部最小点震荡跳动)。
  • SGD对所有参数更新时使用相同的learning rate, 倘若数据是稀疏的,对出现频率低的特征进行大一些的更新,LR会随着更新的次数逐渐变小。

指数加权平均、偏差修正

指数加权平均算法介绍及偏差修正

梯度下降法中使用动量:

  • Momentum
  • NAG

Adagrad:Deep Learning 最优化方法之AdaGrad - 知乎 (zhihu.com) 积累平方梯度, 每次通过全局学习率逐参数得除以历史梯度平方和得平方根,使得每个参数得学习率不同。

Adadelta:

7.7. AdaDelta算法 — 《动手学深度学习》 文档 (gluon.ai)

AdaDelta算法

没有学习率这一超参数。AdaDelta维护一个额外的状态变量delta_t, 其元素同样在时间步0时被初始化为0,然后通过delta_(t-1)来更新delta_t。

RMSprop: 7.6. RMSProp算法 — 《动手学深度学习》 文档 (gluon.ai)

  • RMSProp算法和AdaGrad算法的不同在于,RMSProp算法使用了小批量随机梯度按元素平方的指数加权移动平均来调整学习率。

Adam: 是RMSProp和动量法的结合

如何理解Adam算法(Adaptive Momentum Estimation)?

7.8. Adam算法 — 《动手学深度学习》 文档 (gluon.ai)

几种常见的优化算法

常见的几种优化算法

  1. 梯度下降法
  2. 牛顿法和拟牛顿法
  3. 共轭梯度法
  4. 启发式优化算法
  5. 解决约束优化问题--拉格朗日乘数法

最优化方法是一种数学方法,是研究在给定约束之下如何求某些因素的量,以使某一指标达到最优的学科总称。大多数问题可以建模成一种最优化模型进行求解。机器学习算法的本质:建立优化模型, 通过最优化方法对目标函数(损失函数)进行优化,从而训练出最好的模型。常见的最优化方法有梯度下降法牛顿法和拟牛顿法共轭梯度法启发式优化算法拉格朗日乘数法等等。

梯度下降法:当前位置负梯度方向作为搜索方向。当目标函数是凸函数时,梯度下降法的解是全局解。

梯度下降法的缺点

  • 靠近极小值时收敛速度减慢
  • 直线搜索时可能会产生一些问题
  • 可能会“之字形”地下降
  1. 批量梯度下降 -- 最小化所有训练样本的损失函数, 使得最终求解的是全局最优解, 即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。
  2. 随机梯度下降 -- 最小化每条样本的损失函数, 虽然不是每次迭代得到的损失函数都是朝着全局最优方向,但是大的整体方向是向着全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况

牛顿法和拟牛顿法

牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f(x)的泰勒级数的前面几项来寻找方程的根。牛顿法最大的特点就在于其收敛速度很快。

牛顿迭代法公式:x_{n + 1} = x_{n} - \frac{f(x_{n})}{f^{'}(x_{n})}, 牛顿法又称切线法。

本质上而言,牛顿法是二阶收敛,梯度下降是一阶收敛, 因而牛顿法收敛更快。从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

牛顿法的优缺点总结:

  • 优点:二阶收敛、收敛速度快
  • 缺点:牛顿法是一种迭代算法, 每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂

最优化问题 -- 线性优化(最优化问题-线性优化(LP))

非线性优化问题:是针对一个非线性函数求最值的问题。

拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。

常用的拟牛顿法有DFP算法和BFGS算法, 使用正定矩阵来近似Hessian矩阵的逆(尚不懂拟牛顿法

共轭梯度法(Conjugate Gradient)

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。

在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小稳定性高,而且不需要任何外来参数。(尚不懂共轭梯度法)

启发式优化算法

模拟退火法、遗传算法、蚁群算法、粒子群算法等。

还有一种特殊的优化算法被称之多目标优化算法,它主要针对同时优化多个目标(两个及两个以上)的优化问题,这方面比较经典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。

拉格朗日乘数法

作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。

如何将一个含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题?拉格朗日乘数法从数学意义入手,通过引入拉格朗日乘子建立极值条件,对n个变量分别求偏导对应了n个方程,然后加上k个约束条件(对应k个拉格朗日乘子)一起构成包含了(n+k)变量的(n+k)个方程的方程组问题,这样就能根据求方程组的方法对其进行求解。

5. Focal loss

Focal Loss的引入主要是为了解决难易样本数量不平衡(注意,有区别于正负样本数量不平衡)

相比于交叉熵损失, focal loss对于分类不准确得样本,损失没有改变。对于分类准确的样本,损失会变小。整体而言,相当于增加了分类不准确样本在损失函数中的权重。因此focal loss相当于增加了难分样本在损失函数的权重,使得损失函数倾向于难分的样本,有助于提高难分样本的准确度。

focal loss 通俗讲解 - 知乎 (zhihu.com)

5分钟理解Focal Loss与GHM——解决样本不平衡利器​​​​​​

6.文本分类数据不均衡

文本分类数据不均衡的问题:

  • 数据方面处理
  • 加权的损失函数
  • 评估指标

​​​​​​数据集样本类别不均衡时,训练测试集应该如何做

如何解决NLP分类任务的11个关键问题:类别不平衡&低耗时计算&小样本&鲁棒性&测试检验&长文本分类 - 知乎 (zhihu.com)

7. 多任务学习

收藏|浅谈多任务学习(Multi-task Learning) - 知乎 (zhihu.com)

8.NLP文本分类系列问题 

数据增强(EDA+对抗训练)/数据去噪/类别不平衡/半监督学习UDA/模型轻量化 - 知乎 (zhihu.com)

9.集成学习

参考:集成学习-Boosting,Bagging与Stacking - 知乎 (zhihu.com)

集成学习,要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的准确性,即学习器不能太坏,并且要有“多样性”(diversity),即学习器间具有差异。

根据个体学习器生成方式的不同,目前集成学习方法大致可分为两大类

第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成的序列化方法,代表算法是boosting系列算法。

第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林(Random Forest)系列算法。

Boosting系列算法里最著名算法主要有AdaBoost算法提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)

Bagging的个体弱学习器的训练集是通过随机采样得到的。随机采样一般采用的是自助采样法(Bootstap sampling)。随机森林(Random Forest,简称RF)是Bagging的一个扩展变体。其在以决策树作为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。

Stacking的集成方法

集成学习总结 & Stacking方法详解

Stacking:集成学习策略图解

10. K-means 

KMeans聚类算法详解 - 知乎 (zhihu.com)

手撕K-means的代码

import numpy as np
import random
import matplotlib.pyplot as plt
import torch

def kmeans(data, k, max_time = 100):
    n, m = data.shape
    ini = torch.randint(n, (k,))    #只有一维需要逗号
    midpoint = data[ini]

    time = 0
    last_label = 0

    while(time < max_time):
        d = data.unsqueeze(0).repeat(k, 1, 1)   #shape k * n * m
        mid_ = midpoint.unsqueeze(1).repeat(1, n, 1)    #shape k * n * m
        dis = torch.sum((d - mid_) ** 2, 2)     #计算距离
        label = dis.argmin(0)   #依据最近距离标记label
        if torch.sum(label != last_label) == 0:
            return label
        last_label = label
        for i in range(k):
            kpoint = data[label == i]
            if i == 0:
                midpoint = kpoint.mean(0).unsqueeze(0)
            else:
                midpoint = torch.cat([midpoint, kpoint.mean(0).unsqueeze(0)], 0)
        time += 1

    return label

data1 = torch.randn(100, 2) + 6
data2 = torch.randn(100, 2) + 5
data = torch.cat([data1, data2], 0)

t = kmeans(data, 2).float().unsqueeze(1)

data = data.numpy()
color = list(t.numpy())

color = [(lambda x : 'r' if x == 0 else 'g')(i) for i in color]

plt.scatter(data[:, 0], data[:, 1], color = color)
plt.show()

11.KNN算法

Python—KNN分类算法(详解) - 知乎 (zhihu.com)

11.核函数

机器学习中的核函数与核方法

12.AUC曲线

模型评估指标(AUC值)、精确率和召回率、混淆矩阵、ROC曲线,AUC值

模型评估指标AUC​​​​​​

精确率和召回率 

你可能感兴趣的:(机器学习,人工智能,深度学习)