【计算机视觉】计算机视觉与深度学习-03-全连接神经网络-北邮鲁鹏老师课程笔记

【计算机视觉】计算机视觉与深度学习-03-全连接神经网络-北邮鲁鹏老师课程笔记,第1张

计算机视觉与深度学习-03-全连接神经网络-北邮鲁鹏老师课程笔记
  • 本节大纲
  • 图像表示
  • 线性不可分
  • 分类模型
    • 多层感知器(全连接神经网络)
    • 全连接神经网络的权值
      • 线性分类器权值vs全连接神经网络权值
    • 全连接神经网络绘制与命名
    • 激活函数
      • 为什么需要非线性 *** 作(激活函数)?
      • 激活函数 vs 数据预处理
      • 常用激活函数
        • Sigmoid
        • tanh
        • ReLU
        • Leaky ReLU
    • 网络结构设计
      • 隐层层数(深度设计)
      • 每个隐层神经元个数(宽度设计)
  • 损失函数
    • 多类支撑向量机损失
    • SOFTMAX与交叉熵
      • SOFTMAX
      • 交叉熵
        • 交叉熵
        • 相对熵
          • 为什么是KL散度不是距离?
          • 既然相对熵是衡量两个分布间的不相似性,为什么不用相对熵而用交叉熵?
    • 多类支撑向量机损失 vs 交叉熵损失
      • 为什么有的时候损失值没有改变,但是正确率一直在提高?
  • 优化算法
    • 计算图
      • 引入计算图的目的
      • 计算图的前向计算
      • 计算图的反向计算(反向传播)
      • 计算图颗粒度
      • 计算图中常见的门单元
      • 计算图总结
      • 梯度消失
        • 激活函数选择总结
      • 梯度爆炸
    • 梯度算法改进
      • 梯度下降算法存在的问题
      • 动量法+SGD
      • 自适应梯度与RMSProp
        • 如何区分震荡方向与平坦方向?
        • 自适应梯度算法
          • AdaGrad
          • RMSProp
      • ADAM
        • 修正偏差
          • 冷启动问题
      • SGD & Momentum & AdaGrad & Rmsprop 可视化比较
  • 训练过程
    • 权值初始化
      • 避免全零初始化
      • 随机权值初始化
        • 权值初始化太小
        • 权值初始化太大
        • 实验结论
        • 有效初始化标准
        • Xavier初始化
          • 为什么输入和输出分布会变得不同?
          • Xavier在使用tanh时的表现好
          • Xavier在使用ReLU时的表现不好
        • HE初始化(MSRA)
        • 权值初始化总结
    • 批归一化
      • 批归一化算法过程
        • 平移缩放的作用
    • 机器学习的根本问题
      • 优化
        • 过拟合overfitting
          • 回归过拟合
          • 分类过拟合
        • 过拟合解决办法
          • 获取更多训练数据
          • 调整模型大小(减少feature的个数)
            • Manually select which features to keep.
            • Use a model selection algorithm.
          • 正则化(约束模型权重)
          • 随机失活(Dropout)
            • 实现方式
            • 随机失活比率( Dropout ratio)
            • 为什么随机失活能够防止过拟合?
          • 随机失活的问题
          • Spatial Dropout
          • Stochastic Depth
      • 泛化underfitting
        • 欠拟合
    • 神经网络中的超参数
      • 学习率
        • 学习率调整
          • 离散下降(discrete staircase)
          • 指数减缓(exponential decay)
          • 分数减缓(1/t decay)
      • 超参数优化方法
        • 网格搜索法
        • 随机搜索法
          • 随机搜索法超参数搜索策略
        • 超参数的标尺空间

本节大纲

图像表示

线性不可分

只有经过非线性变换(激活函数),才能对线性不可分的样本进行分类。例如max(0,W1x+b1)。

分类模型 多层感知器(全连接神经网络)

全连接神经网络级联多个变换来实现输入到输出的映射,注意这个过程中非线性变换(激活函数)的重要性。
全连接神经网络组成:一个输入层、一个输出层及多个隐层;
输入层与输出层的神经元个数由任务决定,而隐层数量以及每个隐层的神经元个数需要人为指定;
激活函数是全连接神经网络中的一个重要部分,缺少了激活函数,全连接神经网络将退化为线性分类器。

W1x+b1为线性 *** 作,max(0,W1x+b1)为非线性 *** 作。

全连接神经网络的权值 线性分类器权值vs全连接神经网络权值

线性分类器权值:W1固定数值,由类别个数决定,即权值=类别个数。

全连接神经网络权值:
W1是线性分类器权值,但是模板个数W1是人为设定,这样做的优点是可以有更多的模板表示类别。
W2融合这多个模板的匹配结果来实现最终类别打分。
例:假设W1为1003072(100是自定义,3072是像素矩阵的向量表示的维度),x为30721,b为1001,则W1x+b为1001,max(0,W1x+b)为1001,则W2为10100(10为类别数,100为max(0,W1x+b)行数决定)
原来1个权值模板一头马两个头,调整W1行数增加模板个数,就可以使用2个模板每个模板一个马头表示。

全连接神经网络绘制与命名


输入层维度d:特征数量或特征向量的维度
隐层维度N: 模板数量,即W1维度,是人为设定的。
输出层维度c: 类别数量

全连接:后一层每个神经元都与前一层的所有神经元相连。

激活函数 为什么需要非线性 *** 作(激活函数)?

激活函数 vs 数据预处理

激活函数:作用在神经元,作用于线性变换的结果上。
数据预处理:数据输入时,对数据进行处理。

常用激活函数

Sigmoid

Sigmoid可以使数值保持在0到1之间。

tanh

双曲正切函数。
tanh可以使数值保持在-1到1之间。

ReLU

max(0,x)
x若为负数,输出为0。

Leaky ReLU

max(0.1x,x)
x若为负数,输出0.1x。

网络结构设计

依据分类任务的难易程度来调整神经网络模型的复杂程度。

分类任务越难,设计的神经网络结构就应该越深、越宽。

但是,要注意的是对训练集分类精度最高的全连接神经网络模型,在真实场景下识别性能未必是最好的(过拟合)。

隐层层数(深度设计)

层数越多,分界面就可以越复杂,在这个集合上的分类能力就越强。

每个隐层神经元个数(宽度设计)

神经元个数越多,分界面就可以越复杂,在这个集合上的分类能力就越强。

损失函数 多类支撑向量机损失 SOFTMAX与交叉熵

原始的全连接神经网络,输出层多个f比较大小,选择最大的f作为预测结果,但是这个预测结果的准确率有多大没有体现。

SOFTMAX

SOFTMAX是作用于全连接神经网络的输出层,先区e^f,再归一化,就得到了预测值概率p,选最大的为预测结果。
很明显,上面的预测结果取0.78car,结果预测错误。如何知道这个预测结果是错误的,就需要交叉熵损失。

交叉熵

交叉熵损失:度量分类器预测分布与真实分布之间的距离。两个分布越接近,交叉熵的损失越小。

熵就是信息量。

例:朝鲜和巴西足球比赛,朝鲜赢的概率很低,这种情况信息量很小,所以熵就小。
巴西胜的概率是1,平的概率是0,负的概率是0,计算得熵值H§=0,达到最小。

例:法国和巴西足球比赛,两方势均力敌,这时候需要考虑场地熟悉度,球员的状态,这种情况下信息量就大,所以熵就大。
巴西胜的概率是1/3,平的概率是1/3,负的概率是1/3,计算得熵值H§,达到最大值。

交叉熵 相对熵 为什么是KL散度不是距离?

因为A->B的距离和B->A的距离是相等的,即两个分布之间的距离是相等的,但是KL(p||q)≠KL(q||p),可以度量两个分布的不相似性。

既然相对熵是衡量两个分布间的不相似性,为什么不用相对熵而用交叉熵?

正确的使用,就是使用相对熵。

但真实分布p(x)一般定义为[1,0,0,…],此时H§=0,则H(p,q)=KL(p||q),交叉熵就是相对熵。即在真实分布p(x)为[1,0,0,…]时,为了计算方便,使用交叉熵代替相对熵。

在p(x)不为[1,0,0,…]时,必须使用相对熵计算。
真实分布p(x)定义为[1,0,0,…]时,相对熵=交叉熵,又因为交叉熵计算结果=-1log(qj)-0log(qi)-…=-log(qj),所以在这种情况下,相对熵用-log(qj)表示。

多类支撑向量机损失 vs 交叉熵损失

为什么有的时候损失值没有改变,但是正确率一直在提高?


全连接神经网络输出为【10,9,9】的情况,多类支撑向量机损失为0,但交叉熵损失很大,因为10 9 9 占的概率大概为1.1/3、0.95/3、0.95/3,此时算出交叉熵最大-log(1.1/3),这时虽然选出10对应的类型得出了正确预测,但是正确率很低,所以会继续训练,直到10的分数尽量的高,正确率很高时,才会停止训练。

交叉熵,不但要求概率比别人大,还要求概率比别人大很多。

这种情况,也说明了,为什么有的时候损失值没有改变,但是正确率一直在提高的原因。

例:softmax结果为[0.333, 0.333, 0.334] 选择0.334对应的类型3(错误类型),损失值为-log0.333。继续优化,softmax结果为[0.35, 0.333, 0.32] 选择0.35对应的类型1(正确类型),损失值为-log0.35。
从-log0.333到-log0.35,虽然损失值没怎么改变,但是正确率得到了很大提高。

优化算法 计算图

计算图是一种有向图,它用来表达输入、输出以及中间变量之间的计算关系,图中的每个节点对应着一种数学运算。

引入计算图的目的

对于复杂的损失函数L,要进行算法优化(如梯度下降),就需要计算L对W的偏导,但是因为L很复杂,计算就会很繁琐,容易出错,引入计算图,是想让计算机帮程序员进行偏导数的计算。
主要思想:从后往前,逐步计算局部偏导,逐次相乘,直到最前端,就可得出偏导数

计算图的前向计算

计算图的反向计算(反向传播)

从后往前,逐步进行偏导数计算,逐次相乘,到达最前端时,就可得出偏导数。
例:上图中f=z^2对z求导得2z=6,往前计算z=x+y对x的偏导得1,6*1=6即为 f 对 x 的偏导
前向传播每个节点的计算结果需要存储,因为反向传播计算需要用到。

计算图颗粒度

可以将链条中的多个门当做一个门,简化计算,提高计算效率。

颗粒度变大,效率提高。

一般是用一些常用的函数,进行计算简化,比如sigmoid函数等。

例如下图中的sigmoid函数,手动算出对x的导数,然后将链条中多个门当做一个门,将(W0x0+W1x1+W2)看做x,提高计算效率。

计算图中常见的门单元

计算图总结

任意复杂的函数,都可以用计算图的形式表示。

在整个计算图中,每个门单元都会得到一些输入,然后,进行下面两个计算:
a)这个门的输出值
b)其输出值关于输入值的局部梯度。

利用链式法则,门单元应该将回传的梯度乘以它对其的输入的局部梯度,从而得到整个网络的输出对该门单元的每个输入值的梯度。

梯度消失

从后往前计算,后面的值很小(如0.05),一路上的值都很小,所以乘积会变的更小,不等到最前面,就会变为0.0000000005这样的值。
梯度消失没有有效的解决方法。
因为存在梯度消失问题,现在已经很少在神经网络中使用sigmoid和tanh作为激活函数。
相对而言,ReLU和Leakly ReLU用的比较多。
ReLU函数在梯度小于0时,也会出现梯度消失。
基本没有"死区”,也就是梯度永远不会为0。之所以说“基本“,是因为函数在0处没有导数。

激活函数选择总结

尽量选择ReLU函数或者Leakly ReLU函数,相对于Si gmoid/tanh, ReLU函数或者LeaklyReLU函数会让梯度流更加顺畅,训练过程收敛得更快,梯度消失出现的概率更低。

梯度爆炸

通常用梯度裁剪的方法解决。
梯度消失和梯度爆炸原因及解决-虹膜小马甲

梯度算法改进 梯度下降算法存在的问题

动量法+SGD

动量系数的作用是控制累加梯度的衰减程度。
动量系数不能设置为1,否则v=v+g,即使梯度g=0到达平坦地区,θ也会一直更新下去,不会停止,因为v不为0,v=v,θ=θ-εv。
动量系数设置为0,退化为小批量梯度下降。
动量系数建议设置为0.9。
W 1 = W 1 − ε ∂ L ∂ W 1 , W 2 = W 2 − ε ∂ L ∂ W 2 W_1=W_1-ε\frac{\partial L}{\partial W_1}, W_2=W_2-ε\frac{\partial L}{\partial W_2} W1=W1εW1L,W2=W2εW2L,增大ε,即仅增大总方向的步长不能加快算法收敛速度,因为步长的增大程度,在两个分向量方向上,震荡方向的效果只是震荡频率更高,行进缓慢方向只是快了一点,并没有解决缓慢。
动量法可以解决梯度下降存在的问题。
震荡方向,梯度一正一负,累加梯度的均值为0。
行进缓慢方向,即使很小,多次累加梯度后,也会变得很大。
梯度下降算法:w=w-εg,当处于不好的局部最小或鞍点时,g为0,w=w,会认为已达到收敛,停止更新,但此时并不是比较优秀的解。
动量法:w=μw-εg,当处于不好的局部最小或鞍点时,g为0,w=μw,会认为还未达到收敛,继续更新,更有可能找到更优秀的解。

自适应梯度与RMSProp 如何区分震荡方向与平坦方向?

梯度幅度的平方累加和较大的方向是震荡方向;梯度幅度的平方累加和较小的方向是平坦方向。

自适应梯度算法

对分方向上的步长进行调整。而不是总方向增大步长。
W 1 = W 1 − ε 1 ∂ L ∂ W 1 , W 2 = W 2 − ε 2 ∂ L ∂ W 2 W_1=W_1-ε_1\frac{\partial L}{\partial W_1}, W_2=W_2-ε_2\frac{\partial L}{\partial W_2} W1=W1ε1W1L,W2=W2ε2W2L,减小ε1减小震荡方向步长,增大ε2加速平坦方向步进。

AdaGrad

AdaGrad算法中学习率= ϵ / ( r + δ ) \epsilon/(\sqrt r+ \delta) ϵ/(r +δ)
当累计平方梯度r很大时,学习率就会很小;当累计平方梯度r很小时,学习率就会很大。
分母的δ是为了避免除零错误。
缺点:随着迭代次数的增加,r一定会变得很大,失去了调节作用,学习率会变的很小。针对这个缺点提出了RMSProp。

RMSProp

与AdaGrad的不同:指数衰减累加梯度
当ρ=0时,只考虑当前梯度。
当ρ=1时,只考虑累积变量r。
建议设置为0.999

ADAM

同时使用动量法与自适应梯度思想。

动量法:使用梯度历史累加,而不是当前梯度
历史梯度累加值 v
动量系数 μ(建议值0.9)
自适应梯度:使用梯度平方累加值,改变学习率
历史梯度平方累加值 r
衰减速率 ρ(建议值0.999)

δ:防止除零错误

修正偏差

修正偏差:可以极大缓解算法初期的冷启动问题。且仅在初期起作用,随着遍历次数的增加,修正项不再起作用。

冷启动问题

动量系数设置为建议值 μ=0.9,初始化v=0,则刚开始时,历史梯度累加值 v=μv+(1-μ)g = 0.1g,累加梯度只取到原始g的十分之一,使得权值 θ=θ-学习率*v 刚开始时变化很慢。

使用修正偏差可以解决冷启动问题。考虑刚开始时,修正偏差v’=v/(1-μ^t)=0.1g/0.1=g(t为迭代次数,刚开始时是1),累加梯度只取到原始g。

随着迭代次数的增多,t增大,v’=v/(1-μ^t)中分母接近于1,则v’≈v,v=μv+(1-μ)g,非刚初始时期,v不等于0,所以不存在冷启动问题,累加梯度可以正常工作。

SGD & Momentum & AdaGrad & Rmsprop 可视化比较


SGD在鞍点处,只会在震荡方向震荡,不会达到最优点。
一般用动量法+SGD或者ADAM。
或者两者组合,开始时使用ADAM,后期用动量法+SGD手动调整。
或者两者组合,前期用动量法+SGD手动调整,后期用ADAM加速。
动量法+SGD调优效果更好,手动调整学习率更好,但手动调整到一个很优的值不太容易。

训练过程 权值初始化 避免全零初始化

随机权值初始化 权值初始化太小

前向信息流消失

权值初始化太大

反向梯度消失

实验结论

初始化时让权值不相等,并不能保证网络能够正常的被训练。

有效初始化标准

应该使网络各层的激活值和局部梯度的方差在传播过程中尽量保持一致,以保持网络中正向和反向数据流动。
应该使神经网络输入和输出的分布一样。

Xavier初始化 为什么输入和输出分布会变得不同?

因为输入在经过隐藏层时发生衰变。

Xavier在使用tanh时的表现好

Xavier在使用ReLU时的表现不好

HE初始化(MSRA)

适用于ReLU激活函数。

权值初始化总结

好的初始化方法可以防止前向传播过程中的信息消失,也可以解决反向传递过程中的梯度消失。
激活函数选择双曲正切或者Sigmoid时,建议使用Xaizer初始化方法;
激活函数选择ReLY或Leakly ReLU时,推荐使用He初始化方法。

批归一化

批归一化:对输出值进行归一化,将归一化结果平移缩放作为输出。

但实际 *** 作中,经常将批归一化放在非线性激活前。
批归一化解决两个问题:
1 保证前向传播中信息流通畅,不至于让数据变为0导致的数据不能到达输出层。因为每次归一化后数据都会将很小的数据,变得不那么小。
2 保证反向传播中信息流通畅,可以有效的防止梯度消失现象发生。因为每次归一化后梯度都会变得很有效。

批归一化算法过程

平移缩放的作用

可以使网络自行选择数据分布的均值和方差,γ决定方差,β决定期望。γ和β是学习参数,不是超参数,需要神经网络学习得出。

机器学习的根本问题

机器学习的根本问题是优化与泛化问题。

优化

调节模型以在训练数据上得到最佳性能。

过拟合overfitting

泛化能力差。
过拟合overfitting:指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。

回归过拟合

分类过拟合

过拟合解决办法

最优方案:获取更多的训练数据
次优方案:调节模型允许存储的信息量或者对模型允许存储的信息加以约束,该类方法也称为正则化。

获取更多训练数据

更多的训练数据可以使模型更普适。

调整模型大小(减少feature的个数) Manually select which features to keep. Use a model selection algorithm.

例如PCA

正则化(约束模型权重)

Keep all the features, but reduce the magnitude of parameters.
保留特征个数,约束模型权重,减少参数大小,即权重正则化(常用的有L1、L2正则化)

随机失活(Dropout)

如果模型参数过多,而训练样本过少,容易陷入过拟合。过拟合的表现主要是:在训练数据集上loss比较小,准确率比较高,但是在测试数据上loss比较大,准确率比较低。Dropout可以比较有效地缓解模型的过拟合问题,起到正则化的作用。

Dropout,中文是随机失活,是一个简单又机器有效的正则化方法,可以和L1正则化、L2正则化和最大范数约束等方法互为补充。

在训练过程中,Dropout的实现是让神经元以超参数 § 的概率停止工作或者激活被置为0。

让隐层神经元以一定的概率不被激活。

Dropout可以破坏隐藏层单元之间的协同适应性,使得在使用Dropout后的神经网络提取的特征更加明确,增加了模型的泛化能力。

另外可以从神经元之间的关系来解释Dropout,使用Dropout能够随机让一些神经元临时不参与计算,这样的条件下可以减少神经元之间的依赖,权值的更新不再依赖固有关系的隐含节点的共同作用,这样会迫使网络去学习更加鲁棒的特征。

再看一组实验,在隐藏层神经元数目不变的情况下,调节参数p,观察对训练集和测试集上效果的影响。

以上实验是对MNIST数据集进行的实验,随着p的增加, 测试误差先降后升,p在[0.4, 0.8]之间的时候效果最好,通常p默认值会被设为0.5。
还有一组实验是通过调整数据集判断Dropout对模型的影响:

在数据量比较少的时候,Dropout并没有给模型带来性能上的提升,但是在数据量变大的时候,Dropout则会带来比较明显的提升,这说明Dropout有一定正则化的作用,可以防止模型过拟合。

实现方式

训练过程中,对某一层使用Dropout,就是随机将该层的一些输出舍弃(输出值设置为0),这些被舍弃的神经元就好像被网络删除了一样。

随机失活比率( Dropout ratio)

被设为0的特征所占的比例,通常在0.2 一 0. 5范围内。

为什么随机失活能够防止过拟合?

随机失活的问题

训练过程中使用随机失活,测试过程中不随机失活。要保证两者结果相似,需要进行修改。
在训练过程中,Dropout会随机失活,可以被认为是对完整的神经网络的一些子集进行训练,每次基于输入数据只更新子网络的参数。
在测试过程中,不进行随机失活,而是将Dropout的参数p乘以输出。
上图例子中p=1/2,则训练E[a]=测试E[a]*p=测试E[a]*1/2或者训练E[a]/(1/2)=训练E[a]/§=测试E[a]

参考:正则化之dropout(随机失活)详细介绍

Spatial Dropout

普通的Dropout会将部分元素失活,而Spatial Dropout则是随机将部分区域失失活, 简单理解就是通道随机失活。

一般很少用普通的Dropout来处理卷积层,这样效果往往不会很理想,原因可能是卷积层的激活是空间上关联的,使用Dropout以后信息仍然能够通过卷积网络传输。而Spatial Dropout直接随机选取feature map中的channel进行dropout,可以让channel之间减少互相的依赖关系。

参考:【科普】神经网络中的随机失活方法

Stochastic Depth

在DenseNet之前提出,随机将ResNet中的一部分Res Block失活,实际 *** 作和Dropout也很类似。在训练的过程中任意丢失一些Block, 在测试的过程中使用所有的block。使用这种方式, 在训练时使用较浅的深度(随机在resnet的基础上跳过一些层),在测试时使用较深的深度,较少训练时间,提高训练性能,最终在四个数据集上都超过了ResNet原有的性能(cifar-10, cifar-100, SVHN, imageNet)

参考:Stochastic Depth(随机深度网络)-- BBuf GiantPandaCV

泛化underfitting

预测不准确。
训练好的模型在前所未见的数据(验证集)上的性能好坏。

欠拟合

欠拟合一模型描述能力太弱, 以至于不能很好地学习到数据中的规律。产生欠拟合的原因通常是模型过于简单。

神经网络中的超参数

学习率

学习率调整 离散下降(discrete staircase)

对于深度学习来说,每 t 轮学习,学习率减半。对于监督学习来说,初始设置一个较大的学习率,然后随着迭代次数的增加,减小学习率。
例:当模型代价不再下降时,将学习率降为原来的1/10,继续训练,直到模型代价不再下降时,再将学习率降为原来的1/10。

指数减缓(exponential decay)

对于深度学习来说,学习率按训练轮数增长指数差值递减。
例如: [ α = 0.9 5 e p o c h _ n u m ⋅ α 0 ] [ \alpha = 0.95^{epoch\_num} \cdot \alpha_0 ] [α=0.95epoch_numα0]又或者公式为: [ α = k e p o c h _ n u m ] [ \alpha = \frac{k}{\sqrt {epoch\_num}} ] [α=epoch_num k]
其中epoch_num为当前epoch的迭代轮数。不过第二种方法会引入另一个超参k。

分数减缓(1/t decay)

学习率按照公式 α = α 1 + d e c a y _ r a t e ∗ e p o c h _ n u m \alpha = \frac{\alpha}{1+ {decay\_ rate} * {epoch\_ num}} α=1+decay_rateepoch_numα 变化, decay_rate控制减缓幅度。

参考:深度学习学习率调整小结–球场书生
参考:学习率(Learing Rate)的作用以及如何调整
参考:如何更好地调整学习率?-- pprp

超参数优化方法

网格搜索法

①每个超参数分别取几个值,组合这些超参数值,形成多组超参数;
②在验证集上评估每组超参数的模型性能;
③选择性能最优的模型所采用的那组值作为最终的超参数的值。

缺点:横轴3个测试值*纵轴3个测试值=9组实验

随机搜索法

①参数空间内随机取点,每个点对应一组超参数;
②在验证集上评估每组超参数的模型性能;
③选择性能最优的模型所采用的那组值作为最终的超参数的值。

优点:横轴9个测试值&纵轴9个测试值=9组实验

随机搜索法超参数搜索策略

贪心思想

超参数的标尺空间

对于学习率、正则项强度这类超参数,在对数空间上进行随机采样更合适。
例:假设最优值在0.0001到1之间,如果在0-1之间采样,90%会在0.1-1之间。在10的量级范围内,差别不大,不敏感,所以一般在log对数空间上进行随机采样。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/790355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存