normalization

阅读 / 问答 / 标签

CNN中batch normalization应该放在什么位置

有两种位置。论文作者建议放在affine后面,affine-BN-非线性函数也有人发现,放在激活函数后面效果也不错。

BN(Batch Normalization)和TF2的BN层

在讨论Batch Normalization之前,先讨论一下feature scaling可能会对后续的讨论有很大的帮助。 feature scaling ,即特征归一化,是机器学习领域中一种通用的数据预处理方法,其目的是将模式向量中尺度不一致的不同维度特征归一到同一尺度,以保证训练速度与精度。 假设有一个大小为n的数据集 ,其中每个模式向量有m个维度的特征 。如果在这个数据集中,第i维的特征 服从均值为0、方差为1的高斯分布,而第j维的特征 服从均值为200,方差为1的高斯分布,那么这个数据集将难以用于模型训练。其原因在于, 与 的分布相差甚远,模型中与 相关的参数只进行很小的改变往往难以对结果造成显著性的改变,而与 相关的参数则恰恰相反,这让训练过程的learning rate很难统一,过小收敛过慢,过大则可能不收敛。 为了解决以上问题,feature scaling对每个维度的特征都进行如下变换,变换的结果则是所有维度的特征都归一化到均值为0、方差为1这个尺度: 以上方法对于模型的训练是十分有效的,而在深度神经网络的研究中,研究人员延续这种思路提出了Batch Normalization。相对于传统的模型,深度神经网络遇到的问题是,随着网络深度增加,网络中一个小小的改变可能在经过若干层的传播之后令整个网络出现极大的波动,如bp过程中的梯度消失与爆炸(事实上,ReLU、有效的初始化、设置更小的learning rate等方法都能用于解决该问题)。 Batch Normalization可以用于解决深度神经网络的 Internal Covariate Shift 问题,其实质是: 使用一定的规范化方法,把每个隐层神经元的输入控制为均值为0、方差为1的标准正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域(如Sigmoid函数只在0附近具有较好的梯度),以此避免梯度消失问题。 在Batch Normalization中,Batch是指每次训练时网络的输入都是一批训练数据,这一批数据会同时经过网络的一层,然后在经过 之后,网络再一起对这一批数据的 做规范化处理。当然,Batch Normalization的论文中还使用了两个参数处理规范化之后的数据,即 。事实上,如果 , ,这就等价于Normalization的一个逆运算,那么normalization的意义似乎就不存在了,但是,事实并非如此,因为 , 与 相关,而 , 则完全独立,二者并不等价。合理的解释是,后续操作是为了防止normalization矫枉过正增加的人为扰动。Batch Normalization的具体结构如下所示: 在tensorflow2中使用BN层的方法如下,需要注意的是BN层在训练和推理两种模式下存在不同。 BN层有4*num_channels个参数,每4个参数对应一个通道,分别是 。其中 和其他层的参数的逻辑是一致的,训练时不断调整,推理时不再改变(即只有优化器更新参数时才会改变)。而 不同,在推理时,即使没有优化器更新参数,也可能不断变化。这两个参数受BatchNormalization层的参数training控制,当training=False时,二者为移动均值和方差(固定);当training=True时,二者与每次输入的batch相关, 是当前batch的均值、方差。 综上,在使用TF2的BN层时,推理时需要指定当前模式为推理模式,方法如下(还存在其他方法,如显示地声明training参数为False)。此外,BN层也有trainable参数,和其他层一样,该参数意在冻结 两个参数,但是当trainable=True时,该BN层会以推理模式运行, 两个参数也就随之固定。

深度学习中 Batch Normalization为什么效果好

想了解这个需要先知道Batch Normalization提出的原因以及原理。其主要目的是为了减缓“梯度弥散”或者“梯度爆炸”,具体看下面:Batch Normalization的计算机制可以发现BN会将输出归一化,有点类似于数据标准化,当然这在数据处理里面又叫白化,关于白化的好处,可自行百度。这样做的好处是能使得各层的输出满足相似的分布,更容易收敛,有论文已经证明了这一观点(大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布是一致的”。如果不一致,那么就出现了新机器学习问题,如transfer learning/domain adaptation 等。梯度传播机制如果你研究过梯度反向传播算法,你会发现,由于BN每次都将数据标准化了,所以就能减缓梯度的过大或者过小,从而延缓梯度爆炸或者梯度弥散,相关概念可以自行百度。防止过拟合。有意思的是,之前比较热门的dropout方法在BN提出之后再也没用过了,因为BN能有效减少过拟合的概率。

34统计基础- 分位数标准化(Quantile Normalization)

假设我们有一些来自微阵列实验的数据 如果你不熟悉微阵列,这里有解释: 因此,我们需要标准化数据来解释实验之间的技术差异,这与生物学无关。 这是我们的数据。在这张图中,每种颜色代表一个不同的基因。这些颜色与实际微阵列实验中扫描到的颜色不同。此时,那些颜色已经转换为强度值。每个样本都有不同的平均值,这表明我们需要对不同的整体光强进行补偿。 分位数标准化(Quantile Normalization) 纠正了这个技术。 分位数标准化(Quantile Normalization) 后,每个样本的值都相同,但是原始的基因顺序被保留了下来。他们称之为“Quantile Normalization”,因为标准化的数据集有分位数相同。

数据的normalization对logistic回归的系数有没有影响

回归方程,主要是看各个自变量的假设检验结果,和系数。两个自变量都有统计学意义,系数分别为-5.423和0.001,也就是说,随着自变量一增加一个单位,因变量要降低5.423三个单位。自变量二同理。比如我的因变量是高血压患病与否,随着自变量一得增加,患病危险降低。说明自变量一为保护因素。

批归一化(Batch Normalization)

批归一化是现在越来越多的神经网络采用的方法,其具有加快训练速度、防止过拟合等优点,尤其在深度神经网络中效果非常好。现将BN的学习整理一篇文章备忘。 随着神经网络的层数加深,研究者发现神经网络训练起来越困难,收敛越慢。BN就是为解决这一问题提出的。 首先明确神经网络之所以可以先训练,再预测并取得较好效果的前提假设: 在神经网络的训练过程中,如果输入数据的分布不断变化,神经网络将很难 稳定的学习规律 ,这也是one example SGD训练收敛慢的原因(随机得到的数据前后之间差距可能会很大)。而网络的每一层通过对输入数据进行线性和非线性变换都会改变数据的分布,随着网络层数的加深,每层接收到的数据分布都不一样,这还怎么学习规律呀,这就使得深层网络训练困难。 BN的启发来源是:之前的研究表明如果在图像处理中对输入图像进行白化操作的话(所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布)那么神经网络会较快收敛。神经网络有很多隐藏层,图像只是第一层的输入数据,对于每一个隐藏层来说,都有一个输入数据,即前一层的输出。BN将每一层的输入都进行了类似于图像白化的操作,将每层的数据都控制在稳定的分布内,并取得了很好的效果。 BN算法是专门针对mini-batch SGD进行优化的,mini-batch SGD一次性输入batchsize个数据进行训练,相比one example SGD,mini-batch SGD梯度更新方向更准确,毕竟多个数据的分布和规律更接近整体数据的分布和规律,类似于多次测量取平均值减小误差的思想,所以收敛速度更快。 BN究竟对数据的分布做了什么处理,我们来看下面的示意图: 在概率论中我们都学过,数据减去均值除以方差后,将变成均值为0,方差为1的标准正态分布。如果数据分布在激活函数(图中假设为sigmoid)梯度比较小的范围,在深层神经网络训练中将很容易出现梯度消失的现象,这也是深度网络难训练的原因。通过规范化处理后的数据分布在0附近,图中为激活函数梯度最大值附近,较大的梯度在训练中收敛速度自然快。 但是,关键问题出现了,分布在0附近的数据,sigmoid近似线性函数,这就失去了非线性激活操作的意义,这种情况下,神经网络将降低拟合性能,如何解决这一问题呢?作者对规范化后的(0,1)正态分布数据x又进行了scale和shift操作:y = scale * x + shift,即对(0,1)正态分布的数据进行了均值平移和方差变换,使数据从线性区域向非线性区域移动一定的范围,使数据在较大梯度和非线性变换之间找到一个平衡点,在保持较大梯度加快训练速度的同时又不失线性变换提高表征能力。这两个参数需要在训练中由神经网络自己学习,即公式中的γ和β。如果原始数据的分布就很合适,那么即使经过BN,数据也可以回到原始分布状态,这种情况下就相当于恒等变换了,当然这是特殊情况。 在训练时,BN的操作步骤如第一张图所示,那么在预测时,每次只输入一张图的情况下,无法进行均值和方差的计算,此时该怎么实现BN呢? 正是因为训练数据和测试数据是独立同分布的,所以我们可用训练时的所有均值和方差来对测试数据的均值和方差进行 无偏估计 。本来mini-batch SGD就是在整体数据量大无法一次性操作的情况下,把数据切割成几部分,用部分近似整体的解决方案。在训练时,将每一个mini-batch的均值和方差记录下,估计出整体的均值和方差如下: 首先要明确一点:BN是沿着batch方向计算的,每个神经元都会有一组( )在非线性激活前面约束数据。 假设batch_size=m, 输入的每一个样本有d维,记为 下标表示batch,上标表示一个样本中第几个维度,即第几个神经元。 那么BN计算如下: 中间的过程省略了,其核心思想就是BN是对每一个batch的某一固定维度规范化的,一个样本中有d维,就会求出d组( ),即每一个神经元都有一组( )。 (2)卷积层的BN计算方法: 在卷积层中,数据在某个卷积层中的维度是[batch, w, h, c],其中batch表示batch_size,w是feature map的宽,h是feature map的高,c表示channels。在沿着batch的方向,每个channel的feature map就相当于一个神经元,经过BN后会得到c组( )。此时的BN算法可表示如下: 原论文中BN操作是放在线性计算后,非线性激活前,即: 其中g()表示激活函数。 这里建议参考一下ResNet_v1和ResNet_v2的用法: 最后一点还需要注意的是,在使用BN后,神经网络的线性计算(WX + b)中的偏置b将不起作用,因为在(WX + b)求均值后b作为常数均值还是b,在规范化的过程中原数据要减去均值,所以b在这两步计算中完全抵消了。但由于BN的算法中有一个偏置项β,它完全可以代替b的作用,所以有BN的计算中可不用b。

r语言标准化(normalization)问题:怎样使向量标准化令其平均值和方差分别为0 和1 呢

observations = c(2 , 4.6 , 1 , 3.7 , 5.9 , 4.0 , 6.7 , 2.8) observations_standard=(observations-mean(observations))/(sd(observations))#验证下是否靠谱mean(observations_standard)var(observations_standard)

pytorch常用normalization函数

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在, batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好; layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显; instanceNorm在图像像素上,对HW做归一化,用在风格化迁移; GroupNorm将channel分组,然后再做归一化; SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。 归一化与反归一化 https://blog.csdn.net/rehe_nofish/article/details/111413690 pytorch优雅的反归一化 https://blog.csdn.net/square_zou/article/details/99314197?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control 重点关注 图片保存:torchvision.utils.save_image(img, imgPath) https://blog.csdn.net/weixin_43723625/article/details/108159190

RNA-seq 分析 normalization方法之TMM

在使用过程中存在一些疑问,所以就认真一探究竟。Normalization 的方法很多,适应的条件也不一样。下面两篇讲的比较清晰建议下看下。 参考: https://www.jianshu.com/p/a9d5065f82a6 https://www.jianshu.com/p/a3b78bd49bcc R 包edgeR中 calcNormFactors() 函数默认使用的方法为 "TMM",使用于没有经过其他处理的原始 RNA-seq counts 数据。 参考原作者的文章 A scaling normalization method for differential expression analysis of RNA-seq data. Mark D Robinson and Alicia Oshlack 根据经验,作者提出了一个假设——个体之间大部分的基因表达水平是没有太大变化的,变化的只是少数。一般标准化(包括TPM),都会除以 library 大小,即除以所有基因reads总和,来消除不同批次间测序深度造成的影响。例如下面的,sample A /4,sample B /8,所有基因表达量都一样,是没有差异的。 但是如果像下面这样,简简单单除以 library 大小是不行的。因为此时 library 大小不同不仅仅受到可能的测序批次的影响,而且受到 差异基因gene4 表达量的影响。sample A /4,sample B /14,你会发现所有的基因都有差异,这是不合理的。 所以,根据最开始提出的假设,大多数基因是不发生变化的,对 library 大小进行矫正。默认情况下,TMM会修剪Mg值中最高和最低的30%,剩余的基因计算factors。 如果只是edgeR 来计算差异基因,很简单。函数返回每个样本library 大小和 factors,不需要其他额外操作可以进行下一步。 如果我们想自己做些额外的事情,比如我想做生存分析,根据某个基因表达量将群体分为高表达组和低表达组此时可向下面那样做进行简单标准化。 或者 上面两种方法是等价的。 相比于TPM,此方法没有考虑转录本本身长度的影响,所以样本内不同转录本丰度我们是无法比较的(即同一个样本内测序为相同reads数的两个转录本,并不表示丰度一样,因为他们本身的基因长度不一样。理论上,基因长的,能检测到的可能性越大,如果reads数相当,表明它表达量少。)。但做差异分析的时候,我们比较的是样本之间的关系,所以这也是为什么edgeR等R包要求输入的是最原始的counts数据而不是TPM吧。(FPKM/RPKM等就不讨论了,已经被很多人认为是错误的。)

Quantile Normalization

转自: http://www.bio-info-trainee.com/2043.html 提到normalization很多人都烦了,几十种方法,而对于芯片或者其它表达数据来说,最常见的莫过于quantile normalization啦。那么它到底对我们的表达数据做了什么呢? 首先要么要清楚一个概念,表达矩阵的每一列都是一个样本,每一行都是一个基因或者探针,值就是表达量咯。 quantile normalization 就是对每列单独进行排序,排好序的矩阵求平均值,得到 平均值向量 ,然后根据原矩阵的排序情况替换对应的平均值,所以normalization之后的值只有平均值了。具体看下面的图: 在R里面,推荐用preprocessCore 包来做quantile normalization,不需要自己造轮子啦! 但是需要明白什么时候该用quantile normalization,什么时候不应该用,就复杂很多了。 R包做: http://jtleek.com/genstats/inst/doc/02_05_normalization.html

蛋白质组学定量 Normalization 方法之一

Normalization 是为了样本之间可以比较,用来矫正系统误差。例如上样量A样本是B样本的两倍,最后得出A样本里所有蛋白都是B样本蛋白的两倍,显然是不对的。这种现象在基因测序中也存在,例如测序深度差异等,常用的R包 edgeR 等也有不同的 Normalization 方法。 最简单最粗暴的方法是假设是大部分蛋白是没有发生变化的,只有少数改变了,只要每个样本除以自身所有蛋白丰度和,就可以矫正误差。但显然也有明显的弊端,如果某些蛋白丰度极高,凭一己之力改变了丰度之和,就无法正确矫正。如下 因此,将丰度总和作为Normalization是不太可取的。因此也有其他的一些方法,取出样本中一部分代表总体来进行矫正。例如取中位数,取四分之一和四分之三分位数之间的样本来剔除极端值等。 下面文章来自 Nature -- Proteogenomics connects somatic mutations to signalling in breast cancer 首先作者对样本进行了过滤。reference 是混合样本,因为无论是 TMT 还是 iTRAQ 标记都只能标记有限样本,需要一个混合样本做参照,使在不同批次间可以比较。我们看下图每个样本与 reference的比值取对数结果大部分是符合预期的单峰分布(右),以0(1倍)为中心高斯(正太)分布,也有一些样本是明显的双峰分布(左)。 作者使用 R 包 mclust 双重高斯混合模型进行聚类,较小均值的77个样本通过QC。 其实用的就是 z-score 方法的变种,(x-均值)/标准差 。区别是,这里并不是用的总样本的标准差。 首先假设样本中只有一部分蛋白发生了改变,另一部分没有发生改变,双峰原因是因为污染等,而没有发生上下调的蛋白拥有较小的标准差。 为了归一化前面讲的进样样和系统误差,采用了下面方式,使用 mixtools 包。 以单峰模型估计出均值 双峰模型估计两个标准差 使用最小的标准差标准化 矫正前 如有错误,欢迎指正 其他方法参考文献 A systematic evaluation of normalization methods in quantitative label-free proteomics

完整的单细胞分析流程——数据标化(normalization)

通常在单细胞RNA测序数据中观察到文库之间测序覆盖率的系统差异。它们通常是由细胞间的cDNA捕获或PCR扩增效率方面的技术差异引起的,这归因于用最少的起始材料难以实现一致的文库制备。标准化旨在消除这些差异,以使它们不干扰细胞之间表达谱的比较。这样可以确保在细胞群体中观察到的任何异质性或差异表达都是由生物学而不是技术偏倚引起的。 在这一点上,规范化和批次校正之间的区别需要注意。归一化的发生与批次结构无关,并且仅考虑技术偏差,而批次矫正仅在批次之间发生,并且必须同时考虑技术偏差和生物学差异。技术偏倚倾向于以相似的方式或至少以与它们的生物物理特性(例如长度,GC含量)有关的方式影响基因,而批次之间的生物学差异可能是高度不可预测的。这样,这两个任务涉及不同的假设,并且通常涉及不同的计算方法(尽管某些软件包旨在一次执行两个步骤,例如zinbwave)。因此,避免混淆“标准化”和“批次校正”的数据非常重要,因为这些数据通常表示不同的事物。 我们将主要关注缩放标准化,这是最简单和最常用的标准化策略。这涉及将每个细胞的所有计数除以特定于细胞的比例因子,通常称为“大小因子”。这里的假设是,任何细胞特异性偏倚(例如,捕获或扩增效率)均会通过缩放该细胞的预期平均数来同等地影响所有基因。每个细胞的大小因子表示该细胞中相对偏差的估计,因此,将其计数除以其大小因子应消除该偏差。然后可以将所得的“归一化数据”用于下游分析,例如聚类和降维。为了演示,我们将使用来自scRNAseq软件包的数据集。 文库大小归一化是执行缩放归一化的最简单策略。 我们将文库的大小定义为每个细胞中所有基因的计数总和,假定其预期值随任何细胞特异性偏倚而缩放。 然后,在定义比例常数的情况下,每个细胞的“库大小因子”直接与其库大小成正比,从而使所有细胞的平均大小因子等于1。此定义可确保归一化的表达值与原始计数处于相同规模 ——这对解释很有用——尤其是在处理转换后的数据时。 在Zeisel脑数据中,文库大小因子在细胞之间的差异最大10倍。 这是scRNA-seq数据覆盖范围变异的典型表现。 严格来说,文库大小因子的使用是假设任何一对细胞之间的差异表达(DE)基因中都没有“不平衡”。也就是说,基因的一个子集的任何上调都可以通过不同基因子集中的相同下调幅度来抵消。这样可以通过避免合成效应来确保文库大小是相对于细胞特异性相对偏倚的无偏估计。但是,平衡的DE通常在scRNA-seq应用中不存在,这意味着文库大小归一化可能无法为下游分析产生准确的归一化表达值。 在实践中,标准化的准确性不是探索性scRNA-seq数据分析的主要考虑因素。成分偏差通常不会影响细胞群的分离,而只会影响细胞群或细胞类型之间的对数倍数变化的幅度——向着程度较小的方向。因此,库大小归一化通常在许多应用中都是足够的,这些应用的目的是识别细胞群和定义每个细胞群的top标记。 如前所述,当样本之间存在任何不平衡的差异表达时,就会出现成分偏差。以两个细胞举例,其中单个基因X与细胞B相比在细胞A中被上调。这种上调意味着(i)更多的测序资源用于A中的X,从而当每个细胞的总文库大小通过实验确定时(例如,由于文库量化);其他的非差异基因的覆盖率降低,或(ii)当为X分配更多的读数或UMI时,A的文库大小增加,从而增加了文库大小因子,并为所有非DE基因产生了较小的归一化表达值。在这两种情况下,最终结果是,与B相比,A中的非DE基因将被错误地下调。 对于大量RNA测序数据分析,消除成分偏差是一个经过充分研究的问题。可以使用 DESeq2 包中的 estimateSizeFactorsFromMatrix() 函数或 edgeR 包中的 calcNormFactors() 函数来执行规范化。这些假设大多数基因不是细胞之间的DE。假设两个细胞之间多数非DE基因之间的计数大小的任何系统性差异都代表了偏差,该偏差用于计算适当的大小因子以将其去除。 然而,由于存在大量的低计数和零计数,单细胞数据应用这些bulk归一化方法可能会有问题。为了克服这个问题,我们汇总了许多细胞的计数以进行准确的大小因子估算。然后,将基于库的大小因子“分解”为基于细胞的大小因子,以标准化每个细胞的表达谱。如下所示,这是使用来自scran的 computeSumFactors() 函数执行的。 我们使用带有 quickCluster() 的预聚类步骤,其中每个聚类中的细胞分别进行归一化,并且将大小因子重新缩放以在各个聚类中具有可比性。这避免了在整个种群中大多数基因都是非DE的假设-在成对的簇之间仅需要非DE多数,这对于高度异质的种群来说是一个较弱的假设。默认情况下, quickCluster() 将基于irlba软件包中的方法对PCA使用近似算法。近似值依赖于随机初始化,因此我们需要设置随机种子(通过set.seed())以实现可重现性。 我们看到,解卷积大小因子与图7.2中的库大小因子表现出特定于细胞类型的偏差。这与由细胞类型之间强烈的差异表达引入的成分偏倚的存在是一致的。去卷积大小因子的使用针对这些偏差进行调整,以提高下游应用程序的归一化精度。 准确的归一化对于涉及对每个基因统计信息的估计和解释的过程而言最重要。 例如,成分偏倚会通过系统性地将对数倍数变化沿一个方向或另一个方向转移来破坏DE分析。 但是,对于基于细胞的分析(如聚类分析),与简单的库大小归一化相比,它往往提供的好处较少。 成分偏差的存在已经暗示了表达谱的巨大差异,因此更改标准化策略不太可能影响聚类过程的结果。 spike-in归一化基于以下假设:向每个细胞中添加了相同量的spike-in RNA。spike-in转录本覆盖范围的系统差异仅归因于细胞特异性偏差,例如捕获效率或测序深度。为了消除这些偏差,我们通过缩放“ spike-in size factor”来均衡细胞间的spike-in覆盖范围。与以前的方法相比,spike-in归一化不需要系统的生物学假设(即,没有许多DE基因)。取而代之的是,它假定将掺入的spike-in转录本(i)以恒定的水平添加到每个细胞中,并且(ii)以与内源基因相同的相对方式响应偏倚。 实际上,如果需要关注单个细胞的总RNA含量差异,并且必须保留在下游分析中,则应使用加标归一化。对于给定的细胞,内源RNA总量的增加不会增加其spike-in大小因子。这确保了总RNA含量在群体间的表达差异不会在缩放时消除。相比之下,上述其他标准化方法将仅将总RNA含量的任何变化解释为偏差的一部分,并将其消除。 举个例子,在不同亲和力的T细胞受体配体刺激后,在涉及T细胞活化的不同数据集上使用spike-in归一化 我们应用 computeSpikeFactors() 方法来估计所有细胞的spike-in大小因子。 通过使用与 librarySizeFactors() 中相同的推理,将每个细胞的总spike-in计数转换为大小因子来定义。 scaling将随后消除细胞间spike-in覆盖率的任何差异。 我们观察到每种处理条件下spike-in大小因子和解卷积大小因子之间存在正相关关系(图7.3),表明它们在测序深度和捕获效率上捕获了相似的技术偏倚。 但是,我们还观察到,就亲和力或时间的增加而言,对T细胞受体的刺激不断增加,导致spike-in因子相对于文库大小因子而言有所降低。 这与刺激过程中生物合成活性和总RNA含量的增加一致,这减少了每个文库中的相对spike-in覆盖率(从而减少了spike-in大小因子),但增加了内源基因的覆盖率(因此增加了文库大小因子)。 两组尺寸因子之间的差异对下游解释产生了实际影响。 如果将spike-in 大小因子应用于计数矩阵,则未刺激细胞中的表达值将按比例放大,而受刺激细胞中的表达将按比例缩小。 但是,如果使用反卷积大小因子,则会发生相反的情况。 当我们在标准化策略之间切换时,这可以表现为条件之间DE的大小和方向的变化,如下Malat1所示(图7.4)。 一旦计算出大小因子,就可以使用scater中的 logNormCounts() 函数为每个细胞计算归一化的表达值。 这是通过将每个基因/spike-in转录本的计数除以该细胞的合适大小因子来完成的。 该函数还对归一化后的值进行对数转换,从而创建了一个称为“ logcounts”的新assay。 这些对数值将在以下各章中作为我们下游分析的基础。 对数转换很有用,因为对数值的差异表示基因表达的对数倍变化。这在基于欧几里得距离的下游过程中很重要,下游过程包括许多形式的聚类和降维。通过对对数转换后的数据进行操作,我们确保这些过程基于基因表达的对数倍变化来测量细胞之间的距离。比如,一个在细胞类型A中平均表达量为50,在细胞类型B中表达量为10的基因,或在A中为1100,B中为1000的基因,对数转化可以展现出具有强烈相对差异,因此会关注前者。 在进行对数转换时,我们通常会添加一个伪计数以避免值为零。对于低丰度基因,较大的伪计数将有效地将细胞之间的对数倍变化缩小至零,这意味着下游的高维分析将更多地由高丰度基因的表达差异来驱动。相反,较小的伪计数将增加低丰度基因的相对贡献。常见的做法是使用1的伪计数,原因很简单,即实用的原因是它保留原始矩阵中的稀疏性(即原矩阵中的零在变换后仍为零)。除大多数病理情况外,此方法在所有情况下均有效。 顺便说一句,伪计数的增加是出于将尺寸因子居中统一的动机。这确保了伪计数和规范化的表达式值都在同一范围内。伪计数为1可以解释为每个基因的额外reads或UMI。实际上,居中意味着随着计数深度的提高,伪计数的收缩效果减小。这正确地确保了表达的对数倍变化的估计(例如,根据细胞组之间对数值的差异)随着覆盖范围的扩大而变得越来越准确。相反,如果将恒定的伪计数应用于类似百万分之一的度量,则无论我们执行了多少额外的测序,后续对数倍更改的准确性都将永远不会提高。 在极少数情况下,出于由A.Lun所描述的影响,不适合直接对计数进行缩放。 简而言之,这是由于对数归一化计数的平均值与对数变换后的归一化计数的平均值不同而造成的。 它们之间的差异取决于原始计数的均值和方差,因此相对于计数大小,对数计数的平均值存在系统的趋势。 这通常表现为即使在文库大小归一化之后,轨迹也与文库大小密切相关,如图7.5所示,通过合并和拆分方法生成的合成scRNA-seq数据如图5所示。 由于问题是由于计数大小的差异而引起的,因此最直接的解决方案是降低取样高覆盖率细胞的以匹配低覆盖率细胞。 这使用大小因子来确定达到大小因子的第1个百分位数所需的每个细胞的减采样。 (只有少数几个具有较小尺寸因子的细胞被简单地按比例放大。我们不会尝试将采样缩减为最小尺寸因子,因为这将导致一个尺寸因子非常低的异常细胞过度丢失信息。)我们可以看到 这消除了前两个PC中与库大小因子相关的轨迹,从而提高了基于混合比的已知差异的分辨率(图7.6)。 对数转换仍然是必需的,但是当细胞之间的计数大小相似时,不再会导致均值变化。 虽然减采样是一种方便的解决方案,但由于需要增加高覆盖率细胞的噪声以避免与低覆盖率细胞之间的差异,因此它在统计上是无效的。 它也比简单缩放慢。 因此,我们只建议在按比例缩放的初始分析显示与大小因子高度相关的可疑轨迹后再使用此方法。 在这种情况下,通过减采样重新确定轨迹是否是对数转换的伪像是一件简单的事情。

特征工程之特征标准化(Normalization)

特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为算法和模型的输入。从本质上来说,特征工程是一个数据表示和展现的过程。在实际的工作中,特征工程旨在剔除原始数据中的冗余和杂质,进而提炼出更具表征力的特征。 特征标准化(Normalization)是为了消除特征之间的量纲影响,使得不同的指标之间具有可比性。最典型的标准化就是特征的归一化处理,即将特征统一映射到[0,1]区间上。下面介绍几种常见的标准化方法: 线性函数归一化是对原始特征进行线性变换,并将结果映射到[0,1]的范围上,从而实现对原始特征的等比例缩放。公式如下: 其中 X 为特征原始值, X min 和 X max 分别为特征的最大值和最小值。该方法有一个不足,就是当有新数据引入时, X min 和 X max 可能会变化,此时所有特征值需要重新定义。 零均值标准化是一种基于原始特征的均值(mean)和标准差(standard deviation)进行标准化的方法,它会将特征映射到均值为0,偏差为1的分布上。具体来说,假设特征的均值为 ,标准差为 ,那么归一化的公式定义为: 在使用梯度下降的方法求解最优化问题时,标准化/归一化可以加快梯度下降的求解速度,提升模型的收敛速度。

normalization是什么意思

normalization[英][u02ccnu0254:mu0259lau026a"zeu026au0283n][美][u02ccnu0254:mu0259lau026a"zeu026au0283n]n.正常化; 标准化; 正态化; 复数:normalizations例句:1.It has become clear that liquidity normalization is not a substitute for interestrate normalization. 日渐清晰的是,流动性正常化和利率正常化是两回事。2.While in the process of realizing normalization of relations between chinaand japan, some japanese played a vital role. 在中日关系实现正常化的过程中,一些日本人士起到了至关重要的作用。

12. 批标准化(Batch Normalization )

Batch Normalization算法自从15年提出,到现在已经成为深度学习中经常使用的技术,可以说是十分powerful。 我们先从Feature Scaling或者Feature Normalization说起,不管你是不是做深度学习的方法,其实你都会想要做Feature Scaling。原因是: 在没有进行Feature Scaling之前,如果两个输入数据 的distribution很不均匀的话,导致 对计算结果的影响比较大(图左),所以训练的时候,横纵方向上需要给与一个不同的training rate,在 方向需要一个更大的learning rate, 方向给与一个较小的learning rate,不过这样做的办法却不见得很简单。所以对不同Feature做了normalization之后,使得error surface看起来比较接近正圆的话(图右),就可以使训练容易得多。 不管你是不是deep learning的方法,你都会用到Feature Scaling技术。通常 经典的Feature Scaling 的方法是怎么做的? 现在给你一大堆的数据,你的训练数据总共有大 笔data。而接下来你就对每一个dimension去计算dimension的 mean 跟dimension的 standard deviation ,假设你这个input是39维,所以就算出39个mean跟39个standard deviation;然后对每一维中的数值,假设你取第 维中的数值出来,你就把它 减掉第 维的mean,除以第 维的standard deviation,作为一个Normalization ,你就会让第 维的feature的分布 mean=0,variance=1 ,一般来说,如果你今天做了Feature Scaling这件事情往往会让你的training变得比较快速。 刚才都是还没有讲到deep learning了,现在我们进入deep learning的部分,我们知道说在deep learning里面它的卖点就是有很多个layer,你有个 进来通过一个layer得到 ,把 放入layer 2得到输出 ,我们当然会对network输入的 做Feature Scaling。但是你仔细想想从layer 2的角度来看,其实它的input的feature是 ,我们可以把network前几个layer想成是一个feature的提取,我们知道说network的前几个layer的工作其实就是在抽比较好的feature,后面几个layer当做classify可以做得更好,所以对layer 2来说,他吃到的feature就是layer 1的output ,如果我们觉得说Feature Scaling是有帮助的,我们也应该对layer 2 的feature,也就是layer 1的output 做Feature Scaling,同理layer 2的输出 他是下一个Layer 3的输入,它是下一个layer的feature,我们应该要做一下Normalization,这样接下来layer可以learn的更好。 其实对每一个layer做Normalization这件事情,在deep learning上面是很有帮助的,因为它解决了一个叫做 Internal Covariate Shift 的这个问题,可以令这个问题比较轻微一点。 Internal Covariate Shift 这个问题是什么意思? 如上图所示:你就想成说现在每一个人代表1个layer,然后他们中间是用话筒连在一起,而今天当一个人手上的两边的话筒被接在一起的时候,整个network的传输才会顺利,才会得到好的performance。 现在我们看一下中间那个小人,他左手边的话筒比较高,他的右手边的话筒比较低。在训练的时候为了将两个话筒拉到同一个水平高度,它会将左手边的话筒放低一点,同时右手的话筒放高一点,因为是同时两边都变,所以就可能出现了下面的图,最后还是没对上。 在过去的解决方法是调小learning rate,因为没对上就是因为学习率太大导致的,虽然体调小learning rate可以很好地解决这个问题,但是又会导致训练速度变得很慢。 你不想要学习率设小一点,所以怎么办? 所以今天我们要讲batch Normalization,也就是对每一个layer做Feature Scaling这件事情,就可以来处理Internal Covariate Shift问题。 为什么?因为如果我们今天把每一个layer的feature都做Normalization,我们把每一个layer的feature的output都做Normalization,让他们永远都是比如说 ,对下一个layer来看,前个layer的statistics就会是固定的,他的training可能就会更容易一点。 首先我们把刚才的话筒转化为deep learning中就是说,训练过程参数在调整的时候前一个层是后一个层的输入,当前一个层的参数改变之后也会改变后一层的参数。当后面的参数按照前面的参数学好了之后前面的layer就变了,因为前面的layer也是不断在变的。其实输入数据很好normalization,因为输入数据是固定下来的,但是后面层的参数在不断变化根本就不能那么容易算出mean和variance,所以需要一个新的技术叫Batch normalization。 Batch的数据其实是平行计算的,如下图。实际上gpu在运作的时候,它会把 拼在一起,排在一起变成一个matrix,把这个matrix乘上 得到 ,因为今天是matrix对matrix,你如果把matrix对matrix作平行运算,可以比matrix对三个data分开来进行运算速度还要快,这个就是gpu加速batch运算的原理。 接下来我们要做 Batch Normalization 。怎么做?我们现在想要做的事情是对第一个隐藏层的output, ,做Normalization。 我们可以先做Normalization,再通过激活函数,或者先通过激活函数再做Normalization。我们偏向于先做Normalization,再通过激活函数,这样做有什么好处呢? 因为你的激活函数,如果你用tanh或者是sigmoid,函数图像的两端,相对于 的变化, 的变化都很小。也就是说,容易出现梯度衰减的问题。因此你比较喜欢你的input是落在变化比较大的地方,也就是你的前后 零 的附近,如果先做Normalization你就能够确保说在进入激活函数之前,你的值是落在你的附近。 我们现在来做Normalization:你想要先算出一个 , ,先算出这些 的均值。接下来算一下 , 。好,接下来这边有件事情要跟大家强调一下,就是 是是由 决定的。 是由 和 决定的。等一下会用上。 这边有一件事情要注意:在做Normalization的话,在选的 跟 的时候我们其实希望它代表的是 整个training set全体的statistics 。但是因为实做上统计整个training set全体的statistics是非常耗费时间的,而且不要忘了 的数值是不断的在改变的,你不能说我把整个training set的data导出来算个 ,然后 的数值改变以后,再把整个导出来的再算一次 ,这个是不切实际的做法; 所以现在我们在算 跟 的时候,只会在batch里面算,这意味着什么? 这意味着说你的batch size一定要够大 ,如果太小的话Batch Normalization的性能就会很差,因为你没有办法从一个batch里面估测整个data的 跟 ,举例来说,你可以想象极端case,如果今天batch size=1,你根本不能够apply这套想法。 接下来,有了 跟 以后,我们可以算出: ,这里面的除法代表element wise的除法。好,我们做完Normalization以后就得到了 ,经过Normalization以后 的 每一个dimension它的 ,你高兴的话就把它通过sigmoid得到A,然后再丢到下一个layer,Batch Normalization通常会每一个layer都做好,所以每一个layer的 ,在进入每一个激活函数之前,你都会做这一件事情。 它这边有一个其实大家可能比较不知道的事情是: 有batch Normalization的时候怎么作training? 很多同学想法也许是跟原来没有做背Normalization没有什么不同。其实不是这样,真正在train这个batch Normalization的时候, 会把整个batch里面所有的data一起考虑 。我不知道大家听不听得懂我的意思,你train这个batch Normalization的时候,你要想成你有一个非常巨大的network,然后它的input就是 ,然后得到 ,中间它还会算两个东西 跟 ,它会产生 , ,你一路backout回来的时候,他是会通过 ,通过 ,然后去update z的。 为什么这样?因为假设你不这么做,你把 跟 视为是一个常数。当你实际在train你的network的时候,你Backpropagation的时候,你改的这个 的值,你会改动这个 的值,改动这个 的值,其实你就等同于改动了 跟 的值。但是如果你在training的时候没有把这件事情考虑进去会是有问题的。所以其实在做batch Normalization的时候, 对 的影响是会被在training的时候考虑进去的。所以今天你要想成是你有一个非常巨大的network,input就是一整个batch,在Backpropagation的时候,它error signal也会从这个path(上图粗箭头的反向路径)回来,所以 对 跟 的影响是会在training的时候被考虑进去的,这样讲大家有问题吗? 如果有问题,就忽略吧…… 接下来继续,我们已经把 Normalize ; 但是有时候你会遇到的状况是,你可能不希望你的激活函数的input是 ,也许有些特别的激活函数,但我一下想不到是什么,他的mean和variance是别的值,performance更好。你可以再加上 跟 ,把你现在的distribution的mean和variance再做一下改动,你可以把你的 乘上这个 ,然后再加上 得到 ,然后再把 通过sigmoid函数,当做下一个layer的input,这个 跟 你就把它当做是network的参数,它也是可以跟着network一起被learn出来的。 这边有人可能会有问题是如果我今天的 正好等于 , 正好等于 ,Normalization不就是有做跟没做一样吗?就是把 Normalize成 ,再把 Normalize成 ,但是如果今天 正好等于 , 正好等于 的话就等于没有做事,确实是如此。但是加 和 跟 和 还是有不一样的地方,因为 和 它是受到data所影响。但是今天你的 和 是独立的,他是跟input的data是没有关系的,它是network自己加上去的,他是不会受到input的feature所影响的,所以它们还是有一些不一样的地方。 好,我们看一下在testing的时候怎么做,假设我们知道training什么时候怎么做,我们就train出一个network,其实它在train的时候它是考虑整个batch的,所以他其实要吃一整个batch才work。好,他得到一个 ,他会用 减掉 除以 , 跟 是从一整个batch的data来的,然后他会得到 ,它会乘上 ,再加上 , 和 是network参数一部分,得到的 。training的时候没有问题,testing的时候你就有问题了,因为你不知道怎么算 跟 , 对不对?因为training的时候,你input一整个batch,算出一整个batch的 跟 。但是testing的时候你就有点问题,因为你只有一笔data进来,所以你估不出 跟 。 有一个ideal的solution是说:既然 跟 代表的是整个data set的feature的 均值和标准差 ,而且现在的training的process已经结束了,所以整个network的参数已经固定下来了,我们train好network以后再把它apply到整个training set上面,然后你就可以估测现在 的 跟 ,之前没有办法直接一次估出来,是因为我们network参数不断的在变,在你的training结束以后,把training里的参数已经确定好,你就可以算 的distribution,就可以估出 的 跟 。 这是一个理想的做法,在实做上有时候你没有办法这么做,一个理由是有时候你的training set太大,可能你把整个training set的data都倒出来再重新算一次 跟 ,也许你都不太想做,而另外一个可能是你的training的data是一笔一笔进来的,你并没有把data省下来,你data一个batch进来,你要备参数以后,那个batch就丢掉,你的训练资料量非常大,所以要训练是不省下来的,你每次只进来一个batch,所以也许你的training set根本就没有留下来,所以你也没有办法估测training set的 跟 ; 所以可行的solution是怎么做呢?这个critical 的solution是说把过去在update的过程中的 跟 都算出来,随着这个training的过程正确率会缓缓地上升,如上图红色框中图示:假设第一次取一个batch算出来是 ,第100次取一个batch算出来是 ……你可以说我把过去所有的 连起来当作是整个data的statistic,我这样做也不见得太好,为什么?因为今天在训练过程中参数是不断的变化,所以第一次地方算出来的 跟第100次算出来的 显然是差很多的,对不对?因为真正最后训练完的参数会比较接近100次得到的参数,第一次得到参数跟你训练时候得到参数差很多,所以这个地方的 跟你实际上你训练好的network以后,他会算出来的 的 是差很多的,所以在实做上你会给靠近training结束的这些 比较大的 weight ,然后给前面这些比较少的 weight 。