各類神經網絡學習:(三)RNN 循環神經網絡(中集),同步多對多結構的詳細解釋

上一篇下一篇
RNN(上集)RNN(下集)

同步多對多結構

1)結構詳解

①圖解:

在這里插入圖片描述

②參數含義:

  • x t x_t xt? :表示每一個時刻的輸入;
  • o t o_t ot? :表示每一個時刻的輸出;
  • s t s_t st? :表示每一個隱藏層的狀態輸出;
  • 右側小圓圈代表隱藏層的一個單元;
  • U 、 V 、 W U、V、W UVW 參數共享,即所有的隱藏層都共用這三個參數。

③通用公式:

  • s 0 = 0 s_0=0 s0?=0 (實際計算中是 0 0 0 列向量)。
  • s t = g 1 ( U ? x t + W ? s t ? 1 + b s ) s_t=g1(U·x_t+W·s_{t-1}+b_s) st?=g1(U?xt?+W?st?1?+bs?) g 1 ( ) g1() g1() 是激活函數, b s b_s bs? 是偏置。
  • o t = g 2 ( V ? s t + b o ) o_t=g2(V·s_t+b_o) ot?=g2(V?st?+bo?) g 2 ( ) g2() g2() 是激活函數, b o b_o bo? 是偏置。

通過將公式分解,可以發現: o t o_t ot? 的值和前面每個時刻的輸入都有關系(展開式形似 累乘 )。

④激活函數的選擇

總結:多分類使用 t a n h tanh tanh + s o f t m a x softmax softmax ;單分類使用 t a n h tanh tanh + s i g m o i d sigmoid sigmoid

  • 激活函數 g 1 ( ) g1() g1() 一般選用 t a n h tanh tanh 。不用其他的函數的原因如下:

    • 梯度消失問題(相比于 s i g m o i d sigmoid sigmoid ):

      s i g m o i d sigmoid sigmoid 函數的導數范圍是 ( 0 , 0.25 ] (0,0.25] (0,0.25] t a n h tanh tanh 函數的導數是 ( 0 , 1 ] (0,1] (0,1] 。由于 R N N RNN RNN 中會執行很多累乘,小于 1 1 1 的小數累乘會導致梯度越來越接近于 0 0 0 ,從而導致梯度消失現象。 t a n h tanh tanh s i g m o i d sigmoid sigmoid 相比,梯度收斂速度更快并且相對不易出現梯度消失問題。

    • 梯度爆炸問題(相比于 r e l u relu relu ):

      雖然 r e l u relu relu 函數能有效緩解梯度消失,但是由于 r e l u relu relu 的導數不是 0 0 0 就是 1 1 1 ,恒為 1 1 1 的導數容易導致梯度爆炸,尤其是在會執行很多累乘的 R N N RNN RNN 中。

    • 對稱問題:

      t a n h tanh tanh 的輸出范圍為 [ ? 1 , 1 ] [?1,1] [?1,1] ,這使得它能夠將輸入值映射到一個對稱的區間,有助于梯度的傳播和模型的收斂。

  • 激活函數 g 2 ( ) g2() g2()

    • 對于多分類問題,使用 s o f t m a x softmax softmax
    • 對于單分類問題,使用 s i g m o i d sigmoid sigmoid

2)在同步多對多RNN網絡中,句子如何作為輸入

①首先將句子進行分詞

分詞就是將一個句子拆分成單詞或字符,例如 “我喜歡打籃球” ,會被分詞為 “我、喜歡、打、籃球” 。

  • 對于英文,可用 NLTKword_tokenizesent_tokenize 等工具;對于中文,可用 Jieba 等工具。

  • 分詞后,通常會過濾掉語料庫中出現頻率較低的詞,以減少詞匯表的規模并提高模型訓練效率,低頻詞通常會被替換為 unknown_token

  • 為了幫助模型識別句子的開始和結束,通常會在句首和句尾添加標識符,如開始符 sentence_start 和結束符 sentence_end

②將分詞結果映射為向量

分詞后的單詞或字符需要被映射為向量表示。這通常通過構建一個詞匯表,將每個單詞或字符映射到一個唯一的索引,然后將這些索引轉換為向量。例如,使用 O n e ? H o t One-Hot One?Hot 編碼或嵌入層( E m b e d d i n g L a y e r Embedding Layer EmbeddingLayer)將單詞表示為向量( o n e ? h o t one-hot one?hot 編碼上網一搜便知,這里不做額外解釋)。

在這里插入圖片描述

將詞典通過上述方法轉換之后,就會得到右邊的一個高維、稀疏的向量組( m m m 個詞組成的向量組為 m m m 行, m m m 列)(稀疏指的是絕大部分元素都是 0 0 0 )。

之前提到的開始和結束標志也會在此向量組里,比如用 [1,0,0,...] 表示開始符, [...,0,0,1] 表示結束符。

③將分詞后的結果按照時刻依次輸入模型

以“我喜歡打籃球”→“我、喜歡、打、籃球”為例

模型的輸出后續會給出圖解。

在這里插入圖片描述


3)模型訓練過程中的矩陣運算是怎樣的

僅代表模型在 t t t 時刻的矩陣運算

回顧通用公式:

  • s 0 = 0 s_0=0 s0?=0 (實際計算中是 0 0 0 列向量)。
  • s t = g 1 ( U ? x t + W ? s t ? 1 ) s_t=g1(U·x_t+W·s_{t-1}) st?=g1(U?xt?+W?st?1?) 偏置 b s b_s bs? 先省略。
  • o t = g 2 ( V ? s t ) o_t=g2(V·s_t) ot?=g2(V?st?) 偏置 b o b_o bo? 先省略。

先確定輸出向量的維度: o t o_t ot? [ m , 1 ] [m,1] [m,1] (維度和 x t x_t xt? 一樣), s t s_t st? [ n , 1 ] [n,1] [n,1] n n n 可自定義)。公式展開如下:
[ s t 1 : s t n ] = g 1 ( U ? [ x t 1 ┇ x t m ] + W ? [ s t ? 1 1 : s t ? 1 n ] ) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ o t 1 ┇ o t m ] = g 2 ( V ? [ s t 1 : s t n ] ) \large\left[ \begin{matrix} s^1_t\\ :\\ s^n_t\\ \end{matrix} \right]=g1(U·\left[ \begin{matrix} x^1_t\\ ┇\\ x^m_t\\ \end{matrix} \right]+W·\left[ \begin{matrix} s^1_{t-1}\\ :\\ s^n_{t-1}\\ \end{matrix} \right])\\ -----------------------\\ \large\left[ \begin{matrix} o^1_t\\ ┇\\ o^m_t\\ \end{matrix} \right]=g2(V·\left[ \begin{matrix} s^1_t\\ :\\ s^n_t\\ \end{matrix} \right])\\ ?st1?:stn?? ?=g1(U? ?xt1?xtm?? ?+W? ?st?11?:st?1n?? ?)??????????????????????? ?ot1?otm?? ?=g2(V? ?st1?:stn?? ?)
注意其中的 n n n m m m 。參數矩陣 U 、 W 、 V U、W、V UWV 可由此確定維度( U U U [ n , m ] [n,m] [n,m] W W W [ n , n ] [n,n] [n,n] V V V [ m , n ] [m,n] [m,n] )。

不難推出參數 b s b_s bs? [ n , 1 ] [n,1] [n,1] b o bo bo [ m , 1 ] [m,1] [m,1]


4)在同步多對多RNN網絡中,模型的輸出是什么

①以語言建模為例:輸出激活函數使用softmax,即多分類

語言建模:輸入一個句子并輸出句子中每個詞在下一個時刻最有可能的詞,例如,給定句子 “The cat is on the”,RNN 會預測下一個詞可能是 “mat”、“roof” 等,并給出每個詞的概率。這個過程可以逐詞進行,直到生成完整的句子或序列。

每一個時刻的輸出是一條概率向量,表示下一個最可能的詞。

概率向量構成:由預測概率組成的向量,長度為 N N N 。形如: [0.00001,...,0.018,...,0.00023,...] 。這些概率都由 s o f t m a x softmax softmax 函數計算得出。

例如下方圖解:

在這里插入圖片描述

模型的完整輸入輸出為(輸入仍以“我、喜歡、打、籃球”為例):

(輸出結果可以是其他的,但是這里圖方便,就正好假設輸出也是“我、喜歡、打、籃球”。)

在這里插入圖片描述

舉一個語言建模逐詞進行的例子:

以句子 “The cat is on the” 為例,RNN 會逐詞預測下一個詞,并給出每個詞的概率分布。以下是假設的逐詞生成過程:

  1. 輸入“The”
    RNN 會基于 “The” 預測下一個詞,可能的輸出概率分布為:
    • cat: 0.8
    • dog: 0.1
    • bird: 0.05
  2. 輸入“The cat”
    RNN 會基于 “The cat” 預測下一個詞,可能的輸出概率分布為:
    • is: 0.7
    • was: 0.2
    • jumped: 0.05
  3. 輸入“The cat is”
    RNN 會基于 “The cat is” 預測下一個詞,可能的輸出概率分布為:
    • on: 0.6
    • under: 0.2
    • sleeping: 0.1
  4. 輸入“The cat is on”
    RNN 會基于 “The cat is on” 預測下一個詞,可能的輸出概率分布為:
    • the: 0.7
    • a: 0.2
    • my: 0.05
  5. 輸入“The cat is on the”
    RNN 會基于 “The cat is on the” 預測下一個詞,可能的輸出概率分布為:
    • mat: 0.5
    • roof: 0.3
    • table: 0.1

最終,RNN 可能會生成完整的句子,例如 “The cat is on the mat” 或 “The cat is on the roof” ,具體取決于概率分布和模型訓練數據。

②輸出激活函數使用sigmoid,即單分類

(這里就不展開了,隨便找 D e e p S e e k DeepSeek DeepSeek 寫了個例子):

假設我們有一個 R N N RNN RNN 模型用于預測某個事件是否會在每個時間步發生。模型的輸入是一個時間序列數據,輸出是一個與輸入序列長度相同的二進制序列
0 0 0 表示不會, 1 1 1 表示會)。

具體步驟:

  1. 輸入處理:輸入序列被逐個時間步輸入到 R N N RNN RNN 中。
  2. 隱藏狀態更新: R N N RNN RNN 在每個時間步更新其隱藏狀態,基于當前輸入和前一隱藏狀態。
  3. 輸出生成:在每個時間步, R N N RNN RNN 的輸出層使用 S i g m o i d Sigmoid Sigmoid 激活函數生成一個輸出值,表示當前時間步的事件發生概率(概率 ≥ 0.5 ≥0.5 0.5 時判為 1 1 1,否則為 0 0 0 )。
  4. 序列輸出:最終,模型輸出一個與輸入序列長度相同的二進制序列,每個值表示對應時間步的事件是否會發生。

總結:在同步多對多結構的 R N N RNN RNN 中,使用 S i g m o i d Sigmoid Sigmoid 作為輸出層的激活函數,可以生成一個二進制序列(一開始是概率序列,經過閾值判別后變成二進制序列),適用于二分類問題或概率預測任務。


5)模型訓練中的損失

一般采用交叉熵損失函數。

一整個序列(句子)作為一個輸入樣本時,其損失為各個時刻詞的損失之和。

損失計算公式定義:

  • 時刻 t t t 的損失: E t ( y t , y t ^ ) = ? y t ? l o g ( y t ^ ) \large E_t(y_t,\hat{y_t}) =-y_t·log(\hat{y_t}) Et?(yt?,yt?^?)=?yt??log(yt?^?)
  • 各時刻損失之和: E ( y , y ^ ) = ∑ t E t ( y t , y t ^ ) = ? ∑ t y t ? l o g ( y t ^ ) \large E(y,\hat{y})=\sum_t E_t(y_t,\hat{y_t}) =-\sum_ty_t·log(\hat{y_t}) E(y,y^?)=t?Et?(yt?,yt?^?)=?t?yt??log(yt?^?)

這里和 C N N CNN CNN 的交叉熵損失函數有所不同,這里的 y t y_t yt? 代表時刻 t t t 上正確詞的向量, y t ^ \hat{y_t} yt?^? 代表預測詞的向量。

單個時刻的損失對模型輸出 o t o_t ot? 的導數為 ? J t ? o t = o t ? y t \large \frac{\partial J_t}{\partial o_t} = o_t - y_t ?ot??Jt??=ot??yt?

單個時刻的損失對隱層狀態輸出 s t s_t st? 的導數為 ? J t ? s t = V T ? ( o t ? y t ) \large \frac{\partial J_t}{\partial s_t} = V^T * (o_t - y_t) ?st??Jt??=VT?(ot??yt?)


6)時序反向傳播算法(BPTT)

BPTT,Back Propagation Through Time,對 RNN 來說,梯度是沿時間通道反向傳播的。
看看過程,理解一下就行,實際寫代碼不用親自寫,直接模塊化調用就行。

再次回顧前向傳播通用公式,并帶入激活函數:

  • 公式一: s t = t a n h ( z t ) = t a n h ( U ? x t + W ? s t ? 1 + b s ) \large s_t=tanh(z_t)=tanh(U·x_t+W·s_{t-1}+b_s) st?=tanh(zt?)=tanh(U?xt?+W?st?1?+bs?)
  • 公式二: o t = s o f t m a x ( V ? s t + b o ) \large o_t=softmax(V·s_t+b_o) ot?=softmax(V?st?+bo?)

令損失為 J J J

①梯度計算要求及規則:

  1. 目標 是:計算損失 J J J 關于參數 U 、 V 、 W 、 b s 、 b o U、V、W、b_s、b_o UVWbs?bo? 的梯度;

  2. 因為上述五個參數在每個時刻都是共享的,所以每個時刻的梯度都得計算出來,求出所有時刻梯度之和,才可用于參數更新;

    圖解如下:

    在這里插入圖片描述

  3. 每個時刻的梯度計算 規則:

    • 最后一個時刻:

      • 第一步:依據交叉熵計算公式和公式二計算出: ? J t ? s t 、 ? J t ? V ( √ ) 、 ? J t ? b o ( √ ) \Large \frac{\partial J_t}{\partial s_t}、\frac{\partial J_t}{\partial V}(√)、\frac{\partial J_t}{\partial b_o}(√) ?st??Jt???V?Jt??()?bo??Jt??()
      • 第二步:依據公式一可以計算出: ? s t ? z t 、 ? s t ? U 、 ? s t ? W 、 ? s t ? b s 、 ? s t ? x t \Large \frac{\partial s_t}{\partial z_t}、\frac{\partial s_t}{\partial U}、\frac{\partial s_t}{\partial W}、\frac{\partial s_t}{\partial b_s}、\frac{\partial s_t}{\partial x_t} ?zt??st???U?st???W?st???bs??st???xt??st??
      • 第三步:依據 鏈式法則 ,繼續求出: ? J t ? U ( √ ) 、 ? J t ? W ( √ ) 、 ? J t ? b s ( √ ) \Large \frac{\partial J_t}{\partial U}(√)、\frac{\partial J_t}{\partial W}(√)、\frac{\partial J_t}{\partial b_s}(√) ?U?Jt??()?W?Jt??()?bs??Jt??()
    • 非最后一個時刻:

      • 第一步:依據交叉熵計算公式、公式二計算出: ? J t ? s t 、 ? J t ? V 、 ? J t ? b o \Large \frac{\partial J_t}{\partial s_t}、\frac{\partial J_t}{\partial V}、\frac{\partial J_t}{\partial b_o} ?st??Jt???V?Jt???bo??Jt??

      • 第二步( 不同點 ):在下一個時刻 t + 1 t+1 t+1 (反向傳播時,其實應稱為上一個時刻)時,要求出 ? s t + 1 ? s t \Large \frac{\partial s_{t+1}}{\partial s_t} ?st??st+1?? ,進一步求出 ? J t + 1 ? s t \Large \frac{\partial J_{t+1}}{\partial s_{t}} ?st??Jt+1?? ,則此刻的 ? J t ? s t \Large \frac{\partial J_t}{\partial s_t} ?st??Jt?? 應再加上一部分: ? J t ? s t ( ☆ ) = ? J t ? s t + ? J t + 1 ? s t \Large \frac{\partial J_t}{\partial s_t}(☆)=\frac{\partial J_t}{\partial s_t}+\frac{\partial J_{t+1}}{\partial s_{t}} ?st??Jt??()=?st??Jt??+?st??Jt+1??

        即:當前時刻損失對于隱層狀態輸出值 s t s_t st? 的梯度要再加上下一時刻損失對 s t s_{t} st? 的導數。

      • 第三步:照搬 “最后一個時刻” 的第二步;

      • 第四步:照搬 “最后一個時刻” 的第三步。

單個時刻的反向傳播可以借鑒此視頻中的公式(引自《85.09_手寫RNN案例:單個cell的反向傳播_嗶哩嗶哩_bilibili》),內部公式推導不需要記住。

↑ ↑ 但是其中的 x x x (不是指 x t x^t xt )要改寫成 z t z_t zt? ? x \partial x ?x (不是指 ? x t \partial x^t ?xt )要改寫成 ? z t \partial z_t ?zt? ,右側第六行的 ? W \partial W ?W 改成 ? b s \partial bs ?bs

補充(其中 y t y_t yt? 為預測真實值):
? J t ? o t = o t ? y t ? o t ? s t = V T ? J t ? s t = V T ? ( o t ? y t ) ? J t ? V = ∑ t = 1 T ( o t ? y t ) ? s t T ? J t ? b o = ∑ t = 1 T ( o t ? y t ) \begin{align*} \frac{\partial J_t}{\partial o_t} &= o_t - y_t\\ \frac{\partial o_t}{\partial s_t} &= V^T\\ \frac{\partial J_t}{\partial s_t} &= V^T * (o_t - y_t)\\ \frac{\partial J_t}{\partial V} &= \sum^T_{t=1} (o_t - y_t) * s_t^T\\ \frac{\partial J_t}{\partial b_o} &= \sum^T_{t=1} (o_t - y_t) \end{align*} ?ot??Jt???st??ot???st??Jt???V?Jt???bo??Jt???=ot??yt?=VT=VT?(ot??yt?)=t=1T?(ot??yt?)?stT?=t=1T?(ot??yt?)?

②參數更新

當每個時刻的參數梯度都計算出來,求和得出最終的梯度 ? J ? U 、 ? J ? W 、 ? J ? b s 、 ? J ? V 、 ? J ? b o \Large \frac{\partial J}{\partial U}、\frac{\partial J}{\partial W}、\frac{\partial J}{\partial b_s}、\frac{\partial J}{\partial V}、\frac{\partial J}{\partial b_o} ?U?J??W?J??bs??J??V?J??bo??J? 時,可按照下方公式進行更新:
U = U ? α ? ? J ? U W = W ? α ? ? J ? W ? ? ? b o = b o ? α ? ? J ? b o U=U-\alpha·\frac{\partial J}{\partial U}\\ W=W-\alpha·\frac{\partial J}{\partial W}\\ ···\\ b_o=b_o-\alpha·\frac{\partial J}{\partial b_o}\\ U=U?α??U?J?W=W?α??W?J????bo?=bo??α??bo??J?
其中 α \alpha α 為學習率。


7)相關理解性代碼

下面的代碼僅供參考,并且實際使用pytorch的時候,都是模塊化的,可直接調用的。

這里就僅僅給讀者看看,方便理解前向傳播和反向傳播的代碼邏輯。

import numpy as np# Language modeling: 語言建模(簡寫為 LMing ), 本質上是多分類任務# ***************************** 語言建模 *****************************# softmax自定義函數
def softmax(x):e_x = np.exp(x - np.max(x))return e_x / e_x.sum(axis=0)# 單個時刻的模型前向傳播過程
def rnn_LMing_moment_forwad(x_t, s_prev, parameters):"""單個時刻的模型前向傳播過程:paramx_t: 當前時刻的分詞輸入s_prev: 上一個時刻的隱層狀態輸出parameters: 字典形式的其他參數,包括 U、W、V、bs、bo:return:當前隱層狀態 s_t,輸出 o_t,緩存參數 cache 元組"""U = parameters['U']W = parameters['W']V = parameters['V']bs = parameters['bs']bo = parameters['bo']# 計算公式一, 即當前隱層狀態s_ts_t = np.tanh(np.dot(U, x_t) + np.dot(W, s_prev) + bs)# 計算公式二, 即輸出o_to_t = softmax(np.dot(V, s_t) + bo)# 記錄此時刻的一些參數(在反向傳播中會用到)cache = (s_t, s_prev, x_t, parameters)return s_t, o_t, cache# 整體模型前向傳播
def rnn_LMing_forwad(x, s_0, parameters):"""整體模型前向傳播過程:paramx: 輸入序列(分詞矩陣), 尺寸為[m,1,T], T為該序列中分詞個數s_0: 初始化隱層狀態輸入, 尺寸為[n,1]parameters: 字典形式的其他參數,包括 U、W、V、bs、bo:return:全部時刻的隱層狀態輸出 s_total,尺寸為[n,1,T];全部時刻的輸出 o_total,尺寸為[m,1,T];全部緩存參數元組, 并整合進一個列表 caches 中"""m, _, T = x.shape  # 獲取分詞的向量形式長度、時刻數(分詞數)n, _ = parameters['U'].shape  # 獲取單個時刻隱層狀態的向量形式長度# 初始化全部隱層狀態輸出矩陣、全部時刻輸出、s_total = np.zeros((n, 1, T))o_total = np.zeros((m, 1, T))caches = []s_t = s_0for t in range(T):s_t, o_t, cache = rnn_LMing_moment_forwad(x[:, :, t], s_t, parameters)  # 生成的 s_t 在下一個循環中就是 s_prevs_total[:, :, t] = s_to_total[:, :, t] = o_tcaches.append(cache)  # 將中間參數元組添加進列表中return s_total, o_total, caches# 單個時刻的反向傳播, 其中 ds_t、do_t 需要提前計算傳入
def rnn_LMing_moment_backward(ds_t, do_t, cache):"""對單個時刻進行反向傳播:paramds_t: 當前時刻損失對隱層輸出結果的導數do_t: 當前時刻損失對模型輸出結果的導數(do_t = o_t - y_t), y_t 為真實值cache: 當前時刻的緩存參數:return:gradients: 梯度字典"""# 獲取緩存(s_t, s_prev, x_t, parameters) = cache# 獲取參數U = parameters['U']W = parameters['W']V = parameters['V']bs = parameters['bs']bo = parameters['bo']dz_t = (1 - s_t ** 2) * ds_t  # 計算 z_t 的梯度dx_t = np.dot(U.T, dz_t)  # 計算 x_t 的梯度值dUt = np.dot(dz_t, x_t.T)  # 計算 U 的梯度值ds_prev = np.dot(W.T, dz_t)  # 計算 s_prev 的梯度值, s_prev 就是 s_t_1, ds_prev的含義是當前損失對前一時刻隱層狀態輸出的導數dWt = np.dot(dz_t, s_prev.T)  # 計算 W 的梯度值dbst = np.sum(dz_t, axis=1, keepdims=True)  # 計算 bs 的梯度dVt = np.dot(do_t, s_t.T)  # 計算 V 的梯度值dbot = np.sum(do_t, axis=1, keepdims=True)  # 計算 bo 的梯度值# 將所求梯度存進字典gradient = {"dz_t": dz_t, "dx_t": dx_t, "ds_prev": ds_prev, "dUt": dUt, "dWt": dWt, "dbst": dbst, "dVt": dVt,"dbot": dbot}return gradient# 整體反向傳播, 其中 ds 為所有 ds_t 的集合, do 為所有 do_t 的集合, 兩者需要提前計算傳入
def rnn_LMing_backward(ds, do, caches):"""對單個時刻進行反向傳播:paramds: 所有時刻損失對隱層輸出結果的導數do: 所有時刻損失對模型輸出結果的導數cache: 當前時刻的緩存參數:return:gradients: 梯度字典"""# 獲取第一個時刻的數據, 參數, 輸入輸出值(s1, s0, x_1, parameters) = caches[0]# 獲取時刻數以及 m 和 n 的值n, _, T = ds.shapem, _ = x_1.shape# 初始化梯度值dx = np.zeros((m, 1, T))dU = np.zeros((n, m))dW = np.zeros((n, n))dbs = np.zeros((n, 1))dV = np.zeros((m, n))dbo = np.zeros((m, 1))ds_prev = np.zeros((n, 1))# 循環從后往前進行反向傳播for t in reversed(range(T)):# 根據時間 T 的 s 梯度,以及緩存計算當前時刻的反向傳播梯度gradient = rnn_LMing_moment_backward((ds[:, :, t] + ds_prev), do[:, :, t], caches[t])# 獲取梯度準備進行更新dx_t, ds_prev, dUt, dWt, dbst, dVt, dbot = gradient["dx_t"], gradient["ds_prev"], gradient["dUt"], gradient["dWt"], gradient["dbst"], gradient["dVt"], gradient["dbot"]# 進行每次 t 時間上的梯度接過相加, 作為最終更新的梯度dx[:, :, t] = dx_tdU += dUtdW += dWtdbs += dbstdV += dVtdbo += dbotds0 = ds_prevgradients = {"dU": dU, "dW": dW, "dbs": dbs, "dV": dV, "dbo": dbo, "dx": dx, "ds0": ds0}return gradients

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

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

相關文章

Perl 環境安裝指南

Perl 環境安裝指南 引言 Perl是一種廣泛使用的解釋型、動態編程語言,以其強大的文本處理能力和靈活性著稱。本文將為您詳細介紹Perl環境的安裝過程,包括系統要求、安裝步驟以及注意事項。 系統要求 在安裝Perl之前,請確保您的計算機滿足以下基本要求: 操作系統:Window…

【嵌入式學習2】C語言 - VScode環境搭建

目錄 ## 語言分類 ## c語言編譯器 ## VScode相關配置 ## 語言分類 編譯型語言:C,C解釋型語言:python,JS ## c語言編譯器 分類GCC 系列MinGWCygwinMSVC系列一套編程語言編譯器將GCC編譯器和GNU Binutils移植到Win32平臺下的產物…

qt+opengl 加載三維obj文件

1前面我們已經熟悉了opengl自定義頂點生成一個立方體,并且我們實現了立方體的旋轉,光照等功能。下面我們來用opengl來加載一個obj文件。準備我們首先準備一個簡單的obj文件(head.obj)。資源在本頁下載 2 在obj文件里面&#xff0c…

0326-Java 字符串方法

package com.qc.字符串;import java.util.Arrays;public class Test {public static void main(String[] args) { // String x"hello";//字符串 char[] // x x"demo";//字符串拼接 // xx2450; // xxtrue; // System.out.println(x);//hellodemo2450t…

<command-line>:0:1: error: macro names must be identifiers m

報錯::0:1: error: macro names must be identifiers 排查類很久 原來是: add_compile_definitions(_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)寫成了 add_compile_definitions(-D_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)多了個 -D。

風光互補智慧路燈的燈桿設計有哪些要求?

嘿,朋友們!叁仟風光互補智慧路燈的燈桿設計那可是超級重要的事兒,得全方位綜合考量各種因素,就是為了確保咱們的路燈能兼具超棒的功能性、絕對的安全性、無敵的美觀性以及超厲害的耐用性!下面就來看看這些超贊的常見要…

06、RAG

LLM的知識僅限于它所接受到的訓練數據。如果我們希望讓它了解特定領域的專有知識,則可以使用下面的方式操作: 使用RAG使用專有數據對LLM進行微調RAG與數據微調方式結合使用 什么是RAG 簡單地說,RAG就是把數據發送給LLM之前從數據中查找相關…

自然語言處理:第一百零二章 如何去掉DeepSeek R1思考過程

本人項目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 寫在前面: 筆者更新不易,希望走過路過點個關注和贊,筆芯!!! 寫在前面: 筆者更新不易,希望走過路過點個關注和贊,筆芯!!! 寫在前面: 筆者更新不易…

flink 安裝與訪問 ui

官方文檔:First steps | Apache Flink 版本:v2.0.0 下載Flink Flink運行在所有類UNIX環境中,即Linux,Mac OS X和Cygwin(適用于Windows)。您需要安裝Java 11。要檢查安裝的Java版本,請在終端中…

WPF TextBox實現鍵盤enter后實時讀取TextBox中的值

代碼 <TextBox Grid.Column"0" x:Name"textBox" Margin"10,5,0,5" TextWrapping"Wrap" Text"{Binding SendMessage,UpdateSourceTriggerPropertyChanged}" VerticalContentAlignment"Center" CaretBrush&qu…

PyTorch實現Transformer模型

首先&#xff0c;我得回顧一下Transformer的基本結構&#xff0c;確保自己沒有記錯。Transformer由編碼器和解碼器組成&#xff0c;每個編碼器層包含多頭自注意力機制和前饋網絡&#xff0c;解碼器層則還有編碼器-解碼器注意力。 接下來&#xff0c;用戶需要的是手把手的代碼解…

詳細介紹sentinel的使用,并列舉經常出的面試題以及答案

Sentinel 是一款由阿里巴巴開源的分布式系統的流量防衛系統&#xff0c;能夠實時響應并滿足高并發的流量控制需求。它提供了流量監控、流量控制、熔斷降級、系統保護等核心功能&#xff0c;可幫助開發人員實時發現系統的流量異常并快速做出相應的限流策略。 Sentinel 的使用步…

mysql-connector-java-5.1.37.jarJava連接器

mysql-connector-java-5.1.37.jar是MySQL官方提供的Java連接器&#xff0c;用于在Java應用程序中與MySQL數據庫進行通信。具體來說&#xff0c;這個JAR文件是MySQLJDBC驅動程序的一個版本&#xff0c;允許Java程序通過JDBC&#xff08;JavaDatabaseConnectivity&#xff09;接口…

Python基于Django的智能旅游推薦系統(附源碼,文檔說明)

博主介紹&#xff1a;?IT徐師兄、7年大廠程序員經歷。全網粉絲15W、csdn博客專家、掘金/華為云//InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3…

【博客節選】再談Unity 的 root motion

節選自 【Unity實戰筆記】第二十三 root motion變更方向攻擊 &#xff08;OnStateMove rootmotion rigidbody 使用的一些問題&#xff09; 小伙伴們應該對root motion非常困惑&#xff0c;包括那個bake into pose。 當xz bake into pose后&#xff0c;角色攻擊動畫與父節點產…

網站服務器常見的CC攻擊防御秘籍!

CC攻擊對網站的運營是非常不利的&#xff0c;因此我們必須積極防范這種攻擊&#xff0c;但有些站長在防范這種攻擊時可能會陷入誤區。讓我們先了解下CC攻擊&#xff01; CC攻擊是什么 CC是DDoS攻擊的一種&#xff0c;CC攻擊是借助代理服務器生成指向受害主機的合法請求&#x…

JAVA:Spring Boot @Conditional 注解詳解及實踐

1、簡述 在 Spring Boot 中&#xff0c;Conditional 注解用于實現 條件化 Bean 裝配&#xff0c;即根據特定的條件來決定是否加載某個 Bean。它是 Spring 框架中的一個擴展機制&#xff0c;常用于實現模塊化、可配置的組件加載。 本文將詳細介紹 Conditional 相關的注解&…

使用python爬取網絡資源

整體思路 網絡資源爬取通常分為以下幾個步驟&#xff1a; 發送 HTTP 請求&#xff1a;使用requests庫向目標網站發送請求&#xff0c;獲取網頁的 HTML 內容。解析 HTML 內容&#xff1a;使用BeautifulSoup庫解析 HTML 內容&#xff0c;從中提取所需的數據。處理數據&#xff…

PostgreSQL 數據庫源碼編譯安裝全流程詳解 Linux 8

PostgreSQL 數據庫源碼編譯安裝全流程詳解 Linux 8 1. 基礎環境配置1.1 修改主機名1.2 配置操作系統yum源1.3 安裝操作系統依賴包1.4 禁用SELINUX配置1.5 關閉操作系統防火墻1.6 創建用戶和組1.7 建立安裝目錄1.8 編輯環境變量 2. 源碼方式安裝&#xff08;PG 16&#xff09;2.…

(基本常識)C++中const與引用——面試常問

作者&#xff1a;求一個demo 版權聲明&#xff1a;著作權歸作者所有&#xff0c;商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處 內容通俗易懂&#xff0c;沒有廢話&#xff0c;文章最后是面試常問內容&#xff08;建議通過標題目錄學習&#xff09; 廢話不多…