3.1-RNN存在的問題以及LSTM的結構

文章目錄

  • 1 RNN存在的問題
    • 1.1梯度消失問題
    • 1.2梯度爆炸問題
    • 1.3梯度爆炸的對策
  • 2梯度消失的對策——LSTM
    • 2.1輸出門
    • 2.2遺忘門
    • 2.3輸入門
    • 2.4總結
    • 2.5 LSTM梯度的流動

1 RNN存在的問題

RNN存在梯度消失和梯度爆炸的問題。

  1. 書上以下圖的這句話為例,進行說明;為了正確預測出問號處的單詞:

    1. 一方面需要利用RNN將前面的所有信息編碼并保存在RNN層的隱藏狀態中;

    在這里插入圖片描述

    1. 另一方面,可以通過反向傳播,將待預測單詞位置處的梯度在水平方向上傳遞到過去(如下圖所示),這種有意義的梯度,最終更新模型的權重,使得模型能夠學習時間方向上的依賴關系,最終正確做出預測;

      在這里插入圖片描述

  2. 但是如果梯度在反向傳播的過程中,梯度越向過去傳播,越小,則則靠前的模型權重就得不到更新,從而無法讓模型編碼有用的信息,無法讓模型學習并利用水平方向上長期的依賴關系來進行預測;

  3. 此外,如果梯度越來越大,會出現梯度爆炸,這會使得模型的學習變得不穩定,也是一個問題;

  4. 而這兩種問題在RNN中都存在;

  5. 下面僅僅從時間方向上看梯度的傳播(如下圖所示);縱向來的梯度會和水平方向上傳遞來的梯度相加;因此僅僅分析水平方向上梯度的變化的結論在考慮縱向時也是適用的;

    在這里插入圖片描述

1.1梯度消失問題

  1. y = t a n h ( x ) y=tanh(x) y=tanh(x)函數的導數為: y ′ = 1 ? y 2 y'=1-y^2 y=1?y2;下圖是原函數與導數的圖像:

    在這里插入圖片描述

  2. 由圖像可知,導數值小于 1.0,并且隨著 x 遠離 0,它的值在變小;因此導數永遠小于1,即局部梯度是小數,那么輸出側的梯度乘上局部梯度就會變小;并且如果 x 遠離 0,局部梯度會非常小;那么經過這么一個tanh節點,梯度就會變小一次;而水平方向上有好多個tanh節點,那么傳播到非常過去的節點,梯度甚至有可能會消失。

  3. RNN 層的激活函數一般使用 tanh 函數,但是如果改為 ReLU 函數, 則有希望抑制梯度消失的問題(當 ReLU 的輸入為 x 時,它的輸出是 max(0, x))。這是因為,在 ReLU 的情況下,當 x 大于 0 時,反向傳播將上游的梯度原樣傳遞到下游,梯度不會“退化”。而且可以在ReLU之前將輸入全部變到正數,這樣就完全是x了;

1.2梯度爆炸問題

簡單起見, 這里我們忽略反向傳播圖中的 tanh 節點;

加法節點梯度不變,因此就沒畫出來了;

  1. 那么簡單來看,圖中只剩矩陣乘法的節點,如下圖所示:

    在這里插入圖片描述

  2. 前面說過矩陣相乘的梯度傳播公式;這里每經過一個矩陣乘法節點,都要乘上一個局部梯度 W h \boldsymbol{W}_h Wh??;

    1. 由于RNN是使用一組權重參數的,因此這里每次乘的權重是一樣的;
  3. 接下來書上初始化了一個梯度為1的矩陣,然后執行了多次局部梯度,并計算了每次反向傳播之后梯度的L2范數;代碼如下圖所示:

    1. L2 范數定義為每個元素的平方和的平方根,因此當向量中某個元素很大時,整個范數值就會被拉大;
    2. 這就使得 L2 范數對離群值和噪聲更加敏感,因為這些值在平方運算中會被放大
    3. 所以本書中就計算了這個范數,這樣可以直觀的去看一下梯度是不是有爆炸的趨勢

    在這里插入圖片描述

  4. 下圖是實驗結果;可見確實有爆炸的趨勢;梯度爆炸會導致數值過大,甚至溢出,影響神經網絡的學習;

    在這里插入圖片描述

  5. 但是有一個問題,如果權重是一個標量,那么如果權重大于1,則肯定梯度會越來越大的;權重是一個矩陣的時候,就又涉及到矩陣的奇異值這個概念了(還需要深入了解);

    1. 簡單而言,矩陣的奇異值表示數據的離散程度
    2. 根據這個奇異值(更準確地說是多個奇異值中的最大值)是否大于 1,可以預測梯度大小的變化
    3. 如果奇異值的最大值大于 1,則可以預測梯度很有可能會呈指數級增加;而如果奇異值的最大值小于 1,則可以判斷梯度會呈指數級減小;詳見論文;

1.3梯度爆炸的對策

  1. 梯度爆炸的對策為**梯度裁剪**;

  2. 裁剪按照下式進行:

    1. 將神經網絡所有的參數整合到一起,合成一個”向量“ g ^ \hat{\boldsymbol{g}} g^??;
    2. t h r e s h o l d threshold threshold為梯度閾值;
    3. ∥ g ^ ∥ \|\hat{\boldsymbol{g}}\| g^?為L2范數;

    i f ∥ g ^ ∥ ? t h r e s h o l d : g ^ = t h r e s h o l d ∥ g ^ ∥ g ^ (1) \begin{aligned} if\; \|\hat{\boldsymbol{g}}\|&\geqslant threshold:\\ \hat{\boldsymbol{g}}&=\frac{threshold}{\|\hat{\boldsymbol{g}}\|}\hat{\boldsymbol{g}} \end{aligned} \tag{1} ifg^?g^???threshold:=g^?threshold?g^??(1)

  3. 下面的代碼是書上的一個小例子:

    def clip_grads(grads, max_norm):total_norm = 0for grad in grads:total_norm += np.sum(grad**2) # 對梯度矩陣的所有元素求和;因為公式中就是把所有的梯度組合在一起,然后求的范數;total_norm = np.sqrt(total_norm) # 二范數rate = max_norm / (total_norm + 1e-6) # 公式的變形if rate < 1:for grad in grads:grad *= rateif __name__ == '__main__':dW1 = np.random.rand(3, 3) * 10dW2 = np.random.rand(3, 3) * 10grads = [dW1, dW2]  # 對應梯度裁剪公式里面的gmax_norm = 5.0 # 范數閾值clip_grads(grads, max_norm)pass
    

2梯度消失的對策——LSTM

通過改變RNN的網絡結構,改變了存放”記憶“的載體;引入了門結構;即Gated RNN;

這里先看看LSTM;后面再看一下書上的GRU;

  1. LSTM這里的改進涉及:增加了一個記憶單元、輸入門、輸出門、遺忘門;

  2. 下圖為RNN和LSTM結構的簡略對比:

    1. LSTM多了記憶單元 c \boldsymbol{c} c?;
    2. 這個記憶單元僅在 LSTM 層內部接收和傳遞數據,不像 h \boldsymbol{h} h?那樣還要傳遞給上面的層;
    3. 結合前面說的TRNN層,雖然我們說水平方向上有多個RNN層,但本質上就是一組參數,這些RNN層其實就是一個;后面的TLSTM也是這樣;因此,書上說,記憶單元在 LSTM 層內部結束工作,不向其他層輸出,對外部不可見。

    在這里插入圖片描述

2.1輸出門

概括: t a n h ( c t ) tanh(\boldsymbol{c}_t) tanh(ct?)編碼了目前時刻為止所需要的信息,用輸出門來控制信息中各個元素的重要程度;

  1. LSTM的記憶單元 c t \boldsymbol{c}_t ct?保存了從過去到時刻 t t t的所有必要信息,基于這個充滿必要信息的記憶,向外部的層(和下一時刻的 LSTM)輸出隱藏狀態 h t \boldsymbol{h}_t ht??;如下圖所示:

    1. LSTM輸出經過tanh變換后的記憶單元
    2. c t \boldsymbol{c}_t ct?基于 c t ? 1 \boldsymbol{c}_{t-1} ct?1? h t ? 1 \boldsymbol{h}_{t-1} ht?1? x t \boldsymbol{x}_t xt??經過”某種計算“得到;
    3. 隱藏狀態 h t = t a n h ( c t ) \boldsymbol{h}_{t}=tanh(\boldsymbol{c}_t) ht?=tanh(ct?);即對 c t \boldsymbol{c}_t ct?各個元素應用tanh函數;

    在這里插入圖片描述

  2. 門的概念:

    1. 從字面意義上看,門可以用于控制開合
    2. 但LSTM中的門,還可以控制將門打開多少來控制數據的流動;
    3. 門的開合程度由 0.0 ~1.0 的實數表示(1.0 為全開);重點是,門的開合程度也是(自動) 從數據中學習到的
  3. 接下來用到的函數的區別:

    1. tanh函數:輸出是 ?1.0 ~ 1.0 的實數;表示某種被編碼的“信息”的強弱(程度);
    2. sigmoid函數:輸出是 0.0~1.0 的實數;表示數據流出的比例;如同前面二分類時用它來轉化為概率一樣;
    3. 因此,在大多數情況下,門使用 sigmoid 函數作為激活函數,而包含實質信息的數據則使用 tanh 函數作為激活函數
  4. 綜合2和3,我們可以說:

    1. 有專門的權重參數用于控制門的開合程度,這些權重參數通過學習被更新
    2. sigmoid函數用于求門的開合程度,即將權重參數計算之后的結果輸出到0-1之間;
  5. 輸出門:對 t a n h ( c t ) tanh(\boldsymbol{c}_t) tanh(ct?)施加門,針對 t a n h ( c t ) tanh(\boldsymbol{c}_t) tanh(ct?)中的每個元素,調整它們作為下一時刻的隱藏狀態的重要程度;

    1. 由于這個門管理當前時刻的輸出,即隱藏狀態 h t \boldsymbol{h}_t ht?,所以稱為輸出門

    2. 輸出門的公式如下:
      o = σ ( x t W x ( o ) + h t ? 1 W h ( o ) + b ( o ) ) (2) \boldsymbol{o}=\sigma\left(\boldsymbol{x}_t \boldsymbol{W}_x^{(\mathrm{o})}+\boldsymbol{h}_{t-1} \boldsymbol{W}_h^{(\mathrm{o})}+\boldsymbol{b}^{(\mathrm{o})}\right) \tag{2} o=σ(xt?Wx(o)?+ht?1?Wh(o)?+b(o))(2)

      1. 和單純的RNN的公式如出一轍;輸入 x t \boldsymbol{x}_t xt?有權重 W x ( o ) \boldsymbol{W}_x^{(\mathrm{o})} Wx(o)?,上一時刻的隱藏狀態 h t ? 1 \boldsymbol{h}_{t-1} ht?1?有權重 W h ( o ) \boldsymbol{W}_h^{(\mathrm{o})} Wh(o)? σ ( ) \sigma() σ()表示sigmoid函數;結果 o \boldsymbol{o} o應該是一個行向量;

      2. 然后將 o \boldsymbol{o} o t a n h ( c t ) tanh(\boldsymbol{c}_t) tanh(ct?)的對應元素相乘,作為輸出 h t \boldsymbol{h}_t ht?,如下式所示;對應元素相乘即哈達瑪積(Hadamard product),用 ⊙ \odot 來表示;
        h t = o ⊙ tanh ? ( c t ) (3) \boldsymbol{h}_t=\boldsymbol{o} \odot \tanh \left(\boldsymbol{c}_t\right) \tag{3} ht?=otanh(ct?)(3)

    3. 下圖是加入輸出門之后的LSTM結構圖:

      在這里插入圖片描述

2.2遺忘門

  1. 前面說了: c t \boldsymbol{c}_t ct?基于 c t ? 1 \boldsymbol{c}_{t-1} ct?1? h t ? 1 \boldsymbol{h}_{t-1} ht?1? x t \boldsymbol{x}_t xt?經過”某種計算“得到;
  2. 遺忘門的作用:對上一個LSTM單元傳遞來的記憶信息進行取舍,告訴模型需要忘記什么;因此設置一個遺忘門作用在 c t ? 1 \boldsymbol{c}_{t-1} ct?1?上,將需要忘記的賦予更低的重要性;
  1. 與輸出門類似,遺忘門也是一組權重參數,加上一個sigmoid函數;如下式所示:

    f = σ ( x t W x ( f ) + h t ? 1 W h ( f ) + b ( f ) ) (4) \boldsymbol{f}=\sigma\left(\boldsymbol{x}_t \boldsymbol{W}_x^{(\mathrm{f})}+\boldsymbol{h}_{t-1} \boldsymbol{W}_h^{(\mathrm{f})}+\boldsymbol{b}^{(\mathrm{f})}\right) \tag{4} f=σ(xt?Wx(f)?+ht?1?Wh(f)?+b(f))(4)
    其中 W x ( f ) \boldsymbol{W}_x^{(\mathrm{f})} Wx(f)? W h ( f ) \boldsymbol{W}_h^{(\mathrm{f})} Wh(f)? b ( f ) \boldsymbol{b}^{(\mathrm{f})} b(f)為遺忘門的權重和偏置參數; σ ( ) \sigma() σ()依舊表示sigmoid函數;然后將遺忘門 f \boldsymbol{f} f c t ? 1 \boldsymbol{c}_{t-1} ct?1?對應元素相乘,得到當前時刻的記憶單元 c t \boldsymbol{c}_{t} ct??;如下式所示:
    c t = f ⊙ c t ? 1 (5) \boldsymbol{c}_t=\boldsymbol{f} \odot \boldsymbol{c}_{t-1} \tag{5} ct?=fct?1?(5)

  2. 加入遺忘門之后LSTM的結構如下圖所示:

    在這里插入圖片描述

2.3輸入門

  1. 除了遺忘一部分信息,還需要讓模型記住一些新的信息;
  2. 新的信息也有重要程度之分,因此引入輸入門,判斷新增信息的各個元素的價值有多大;
  1. 將新的信息加入到記憶單元中,因此使用tanh函數,而不用sigmoid函數;計算公式如下:
    g = tanh ? ( x t W x ( g ) + h t ? 1 W h ( g ) + b ( g ) ) (6) \boldsymbol{g}=\tanh \left(\boldsymbol{x}_t \boldsymbol{W}_x^{(\mathrm{g})}+\boldsymbol{h}_{t-1} \boldsymbol{W}_h^{(\mathrm{g})}+\boldsymbol{b}^{(\mathrm{g})}\right) \tag{6} g=tanh(xt?Wx(g)?+ht?1?Wh(g)?+b(g))(6)
    相關參數類似前面的輸出門和遺忘門的參數;

    這是計算的新的信息;將此信息加入到上一時刻的記憶單元 c t ? 1 \boldsymbol{c}_{t-1} ct?1??中,形成新的記憶;

  2. 為了區分新的信息中元素的價值,構建輸入門,用輸入門對新的信息加權;輸入門公式如下:
    i = σ ( x t W x ( i ) + h t ? 1 W h ( i ) + b ( i ) ) (7) \boldsymbol{i}=\sigma\left(\boldsymbol{x}_t \boldsymbol{W}_x^{(\mathrm{i})}+\boldsymbol{h}_{t-1} \boldsymbol{W}_h^{(\mathrm{i})}+\boldsymbol{b}^{(\mathrm{i})}\right) \tag{7} i=σ(xt?Wx(i)?+ht?1?Wh(i)?+b(i))(7)
    用這個權值 i \boldsymbol{i} i與新增加的信息 g \boldsymbol{g} g相乘,對應元素相乘,然后再添加到被篩選過的保留下來的上一時刻的記憶單元 c t ? 1 \boldsymbol{c}_{t-1} ct?1?中。

  3. 加入新增信息和輸入門之后LSTM的結構如下:

    在這里插入圖片描述

2.4總結

  1. 上一時刻傳來的記憶單元有些信息需要被遺忘,因此增加了遺忘門;

  2. 當前時刻有新的信息需要添加,且增加的信息也有重要程度之分,因此加了輸入門;

  3. 1和2形成了當前時刻的記憶單元;

  4. 當前時刻輸出的隱藏狀態原本就是要包含目前為止所有的信息的,因此基于當前時刻的記憶單元,計算當前時刻的隱藏狀態;而輸出門就是用來調整當前時刻記憶單元作為下一時刻隱藏狀態的重要程度的。

  5. 另外,從公式上看,不管是哪個門,以及新增的記憶單元,都是基于 h t ? 1 \boldsymbol{h}_{t-1} ht?1? x t \boldsymbol{x}_t xt?;每個門的權重參數具體數值不同,但形式相同。

2.5 LSTM梯度的流動

LSTM中最關鍵的就是記憶單元 c \boldsymbol{c} c,隱藏狀態 h \boldsymbol{h} h就是基于 c \boldsymbol{c} c計算得到的;因此LSTM的記憶信息主要來自于 c \boldsymbol{c} c;所以梯度的流動我們主要關注一下記憶單元 c \boldsymbol{c} c部分。

  1. 涉及記憶單元的梯度流動如下圖所示:

    1. 涉及兩種計算:加法和乘法
    2. 加法節點,梯度直接傳遞,沒有任何變化;因此主要看一下乘法節點

    在這里插入圖片描述

  2. 不會梯度消失或者爆炸的原因:

    1. RNN里面的乘法節點是矩陣乘法,而且每次都是相同的權重矩陣,因此出現了梯度消失或者梯度爆炸的情況;
    2. 而這里的LSTM的乘法是對應元素相乘,因此不會像矩陣乘法的梯度那樣,每經過一個節點,都要再乘上一個矩陣;
    3. 而且這里每次的梯度都是不同的門值(因為每次輸入 x \boldsymbol{x} x?不一樣,雖然依然是一套權重參數)
  3. 另外,這里的乘法節點是遺忘門處的:

    1. 遺忘門作為權重乘到了上一時刻的記憶單元上,需要被忘記的會被分配較低的權重;
    2. 那么反向傳播時,需要被忘記的對應的梯度就小,需要保持記住的對應的梯度就大;
    3. 梯度大,意味著能夠被學習;且在水平方向上需要保持記住的,它們的梯度就會保持住,不會退化,能夠傳播到非常開始的時刻;那么這就讓模型能夠保持長期的記憶、保持長期的依賴關系
  4. LSTM是Long Short-Term Memory(長短期記憶)的縮寫,意思是可以長(Long)時間維持短期記憶(Short-Term Memory):

    1. 每經過一個時刻都可以形成新的記憶,這是短期的;
    2. 但是由于該記住的,對應的梯度不會退化,因此可以長期記住;

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

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

相關文章

前瞻斷言與后瞻斷言:JavaScript 正則表達式的秘密武器

JavaScript 中的前瞻斷言&#xff08;lookahead&#xff09;和后瞻斷言&#xff08;lookbehind&#xff09;相信用過的小伙伴就知道它的威力了&#xff0c;在一些特定的需求場景下&#xff0c;可以做到四兩撥千斤的作用&#xff0c;今天讓我們來盤點一下在 JavaScript 正則表達…

昇思25天學習打卡營第14天|munger85

基于MindNLPMusicGen生成自己的個性化音樂 這個所謂的個性化的音樂就是指你輸入一段文字它會根據這個文字輸出一段音樂這個音樂是貼近于那段文字的所以叫做文生成音樂&#xff0c; 如果網絡正常的話就可以直接從下載這個模型。 那么音樂生成的有兩種方式呢有兩種方式&#xff…

【C++初階】C/C++內存管理

【C初階】C/C內存管理 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;C&#x1f96d; &#x1f33c;文章目錄&#x1f33c; 1. C/C內存分布 2. C語言中動態內存管理方式&#xff1a;malloc/calloc/realloc/free 3. C內存管理方式 3…

DP學習——組合模式

學而時習之&#xff0c;溫故而知新。 組合模式 和代理模式相比 和代理模式相比&#xff0c;有點類似。引用類和被引用類都繼承于同一個接口類。 但是感覺組合模式是對代理模式的更加豐富化&#xff08;升級版、超進化&#xff09;&#xff0c;集合化或者說聚合化。 組合模…

拉格朗日乘子法和KKT條件

拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 條件是求解約束優化問題的重要方法&#xff0c;在有等式約束時使用拉格朗日乘子法&#xff0c;在有不等約束時使用 KKT 條件。當然&#xff0c;這兩個方法求得的結果只是必要條件&#xff0c;只有當目標函數…

ssrf復習(及ctfshow351-360)

1. SSRF 概述 服務器會根據用戶提交的URL發送一個HTTP請求。使用用戶指定的URL&#xff0c;Web應用可以獲取圖片或者文件資源等。典型的例子是百度識圖功能。 如果沒有對用戶提交URL和遠端服務器所返回的信息做合適的驗證或過濾&#xff0c;就有可能存在“請求偽造"的缺陷…

C#中錯誤與異常處理

1、錯誤和異常 如果程序運行期間發生錯誤&#xff0c;異常就會發生。異常會中止當前的程序流&#xff0c;如果不采取措施&#xff0c;程序將停止運行。 錯誤和異常是兩個不同的概念&#xff0c;但它們都與程序的穩定性和可維護性有關。 1.1、錯誤 錯誤通常是指編譯時的語法錯誤…

FPGA學習筆記(一) FPGA最小系統

文章目錄 前言一、FPGA最小系統總結 前言 今天學習下FPGA的最小系統一、FPGA最小系統 FPGA最小系統與STM32最小系統類似&#xff0c;由供電電源&#xff0c;時鐘電路晶振&#xff0c;復位和調試接口JTAG以及FLASH配置芯片組成&#xff0c;其與STM32最大的不同之處就是必須要有…

關于Hyperf高并發性能的一些配置詳解和硬件推薦

目錄 工作進程的管理 自定義配置示例&#xff08;EasySwoole&#xff09;&#xff1a; 自動生成&#xff1a; 結論&#xff1a; 集群部署與協程數的關系&#xff1a; 設置 max_coroutine 的考慮因素&#xff1a; 集群部署時的配置&#xff1a; 示例配置&#xff1a; C…

鏈表面試練習習題集(Java)

1. 思路&#xff1a; 因為楊輝三角是由二維數組構成&#xff0c;所以要先創建一個二維數組&#xff0c;如何用順序表表示二維數組&#xff0c;可以通過List<List<Interger>>來表示一個二維數組&#xff0c;可以這樣理解&#xff1a;先創建一個一維數組List&#x…

modbus slave 設備通過 網關thingsboard-gateway 將數據上傳到thingsboard云平臺

搭建thingsboard物聯網云平臺花了大量時間&#xff0c;從小白到最后搭建成功&#xff0c;折磨了好幾天&#xff0c;也感謝網友的幫助&#xff0c;提供了思路最終成功搞定&#xff0c;特此記錄。 一、thingsboard環境搭建&#xff08;Ubuntu20.04LTS&#xff09; 參考官方文檔&a…

java之 junit單元測試案例【經典版】

一 junit單元測試 1.1 單元測試作用 單元測試要滿足AIR原則&#xff0c;即 A&#xff1a; automatic 自動化&#xff1b; I: Independent 獨立性&#xff1b; R&#xff1a;Repeatable 可重復&#xff1b; 2.單元測試必須使用assert來驗證 1.2 案例1 常規單元測試 1.…

PSINS工具箱函數介紹——r2d

介紹工具箱里面r2d這個小函數的作用。 程序源碼 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …

設計模式使用場景實現示例及優缺點(行為型模式——觀察者模式)

阿爾法的身體內部有一個智能芯片&#xff0c;這個芯片能夠根據環境和需求自動改變它的行為模式。當阿爾法需要完成不同任務時&#xff0c;它的內部狀態會發生變化&#xff0c;進而改變它的行為&#xff0c;就像是它變成了另一個機器人一樣。 一天&#xff0c;智能城的市長接到一…

多種方式實現 元素高度絲滑的從0-1顯示出來

選擇合適的方式&#xff0c;給用戶更好的體驗&#xff0c;多種方式實現 元素高度絲滑的從0-1顯示出來。 能用 CSS 實現的動畫&#xff0c;就不要采用 JS 去實現。 1、瀏覽器可以對CSS動畫進行優化&#xff0c;其優化原理類似于requestAnimationFrame&#xff0c;會把每一幀的…

java基礎學習:序列化之 - Fast serialization

在Java中&#xff0c;序列化是將對象的狀態轉換為字節流的過程&#xff0c;以便保存到文件、數據庫或通過網絡傳輸。Java標準庫提供了java.io.Serializable接口和相應的機制來進行序列化和反序列化。然而&#xff0c;標準的Java序列化機制性能較低&#xff0c;并且生成的字節流…

appium2.0 執行腳本遇到的問題

遇到的問題&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的時候 地址默認加的 /wd/hub 在appium2.0上&#xff0c; 服務器默認路徑是 / 如果要用/wd/hub 需要通過啟動服務時設置基本路徑 appium --base-path/wd/hub 這樣就能正常執行了 方法二…

關于Kafka的17個問題

1.Kafka 的設計時什么樣的呢&#xff1f; Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消費消息的程序成為 consumer. Kafka 以集群的方式運行&#xff0c;可以由一個或多個服務組成&#xff0c;每個服務叫做一個…

前端css常用筆記

文章目錄 一、樣式二、vue筆記2.1、組件之間的通信2.1.1 子組件調用父組件的方法2.1.2 父組件調用子組件的方法2.1.3 孫組件調用祖父組件方法的實現 2.2、使用若依時,node_nodules越來越大的問題2.3、echart筆記 一、樣式 1 文字與圖標對不齊的解決方法 /**給icon加上這個樣式即…

mysql的索引事務和存儲引擎

一、索引 1、索引 索引的概念 &#xff1a;索引是一個排序的列表&#xff0c;在列表當中存儲索引的值以及索引值對應數據所在的物理行。 索引的引用&#xff1a; 使用索引之后&#xff0c;就不需要掃描全表來定位某行的數據。 加快數據庫的查詢速度。 索引可以是表中的一…