【人工智能】神經網絡的優化器optimizer(三):RMSProp動態自適應學習率優化器

一、算法核心原理

????????RMSProp(Root Mean Square Propagation)是深度學習先驅Geoffrey Hinton在2012年提出的優化算法,它基于AdaGrad算法的改進,創新性地解決了傳統梯度下降法中學習率固定不變的局限性。該算法的核心機制在于采用指數加權移動平均(EWMA,詳情可參考連接:【深度學習】通俗易懂的基礎知識:指數加權平均)方法,實現了對參數更新幅度的自適應動態調整。

二、RMSProp算法的公式推導

? ? ? ? AdaGrad算法(【人工智能】神經網絡的優化器optimizer(二):Adagrad自適應學習率優化器)對于學習率的動態調整設計思路:把全部歷史梯度一視同仁全部打包進行平方和,導致學習提早結束。

????????RMSProp算法對于學習率的動態調整設計思路:通過將Momentum動量優化器(【人工智能】神經網絡的優化器optimizer(一):Momentum動量優化器)中采用的指數加權平均(EWMA)應用到學習率動態調整中,以便于通過指數衰減將近期數據賦予高權重,歷史數據逐漸“遺忘”,從而產生類似“滑動”的機制,避免學習率過早衰減的問題。

????????????????????????????????????????????????v_{t}=\beta v_{t-1}+(1-\beta)x_{t}^{2}

????????其中:

  • v_{t}:當前時刻的加權平均值

  • v_{t-1}:上一時刻的加權平均值(初始值?v_{0}=0

  • x_{t}:想要觀察的時刻?t 的值,在該文章中代表 t 時間的梯度

  • \beta:衰減因子(0<β<1),控制歷史數據的權重分布?

????????RMSProp為每個參數維護一個狀態變量(通常記作 V),用于記錄梯度平方的指數衰減平均值,剩下的其他公式就和AdaGrad算法是一樣的了:

????????????????????????????????????????????????????????????????????????????\theta _{t+1}=\theta _{t}-\frac{\eta }{\sqrt{v_{t}+\epsilon }}\cdot x_{t}

? ? ? ? 其算法的特點也和AdaGrad算法差不多:

  1. ?分母設計?:v^{_{t}}近似為梯度的均方根(Root Mean Square),反映歷史梯度的幅值

  2. ?自適應效果?:

    1. 梯度方向振蕩劇烈(v^{_{t}}較大)→ 學習率降低,抑制震蕩

    2. 梯度方向平緩(v^{_{t}}較小)→ 學習率增大,加速收斂?

  3. 穩定常數:\varepsilon(如1e-8)用于數值穩定,防止分母為零?

三、RMSProp算法和AdaGrad算法的對比

?特性??RMSProp??AdaGrad?
歷史梯度累積方式指數衰減加權平均全局累積
學習率衰減趨勢動態平衡,避免過早趨近零單調遞減,后期更新停滯
適用場景非平穩目標、深層網絡、RNN?稀疏數據、淺層網絡

????????根據上述內容可以總結出幾個特點:

  • 解決AdaGrad缺陷?:AdaGrad累積所有歷史梯度導致后期學習率過小,RMSProp通過衰減系數?γ 削弱早期梯度的影響,使學習率在訓練中保持有效調整能力?;

  • ?適應非平穩目標?:在RNN等動態系統中,梯度分布隨時間變化,RMSProp的指數衰減能更快響應近期變化?;

  • ?超參數影響?:γγ?過大易忽略新梯度信息,過小則退化為類似AdaGrad,通常取0.9經驗值?。

????????綜上所述,RMSProp的衰減機制通過加權平均平衡歷史與當前梯度,實現學習率的穩定自適應調整,顯著提升非凸優化問題的訓練效率?。

四、代碼實現

? ? ? ? 以下是使用python編寫的兩個算法的動畫對比圖,可以觀察到RMSProp算法相比AdaGrad算法會快速往原點滑動,然后在原點附近來回滑動,通過修改超參可以調整算法的步幅以及方向,建議各位自行嘗試:

? ? ? ? 代碼源碼如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation# 生成樣本數據
np.random.seed(42)
sample_data = np.random.randn(100, 2) * 2# 定義測試函數
def loss_func(x, y):return 0.1 * x ** 2 + 2 * y ** 2 + np.sin(x) * np.cos(y)# 優化器實現
class AdaGrad:def __init__(self, params, lr=0.1):self.params = params.copy()self.lr = lrself.cache = {k: 0 for k in params.keys()}self.history = {k: [v] for k, v in params.items()}def step(self, grads):for key in self.params:self.cache[key] += grads[key] ** 2self.params[key] -= self.lr * grads[key] / (np.sqrt(self.cache[key]) + 1e-8)self.history[key].append(self.params[key])class RMSProp:def __init__(self, params, lr=0.1, gamma=0.9):self.params = params.copy()self.lr = lrself.gamma = gammaself.cache = {k: 0 for k in params.keys()}self.history = {k: [v] for k, v in params.items()}def step(self, grads):for key in self.params:self.cache[key] = self.gamma * self.cache[key] + (1 - self.gamma) * grads[key] ** 2self.params[key] -= self.lr * grads[key] / (np.sqrt(self.cache[key]) + 1e-8)self.history[key].append(self.params[key])# 初始化優化器
initial_params = {'x': -4, 'y': 4}
adagrad = AdaGrad(initial_params.copy())
rmsprop = RMSProp(initial_params.copy())# 創建可視化
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)# 繪制樣本數據
ax1.scatter(sample_data[:, 0], sample_data[:, 1], c='black', s=10)
ax2.scatter(sample_data[:, 0], sample_data[:, 1], c='black', s=10)# 繪制等高線
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = loss_func(X, Y)
ax1.contour(X, Y, Z, levels=20, alpha=0.5)
ax2.contour(X, Y, Z, levels=20, alpha=0.5)# 動畫更新函數
def update(frame):# 計算梯度x_adagrad, y_adagrad = adagrad.params['x'], adagrad.params['y']grads = {'x': 0.2 * x_adagrad + np.cos(x_adagrad) * np.cos(y_adagrad),'y': 4 * y_adagrad - np.sin(x_adagrad) * np.sin(y_adagrad)}adagrad.step(grads)x_rmsprop, y_rmsprop = rmsprop.params['x'], rmsprop.params['y']grads = {'x': 0.2 * x_rmsprop + np.cos(x_rmsprop) * np.cos(y_rmsprop),'y': 4 * y_rmsprop - np.sin(x_rmsprop) * np.sin(y_rmsprop)}rmsprop.step(grads)# 更新軌跡ax1.plot(adagrad.history['x'], adagrad.history['y'], 'b-', lw=1)ax2.plot(rmsprop.history['x'], rmsprop.history['y'], 'r-', lw=1)return ax1, ax2# 運行動畫
ani = FuncAnimation(fig, update, frames=100, interval=200)
ax1.set_title('AdaGrad (Blue)')
ax2.set_title('RMSProp (Red)')
plt.tight_layout()
plt.show()

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

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

相關文章

全面解析了Java微服務架構的設計模式

一、引言&#xff1a;微服務架構的背景與優勢隨著互聯網應用的復雜度不斷提升&#xff0c;傳統的單體架構&#xff08;Monolithic Architecture&#xff09;在可維護性、可擴展性、部署靈活性等方面逐漸暴露出瓶頸。微服務架構&#xff08;Microservices Architecture&#xff…

本地組策略編輯器圖形化工具

本地組策略圖形化工具&#xff0c;添加用戶權限分配功能。這將包括常見的用戶權限策略設置&#xff1a; 目前版本在優化中&#xff0c;后續會添加更多功能。 # GroupPolicyGUI.ps1 # 需要以管理員權限運行Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName …

深度學習卷積神經網絡項目實戰——超市商品分類

卷積神經網絡項目實戰 1.項目簡介 1.1項目名稱 ? 基于CNN實現超市商品的混合顆粒度分類&#xff08;500分類&#xff09; 1.2 項目簡介 ? 該項目旨在通過卷積神經網絡&#xff08;CNN&#xff09;實現超市商品的混合顆粒度分類&#xff0c;主要針對商品的不同種類進行分…

網站如何被搜索引擎收錄(Google、Bing、百度等)

1. 【Google 收錄】注冊 Google Search Console&#xff1a; https://search.google.com/search-console添加網站&#xff08;主域名、子域名都加&#xff09;驗證所有權&#xff08;用 DNS、HTML 文件、Meta Tag 都可以&#xff09;提交 Sitemap&#xff08;/sitemap.xml&…

JDK 8 → JDK 17 升級說明書(面向 Spring Boot / Spring Cloud / Spring )

自從 JDK 8 發布以來&#xff0c;Java 語言在持續進化&#xff0c;帶來了許多新的功能和性能改進。而 JDK 17 作為一個長期支持版本&#xff08;LTS&#xff09;&#xff0c;在許多方面超越了 JDK 8&#xff0c;不僅提升了語言本身的能力&#xff0c;還進一步提高了性能、可維護…

【ElasticSearch】使用docker compose,通過編寫yml安裝es8.15和kibana可視化界面操作,go連接es

使用 Docker 安裝 Elasticsearch Docker 搭建 Elasticsearch Kibana 環境&#xff0c;并在過程中標注常見問題和解決方案。 1. 準備工作 在開始之前&#xff0c;請確認你本地已經安裝了&#xff1a; 工具版本建議檢查方式Docker≥ 20.xdocker -vDocker Compose≥ 2.xdocker …

《C 語言文件操作補充:字符串格式化與隨機讀寫全解析》

目錄 一. sprintf函數和sscanf函數 1.1 sprintf 函數&#xff1a;將格式化數據寫入字符串 1.2 sscanf 函數&#xff1a;從字符串中格式化讀取數據 二. 文件的隨機讀寫 2.1 fseek 函數&#xff1a;移動文件讀寫指針 2.2 ftell 函數&#xff1a;獲取當前指針位置 2.3 rew…

SOME/IP-SD報文中 Entry Format(條目格式)-理解筆記4

逐字段解析 AUTOSAR SOME/IP Service Discovery 中的 Entry 格式。我們將它拆解成幾個部分&#xff0c;并用清晰的排版和比喻來確保每個字段都得到解釋。&#x1f4dc; Entry 的完整結構&#xff1a;三層蛋糕 一條完整的 SD Entry 信息就像一塊三層蛋糕&#xff0c;從上到下分別…

在 vue3 和 vue2 中,computed 計算屬性和 methods 方法區別是什么

在 Vue 2 和 Vue 3 中&#xff0c;computed&#xff08;計算屬性&#xff09;和 methods&#xff08;方法&#xff09;都是處理數據邏輯的方式&#xff0c;但它們在緩存機制、使用場景、執行時機等方面有顯著區別&#xff0c;且這些區別在兩個版本中保持一致。 1. 緩存機制&…

android 改機系列之-虛擬攝像頭-替換相機預覽畫面

Android Native 層實現跨進程 YUV 視頻幀共享&#xff1a;基于抽象 Unix Socket 的高效通信方案。基于AOSP13源碼或者lineage20 或相近版本。非hook 或者lsp 等插件方案。 1.引言 在某些定制化 Android 應用場景中&#xff0c;我們可能需要動態替換系統相機的預覽畫面 —— 例…

SSM從入門到實戰:2.5 SQL映射文件與動態SQL

&#x1f44b; 大家好&#xff0c;我是 阿問學長&#xff01;專注于分享優質開源項目解析、畢業設計項目指導支持、幼小初高的教輔資料推薦等&#xff0c;歡迎關注交流&#xff01;&#x1f680; 12-SQL映射文件與動態SQL &#x1f4d6; 本文概述 本文是SSM框架系列MyBatis進…

vue+vite打包后的文件希望放在一個子目錄下

比如我們常規操作是打包的項目文件直接放在域名下面。如果我們希望把項目放在子域名下面應該怎么處理呢&#xff1f;需要兩個步驟vite.config.js里面指定base的路徑假設我們希望放在子目錄加做call那么我們可以這樣base:/call/,注意不是build目錄哈。return的最外層。如果本地和…

Java:Docx4j類庫簡介及使用

1.簡介 Docx4j 是一個功能強大的 Java 類庫&#xff0c;專門用于創建和操作 Microsoft Open XML 格式&#xff08;如 Word DOCX、PowerPoint PPTX 和 Excel XLSX&#xff09;的文件。它深受 Java 開發者喜愛&#xff0c;特別是在需要自動化處理 Office 文檔的場景下。 下面是一…

【機械故障】旋轉機械故障引起的振動信號調制效應概述

系列文章目錄 提示&#xff1a;學習筆記 機械故障信號分析 共振峰 旋轉機械故障引起的振動信號調制效應概述系列文章目錄一、研究背景與意義二、故障引起的調制效應分類三、非平穩信號分析方法3.1 時頻分析方法3.2 信號分解方法一、研究背景與意義 在工程實踐中&#xff0c;可…

密碼安全隱形基石:隨機數、熵源與DRBG核心解析與技術關聯

前言&#xff1a;密碼安全的 “隱形基石” 在數字化浪潮席卷全球的今天&#xff0c;從金融交易的密鑰生成到區塊鏈的共識機制&#xff0c;從量子通信的加密協議到智能汽車的身份認證&#xff0c;隨機數如同空氣般滲透在信息系統的每一個安全節點。然而&#xff0c;看似簡單的 …

Vue3 + Element Plus實現表格多行文本截斷與智能Tooltip提示

在實際開發中&#xff0c;我們經常需要在表格中展示較長的文本內容&#xff0c;但又希望保持界面的整潔美觀。本文將介紹如何在Vue3 和 Element Plus中實現表格多行文本截斷&#xff0c;并智能控制Tooltip的顯示——只有當文本被截斷時才顯示Tooltip&#xff0c;否則不顯示。 需…

使用powerquery處理數據,取時間或者日期之前的

Table.AddColumn(#"已更改列類型 1", "自定義 (2)", each letcleanText Text.Replace([備注], "#(lf)", " "),hasTime Text.Contains(cleanText, "時間&#xff1a;"),hasDate Text.Contains(cleanText, "日期&…

Java面試全棧技術解析:從Spring Cloud到Kafka的實戰演練

面試官&#xff1a;請簡單介紹一下Spring Cloud的核心組件&#xff1f; 謝飛機&#xff1a;嗯...Spring Cloud主要是基于Spring Boot的&#xff0c;然后有Eureka做服務發現&#xff0c;Feign做聲明式REST調用&#xff0c;還有Config做配置中心... 面試官&#xff1a;那在電商場…

極簡 useState:手寫 20 行,支持多次 setState 合并

不依賴 React&#xff0c;用 閉包 批處理隊列 實現可合并更新的 useState。一、20 行完整代碼 function createUseState(initialValue) {let state initialValue;let pending null; // 合并隊列let listeners [];const flush () > {if (pending ! null) {…

LabVIEW Vision視覺引導撐簧圈智能插裝

為解決人工插裝連接器撐簧圈時勞動強度大、效率低、一致性差的問題&#xff0c;例以 LabVIEW為開發平臺&#xff0c;結合 IMAQ Vision 機器視覺庫&#xff0c;搭配精密硬件搭建智能插裝系統。系統可適配 9 芯、13 芯、25 芯、66 芯、128 芯 5 種規格工件&#xff0c;經 100 只產…