在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch教程-10.4. 雙向遞歸神經網絡

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀

到目前為止,我們的序列學習任務的工作示例是語言建模,我們的目標是在給定序列中所有先前標記的情況下預測下一個標記。在這種情況下,我們只希望以左向上下文為條件,因此標準 RNN 的單向鏈接似乎是合適的。然而,還有許多其他序列學習任務上下文,在這些上下文中,在向左和向右上下文的每個時間步調整預測是非常好的。例如,考慮詞性檢測。在評估與給定詞相關的詞性時,為什么我們不應該考慮兩個方向的上下文?

另一項常見任務(通常在針對感興趣的實際任務微調模型之前用作預訓練練習)是屏蔽文本文檔中的隨機標記,然后訓練序列模型以預測缺失標記的值。請注意,根據空白后面的內容,缺失標記的可能值會發生顯著變化:

我是___。

我___餓了。

我___餓了,我能吃半頭豬。

在第一句話中,“快樂”似乎是一個可能的候選者。“不”和“非常”這兩個詞在第二句中似乎說得通,但“不”與第三句似乎格格不入。

幸運的是,一種簡單的技術可以將任何單向 RNN 轉換為雙向 RNN (Schuster 和 Paliwal,1997)。我們簡單地實現兩個單向 RNN 層,它們以相反的方向鏈接在一起并作用于相同的輸入(圖 10.4.1)。對于第一個 RNN 層,第一個輸入是x1最后的輸入是 xT,但是對于第二個 RNN 層,第一個輸入是 xT最后的輸入是x1. 為了產生這個雙向 RNN 層的輸出,我們只需將兩個底層單向 RNN 層的相應輸出連接在一起。

pYYBAGR9N2OAGJ96AADWxnNwvHE433.svg

圖 10.4.1雙向 RNN 的架構。

正式地為任何時間步長t,我們考慮一個小批量輸入 Xt∈Rn×d(示例數量: n,每個示例中的輸入數量:d) 并令隱藏層激活函數為?. 在雙向架構中,這個時間步長的前向和后向隱藏狀態是H→t∈Rn×h 和H←t∈Rn×h,分別在哪里h是隱藏單元的數量。前向和后向隱藏狀態更新如下:

(10.4.1)H→t=?(XtWxh(f)+H→t?1Whh(f)+bh(f)),H←t=?(XtWxh(b)+H←t+1Whh(b)+bh(b)),

權重在哪里 Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h,andWhh(b)∈Rh×h, 和偏見bh(f)∈R1×h和 bh(b)∈R1×h都是模型參數。

接下來,我們連接前向和后向隱藏狀態 H→t和 H←t獲得隱藏狀態 Ht∈Rn×2h送入輸出層。在具有多個隱藏層的深度雙向 RNN 中,此類信息作為輸入傳遞到下一個雙向層。最后,輸出層計算輸出 Ot∈Rn×q(輸出數量: q):

(10.4.2)Ot=HtWhq+bq.

這里,權重矩陣 Whq∈R2h×q和偏見 bq∈R1×q是輸出層的模型參數。雖然從技術上講,兩個方向可以有不同數量的隱藏單元,但在實踐中很少做出這種設計選擇。我們現在演示雙向 RNN 的簡單實現。

import torch
from torch import nn
from d2l import torch as d2l

from mxnet import np, npx
from mxnet.gluon import rnn
from d2l import mxnet as d2l

npx.set_np()

from jax import numpy as jnp
from d2l import jax as d2l

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

import tensorflow as tf
from d2l import tensorflow as d2l

10.4.1。從零開始實施

要從頭開始實現雙向 RNN,我們可以包含兩個RNNScratch具有獨立可學習參數的單向實例。

class BiRNNScratch(d2l.Module):
  def __init__(self, num_inputs, num_hiddens, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.f_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.b_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.num_hiddens *= 2 # The output dimension will be doubled

class BiRNNScratch(d2l.Module):
  def __init__(self, num_inputs, num_hiddens, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.f_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.b_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.num_hiddens *= 2 # The output dimension will be doubled

class BiRNNScratch(d2l.Module):
  num_inputs: int
  num_hiddens: int
  sigma: float = 0.01

  def setup(self):
    self.f_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.b_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.num_hiddens *= 2 # The output dimension will be doubled

class BiRNNScratch(d2l.Module):
  def __init__(self, num_inputs, num_hiddens, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.f_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.b_rnn = d2l.RNNScratch(num_inputs, num_hiddens, sigma)
    self.num_hiddens *= 2 # The output dimension will be doubled

前向和后向 RNN 的狀態分別更新,而這兩個 RNN 的輸出被連接起來。

@d2l.add_to_class(BiRNNScratch)
def forward(self, inputs, Hs=None):
  f_H, b_H = Hs if Hs is not None else (None, None)
  f_outputs, f_H = self.f_rnn(inputs, f_H)
  b_outputs, b_H = self.b_rnn(reversed(inputs), b_H)
  outputs = [torch.cat((f, b), -1) for f, b in zip(
    f_outputs, reversed(b_outputs))]
  return outputs, (f_H, b_H)

@d2l.add_to_class(BiRNNScratch)
def forward(self, inputs, Hs=None):
  f_H, b_H = Hs if Hs is not None else (None, None)
  f_outputs, f_H = self.f_rnn(inputs, f_H)
  b_outputs, b_H = self.b_rnn(reversed(inputs), b_H)
  outputs = [np.concatenate((f, b), -1) for f, b in zip(
    f_outputs, reversed(b_outputs))]
  return outputs, (f_H, b_H)

@d2l.add_to_class(BiRNNScratch)
def forward(self, inputs, Hs=None):
  f_H, b_H = Hs if Hs is not None else (None, None)
  f_outputs, f_H = self.f_rnn(inputs, f_H)
  b_outputs, b_H = self.b_rnn(reversed(inputs), b_H)
  outputs = [jnp.concatenate((f, b), -1) for f, b in zip(
    f_outputs, reversed(b_outputs))]
  return outputs, (f_H, b_H)

@d2l.add_to_class(BiRNNScratch)
def forward(self, inputs, Hs=None):
  f_H, b_H = Hs if Hs is not None else (None, None)
  f_outputs, f_H = self.f_rnn(inputs, f_H)
  b_outputs, b_H = self.b_rnn(reversed(inputs), b_H)
  outputs = [tf.concat((f, b), -1) for f, b in zip(
    f_outputs, reversed(b_outputs))]
  return outputs, (f_H, b_H)

10.4.2。簡潔的實現

使用高級 API,我們可以更簡潔地實現雙向 RNN。這里我們以一個 GRU 模型為例。

class BiGRU(d2l.RNN):
  def __init__(self, num_inputs, num_hiddens):
    d2l.Module.__init__(self)
    self.save_hyperparameters()
    self.rnn = nn.GRU(num_inputs, num_hiddens, bidirectional=True)
    self.num_hiddens *= 2

Using the high-level APIs, we can implement bidirectional RNNs more concisely. Here we take a GRU model as an example.

class BiGRU(d2l.RNN):
  def __init__(self, num_inputs, num_hiddens):
    d2l.Module.__init__(self)
    self.save_hyperparameters()
    self.rnn = rnn.GRU(num_hiddens, bidirectional=True)
    self.num_hiddens *= 2

Flax API does not offer RNN layers and hence there is no notion of any bidirectional argument. One needs to manually reverse the inputs as shown in the scratch implementation, if a bidirectional layer is needed.

Using the high-level APIs, we can implement bidirectional RNNs more concisely. Here we take a GRU model as an example.

10.4.3。概括

在雙向 RNN 中,每個時間步的隱藏狀態同時由當前時間步之前和之后的數據確定。雙向 RNN 主要用于序列編碼和給定雙向上下文的觀察估計。由于長梯度鏈,雙向 RNN 的訓練成本非常高。

10.4.4。練習

如果不同方向使用不同數量的隱藏單元,形狀將如何Ht改變?

設計具有多個隱藏層的雙向 RNN。

多義現象在自然語言中很常見。例如,“銀行”一詞在“我去銀行存款”和“我去銀行坐下”的語境中有不同的含義。我們如何設計一個神經網絡模型,以便在給定上下文序列和一個詞的情況下,返回該詞在上下文中的向量表示?哪種類型的神經架構更適合處理多義詞?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4810

    瀏覽量

    102903
  • pytorch
    +關注

    關注

    2

    文章

    809

    瀏覽量

    13783
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于遞歸神經網絡和前饋神經網絡的深度學習預測算法

    蛋白質二級結構預測是結構生物學中的一個重要問題。針對八類蛋白質二級結構預測,提出了一種基于遞歸神經網絡和前饋神經網絡的深度學習預測算法。該算法通過雙向
    發表于 12-03 09:41 ?9次下載

    PyTorch教程之循環神經網絡

    電子發燒友網站提供《PyTorch教程之循環神經網絡.pdf》資料免費下載
    發表于 06-05 09:52 ?0次下載
    <b class='flag-5'>PyTorch</b>教程之循環<b class='flag-5'>神經網絡</b>

    PyTorch教程之從零開始的遞歸神經網絡實現

    電子發燒友網站提供《PyTorch教程之從零開始的遞歸神經網絡實現.pdf》資料免費下載
    發表于 06-05 09:55 ?0次下載
    <b class='flag-5'>PyTorch</b>教程之從零開始的<b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>實現

    PyTorch教程9.6之遞歸神經網絡的簡潔實現

    電子發燒友網站提供《PyTorch教程9.6之遞歸神經網絡的簡潔實現.pdf》資料免費下載
    發表于 06-05 09:56 ?0次下載
    <b class='flag-5'>PyTorch</b>教程9.6之<b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>的簡潔實現

    PyTorch教程10.3之深度遞歸神經網絡

    電子發燒友網站提供《PyTorch教程10.3之深度遞歸神經網絡.pdf》資料免費下載
    發表于 06-05 15:12 ?0次下載
    <b class='flag-5'>PyTorch</b>教程10.3之深度<b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>

    PyTorch教程10.4雙向遞歸神經網絡

    電子發燒友網站提供《PyTorch教程10.4雙向遞歸神經網絡.pdf》資料免費下載
    發表于 06-05 15:13 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>10.4</b>之<b class='flag-5'>雙向</b><b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>

    PyTorch教程16.2之情感分析:使用遞歸神經網絡

    電子發燒友網站提供《PyTorch教程16.2之情感分析:使用遞歸神經網絡.pdf》資料免費下載
    發表于 06-05 10:55 ?0次下載
    <b class='flag-5'>PyTorch</b>教程16.2之情感分析:使用<b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>

    使用PyTorch構建神經網絡

    PyTorch是一個流行的深度學習框架,它以其簡潔的API和強大的靈活性在學術界和工業界得到了廣泛應用。在本文中,我們將深入探討如何使用PyTorch構建神經網絡,包括從基礎概念到高級特性的全面解析。本文旨在為讀者提供一個完整的
    的頭像 發表于 07-02 11:31 ?1004次閱讀

    遞歸神經網絡是循環神經網絡

    遞歸神經網絡(Recurrent Neural Network,簡稱RNN)和循環神經網絡(Recurrent Neural Network,簡稱RNN)實際上是同一個概念,只是不同的翻譯方式
    的頭像 發表于 07-04 14:54 ?1450次閱讀

    遞歸神經網絡與循環神經網絡一樣嗎

    遞歸神經網絡(Recursive Neural Network,RvNN)和循環神經網絡(Recurrent Neural Network,RNN)是兩種不同類型的神經網絡結構,它們在
    的頭像 發表于 07-05 09:28 ?1526次閱讀

    rnn是遞歸神經網絡還是循環神經網絡

    RNN(Recurrent Neural Network)是循環神經網絡,而非遞歸神經網絡。循環神經網絡是一種具有時間序列特性的神經網絡,能
    的頭像 發表于 07-05 09:52 ?955次閱讀

    PyTorch神經網絡模型構建過程

    PyTorch,作為一個廣泛使用的開源深度學習庫,提供了豐富的工具和模塊,幫助開發者構建、訓練和部署神經網絡模型。在神經網絡模型中,輸出層是尤為關鍵的部分,它負責將模型的預測結果以合適的形式輸出。以下將詳細解析
    的頭像 發表于 07-10 14:57 ?839次閱讀

    遞歸神經網絡的實現方法

    遞歸神經網絡(Recursive Neural Network,簡稱RNN)是一種特殊類型的神經網絡,其特點在于能夠處理具有層次或樹狀結構的數據,并通過遞歸的方式對這些數據進行建模。與
    的頭像 發表于 07-10 17:02 ?709次閱讀

    遞歸神經網絡和循環神經網絡的模型結構

    遞歸神經網絡是一種旨在處理分層結構的神經網絡,使其特別適合涉及樹狀或嵌套數據的任務。這些網絡明確地模擬了層次結構中的關系和依賴關系,例如語言中的句法結構或圖像中的層次表示。它使用
    的頭像 發表于 07-10 17:21 ?1193次閱讀
    <b class='flag-5'>遞歸</b><b class='flag-5'>神經網絡</b>和循環<b class='flag-5'>神經網絡</b>的模型結構

    pytorch中有神經網絡模型嗎

    當然,PyTorch是一個廣泛使用的深度學習框架,它提供了許多預訓練的神經網絡模型。 PyTorch中的神經網絡模型 1. 引言 深度學習是一種基于人工
    的頭像 發表于 07-11 09:59 ?1549次閱讀
    主站蜘蛛池模板: 69日本xxxxxxxxx96| 97色综合| 色片免费网站 | 国产精品你懂得 | 你懂的在线视频播放 | 久久精品国产清自在天天线 | 99精品国产在热久久 | 日本不卡视频在线观看 | www.三级.com| 激情丁香六月 | 亚洲成人免费看 | 色综合久久五月 | 五月天婷婷亚洲 | 天天躁夜夜躁狠狠躁 | 在线免费视频手机版 | 免费在线黄色网 | 永久免费在线视频 | 久青草久青草高清在线播放 | 亚洲综合色丁香婷婷六月图片 | 成人xx视频免费观看 | 黄在线观看网站 | 免费永久视频 | 黄 色 毛片免费 | 午夜看一级特黄a大片黑 | 精品视频一区二区三区四区五区 | avt天堂网| 速度与激情一 | 色综合天天五月色 | 日本黄色大片在线播放视频免费观看 | 特级毛片女人18毛片 | 天天操夜夜拍 | 午夜性爽视频男人的天堂在线 | 色老头在线视频 | 久久精品国产精品亚洲毛片 | 三级在线国产 | 色多多网| 天天干天天操天天插 | 男人的午夜影院 | www.xxx.日本 | 久久久婷婷 | 中文字幕一区二区三区在线不卡 |