ML(5) 您所在的位置:网站首页 标准化处理怎么做 ML(5)

ML(5)

2024-07-17 02:51| 来源: 网络整理| 查看: 265

去量纲:归一化、标准化 1. 去量刚1.1 归一化(Normalization)Min-Max Normalization非线性Normalization 1.2 标准化(Standardlization)Z-score Normalization 2. 去量刚加速梯度下降收敛3. BatchNormalization、 LayerNormalizaiton3.1 BatchNormalization3.2 LayerNormalizaiton normalization Standardlization 对梯度的影响

1. 去量刚

去量纲化 可以消除特征之间量纲的影响,不同量纲的特征统一到一个大致相同的数值区间内;以便不同量级的指标能够进行比较和加权处理。去量纲化的好处:

(1).消除量纲引起的特征数量级对分析结果的影响,使得不同量纲之间的特征具有可比性;

(2).未归一化的特征数值太大,可能会引起数值计算的问题;

(3).利用梯度下降优化的模型,输入特征归一化处理能够加速算法的收敛过程;(线性回归,逻辑回归,支持向量机,神经网络模型)

去量纲化的方法: 两类常用的方法:归一化、标准化

1.1 归一化(Normalization) Min-Max Normalization

x ′ = x − X m i n X m a x − X m i n x'=\frac{x-X_{min}}{X_{max}-X_{min}} x′=Xmax​−Xmin​x−Xmin​​

作用: 将原始特征数据线性映射到[0,1] 优点: 线性变换,对数据进行处理,不会改变原有数据的性质 缺点: 新数据加入, X m i n , X m a x X_{min},X_{max} Xmin​,Xmax​可能会发生变化,所有数据需要重新进行归一化处理。

非线性Normalization

对数变换: x ′ = log ⁡ x x'=\log x x′=logx 反正切变换: x ′ = 2 π arctan ⁡ x x'=\frac{2}{\pi}\arctan x x′=π2​arctanx 适用情况:用于数据分化较大的场景,有些数据很大,有些数据很小 。需要依据数据分布情况,决定使用的非线性函数。

1.2 标准化(Standardlization) Z-score Normalization

零均值标准化 x ′ = x − μ σ x'=\frac{x-\mu}{\sigma} x′=σx−μ​ 其中: μ \mu μ 原始数据均值, σ \sigma σ原始数据标准差 (数据量很大的情况下,这两个统计量对 加入新数据 不敏感,故可以处理新添加数据的情况); x − μ x-\mu x−μ 为数据中心化,将数据中心平移到原点。

适用情况: 原始数据分布接近正态分布,将原始数据 标准化 为均值为0 ,方差为1 的分布。 优点: 线性变换,对数据进行处理,不会改变原有数据的性质

2. 去量刚加速梯度下降收敛

涉及数学知识: 1.一个三维曲面 z = f ( x , y ) z=f(x,y) z=f(x,y)被一系列平面 z = c z=c z=c所截得到一系列等值线。

2.曲面上某点P 梯度方向 定义:函数在该点增长最快的方向。 通过方向导数与 f x f_x fx​和 f y f_y fy​的关系得出函数在P点增长最快的方向为: ( f x , f y ) (f_x,f_y) (fx​,fy​),即为梯度方向。

3.等值线上 P点法线方向,垂直于P点切线方向。P点切线方向 ( d x , d y ) (dx,dy) (dx,dy),斜率为 d y d x \frac{dy}{dx} dxdy​, 由隐函数求导规则可得 d y d x = − f x f y \frac{dy}{dx}=-\frac{f_x}{f_y} dxdy​=−fy​fx​​. 则法线斜率为 f y f x \frac{f_y}{f_x} fx​fy​​,即,法线方向为 ( f x , f y ) (f_x,f_y) (fx​,fy​) .所以曲线上某点的梯度方向,与过该点的等值线的法线方向相同。

4.c=f(x,y)隐函数求导:(两边同时对x求导) 0 = ∂ f ∂ x + ∂ f ∂ y d y d x = > d y d x = − f x f y 0=\frac{\partial f}{\partial x}+\frac{\partial f}{\partial y}\frac{dy}{d x}=>\frac{dy}{d x}=-\frac{f_x}{f_y} 0=∂x∂f​+∂y∂f​dxdy​=>dxdy​=−fy​fx​​

5.相互垂直两个向量 a = ( x 1 , y 1 ) , b = ( x 2 , y 2 ) a=(x_1,y_1),b=(x_2,y_2) a=(x1​,y1​),b=(x2​,y2​),夹角 θ \theta θ 内积定义垂直关系: ∣ a ∣ ∣ b ∣ cos ⁡ θ = 0 |a||b|\cos \theta=0 ∣a∣∣b∣cosθ=0 坐标垂直关系: x 1 x 2 + y 1 y 2 = 0 x_1x_2+y_1y_2=0 x1​x2​+y1​y2​=0(带入 a = x 1 i + y 1 j , b = x 2 i + y 2 j , a ∗ b 计算 a=x_1i+y_1j,b=x_2i+y_2j,a*b计算 a=x1​i+y1​j,b=x2​i+y2​j,a∗b计算) 两向量与x轴夹角正玄值关系: − 1 = y 2 x 2 y 1 x 1 -1=\frac{y_2}{x_2} \frac{y_1}{x_1} −1=x2​y2​​x1​y1​​

Reference From: 通俗易懂理解特征归一化对梯度下降算法的重要性

3. BatchNormalization、 LayerNormalizaiton

神经网络 训练过程实际是在 学习数据分布,如果训练数据与测试数据分布不同,那么神经网络表现出泛化能力差的问题。因此在训练开始前要保证训练数据和测试数据分布相同。

在网络前向传播的过程中,每个中间层 会改变其输出特征的分布,(从而导致一批数据的分布发生改变)(糟糕的情况下)每一层都要拟合不同的数据分布,增大了网络训练的复杂度。为了降低训练难度和减小拟合风险,就引入了不同的normalization方法。

normalization 沿着数据不同的轴做(剩余的轴拉成一条轴) 就区分出 BN, LNnormalization 位于每一层的输出,和下一层的输入之间。 3.1 BatchNormalization

BatchNormalization - 沿着B轴作normalization, 对一个batch内的每个样本做。

step1: 在前一层的输出 和 后一层的输入之间加一层BN,这一批数据在经过 BN处理后恢复至N(0, 1)的分布(每一个特征位都是一个正态分布)step2: 之后还将重新接一个仿射变换,由可学习参数 γ \gamma γ 和 β \beta β恢复上一层输出的分布。由于对一个batch内的每个样本做,在BN层,会维持一个均值和方差特征tensor,上一层的输出特征的每个特征位做减均值除方差的操作,均值和方差用估计量的方式增量更新。train eval 时会有差别,train 时会更新均值和方差的估计量,eval时直接使用

优点:不做BN操作,前一层网络权重 需要完美的拟合数据分布,但是引入 γ \gamma γ 和 β \beta β后,可以期待他们两取恢复最优的数据分布,减轻了上一层 参数任务的复杂度,从而更有利于提高模型的泛化能力。

[todo]手动实现

3.2 LayerNormalizaiton

LayerNormalization - 沿着某一特征维度作normalization,NLP 里用多用处理序列长度(句子长度不同引入的问题) [todo]概述说明。

import torch import torch.nn as nn def LN_test(): """ @note 手动实现 LN, 深度理解LN """ # for cv N, C, H, W = 20, 5, 10, 10 cv_input = torch.randn(N, C, H, W) cv_LN = nn.LayerNorm([C, H, W]) cv_output = cv_LN(cv_input) # [N, C, G, W] # for nlp batch, sentence_lenth, embedding_dim = 20, 5, 10 nlp_input = torch.randn(batch, sentence_lenth, embedding_dim) nlp_LN = nn.LayerNorm(embedding_dim) # 不会说的是sentence的长度都变成1,embedding_dim是特征轴长度,每一纬 沿着sentence_lenth收集均值方差 nlp_output = nlp_LN(nlp_input) # self implementation input_data = torch.randn(2, 2, 3, 4) build_in_LN = nn.LayerNorm(normalized_shape=[2, 3, 4], elementwise_affine=False) # 对input 后3维(len([2, 3, 4]))做ln, # print_module(build_in_LN, "build_in_LN") build_in_LN_output = build_in_LN(input_data) mean = torch.mean(input_data, dim=[1, 2, 3], keepdim=True) # [2, 1, 1, 1] 后三个dime的元素全部求均值和方差了 var = torch.var(input_data, dim=[1, 2, 3], keepdim=True, unbiased=False) # [2, 1, 1, 1] self_implement_output = (input_data - mean) / (torch.sqrt(var) + build_in_LN.eps) # [2, 2, 3, 4] assert torch.allclose(self_implement_output, build_in_LN_output, rtol=1e-4) build_in_LN2 = nn.LayerNorm(normalized_shape=[3, 4], elementwise_affine=False) # 3 * 4 特征面面 build_in_LN_output2 = build_in_LN2(input_data) mean2 = torch.mean(input_data, dim=[2, 3], keepdim=True) # [2, 2, 1, 1] 3 * 4 特征面的均值 var2 = torch.var(input_data, dim=[2, 3], keepdim=True, unbiased=False) # [2, 2, 1, 1] 3 * 4 特征面方差 self_implement_output2 = (input_data - mean2) / (torch.sqrt(var2) + build_in_LN2.eps) # [2, 2, 3, 4] 所有元素对 特征平面均值方差 做归一化。 assert torch.allclose(self_implement_output2, build_in_LN_output2, rtol=1e-4)

Reference From: Layer Normalization(LN) 层标准化 (为什么Transformer用LN)(手写手动实现LN) Layer Normalization 和 Batch Normalization Layer Normalization

参考博文: 1.梯度方向与等高线方向垂直的理解 2.等值线与梯度的几何意义 3.一文读懂梯度下降算法(各种导数) 4.据预处理之中心化(零均值化)与标准化(归一化) 5.归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)(简书)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有