深度學習03 人工神經網絡ANN

什么是神經網絡

人工神經網絡( Artificial Neural Network, 簡寫為ANN)也簡稱為神經網絡(NN),是一種模仿生物神經網絡結構和功能的計算模型,人腦可以看做是一個生物神經網絡,由眾多的神經元連接而成.各個神經元傳遞復雜的電信號,樹突接收到輸入信號,然后對信號進行處理,通過軸突輸出信號.

當電信號通過樹突進入到細胞核時,會逐漸聚集電荷。達到一定的電位后,細胞就會被激活,通過軸突發出電信號。

構建人工神經網絡

神經網絡由多個神經元組成,構建神經網絡就是構建神經元.基礎神經元如下

?這個過程就像,來源不同樹突(樹突都會有不同的權重)的信息, 進行的加權計算, 輸入到細胞中做加和,再通過激活函數輸出細胞值。

然后使用多個神經元構成神經網絡,相鄰層的神經元互相連接

????????神經網絡中信息只向一個方向移動,即從輸入節點向前移動,通過隱藏節點,再向輸出節點移動。其中的基本部分是:

  1. ?輸入層(Input Layer): 即輸入x的那一層(如圖像、文本、聲音等)。每個輸入特征對應一個神經元。輸入層將數據傳遞給下一層的神經元。
  2. ?輸出層(Output Layer): 即輸出y的那一層。輸出層的神經元根據網絡的任務(回歸、分類等)生成最終的預測結果。
  3. ?隱藏層(Hidden Layers): 輸入層和輸出層之間都是隱藏層,神經網絡的“深度”通常由隱藏層的數量決定。

????????隱藏層的神經元通過加權和激活函數處理輸入,并將結果傳遞到下一層。?特點是:

  • 同一層的神經元之間沒有連接
  • 第 N 層的每個神經元和第 N-1層 的所有神經元相連(這就是full connected的含義),這就是全連接神經網絡
  • 全連接神經網絡接收的樣本數據是二維的,數據在每一層之間需要以二維的形式傳遞
  • 第N-1層神經元的輸出就是第N層神經元的輸入 每個連接都有一個權重值(w系數和b系數)
神經網絡內部狀態值和激活值

?內部狀態值是是神經元對輸入信號的加權求和結果,加上偏置項后的線性組合。

????????wi為內部狀態值梯度(權重矩陣與偏置可以初始化)

激活值(通常記為?a)是內部狀態值通過激活函數?f(?)?非線性變換后的輸出,如sigmoid,tanh,relu,softmax即

????????總的來說,神經網絡是一種模仿生物神經網絡結構和功能的計算模型,由輸入層,輸出層,和隱藏層構成,每一層都由神經元構成.

????????神經元包含內部狀態值梯度w,偏置值b,激活函數f(x),通過對外部輸入進行加權計算得到內部狀態值z,將z輸入激活函數進行非線性變換得到激活值傳給下一個神經元或者輸出.

激活函數

????????激活函數用于對每層的輸出數據進行變換,進而為整個網絡注入了非線性因素.此時,神經網絡就可以你和各種曲線.

  • 如果沒有引入非線性因素,神經網絡等價于一個線性模型
  • 通過給網絡輸出增加激活函數, 實現引入非線性因素, 使得網絡模型可以逼近任意函數, 提升網絡對復雜問題的擬合能力.

如果不使用激活函數,整個網絡雖然看起來復雜,其本質還相當于一種線性模型,如下公式所示:

?

常見激活函數及特點?

激活函數作用:向神經網絡中添加非線性因素

激活函數選擇方法:relu能且僅能用于隱藏層,輸出層二分類常用sigmoid,多分類常用softmax

激活函數參數初始化

????????參數初始化在神經網絡訓練中扮演著至關重要的角色,它直接影響模型的收斂速度、訓練穩定性以及最終性能。

核心作用:

  • 打破對稱性

????????若所有參數初始化為相同值(如零初始化),神經元在反向傳播時會接收到相同的梯度更新,導致網絡無法學習差異化特征。隨機初始化(如正態分布或均勻分布)通過賦予參數不同的初始值,確保神經元學習不同的特征.

  • 控制梯度傳播穩定性

????????初始化值過大可能導致梯度爆炸(權重更新失控),過小則導致梯度消失(淺層參數無法更新)。例如,Xavier和Hekaiming初始化通過調整權重范圍,使各層輸出的方差保持一致,從而穩定梯度傳播

  • 加速模型收斂?

????????合理的初始化(如Xavier或He初始化)能使網絡在訓練初期處于更優的起始狀態,減少收斂所需的迭代次數。

  • 適配激活函數特性

????????不同激活函數對初始化范圍的要求不同,如:

????????Sigmoid/Tanh??:適合Xavier初始化,因其需要對稱的輸入分布

????????ReLU??:He初始化通過調整方差適應ReLU的“單側抑制”特性

常見初始化方式及對比

激活函數初始化選擇
模擬搭建神經網絡?如圖

+1為偏置,及z=wx+b的b?

是??偏置節點的可視化表示??,它通過引入可學習的偏置權重,幫助神經網絡擺脫輸入空間的限制,顯著提升模型的表達能力,它允許神經元的激活函數在輸入全為0時也能產生非零輸出,增強模型的靈活性。如果沒有偏置,許多簡單的分類問題(如異或問題)將無法被正確擬合。

?具體步驟如下

# 導包
from torch.nn import Module, Linear
import torch
# 提前安裝torchsummary,然后導入summary查看模型參數
# pip install torchsummary
from torchsummary import summary# TODO 1.自定義模型類繼承Module類
class My_Model(Module):# TODO 2.重寫init魔法方法和forward前向傳播方法def __init__(self, *args, **kwargs):# 1.調用父類的init初始化方法super().__init__(*args, **kwargs)# TODO 定義神經網絡結構self.linear1 = Linear(3, 3)self.linear2 = Linear(3, 2)self.out = Linear(2, 2)# 3.參數初始化(生成權重矩陣和偏置矩陣)# 隱藏層初始化權重矩陣torch.nn.init.xavier_normal_(self.linear1.weight)torch.nn.init.kaiming_normal_(self.linear2.weight)# 隱藏層初始化偏置矩陣torch.nn.init.zeros_(self.linear1.bias)torch.nn.init.zeros_(self.linear2.bias)def forward(self, x):#  TODO 前向傳播計算(每層都是加權求和+激活函數)x = torch.sigmoid(self.linear1(x))x = torch.relu(self.linear2(x))# 此處-1代表最后一維, 也就是按照每個樣本概率和為1.x = torch.softmax(self.out(x), dim=-1)#  返回結果return x# TODO 3.創建模型對象并使用模型對象
# 創建模型對象
model = My_Model()  # 自動調用init魔法方法
# 準備數據集(正態分布數據)
torch.manual_seed(66)
data = torch.randn(5, 3)  # 5個樣本,3個特征
print(data)
# 把數據傳入模型對象
output = model(data)  # 自動調用forward方法
print(output)
print('============================================================')
# TODO summary()查看模型參數
summary(model, (3,), batch_size=5) # 第1層:12,第2層:8,第3層:6
print('============================================================')
#  TODO 遍歷查看模型名字和對應參數
for name, param in model.named_parameters():print(f'參數名稱: {name}, 參數值: {param}')print('---------------------------------')

損失函數

在機器學習中就已經引入了損失函數的概念,在此回顧一遍

? ? 損失函數是衡量模型參數質量的函數,又叫代價函數,誤差函數等等,根據損失函數計算損失值,結合反向傳播算法以及梯度下降算法實現參數的更新.(前向傳播和方向傳播在后續優化方法中會提到)

損失函數分為兩大類:

  • 分類損失函數
  1. 多分類交叉熵損失函數:nn.CrossEntropyLoss(reduction='mean')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????[實現softmax激活值計算+損失計算]
  2. 二分類交叉熵損失函數:nn.BCELoss(reduction='mean')
  • 回歸損失函數:
  1. MAE平均絕對誤差損失函數:nn.MSEloss(),計算平均絕對誤差
  2. MSE均方誤差損失函數:nn.MSEloss(),計算均方誤差
  3. Huber Loss損失函數:指定a值,小于a使用MSE,大于a使用MAE使得損失值更平滑
  4. Smooth L1損失函數:a=1的Huber Loss損失函數

網絡模型優化方法 學習率 梯度 正則化

????????眾所周知,損失函數是衡量模型參數好壞的標準,而模型參數是通過梯度下降來進行更新的,也就是說,要優化模型,就是優化梯度下降算法,梯度下降公式為:

不難看出:僅有的兩個變量為學習率和梯度,梯度通常指損失函數關于模型參數的導數,因此優化方法需要從這倆入手

梯度下降法三大概念

epoch:訓練次數/輪次
batch_size:?每次迭代需要的樣本數
iteration:每次訓練需要迭代多少次:樣本數/batch_size[+1, 不能整除需要加1]

正向傳播與反向傳播

????????正向傳播(Forward Propagation)是神經網絡中數據從輸入層逐層傳遞到輸出層的過程。每一層的神經元接收前一層輸出的加權求和結果,并通過激活函數生成該層的輸出,最終得到網絡的預測結果。

????????反向傳播(Backpropagation)是訓練神經網絡的核心算法,用于計算損失函數對網絡參數的梯度。通過鏈式法則,梯度從輸出層反向傳播到輸入層,指導參數更新以最小化損失。

?反向梯度計算:

?參數更新:梯度= 損失值對網格參數w求導,顯而易見,梯度是逐級向上逐漸求出的,最終每一個梯度都會被更新,需要注意的是,梯度的計算路徑即反向傳播路徑不止一條.

梯度下降的兩種優化方式:梯度角度和學習率角度
指數加權平均思想:根據歷史指數加權值當天值加權計算得出當前指數加權平均值

當處于第一天時,new歷史加權指數平均值==第一天的值

當處于第二天時,new歷史加權指數平均值=b*歷史加權平均值=(1-b)*第二天值

當處于第三天時,new歷史加權指數平均值=b*歷史加權平均值=(1-b)*第三天值

....

此思想是優化方法的核心思路

在梯度角度的優化方法

BGD 每次迭代時使用全部訓練數據計算損失函數的梯度,并更新模型參數 準但是慢

SGD?每次迭代僅使用一個樣本或一小批樣本來計算梯度 快但是不準

MBGD 選幾個梯度更新 不慢較準

momentum動量法?當前梯度是指數移動加權平均梯度

引入了指數加權平均思想?

梯度 ==?當前梯度*系數+歷史加權平均梯度*(1-系數)

St=(1-β)*Gt + β*St-1

在學習率角度優化的方法
  • 自動調整

adagrad:自動調整學習率,初始大,后期小

新學習率=原始學習率/歷史梯度平方

?RMSprop:新學習率=舊學習率/歷史梯度加權平方

Adam:是RMSprop學習率更新+momentun梯度更新一起使用

  • 手動調整

等間隔:lr = lr * gamma

scheduer = optim.lr_scheduler.StepLR(optimizer=optimizer, step_size=50, gamma=0.5)

指定間隔:lr = lr * gamma

optim.lr_scheduler.MultiStepLR(optimizer=optimizer, milestones=[50, 100, 160], gamma=0.5, last_epoch=-1)

指數衰減:lr = lr*gamma**epoch

optim.lr_scheduler.ExponentialLR(optimizer=optimizer, gamma=0.9)

優化器的選擇

深度學習默認選擇adam:適合大多數深度學習任務

SGD+momentum:更好的泛化性能,如cv任務

adagrad或者RMS適合用于稀疏數據或者特定任務

正則化

防止機器學習模型過擬合的技術,通過在損失函數中添加額外的懲罰項,限制模型參數的大小或復雜度。其核心目標是提高模型在未知數據上的泛化能力。

范數正則化

L1正則化(Lasso回歸)
L2正則化(嶺回歸)

隨機失活正則化

dropout層?

以指定p概率讓神經元隨機失活

批量歸一正則化

實現原理:對線性結果進行標準化處理,?根據每批樣本的均值和標準差計算標準化的值

注意點

  • ?? ?在激活層前使用(卷積層后/線性層后)
  • ?? ?多數在計算機視覺領域使用
  • ?? ?可以引入γ和β可學習參數, 不同層的樣本分布在不同范圍內(不同層使用的激活函數不同); 可以補回標準化丟失的信號

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

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

相關文章

Linux中部署Jenkins保姆間教程

本文將以docker的方式,講述如何部署Jenkins 一、拉取Jenkins鏡像 1.1 最新版Jenkins介紹 最新版Jenkins地址:Download and deploy 當前最新版的如下圖所示: 1.2 各版本支持的JDK版本 地址如下:Java Support Policy 如果你安裝…

【軟考中級·軟件評測師】下午題·面向對象測試之架構考點全析:分層、分布式、微內核與事件驅動

一、分層架構:分層獨立與質量特性的雙向約束 分層架構通過“垂直分層(表示層→服務層→業務邏輯層→數據層)”實現職責隔離,是Web應用、企業級系統的主流架構模式。 1. 父類成員函數重測場景 子類繼承父類時,若父類…

C++ 快速回顧(五)

C 快速回顧(五) 前言一、Dll和Lib的區別區別在開發中使用 二、封裝并使用C庫1.封裝庫2.使用庫 三、封裝并使用C庫1.封裝庫2.使用庫 前言 用于快速回顧之前遺漏或者補充C知識 一、Dll和Lib的區別 靜態庫(LIB)在編譯時鏈接&#…

【ARM】解決ArmDS的工程沒有生成Map文件的問題

1、 文檔目標 在嵌入式開發過程中,使用Arm Development Studio(簡稱ArmDS)進行項目構建時,Map文件的生成是調試和分析代碼的重要環節。Map文件不僅記錄了程序中各個段(sections)的內存分布情況&#xff0c…

Java如何導出word(根據模板生成),通過word轉成pdf,放壓縮包

<!-- 導出word文檔所需依賴--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0-beta</version></dependency><dependency><groupId>org.apache.poi</gr…

【C#】 DevExpress.XtraEditors.SidePanel

DevExpress.XtraEditors.SidePanel&#xff0c; 它是 DevExpress 提供的“側邊滑出”面板&#xff08;類似于抽屜、浮動信息區&#xff09;&#xff0c;非常適合做可隱藏的參數區、幫助區、臨時交互區等。 SidePanel 用法核心點 1. 基本用法 可容納其它控件&#xff0c;就像普…

1.1_2 計算機網絡的組成和功能

在這個視頻中&#xff0c;我們會探討計算機網絡的組成和功能。我們會從三個視角去探討計算機網絡由哪些部分組成&#xff0c;其次&#xff0c;我們會簡單的了解計算機網絡的功能。 首先我們可以把計算機網絡看作是由硬件、軟件和協議共同組成的一個龐大復雜的系統。首先在硬件上…

Linux驅動學習day11(定時器)

定時器 定時器主要作用就是&#xff1a;設置超時時間&#xff0c;執行超時函數。 按鍵按下存在抖動&#xff0c;為了消除抖動可以設置定時器&#xff0c;如上圖所示&#xff0c;按下一次按鍵會產生多次抖動&#xff0c;即會產生多次中斷&#xff0c;在每次中斷產生的時候&…

Java 編程之觀察者模式詳解

一、什么是觀察者模式&#xff1f; 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;用于對象之間的一對多依賴關系&#xff1a;當被觀察對象&#xff08;Subject&#xff09;狀態發生變化時&#xff0c;所有依賴它的觀察者&#xff08;O…

【C++】經典string類問題

目錄 1. 淺拷貝 2. 深拷貝 3. string類傳統寫法 4. string類現代版寫法 5. 自定義類實現swap成員函數 6. 標準庫swap函數的調用 7. 引用計數和寫時拷貝 1. 淺拷貝 若string類沒有顯示定義拷貝構造函數與賦值運算符重載&#xff0c;編譯器會自動生成默認的&#xff0c…

kotlin中object:的用法

在Kotlin中&#xff0c;object: 用于聲明匿名對象&#xff08;Anonymous Object&#xff09;&#xff0c;這是實現接口或繼承類的輕量級方式&#xff0c;無需顯式定義具名類。以下是核心用法和場景&#xff1a; 1. 基本語法 val obj object : SomeInterface { // 實現接口ov…

js代碼04

題目 非常好。我們剛剛看到了回調函數在處理多個異步操作時會變得多么混亂&#xff08;回調地獄&#xff09;。為了解決這個問題&#xff0c;現代 JavaScript 提供了一個更強大、更優雅的工具&#xff1a;Promise。 Promise&#xff0c;正如其名&#xff0c;是一個“承諾”。…

Jenkins初探-通過Docker部署Jenkins并安裝插件

簡介 本文介紹了使用Docker安裝Jenkins并進行初始配置的完整流程。主要內容包括&#xff1a; (1)通過docker pull命令獲取Jenkins鏡像&#xff1b;(2)使用docker run命令啟動容器并映射端口&#xff1b;(3)訪問Jenkins界面獲取初始管理員密碼&#xff1b;(4)安裝推薦插件并創…

嵌入式開發:GPIO、UART、SPI、I2C 驅動開發詳解與實戰案例

&#x1f4cd; 本文為嵌入式學習系列第二篇&#xff0c;基于 GitHub 開源項目&#xff1a;0voice/EmbeddedSoftwareLearn &#x1f4ac; 作者&#xff1a;0voice &#x1f440; 適合對象&#xff1a;嵌入式初學者、STM32學習者、想搞明白外設驅動開發的C語言學習者 一、驅動是什…

常用 Linux 命令和 shell 腳本語言整理

目錄 一、Linux 命令大全 1、文件和目錄操作 &#xff08;1&#xff09;ls 列出目錄內容 &#xff08;2&#xff09;pwd 查看當前目錄 &#xff08;3&#xff09;cd 切換目錄 &#xff08;4&#xff09;mkdir 創建目錄 &#xff08;5&#xff09;cp 復制文件或目錄 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代碼閱讀筆記-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目錄 autobackend.py 1.所需的庫和模塊 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…

【MySQL基礎】MySQL索引全面解析:從原理到實踐

MySQL學習&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我們基本上已經把MySQL的基礎知識都進行了學習&#xff0c;但是我們之前處理的數據都是十分少的&#xff0c;但是如果當我們的數據量很大…

第三十五章 I2S——音頻傳輸接口

第三十五章 I2S——音頻傳輸接口 目錄 第三十五章 I2S——音頻傳輸接口 1 I2S概述 1.1 簡介 1.2 功能特點 1.3 工作原理 1.4 利用DMA通信的I2S 1.4.1 I2S配合DMA通信工作原理 1.4.2 配置要點 2 應用場景 2.1 消費類音頻設備 2.2 專業音頻設備 2.3 通信設備 2.4 汽車電子 2.5 嵌…

產品-Figma(英文版),圖像的布爾類型圖例說明

文章目錄 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多個形狀合并成一個新的完整形狀&#xff0c;保留所有外部輪廓&#xff0c;內部不被切割。由于紅色的長方形在外面的一層&#xff0c;所以切割后&#x…

Windows CMD命令分類大全

?? ?一、系統與磁盤管理? ?系統信息? systeminfo&#xff1a;查看詳細硬件及系統配置&#xff08;版本/內存/補丁&#xff09;211 winver&#xff1a;快速檢查Windows版本11 msinfo32&#xff1a;圖形化系統信息面板811?磁盤工具? chkdsk /f&#xff1a;修復磁盤錯誤&…