詳解歸一化、標準化、正則化以及batch normalization

文章目錄

      • what(是什么)
      • where(用在哪)
      • How(如何用&&原理)
        • 歸一化
          • 實現方式
          • 原理
          • 示例說明
        • 標準化
          • 實現方式
          • 原理
          • 示例說明
        • 正則化
          • 實現方式
          • 原理
          • 作用
        • Batch Normalization
          • pytorch中的batch normalization
          • 原理
          • BN的作用

歸一化、標準化、正則化、以及深度學習種經常看到的Batch Normalization分別是什么?用在哪?怎么用,以及各自的原理分別是什么?本文針對這些問題,進行對比分析,整體解析。

what(是什么)

  • 歸一化,是對數據進行歸一處理,處理的結果,從數據上看,會使得數據全部落在[0,1]的范圍;從應用角度看,能夠消除量綱的影響,也就是說,歸一化在不同的特征之間進行,但可能涉及到一些反歸一化的操作。
  • 標準化,主要改變數據的分布,處理結果,從數據上看,會使得數據服從標準正態分布;從應用的角度看,這種標準的正態分布能夠加速模型訓練,主要用在同一特征的特征數據上。
  • 正則化,是在機器學習中的損失函數中添加懲罰項,從數據上看,這種懲罰項會減小模型權重,通過減小權重,在應用中,能夠降低有效防止過擬合。
  • 而深度學習中常說的Batch Normalization層則是數據標準化的一個更高級的具體實現。具體地,在標準化的基礎上,對數據進一步的進行一個縮放和拉伸,以達到學習數據真實分布的目的。從數據上看,經過Batch Normalization層的后的數據,會呈現正態分布;從應用角度,該分布可以有效加速模型模型、防止梯度消失、防止過擬合的作用。

where(用在哪)

  • 歸一化,主要用在存在多個特征,且多個特征之間量綱不一致的情況下,需要對數據進行歸一化,以消除量綱帶來的影響,尤其,當特征的數值范圍變化較大時,或者算法對輸入數據的數值范圍敏感時,可以考慮歸一化。
  • 標準化,主要在模型訓練階段,尤其當特征的分布偏差大或者算法對數據的分布敏感時,可以考慮標準化。
  • 正則化,主要用在機器學習的損失函數上。通過在損失函數上施加懲罰項,來降低模型復雜度,特別是在數據量不足或者特征數目較多時。

How(如何用&&原理)

歸一化
實現方式
  • 最大最小歸一化
    將數據縮放到一個固定的范圍,通常是[0, 1]或者[-1, 1]。
## 在 python 中實現最大最小歸一化的操作import numpy as npdef min_max_normalize(data):min_val = np.min(data)max_val = np.max(data)normalized_data = (data - min_val) / (max_val - min_val)return normalized_data
原理

公式為: x ′ = x ? m i n ( x ) m a x ( x ) ? m i n ( x ) x'=\frac{x-min(x)}{max(x)-min(x)} x=max(x)?min(x)x?min(x)?, 其中, ( x ) (x) (x) 是原始數據, ( x ′ ) (x') (x) 是歸一化后的數據, m i n ( x ) min(x) min(x) m a x ( x ) max(x) max(x) 分別是數據集 X X X 的最小值和最大值。

示例說明

在許多機器學習算法中,如支持向量機(SVM)、k近鄰(k-NN)等,距離度量是一個重要的因素。如果特征未經過歸一化,具有較大范圍值的特征可能會主導距離計算,導致模型偏向于某些特征而忽略其他特征。通過歸一化,可以避免這種情況,確保每個特征對模型的貢獻相對平等。
例子:

假設我們有一個數據集,包含兩個特征:身高(單位:厘米)和體重(單位:千克)。身高的范圍可能在150到190厘米之間,而體重的范圍可能在50到100千克之間。如果我們不對這些特征進行歸一化,身高和體重的值范圍差異很大,可能導致機器學習模型在訓練過程中對于體重的變化更為敏感,而對身高的變化不敏感。

通過歸一化,我們可以將身高和體重都映射到 [0, 1] 的范圍內,使得這兩個特征的尺度相似。這樣模型在訓練時能夠更平衡地考慮身高和體重對輸出(比如預測健康狀況)的影響,而不會被特征尺度的差異所影響。

標準化
實現方式
  • Z-score方法
    調整數據分布,將數據拉到均值為0,方差為1的標準正態分布。
import numpy as npdef calculate_z_scores(data):"""計算給定數據集的Z-Scores(標準化)。參數:data: numpy數組,包含要標準化的數據集。返回:Z-Scores的numpy數組,與輸入數據形狀相同。"""mean_data = np.mean(data)std_data = np.std(data)z_scores = (data - mean_data) / std_datareturn z_scores# 示例用法
X = np.array([1, 2, 3, 4, 5])
Z_scores = calculate_z_scores(X)
print("原始數據 X:", X)
print("Z-Scores:", Z_scores)
原理

公式為: x ′ = x ? m e a n ( x ) s t d ( x ) x'=\frac{x-mean(x)}{std(x)} x=std(x)x?mean(x)?,其中, x ′ x' x為處理后的數據, m e a n ( x ) mean(x) mean(x)為數據的均值, s t d ( x ) std(x) std(x)為數據方差。經過處理,數據服從標準正態分布。

示例說明

假設我們的數據集如下:

特征1特征2
10200
20800
30600
40400

標準化后的數據集如下(保留一位小數):

特征1特征2
-1.3-1.3
-0.51.3
0.50.5
1.3-0.5

通過這種標準化,我們可以看到原始數據的不同尺度被調整到了相似的范圍內,這樣在進一步的分析和建模中,特征的權重和貢獻度更容易理解和比較

正則化
實現方式

在損失函數中添加正則項,其中L1正則添加 λ ∑ i = 1 n ∣ w i ∣ \lambda \sum_{i=1}^{n} |w_i| λi=1n?wi?,L2正則添加 λ ∑ i = 1 n w i 2 \lambda \sum_{i=1}^{n} w_i^2 λi=1n?wi2?

原理
  • L1正則化(Lasso正則化): 添加參數向量的L1范數作為懲罰項。它傾向于使得部分參數為零,從而實現特征選擇的效果,減少不重要特征對模型的影響。
    Lossregularized = Lossoriginal + λ ∑ i = 1 n ∣ w i ∣ \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} |w_i| Lossregularized=Lossoriginal+λi=1n?wi?
    其中, ( λ ) ( \lambda ) (λ) 是正則化強度參數,控制正則化項對總損失的貢獻程度。

  • L2正則化(Ridge正則化): 添加參數向量的L2范數平方作為懲罰項。它通過懲罰參數的大小來控制模型的復雜度,避免參數值過大。
    Lossregularized = Lossoriginal + λ ∑ i = 1 n w i 2 \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} w_i^2 Lossregularized=Lossoriginal+λi=1n?wi2?
    類似地, ( λ ) ( \lambda ) (λ) 是正則化強度參數。

作用

此處,引用大神深入理解L1、L2正則的博客中的圖,進一步說明L1和L2正則。

  • L1正則
    在考慮二維特征的情況下,L1正則的圖像應該為一個規則矩形,將正則項記為 J J J,若把正則項 J J J、原始損失函數 L o s s o r i g i n a l Lossoriginal Lossoriginal繪制在同一個坐標下,應該為:
    L1正則
    將帶有正則的損失函數記為 L o s s r e g u l a r i z e d Lossregularized Lossregularized,那么 L o s s r e g u l a r i z e d Lossregularized Lossregularized在取到最小值時,應該在 L o s s o r i g i n a l Lossoriginal Lossoriginal J J J的交點處(原因以及具體推導,見大神的博客,主要是一個帶約束的優化問題,使用KKT條件求解)。從圖像直觀理解,損失函數與正則項圖像的交點,更容易落在坐標軸而非坐標平面上(高維特征空間會更加明顯),在二維空間,就意味著有一維的特征數據為0,也就是說有一個維度的特征沒有對損失函數起到作用。從而得出,L1正則具有使得模型更加稀疏的作用,也可以說,起到了一定的特征選擇的作用。

  • L2正則
    同樣的,將 L 2 L2 L2正則項 J J J以及原始損失函數 L o s s o r i g i n a l Lossoriginal Lossoriginal的等值線繪制在同一個坐標系下。
    在這里插入圖片描述
    從圖中可以看出,帶正則的損失函數 L o s s r e g u l a r i z e d Lossregularized Lossregularized的最小值更多的出現在坐標平面中,因此L2正則是不具有使得模型更加稀疏的能力的。

Batch Normalization
pytorch中的batch normalization

BatchNorm層通常在激活函數之前應用。它會自動計算每個特征的均值和方差,并根據小批量數據的統計信息進行歸一化處理,在使用時,需要注意訓練與評估模式的切換,訓練階段,使用mini-batch的均值和方差,評估模式(推理模式)下,會默認使用整個批次的均值和方差

對于全連接層(線性層),可以使用 torch.nn.BatchNorm1d(num_features)
對于2維卷積層,可以使用 torch.nn.BatchNorm2d(num_features)
對于3維卷積層(如視頻處理),可以使用 torch.nn.BatchNorm3d(num_features)

import torch
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(784, 256)self.bn1 = nn.BatchNorm1d(256)  # BatchNorm1d應用于全連接層輸出self.fc2 = nn.Linear(256, 10)def forward(self, x):x = torch.flatten(x, 1)x = self.fc1(x)x = self.bn1(x)x = torch.relu(x)x = self.fc2(x)return x
原理

Batch Normalization由google在2015年提出,主要是為了解決深度神經網絡訓練過程中的內部協變量偏移(Internal Covariate Shift,在深度神經網絡中,每一層的輸入數據分布隨著網絡的訓練而發生變化,這被稱為內部協變量偏移。這種變化可能導致每層需要不斷適應前一層輸出的分布變化,使得網絡訓練過程變得復雜和緩慢)問題,同時有助于加速網絡的收斂過程。

  • 算法步驟
    摘自于Batch Normalization論文
    在這里插入圖片描述
    BN在減均值除方差后,將數據分布調整為標準的正態分布。此外,額外增加一個縮放和平移的操作,也即增加兩個需要學習的參數,分別為 β \beta β γ \gamma γ。這兩個參數的引入是為了恢復數據本身的表達能力,對規范化后的數據進行線性變換。
BN的作用

主要有三個作用,首先,通過將特征數據的分布調整到標準正態分布,而在這分布下,激活函數的梯度比較大,能夠完美解決梯度消失的問題;其次,由于存在較大的梯度,能夠加速模型的訓練;最后,由于數據被調整為比較標準的正態分布,模型能夠學習到比較通用化的特征,屏蔽了距離正態分布中心較遠的特征,避免了對離群特征點的使用,能夠在一定程度上減弱過擬合。

附上對BN非常詳細的一個解讀,有需要的同學可以仔細研讀。BN論文的詳細解讀,該文章通過作圖,詳細的說明了,在標準正態分布中,激活函數的梯度變化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38936.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代理設計模式和裝飾器設計模式的區別

代理設計模式: 作用:為目標(原始對象)增加功能(額外功能,拓展功能) 三種經典應用場景: 1:給原始對象增加額外功能(spring添加事務,Mybatis通過代理實現緩存功能等等) 2:遠程代理(網絡通信,輸出傳輸(RPC,D…

【TB作品】智能臺燈,ATMEGA16單片機,Proteus仿真

智能臺燈 1 adc檢測光強光敏電阻 顯示電壓 2 光強太高 也就是高于臨界值 就關閉小燈 3 光強太低 也就是低于臨界值 就打開小燈 3 按鍵修改臨界值 顯示 實驗報告:基于ATMEGA16單片機的智能臺燈設計與Proteus仿真 1. 實驗背景 智能臺燈是一種能夠根據環境光強自動調…

代碼隨想錄第40天|動態規劃

完全背包 完全背包物品可以無限使用 01背包核心代碼 01背包中的二維dp數組的兩個for遍歷可顛倒, 而一維dp數組的一定先遍歷物品再遍歷背包容量狀態轉移方程(背包容量一定為遞減) 完全背包核心代碼 (只在完全背包中一維dp數組嵌套順序可顛倒, 實際題目需要確定遍歷順序) 狀…

【高考志愿】建筑學

目錄 一、專業介紹 1.1 專業定義 1.2 專業培養目標 1.3 核心課程 二、就業方向和前景 2.1 就業方向 2.2 專業前景 三、報考注意 四、行業趨勢與未來展望 五、建筑學專業排名 一、專業介紹 1.1 專業定義 建筑學,這一充滿藝術與科技魅力的學科,…

天線 有源 無源 參數

無源測試駐波比VSWR/回波損耗(Return Loss)≤2效率≥50%輸入阻抗50R10%增益天線方向圖3D場強圖方向性 有源測試 OTA 傳導測試:發射功率傳導測試:接收靈敏度總輻射功率TRP(Total Radiated Power)≥發射功率減3dB總接收靈敏度TIS(Total Isotrop…

JDBC1(JDBC相關類與接口 ?連接mysql數據庫? 測試 不同數據庫廠商實現-MySQL和Oracle)

目錄 一、JDBC 1. JDBC相關類與接口 1.1 DriverManager 1.2 Connection 1.3 Statement 4.ResultSet 2. JDBC工作原理 二、連接mysql數據庫 1. 導入jar包 2. 使用DriverManager加載驅動類 3. Connection接口 4. Statement接口 5. ResultSet接口 ?編輯 6. 關閉并…

顯卡簡介

顯卡是計算機系統中一個重要的組成部分,它負責處理圖形和視頻輸出。顯卡的性能直接影響到計算機的圖形處理能力,因此在游戲、視頻編輯、3D渲染等需要高性能圖形處理的應用中,顯卡的選擇至關重要。本文將從顯卡的基本概念、性能指標、市場現狀…

【Node.JS】入門

文章目錄 Node.js的入門涉及對其基本概念、特點、安裝、以及基本使用方法的了解。以下是對Node.js入門的詳細介紹: 一、Node.js基本概念和特點 定義:Node.js是一個基于Chrome V8引擎的JavaScript運行環境,它使得JavaScript能夠運行在服務器…

【鴻蒙學習筆記】基礎組件Progress:進度條組件

官方文檔:Progress 目錄標題 作用最全屬性迭代追加進度賦值風格樣式 作用 進度條組件 最全屬性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 顏色.width(200)// 大小.height(50)// 高度.value(50)// 進度可更…

視頻轉音頻:怎樣提取視頻中的音頻?6個提取音頻的小技巧(建議收藏)

怎樣提取視頻中的音頻?當我們想從視頻中提取出聲音時,通常會遇到很多問題。無論是想單獨提取出視頻里的音頻,還是把它轉成方便儲存或者分享的音頻格式,這都會涉及到視頻轉音頻的一個需求。因此,在這篇指南里&#xff0…

Spring Cloud - 項目搭建

1、新建maven項目 新建maven項目,該項目為主項目 1、新建maven項目 2、設置項目類型 3、選擇項目原型 4、設置參數 5、等著完成 2、設置項目信息 1、右鍵,項目屬性 2、設置jdk版本 3、選擇jdk17 4、修改編譯版本 5、右鍵項目,選擇maven->u…

【吊打面試官系列-MyBatis面試題】模糊查詢 like 語句該怎么寫?

大家好&#xff0c;我是鋒哥。今天分享關于 【模糊查詢 like 語句該怎么寫?】面試題&#xff0c;希望對大家有幫助&#xff1b; 模糊查詢 like 語句該怎么寫? 第 1 種&#xff1a;在 Java 代碼中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

CDH安裝和配置流程

這份文件是一份關于CDH&#xff08;Clouderas Distribution Including Apache Hadoop&#xff09;安裝的詳細手冊&#xff0c;主要內容包括以下幾個部分&#xff1a; 1. **前言**&#xff1a; - CDH是基于Apache Hadoop的發行版&#xff0c;由Cloudera公司開發。 - 相比…

技術派全局異常處理

前言 全局的異常處理是Java后端不可或缺的一部分&#xff0c;可以提高代碼的健壯性和可維護性。 在我們的開發中&#xff0c;總是難免會碰到一些未經處理的異常&#xff0c;假如沒有做全局異常處理&#xff0c;那么我們返回給用戶的信息應該是不友好的&#xff0c;很抽象的&am…

【一篇文章帶你搞懂--拉鏈表!!!拉鏈表的原理是什么!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是書生?&#xff0c;今天主要和大家分享一下拉鏈表的原理以及使用,希望對大家有所幫助。 大家可以關注我下方的鏈接更多優質文章供學習參考。 &#x1f49e;&#x1f49e;代碼是你的畫筆&#xff0c;創新是你…

深入解析:WebKit的JavaScript引擎與V8引擎的比較研究

在現代Web開發中&#xff0c;JavaScript引擎是瀏覽器的核心組件之一&#xff0c;它們負責解析和執行JavaScript代碼。WebKit和V8是兩個非常著名的JavaScript引擎&#xff0c;分別被用于不同的瀏覽器和環境中。WebKit的JavaScript引擎最初是Nitro&#xff0c;后來被JavaScriptCo…

【超簡單-Java設計模式1】設計模式的定義、分類及七大設計原則

引言 Java設計模式從入門到精通-設計模式的定義、設計模式分類及七大設計原則 設計模式簡介 在軟件開發中&#xff0c;設計模式是解決常見設計問題的最佳實踐。它們為開發者提供了一種通用的解決方案&#xff0c;使得代碼更加靈活、可復用和可維護。在Java編程語言中&#x…

Flink 運行時架構

Flink 運行時的組件 作業管理器&#xff08;JobManager&#xff09;資源管理器&#xff08;ResourceManager&#xff09;任務管理器&#xff08;TaskManager&#xff09;分發器&#xff08;Dispatch&#xff09; JobManager 控制一個應用程序執行的主進程&#xff0c;也就是說…

LiveNVR監控流媒體Onvif/RTSP用戶手冊-概覽:CPU使用、存儲使用、帶寬使用、負載、內存使用、通道統計

LiveNVR監控流媒體Onvif/RTSP用戶手冊-概覽:CPU使用、存儲使用、帶寬使用、負載、內存使用、通道統計 1、概覽1.1、通道統計1.2、負載1.3、CPU使用1.4、存儲使用1.5、帶寬使用1.6、內存使用 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒體服務 1、概覽 1.1、通道統計 顯示可用通道&…

構建Kylin Cube的藝術:最佳實踐指南

構建Kylin Cube的藝術&#xff1a;最佳實踐指南 Apache Kylin是一個開源的大數據分析引擎&#xff0c;專為大規模數據集提供快速的查詢能力。Kylin的核心是Cube&#xff0c;它是一種多維數據模型&#xff0c;能夠顯著提高查詢性能。然而&#xff0c;設計一個高效的Cube需要考慮…