DL Homework 10

習題6-1P?推導RNN反向傳播算法BPTT.
習題6-2?推導公式(6.40)和公式(6.41)中的梯度

習題6-3?當使用公式(6.50)作為循環神經網絡的狀態更新公式時, 分析其可能存在梯度爆炸的原因并給出解決方法.

? ? ? ? ?當然,因為我數學比較菜,我看了好半天還是沒看懂怎么庫庫推過來的,等我慢慢研究,這個博客會定時更新的,哭死

????????但是可能存在梯度爆炸的原因還是比較明確的:RNN發生梯度消失和梯度爆炸的原因如圖所示,將公式改為上式后當γ<1時,t-k趨近于無窮時,γ不會趨近于零,解決了梯度消失問題,但是梯度爆炸仍然存在。當γ>1時,隨著傳播路徑的增加,γ趨近于無窮,產生梯度爆炸。

????????如果時刻t的輸出yt依賴于時刻k的輸入xk,當間隔t-k比較大時,簡單神經網絡很難建模這種長距離的依賴關系, 稱為長程依賴問題(Long-Term ependencies Problem)

????????由于梯度爆炸或消失問題,實際上只能學習到短周期的依賴關系。

? ? ? ? 至于改進方案老師給出了兩種,一種是較為直接的修改選取合適參數,同時使用非飽和激活函數,盡量使得diag({f}'(z_{\tau }))U^T\approx 1 需要足夠的人工調參經驗,限制了模型的廣泛應用.

? ? ? ? 另一種則是比較有效的改進模型

  • 權重衰減 通過給參數增加L1或L2范數的正則化項來限制參數的取值范圍,從而使得 γ ≤ 1.
  • 梯度截斷 當梯度的模大于一定閾值時,就將它截斷成為一個較小的數
習題6-2P?設計簡單RNN模型,分別用Numpy、Pytorch實現反向傳播算子,并代入數值測試.

1.反向求導的函數

import numpy as np
import torch.nn# GRADED FUNCTION: rnn_cell_forward
def softmax(a):exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn ydef rnn_cell_forward(xt, a_prev, parameters):Wax = parameters["Wax"]Waa = parameters["Waa"]Wya = parameters["Wya"]ba = parameters["ba"]by = parameters["by"]a_next = np.tanh(np.dot(Wax, xt) + np.dot(Waa, a_prev) + ba)yt_pred = softmax(np.dot(Wya, a_next) + by)cache = (a_next, a_prev, xt, parameters)return a_next, yt_pred, cachedef rnn_cell_backward(da_next, cache):(a_next, a_prev, xt, parameters) = cacheWax = parameters["Wax"]Waa = parameters["Waa"]Wya = parameters["Wya"]ba = parameters["ba"]by = parameters["by"]dtanh = (1 - a_next * a_next) * da_next dxt = np.dot(Wax.T, dtanh)dWax = np.dot(dtanh, xt.T)da_prev = np.dot(Waa.T, dtanh)dWaa = np.dot(dtanh, a_prev.T)dba = np.sum(dtanh, keepdims=True, axis=-1)  gradients = {"dxt": dxt, "da_prev": da_prev, "dWax": dWax, "dWaa": dWaa, "dba": dba}return gradients# GRADED FUNCTION: rnn_forward
np.random.seed(1)
xt = np.random.randn(3, 10)
a_prev = np.random.randn(5, 10)
Wax = np.random.randn(5, 3)
Waa = np.random.randn(5, 5)
Wya = np.random.randn(2, 5)
ba = np.random.randn(5, 1)
by = np.random.randn(2, 1)
parameters = {"Wax": Wax, "Waa": Waa, "Wya": Wya, "ba": ba, "by": by}a_next, yt, cache = rnn_cell_forward(xt, a_prev, parameters)da_next = np.random.randn(5, 10)
gradients = rnn_cell_backward(da_next, cache)
print("gradients[\"dxt\"][1][2] =", gradients["dxt"][1][2])
print("gradients[\"dxt\"].shape =", gradients["dxt"].shape)
print("gradients[\"da_prev\"][2][3] =", gradients["da_prev"][2][3])
print("gradients[\"da_prev\"].shape =", gradients["da_prev"].shape)
print("gradients[\"dWax\"][3][1] =", gradients["dWax"][3][1])
print("gradients[\"dWax\"].shape =", gradients["dWax"].shape)
print("gradients[\"dWaa\"][1][2] =", gradients["dWaa"][1][2])
print("gradients[\"dWaa\"].shape =", gradients["dWaa"].shape)
print("gradients[\"dba\"][4] =", gradients["dba"][4])
print("gradients[\"dba\"].shape =", gradients["dba"].shape)
gradients["dxt"][1][2] = -0.4605641030588796
gradients["dxt"].shape = (3, 10)
gradients["da_prev"][2][3] = 0.08429686538067724
gradients["da_prev"].shape = (5, 10)
gradients["dWax"][3][1] = 0.39308187392193034
gradients["dWax"].shape = (5, 3)
gradients["dWaa"][1][2] = -0.28483955786960663
gradients["dWaa"].shape = (5, 5)
gradients["dba"][4] = [0.80517166]
gradients["dba"].shape = (5, 1)

# GRADED FUNCTION: rnn_forward
def rnn_forward(x, a0, parameters):caches = []n_x, m, T_x = x.shapen_y, n_a = parameters["Wya"].shapea = np.zeros((n_a, m, T_x))y_pred = np.zeros((n_y, m, T_x))a_next = a0for t in range(T_x):a_next, yt_pred, cache = rnn_cell_forward(x[:, :, t], a_next, parameters)a[:, :, t] = a_nexty_pred[:, :, t] = yt_predcaches.append(cache)caches = (caches, x)return a, y_pred, cachesnp.random.seed(1)
x = np.random.randn(3, 10, 4)
a0 = np.random.randn(5, 10)
Waa = np.random.randn(5, 5)
Wax = np.random.randn(5, 3)
Wya = np.random.randn(2, 5)
ba = np.random.randn(5, 1)
by = np.random.randn(2, 1)
parameters = {"Waa": Waa, "Wax": Wax, "Wya": Wya, "ba": ba, "by": by}a, y_pred, caches = rnn_forward(x, a0, parameters)
print("a[4][1] = ", a[4][1])
print("a.shape = ", a.shape)
print("y_pred[1][3] =", y_pred[1][3])
print("y_pred.shape = ", y_pred.shape)
print("caches[1][1][3] =", caches[1][1][3])
print("len(caches) = ", len(caches))

?用numpy和pytorh去實現反向傳播算子,并且二者對比

class RNNCell:def __init__(self, weight_ih, weight_hh,bias_ih, bias_hh):self.weight_ih = weight_ihself.weight_hh = weight_hhself.bias_ih = bias_ihself.bias_hh = bias_hhself.x_stack = []self.dx_list = []self.dw_ih_stack = []self.dw_hh_stack = []self.db_ih_stack = []self.db_hh_stack = []self.prev_hidden_stack = []self.next_hidden_stack = []# temporary cacheself.prev_dh = Nonedef __call__(self, x, prev_hidden):self.x_stack.append(x)next_h = np.tanh(np.dot(x, self.weight_ih.T)+ np.dot(prev_hidden, self.weight_hh.T)+ self.bias_ih + self.bias_hh)self.prev_hidden_stack.append(prev_hidden)self.next_hidden_stack.append(next_h)# clean cacheself.prev_dh = np.zeros(next_h.shape)return next_hdef backward(self, dh):x = self.x_stack.pop()prev_hidden = self.prev_hidden_stack.pop()next_hidden = self.next_hidden_stack.pop()d_tanh = (dh + self.prev_dh) * (1 - next_hidden ** 2)self.prev_dh = np.dot(d_tanh, self.weight_hh)dx = np.dot(d_tanh, self.weight_ih)self.dx_list.insert(0, dx)dw_ih = np.dot(d_tanh.T, x)self.dw_ih_stack.append(dw_ih)dw_hh = np.dot(d_tanh.T, prev_hidden)self.dw_hh_stack.append(dw_hh)self.db_ih_stack.append(d_tanh)self.db_hh_stack.append(d_tanh)return self.dx_listif __name__ == '__main__':np.random.seed(123)torch.random.manual_seed(123)np.set_printoptions(precision=6, suppress=True)rnn_PyTorch = torch.nn.RNN(4, 5).double()rnn_numpy = RNNCell(rnn_PyTorch.all_weights[0][0].data.numpy(),rnn_PyTorch.all_weights[0][1].data.numpy(),rnn_PyTorch.all_weights[0][2].data.numpy(),rnn_PyTorch.all_weights[0][3].data.numpy())nums = 3x3_numpy = np.random.random((nums, 3, 4))x3_tensor = torch.tensor(x3_numpy, requires_grad=True)h3_numpy = np.random.random((1, 3, 5))h3_tensor = torch.tensor(h3_numpy, requires_grad=True)dh_numpy = np.random.random((nums, 3, 5))dh_tensor = torch.tensor(dh_numpy, requires_grad=True)h3_tensor = rnn_PyTorch(x3_tensor, h3_tensor)h_numpy_list = []h_numpy = h3_numpy[0]for i in range(nums):h_numpy = rnn_numpy(x3_numpy[i], h_numpy)h_numpy_list.append(h_numpy)h3_tensor[0].backward(dh_tensor)for i in reversed(range(nums)):rnn_numpy.backward(dh_numpy[i])print("numpy_hidden :\n", np.array(h_numpy_list))print("tensor_hidden :\n", h3_tensor[0].data.numpy())print("------")print("dx_numpy :\n", np.array(rnn_numpy.dx_list))print("dx_tensor :\n", x3_tensor.grad.data.numpy())print("------")print("dw_ih_numpy :\n",np.sum(rnn_numpy.dw_ih_stack, axis=0))print("dw_ih_tensor :\n",rnn_PyTorch.all_weights[0][0].grad.data.numpy())print("------")print("dw_hh_numpy :\n",np.sum(rnn_numpy.dw_hh_stack, axis=0))print("dw_hh_tensor :\n",rnn_PyTorch.all_weights[0][1].grad.data.numpy())print("------")print("db_ih_numpy :\n",np.sum(rnn_numpy.db_ih_stack, axis=(0, 1)))print("db_ih_tensor :\n",rnn_PyTorch.all_weights[0][2].grad.data.numpy())print("------")print("db_hh_numpy :\n",np.sum(rnn_numpy.db_hh_stack, axis=(0, 1)))print("db_hh_tensor :\n",rnn_PyTorch.all_weights[0][3].grad.data.numpy())

實驗結果:numpy實現和torch實現結果基本一樣?

總結

本次實驗主要是圍繞BPTT的手推和代碼(舉例子推我推的很明白,但是理論硬推的時候,數學的基礎是真跟不上阿,有心無力害,但是課下多努力吧,這篇博客本人寫的感覺不是很好,因為數學知識不太跟得上感覺很多東西力不從心,也不算真正寫完了吧,博客之后會持續更新de)

首先對于RTRL和BPTT,對于兩種的學習算法要明確推導的過程(雖然我還沒特別明確,半知半解)

關于梯度爆炸,梯度消失,對我們來說不陌生了,怎么能盡可能減少他們兩者對我們的危害,比如梯度爆炸可以采取權重衰減和梯度截斷等等,要明確梯度消失可以增加非線性等等,對于增加非線性后的容量問題,引入門控機制,LSTM等等,都應該對這塊的知識有一個完整的體系。

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

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

相關文章

Vue之數據綁定

在我們Vue當中有兩種數據綁定的方法 1.單向綁定 2.雙向綁定 讓我為大家介紹一下吧&#xff01; 1、單向綁定(v-bind) 數據只能從data流向頁面 舉個例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

BASH中export使用:命令行中傳入變量

可以看到通過export address/project這句話 定義了一個變量address,數值為/project。

運維06:監控

監控生命周期 1.服務器上架到機柜2.基礎設施監控 服務器溫度&#xff0c;風扇轉速 ipmitool命令&#xff0c;只能用在物理機上 存儲的監控&#xff08;df, fdisk, iotop&#xff09; cpu&#xff08;lscpu, uptime, top, htop, glances&#xff09; 內存情況&#xff08;free&…

MVC Gantt Wrapper:RadiantQ jQuery

The RadiantQ jQuery Gantt Package includes fully functional native MVC Wrappers that let you declaratively and seamlessly configure the Gantt component within your aspx or cshtm pages just like any other MVC extensions. 如果您還沒有準備好轉向完全基于客戶端…

(C++)只出現一次的數字I--異或

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能&#xff0c;輕松拿下世界 IT 名企 Dream Offer。https://le…

OpenAI承認ChatGPT變懶惰,正在修復該問題

OpenAI旗下的官方ChatGPT賬號在社交平臺表示&#xff0c;已經收到了大量用戶關于GPT-4變懶惰的反饋。 這是因為自11月11日以來&#xff0c;OpenAI就沒有更新過該模型。當然這不是故意的&#xff0c;大模型的行為是不可預測的&#xff0c;正在研究修復該問題。 外界猜測&#x…

pip install faiss-gpu 失敗解決方法

安裝 faiss-gpu 失敗解決方法 1. 錯誤信息2. 不好用的解決方法2-1. 不好用的解決方法12-2. 不好用的解決方法22-3. 不好用的解決方法3 3. 好用的解決方法 1. 錯誤信息 Windows x86 平臺安裝 faiss-gpu&#xff0c;發生錯誤&#xff0c; pip install faiss-gpu失敗信息如下&am…

力扣面試150題 | 買賣股票的最佳時期

力扣面試150題 &#xff5c; 買賣股票的最佳時期 題目描述解題思路代碼實現 題目描述 121.買賣股票的最佳時期 給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一…

文本預處理(text preprocess)總結

在任何機器學習任務中&#xff0c;清理&#xff08;cleaning &#xff09;或預處理&#xff08;preprocessing&#xff09;數據與模型構建同樣重要&#xff0c;甚至更重要。 當涉及文本等非結構化數據時&#xff0c;這個過程就更加重要。 1. 小寫化(Lower Casing) 小寫是一種…

【UML】NO.1 UML簡介

目錄 一、什么是UML 二、UML和軟件工程 三、UML的誕生 四、UML的基本構成 從今天開始&#xff0c;開一個新的話題&#xff0c;把UML梳理一遍。 一、什么是UML UML&#xff08;Unified Modeling Language,UML&#xff09;是一個通用的可視化建模語言標準&#xff0c;用于對…

企業欠稅信息API:實現稅務管理的智能化與高效化

前言 隨著經濟的發展和社會的進步&#xff0c;企業欠稅問題逐漸凸顯&#xff0c;成為制約經濟發展的重要因素。為了解決這一問題&#xff0c;企業欠稅信息API應運而生。它通過先進的技術手段&#xff0c;提供了一種全新的欠稅信息查詢方式&#xff0c;幫助企業實現稅務管理的智…

nginx多ip部署

1.修改網卡信息自定義多個IP 進入/etc/sysconfig/network-scripts&#xff0c;編輯ifcfg-ens33網卡文件。將dhcp動態分配修改成static&#xff0c;同時添加ip地址子網掩碼、網關和DNS。 修改完成后重啟網卡&#xff0c;systemctl restart network 2.修改nginx配置文件 有幾個…

Vue3無廢話,快速上手

Vue3無廢話&#xff0c;快速上手 認識Vue3 1. Vue2 選項式 API vs Vue3 組合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> import { ref } from vue const count ref(0) const…

【c++隨筆16】reserve之后,使用std::copy會崩潰?

【c隨筆16】reserve之后&#xff0c;使用std::copy會崩潰? 一、reserve之后&#xff0c;使用std::copy會崩潰?二、函數std::reserve、std::resize、std::copy1、std::resize&#xff1a;2、std::reserve&#xff1a;3、std::copy&#xff1a; 三、崩潰原因分析方案1、你可以使…

機器學習 | Python貝葉斯超參數優化模型答疑

機器學習 | Python貝葉斯超參數優化模型答疑 目錄 機器學習 | Python貝葉斯超參數優化模型答疑問題匯總問題1答疑問題2答疑問題3答疑問題匯總 問題1:想問一下貝葉斯優化是什么? 問題2:為什么使用貝葉斯優化? 問題3:如何實現? 問題1答疑 超參數優化在大多數機器學習流水線…

淺析不同NAND架構的差異與影響

SSD的存儲介質是什么&#xff0c;它就是NAND閃存。那你知道NAND閃存是怎么工作的嗎&#xff1f;其實&#xff0c;它就是由很多個晶體管組成的。這些晶體管里面存儲著電荷&#xff0c;代表著我們的二進制數據&#xff0c;要么是“0”&#xff0c;要么是“1”。NAND閃存原理上是一…

安卓11修改power按鍵功能

客戶需要把power鍵的短按休眠功能去除&#xff0c;并且把長按功能改成直接關機&#xff0c;我們先分析系統framework層處理按鍵的代碼&#xff1a; interceptKeyBeforeQueueing power按鍵上來都會直接走這里&#xff0c;我們找到power按鍵處理的地方如下&#xff1a; case KeyE…

開啟數據庫性能之旅:MSSQL存儲過程索引優化深度解析

數據庫&#xff0c;如同一座龐大的圖書館&#xff0c;蘊藏著無數寶貴的信息。然而&#xff0c;想要在這個海量數據的世界中迅捷而準確地找到所需&#xff0c;索引就成為了至關重要的引路人。本文將引領讀者深入探討MSSQL存儲過程中索引優化的奧妙&#xff0c;揭示數據庫性能提升…

Spring日志完結篇,MyBatis操作數據庫(入門)

目錄 Spring可以對日志進行分目錄打印 日志持久化&#xff08;讓日志進行長期的保存&#xff09; MyBatis操作數據庫(優秀的持久層框架) MyBatis的寫法 開發規范&#xff1a; 單元測試的寫法 傳遞參數 Spring可以對日志進行分目錄打印 他的意思是說spring相關只打印INFO…

mysql中的DQL查詢

表格為&#xff1a; DQL 基礎查詢 語法&#xff1a;select 查詢列表 from 表名&#xff1a;&#xff08;查詢的結果是一個虛擬表格&#xff09; -- 查詢指定的列 SELECT NAME,birthday,phone FROM student -- 查詢所有的列 * 所有的列&#xff0c; 查詢結果是虛擬的表格&am…