機器學習(神經網絡基礎篇)——個人理解篇6(概念+代碼)

1 在聲明一個類中,構建一個屬于類的函數,前面為什要加上“self”?

就像下面這一串代碼:

 class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std=0.01):# 
初始化權重self.params = {}self.params['W1'] = weight_init_std * \np.random.randn(input_size, hidden_size)self.params['b1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * \np.random.randn(hidden_size, output_size)self.params['b2'] = np.zeros(output_size)def predict(self, x):W1, W2 = self.params['W1'], self.params['W2']b1, b2 = self.params['b1'], self.params['b2']a1 = np.dot(x, W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1, W2) + b2y = softmax(a2)return y

解釋:

在Python中,self 是一個指向當前類實例自身的引用參數,它的作用類似于“我”或“這個對象”。它的存在是為了讓類的方法(函數)能夠訪問和操作這個實例的屬性(變量)和其他方法。

專業解釋:

1 訪問實例屬性
在 predict 方法中,你需要訪問當前實例的權重參數 self.params['W1']、self.params['b1'] 等。沒有 self,方法就不知道去哪里找這些參數。
2 區分不同實例
如果有多個神經網絡實例(比如 net1 和 net2),它們的權重參數是獨立的。通過 self,每個實例的方法只會操作自己的參數,不會互相干擾。

通俗解釋:
想象你有一個機器人(類 TwoLayerNet),它身上有多個按鈕(屬性如 params)和功能(方法如 predict)。當你按下某個功能按鈕時,機器人需要知道:“這個功能是針對 我自身 的哪些屬性操作的?”這時 self 就是告訴機器人:“操作的是當前這個機器人自己的按鈕,而不是其他機器人的。”

總結:self 是類方法的“自我標識符”,讓方法知道應該操作哪個實例的數據。沒有它,類的方法就無法區分不同實例的屬性。

2? ?神經網絡中的參數優化,你知道哪些?有什么優缺點?(純個人總結)

所謂優化,實質上是找使得損失函數的值最小的一組參數。舉一個生活中的例子:

2.1? ?用調熱水澡水溫類比神經網絡參數優化

想象你正在調整淋浴的冷熱水龍頭,目標是找到 ?最舒適的水溫。這個過程與神經網絡的參數優化驚人地相似:

1. 初始狀態(參數初始化)??
  • ?場景?:第一次打開淋浴,隨機擰動冷熱龍頭(初始權重和偏置隨機設置)。
  • ?結果?:水溫要么太冷(預測錯誤),要么太燙(損失函數值大)。
2. 試水溫(前向傳播)??
  • ?動作?:伸手試水溫,感受冷熱程度。
  • ?對應?:
    • 輸入數據 = 當前冷熱水比例(參數)
    • 輸出結果 = 實際水溫(預測值)
    • 目標 = 理想水溫(標簽)
    • 誤差 = 水溫偏差(損失函數值)
3. 調整龍頭(反向傳播與梯度下降)??
  • ?冷熱不均(計算梯度)??:

    • 若水太冷 → ?需要更多熱水?(梯度指向增加熱水權重的方向)。
    • 若水太熱 → ?需要更多冷水?(梯度指向減少熱水權重的方向)。
    • 調整幅度 = 手擰龍頭的力度(學習率)。
  • ?具體操作?:

    • 微調熱水龍頭開大一點(參數更新公式:W = W - 學習率 × 梯度)。
    • 下次再試水溫(下一輪訓練)。
4. 反復調試(迭代優化)??
  • ?過程?:
    太冷 → 加熱水 → 試水 → 太燙 → 減熱水 → 試水 → 接近舒適 → 微調...
  • ?對應?:
    通過多次迭代(epoch),參數(冷熱水比例)逐漸收斂到最佳值(損失函數最小化)。
5. 成功(模型收斂)??
  • ?結果?:水溫穩定在理想溫度(模型準確預測)。
  • ?關鍵因素?:
    • ?學習率?:手擰龍頭的幅度太大(學習率高)→ 水溫反復震蕩;幅度太小(學習率低)→ 調整過慢。
    • ?耐心(迭代次數)??:足夠多的調試次數才能找到平衡點。

2.2? ? ?SGD(隨機下降)介紹

1? ?核心公式:

這里把需要更新的權重參數記為W,把損失函數關于W的梯度記為。 η表示學習率,實際上會取0.01或0.001這些事先決定好的值。上式中的←表示用右邊的值更新左邊的值。(可以理解為朝向梯度下降的方向前進)

2? ?SGD缺點:

首先來求的最值問題。

左圖表示的函數是向x軸方向延伸的“碗”狀函數。 右圖是等高線呈向x軸方向延伸的橢圓狀。

此函數對應的梯度如下圖:

這個梯度的特征是,y軸方向上大,x軸方向上小。換句話說, 就是y軸方向的坡度大,而x軸方向的坡度小。假設從(x , y )=(-7, 2)處 (初始值)開始搜索,結果如下圖所示:

如圖,雖然最后能找到“最優點”,但是過程很曲折,,SGD呈“之”字形移動。這是一個相當低效的路徑,在Y軸上跨度比較大,但是在水平方向上看,每次平移的:“步伐”總是很小。

為了改正SGD的缺點,下面將介紹Momentum、AdaGrad、Adam這3 種方法來取代SGD。

2.3? Momentum(同SGD相比,引入了阻力下的初始速度)

Momentum是“動量”的意思,和物理有關。

1? ?我個人的理解:

將二維空間圖像的梯度進行正交分解,在梯度跨度大的方向(比如Y軸)對梯度的跨度進行適當的“動態調整”,在梯度跨度小的方向(比如X軸)對梯度的跨度施加外力作用,“迫使”梯度跨度逐漸增加。

2? 核心公式:

和前面的SGD一樣,W表示要更新的權重參數,表示損失函數關 于W的梯度,η表示學習率。這里新出現了一個變量v,對應物理上的速度。

例如下圖:

αv這一項,在物體不受任何力時,該項承擔使物體逐漸減 速的任務(α設定為0.9之類的值),對應物理上的地面摩擦或空氣阻力。

class Momentum:def __init__(self, lr , moment):self.lr = lrself.moment = momentself.v = Nonedef update (self, para , grad):if self.v is None:self.v = {}for key , val in para.items():self.v[key] = np.zeros_like(val)for key in para.keys():para[key] = self.moment * self.v[key] - self.lr - grad[key]para[key] =+ self.v[key]

實例變量v會保存物體的速度。初始化時,v中什么都不保存,但當第 一次調用update()時,v會以字典型變量的形式保存與參數結構相同的數據。

假設采用Momentum解決函數最優化的問題,相應的 優化路徑如下:

? ??

和SGD相比,我們發現 “之”字形的“程度”減輕了。這是因為雖然x軸方向上受到的力非常小,但 是一直在同一方向上受力,所以朝同一個方向會有一定的加速。反過來,雖 然y軸方向上受到的力很大,但是因為交互地受到正方向和反方向的力,它 們會互相抵消,所以y軸方向上的速度不穩定。因此,和SGD時的情形相比, 可以更快地朝x軸方向靠近,減弱“之”字形的變動程度。

2.4? ? AdaGrad

在神經網絡的學習中,學習率(數學式中記為η)的值很重要。學習率過小, 會導致學習花費過多時間;反過來,學習率過大,則會導致學習發散而不能 正確進行。

有一種被稱為學習率衰減(learning rate decay)的方法,即隨著學習的進行,使學習率逐漸減小。

AdaGrad會為參數的每個元素適當地調整學習率。

1? 核心公式:

和前面的SGD一樣,W表示要更新的權重參數, 表示損失函數關 于W的梯度,η表示學習率。這里新出現了變量h,它保 存了以前的所有梯度值的平方和(表示對應矩陣元素的乘法)。 然后,在更新參數時,通過乘以,就可以調整學習的尺度。這意味著, 參數的元素中變動較大(被大幅更新)的元素的學習率將變小。也就是說, 可以按參數的元素進行學習率衰減,使變動大的參數的學習率逐漸減小。

AdaGrad代碼實現過程:

class AdaGrad:def __init_(self, lr = 0.01):self.lr = lrself.h = Nonedef update(self, para, grad):if self.h is None:self.h = {}for key, val in para.items():self.h[key] = np.zeros_like(val)for key in para.keys():self.h[key] += grad[key] * grad[key]para[key] -= self.lr * grad[key] / (np.sqrt(self.h[key]) + 1e-7)

假設采用AdaGrad解決函數最優化的問題,相應的 優化路徑如下:

函數的取值高效地向著最小值移動。由于y軸方 向上的梯度較大,因此剛開始變動較大,但是后面會根據這個較大的變動按 比例進行調整,減小更新的步伐。因此,y軸方向上的更新程度被減弱,“之” 字形的變動程度有所衰減.

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

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

相關文章

Cribl 對Windows-xml log 進行 -Removing filed-06

Removing Fields Description? The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function

chili3d調試6 添加左側面板

注釋前 一個一個注釋看對應哪個窗口 無事發生 子方法不是顯示的窗口 注釋掉看看 沒了 注釋這個看看 零件頁面沒了 這個瀏覽器居然完全不用關的,刷新就重載了 注釋看看 無工具欄版本 sidebar: 往框框里面加入 div({ className: style.input }, user_…

Linux學習——了解和熟悉Linux系統的遠程終端登錄

Linux學習——了解和熟悉Linux系統的遠程終端登錄 一.配置Ubuntu系統的網絡和用戶 1、設置虛擬機網絡為橋接模式 打開VMWare,選擇編輯虛擬機設置,在網絡適配器設置中,選擇“橋接模式”,保存設置并啟動Ubuntu。 2、配置Ubuntu的…

【JAVA EE初階】多線程(1)

這樣的代碼,雖然也能打印hello thread,但是沒有創建新的線程,而是直接在main方法所在的主線程中執行了run的邏輯 start方法,是調用系統api,真正在操作系統內部創建一個線程。這個新的線程會以run作為入口方法&#xff…

javase 學習

一、Java 三大版本 javaSE 標準版 (桌面程序; 控制臺開發) javaME 嵌入式開發(手機、小家電)基本不用,已經淘汰了 javaEE E業級發開(web端、 服務器開發) 二、Jdk ,jre jvm 三…

【Linux】Linux 操作系統 - 05 , 軟件包管理器和 vim 編輯器的使用 !

文章目錄 前言一、軟件包管理器1 . 軟件安裝2 . 包管理器3 . Linux 生態 二、軟件安裝 、卸載三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替換模式7 . V-BLOCK 模式8 . 技巧補充 總結 前言 本篇筆者將會對軟件包管理…

python基礎知識點(1)

python語句 一行寫一條語句 一行內寫多行語句,使用分號分隔建議每行寫一句,且結束時不寫分號寫在[ ]、{ }內的跨行語句,被視為一行語句\ 是續行符,實現分行書寫功能 反斜杠表示下一行和本行是同一行 代碼塊與縮進 代碼塊復合語句&#xf…

C#/.NET/.NET Core技術前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技術前沿周刊,你的每周技術指南針!記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿,助力技術成長與視野拓寬。 歡迎投稿、推薦…

HTML表單與數據驗證設計

HTML 表單與數據驗證設計:構建可靠的用戶數據采集系統 引言 互聯網的核心是數據交互,而HTML表單是這一交互的主要入口。作為前端工程師,設計高質量的表單不僅關乎用戶體驗,更直接影響數據收集的準確性和系統安全。 在我的學習實…

基于STM32的Keil環境搭建與點燈

本人使用的STM32開發板為正點原子的STM32F103ZE,在此記錄完整的搭建與點燈過程。 一、Keil的安裝與配置 安裝Keil 首先進入Keil下載官網:https://www.keil.com/download/product/ 點擊MDK-ARM,并填寫相關信息,之后開始下載最新版…

React-useRef

如果我們想在hooks里面獲同步取最新的值&#xff0c;那么則可以使用useRef, 關鍵源碼如下&#xff1a; function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…

幽靈依賴與常見依賴管理

文章目錄 前言1. 演示&#xff1a;檢測和修復幽靈依賴步驟1&#xff1a;安裝 depcheck步驟2&#xff1a;在項目根目錄運行 depcheck可能的輸出步驟3&#xff1a;修復幽靈依賴 2. 依賴管理的好習慣 1. 場景設定現在有如下依賴需求&#xff1a; 2. 依賴沖突的表現3. 解決依賴沖突…

如何使用人工智能大模型,免費快速寫工作總結?

如何使用人工智能大模型&#xff0c;免費快速寫工作總結&#xff1f; 詳細學習視頻https://edu.csdn.net/learn/40406/666581

[Java實戰經驗]異常處理最佳實踐

一些好的異常處理實踐。 目錄 異常設計自定義異常為異常設計錯誤代碼&#xff08;狀態碼&#xff09;設計粒度全局異常處理異常日志信息保留 異常處理時機資源管理try-with-resources異常中的事務 異常設計 自定義異常 自定義異常設計&#xff0c;如業務異常定義BusinessExce…

Makefile 入門指南

Makefile 入門指南 最簡單的例子 單文件編譯 假設我們有一個main.cpp文件&#xff0c;最簡單的Makefile如下&#xff1a; # 最簡單的單文件編譯 # 目標:依賴文件 main: main.cpp# 編譯命令g main.cpp -o main使用步驟&#xff1a; 將上述內容保存為名為Makefile的文件&…

PyTorch數據操作基礎教程:從張量創建到高級運算

本文通過示例代碼全面講解PyTorch中張量的基本操作&#xff0c;包含創建、運算、廣播機制、索引切片等核心功能&#xff0c;并提供完整的代碼和輸出結果。 1. 張量創建與基本屬性 import torch# 創建連續數值張量 x torch.arange(12, dtypetorch.float32) print("原始張…

【Redis】Redis中的常見數據類型(一)

文章目錄 前言一、Redis前置知識1. 全局命令2、數據結構和內部編碼3. 單線程架構 二、String 字符串1. 常見命令2. 計數命令3.其他命令4. 內部編碼5. 典型使用場景 三、Hash哈希1. 命令2.內部編碼3. 使用場景4. 緩存方式對比 結語 前言 Redis 提供了 5 種數據結構&#xff0c;…

Windows 中使用 `netstat` 命令查看端口占用

在 Windows 系統中&#xff0c;可以通過 netstat 命令來查看當前系統的網絡連接以及端口的占用情況。以下是關于該命令的具體說明&#xff1a; #### 使用方法 1. **查看所有端口及其狀態** 可以通過以下命令查看系統中的所有活動連接和監聽端口&#xff1a; bash net…

23種設計模式-結構型模式之裝飾器模式(Java版本)

Java 裝飾器模式&#xff08;Decorator Pattern&#xff09;詳解 &#x1f381; 什么是裝飾器模式&#xff1f; 裝飾器模式是一種結構型設計模式&#xff0c;允許向一個對象動態添加新的功能&#xff0c;而不改變其結構。 &#x1f9f1; 你可以想象成在原有功能上“包裹”一…

解決模擬器打開小紅書設備異常問題

解決模擬器打開小紅書設備異常問題 解決模擬器打開小紅書設備異常問題和無法打開問題 解決模擬器打開小紅書設備異常問題和無法打開問題 問題描述 最近有用戶反饋在模擬器上無法正常登錄和打開小紅書APP&#xff0c;系統提示"設備異常"錯誤。本文將詳細介紹如何通過…