精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用PyTorch實現遞歸神經網絡?

大數據 深度學習
PyTorch 是 Facebook AI Research 和其它幾個實驗室的開發人員的成果,該框架結合了 Torch7 高效靈活的 GPU 加速后端庫與直觀的 Python 前端,它的特點是快速成形、代碼可讀和支持最廣泛的深度學習模型。

[[189593]]

從 Siri 到谷歌翻譯,深度神經網絡已經在機器理解自然語言方面取得了巨大突破。這些模型大多數將語言視為單調的單詞或字符序列,并使用一種稱為循環神經網絡(recurrent neural network/RNN)的模型來處理該序列。但是許多語言學家認為語言最好被理解為具有樹形結構的層次化詞組,一種被稱為遞歸神經網絡(recursive neural network)的深度學習模型考慮到了這種結構,這方面已經有大量的研究。雖然這些模型非常難以實現且效率很低,但是一個全新的深度學習框架 PyTorch 能使它們和其它復雜的自然語言處理模型變得更加容易。

雖然遞歸神經網絡很好地顯示了 PyTorch 的靈活性,但它也廣泛支持其它的各種深度學習框架,特別的是,它能夠對計算機視覺(computer vision)計算提供強大的支撐。PyTorch 是 Facebook AI Research 和其它幾個實驗室的開發人員的成果,該框架結合了 Torch7 高效靈活的 GPU 加速后端庫與直觀的 Python 前端,它的特點是快速成形、代碼可讀和支持最廣泛的深度學習模型。

開始 SPINN

鏈接中的文章(https://github.com/jekbradbury/examples/tree/spinn/snli)詳細介紹了一個遞歸神經網絡的 PyTorch 實現,它具有一個循環跟蹤器(recurrent tracker)和 TreeLSTM 節點,也稱為 SPINN——SPINN 是深度學習模型用于自然語言處理的一個例子,它很難通過許多流行的框架構建。這里的模型實現部分運用了批處理(batch),所以它可以利用 GPU 加速,使得運行速度明顯快于不使用批處理的版本。

SPINN 的意思是堆棧增強的解析器-解釋器神經網絡(Stack-augmented Parser-Interpreter Neural Network),由 Bowman 等人于 2016 年作為解決自然語言推理任務的一種方法引入,該論文中使用了斯坦福大學的 SNLI 數據集。

該任務是將語句對分為三類:假設語句 1 是一幅看不見的圖像的準確標題,那么語句 2(a)肯定(b)可能還是(c)絕對不是一個準確的標題?(這些類分別被稱為蘊含(entailment)、中立(neutral)和矛盾(contradiction))。例如,假設一句話是「兩只狗正跑過一片場地」,蘊含可能會使這個語句對變成「戶外的動物」,中立可能會使這個語句對變成「一些小狗正在跑并試圖抓住一根棍子」,矛盾能會使這個語句對變成「寵物正坐在沙發上」。

特別地,研究 SPINN 的初始目標是在確定語句的關系之前將每個句子編碼(encoding)成固定長度的向量表示(也有其它方式,例如注意模型(attention model)中將每個句子的每個部分用一種柔焦(soft focus)的方法相互比較)。

數據集是用句法解析樹(syntactic parse tree)方法由機器生成的,句法解析樹將每個句子中的單詞分組成具有獨立意義的短語和子句,每個短語由兩個詞或子短語組成。許多語言學家認為,人類通過如上面所說的樹的分層方式來組合詞意并理解語言,所以用相同的方式嘗試構建一個神經網絡是值得的。下面的例子是數據集中的一個句子,其解析樹由嵌套括號表示:

  1. ( ( The church ) ( ( has ( cracks ( in ( the ceiling ) ) ) ) . ) ) 

這個句子進行編碼的一種方式是使用含有解析樹的神經網絡構建一個神經網絡層 Reduce,這個神經網絡層能夠組合詞語對(用詞嵌入(word embedding)表示,如 GloVe)、 和/或短語,然后遞歸地應用此層(函數),將最后一個 Reduce 產生的結果作為句子的編碼:

  1. X = Reduce(“the”, “ceiling”) 
  2. Y = Reduce(“in”, X) 
  3. ... etc. 

但是,如果我希望網絡以更類似人類的方式工作,從左到右閱讀并保留句子的語境,同時仍然使用解析樹組合短語?或者,如果我想訓練一個網絡來構建自己的解析樹,讓解析樹根據它看到的單詞讀取句子?這是一個同樣的但方式略有不同的解析樹的寫法:

  1. The church ) has cracks in the ceiling ) ) ) ) . ) ) 

或者用第 3 種方式表示,如下:

  1. WORDS:  The church   has cracks in the ceiling         . 
  2. PARSES: S   S      R S   S      S  S   S       R R R R S R R 

我所做的只是刪除開括號,然后用「S」標記「shift」,并用「R」替換閉括號用于「reduce」。但是現在可以從左到右讀取信息作為一組指令來操作一個堆棧(stack)和一個類似堆棧的緩沖區(buffer),能得到與上述遞歸方法完全相同的結果:

  1. 將單詞放入緩沖區。
  2. 從緩沖區的前部彈出「The」,將其推送(push)到堆棧上層,緊接著是「church」。
  3. 彈出前 2 個堆棧值,應用于 Reduce,然后將結果推送回堆棧。
  4. 從緩沖區彈出「has」,然后推送到堆棧,然后是「cracks」,然后是「in」,然后是「the」,然后是「ceiling」。
  5. 重復四次:彈出 2 個堆棧值,應用于 Reduce,然后推送結果。
  6. 從緩沖區彈出「.」,然后推送到堆棧上層。
  7. 重復兩次:彈出 2 個堆棧值,應用于 Reduce,然后推送結果。
  8. 彈出剩余的堆棧值,并將其作為句子編碼返回。

我還想保留句子的語境,以便在對句子的后半部分應用 Reduce 層時考慮系統已經讀取的句子部分的信息。所以我將用一個三參數函數替換雙參數的 Reduce 函數,該函數的輸入值為一個左子句、一個右子句和當前句的上下文狀態。該狀態由神經網絡的第二層(稱為循環跟蹤器(Tracker)的單元)創建。Tracker 在給定當前句子上下文狀態、緩沖區中的頂部條目 b 和堆棧中前兩個條目 s1\s2 時,在堆棧操作的每個步驟(即,讀取每個單詞或閉括號)后生成一個新狀態:

  1. context[t+1] = Tracker(context[t], b, s1, s2) 

容易設想用你最喜歡的編程語言來編寫代碼做這些事情。對于要處理的每個句子,它將從緩沖區加載下一個單詞,運行跟蹤器,檢查是否將單詞推送入堆棧或執行 Reduce 函數,執行該操作;然后重復,直到對整個句子完成處理。通過對單個句子的應用,該過程構成了一個大而復雜的深度神經網絡,通過堆棧操作的方式一遍又一遍地應用它的兩個可訓練層。但是,如果你熟悉 TensorFlow 或 Theano 等傳統的深度學習框架,就知道它們很難實現這樣的動態過程。你值得花點時間回顧一下,探索為什么 PyTorch 能有所不同。

圖 1:一個函數的圖結構表示

深度神經網絡本質上是有大量參數的復雜函數。深度學習的目的是通過計算以損失函數(loss)度量的偏導數(梯度)來優化這些參數。如果函數表示為計算圖結構(圖 1),則向后遍歷該圖可實現這些梯度的計算,而無需冗余工作。每個現代深度學習框架都是基于此反向傳播(backpropagation)的概念,因此每個框架都需要一個表示計算圖的方式。

在許多流行的框架中,包括 TensorFlow、Theano 和 Keras 以及 Torch7 的 nngraph 庫,計算圖是一個提前構建的靜態對象。該圖是用像數學表達式的代碼定義的,但其變量實際上是尚未保存任何數值的占位符(placeholder)。圖中的占位符變量被編譯進函數,然后可以在訓練集的批處理上重復運行該函數來產生輸出和梯度值。

這種靜態計算圖(static computation graph)方法對于固定結構的卷積神經網絡效果很好。但是在許多其它應用中,有用的做法是令神經網絡的圖結構根據數據而有所不同。在自然語言處理中,研究人員通常希望通過每個時間步驟中輸入的單詞來展開(確定)循環神經網絡。上述 SPINN 模型中的堆棧操作很大程度上依賴于控制流程(如 for 和 if 語句)來定義特定句子的計算圖結構。在更復雜的情況下,你可能需要構建結構依賴于模型自身的子網絡輸出的模型。

這些想法中的一些(雖然不是全部)可以被生搬硬套到靜態圖系統中,但幾乎總是以降低透明度和增加代碼的困惑度為代價。該框架必須在其計算圖中添加特殊的節點,這些節點代表如循環和條件的編程原語(programming primitive),而用戶必須學習和使用這些節點,而不僅僅是編程代碼語言中的 for 和 if 語句。這是因為程序員使用的任何控制流程語句將僅運行一次,當構建圖時程序員需要硬編碼(hard coding)單個計算路徑。

例如,通過詞向量(從初始狀態 h0 開始)運行循環神經網絡單元(rnn_unit)需要 TensorFlow 中的特殊控制流節點 tf.while_loop。需要一個額外的特殊節點來獲取運行時的詞長度,因為在運行代碼時它只是一個占位符。

  1. # TensorFlow 
  2. # (this code runs once, during model initialization) 
  3. # “words” is not a real list (it’s a placeholder variable) so 
  4. # I can’t use “len” 
  5. cond = lambda i, h: i < tf.shape(words)[0] 
  6. cell = lambda i, h: rnn_unit(words[i], h) 
  7. i = 0 
  8. _, h = tf.while_loop(cond, cell, (i, h0)) 

基于動態計算圖(dynamic computation graph)的方法與之前的方法有根本性不同,它有幾十年的學術研究歷史,其中包括了哈佛的 Kayak、自動微分庫(autograd)以及以研究為中心的框架 Chainer和 DyNet。在這樣的框架(也稱為運行時定義(define-by-run))中,計算圖在運行時被建立和重建,使用相同的代碼為前向通過(forward pass)執行計算,同時也為反向傳播(backpropagation)建立所需的數據結構。這種方法能產生更直接的代碼,因為控制流程的編寫可以使用標準的 for 和 if。它還使調試更容易,因為運行時斷點(run-time breakpoint)或堆棧跟蹤(stack trace)將追蹤到實際編寫的代碼,而不是執行引擎中的編譯函數。可以在動態框架中使用簡單的 Python 的 for 循環來實現有相同變量長度的循環神經網絡。

  1. # PyTorch (also works in Chainer) 
  2. # (this code runs on every forward pass of the model) 
  3. # “words” is a Python list with actual values in it 
  4. h = h0 
  5. for word in words:    h = rnn_unit(word, h) 

PyTorch 是第一個 define-by-run 的深度學習框架,它與靜態圖框架(如 TensorFlow)的功能和性能相匹配,使其能很好地適合從標準卷積神經網絡(convolutional network)到最瘋狂的強化學習(reinforcement learning)等思想。所以讓我們來看看 SPINN 的實現。

代碼

在開始構建網絡之前,我需要設置一個數據加載器(data loader)。通過深度學習,模型可以通過數據樣本的批處理進行操作,通過并行化(parallelism)加快訓練,并在每一步都有一個更平滑的梯度變化。我想在這里可以做到這一點(稍后我將解釋上述堆棧操作過程如何進行批處理)。以下 Python 代碼使用內置于 PyTorch 的文本庫的系統來加載數據,它可以通過連接相似長度的數據樣本自動生成批處理。運行此代碼之后,train_iter、dev_iter 和 test_itercontain 循環遍歷訓練集、驗證集和測試集分塊 SNLI 的批處理。

  1. from torchtext import data, datasets TEXT = datasets.snli.ParsedTextField(lower=True
  2. TRANSITIONS = datasets.snli.ShiftReduceField() 
  3. LABELS = data.Field(sequential=False)train, dev, test = datasets.SNLI.splits(    TEXT, TRANSITIONS, LABELS, wv_type='glove.42B')TEXT.build_vocab(train, dev, test) 
  4. train_iter, dev_iter, test_iter = data.BucketIterator.splits(    (train, dev, test), batch_size=64) 

你可以在 train.py中找到設置訓練循環和準確性(accuracy)測量的其余代碼。讓我們繼續。如上所述,SPINN 編碼器包含參數化的 Reduce 層和可選的循環跟蹤器來跟蹤句子上下文,以便在每次網絡讀取單詞或應用 Reduce 時更新隱藏狀態;以下代碼代表的是,創建一個 SPINN 只是意味著創建這兩個子模塊(我們將很快看到它們的代碼),并將它們放在一個容器中以供稍后使用。

  1. import torchfrom torch import nn 
  2. # subclass the Module class from PyTorch’s neural network package 
  3. class SPINN(nn.Module):    
  4.  def __init__(self, config):         
  5. super(SPINN, self).__init__()        
  6.  self.config = config        
  7.  self.reduce = Reduce(config.d_hidden, config.d_tracker)         
  8. if config.d_tracker is not None:            
  9.  self.tracker = Tracker(config.d_hidden, config.d_tracker) 

當創建模型時,SPINN.__init__ 被調用了一次;它分配和初始化參數,但不執行任何神經網絡操作或構建任何類型的計算圖。在每個新的批處理數據上運行的代碼由 SPINN.forward 方法定義,它是用戶實現的方法中用于定義模型向前過程的標準 PyTorch 名稱。上面描述的是堆棧操作算法的一個有效實現,即在一般 Python 中,在一批緩沖區和堆棧上運行,每一個例子都對應一個緩沖區和堆棧。我使用轉移矩陣(transition)包含的「shift」和「reduce」操作集合進行迭代,運行 Tracker(如果存在),并遍歷批處理中的每個樣本來應用「shift」操作(如果請求),或將其添加到需要「reduce」操作的樣本列表中。然后在該列表中的所有樣本上運行 Reduce 層,并將結果推送回到它們各自的堆棧。

  1. def forward(self, buffers, transitions): 
  2.         # The input comes in as a single tensor of word embeddings; 
  3.         # I need it to be a list of stacks, one for each example in 
  4.         # the batch, that we can pop from independently. The words in 
  5.         # each example have already been reversed, so that they can 
  6.         # be read from left to right by popping from the end of each 
  7.         # list; they have also been prefixed with a null value. 
  8.         buffers = [list(torch.split(b.squeeze(1), 1, 0)) 
  9.                    for b in torch.split(buffers, 1, 1)] 
  10.         # we also need two null values at the bottom of each stack, 
  11.         # so we can copy from the nulls in the input; these nulls 
  12.         # are all needed so that the tracker can run even if the 
  13.         # buffer or stack is empty 
  14.         stacks = [[buf[0], buf[0]] for buf in buffers] 
  15.         if hasattr(self, 'tracker'): 
  16.             self.tracker.reset_state() 
  17.         for trans_batch in transitions: 
  18.             if hasattr(self, 'tracker'): 
  19.                 # I described the Tracker earlier as taking 4 
  20.                 # arguments (context_t, b, s1, s2), but here I 
  21.                 # provide the stack contents as a single argument 
  22.                 # while storing the context inside the Tracker 
  23.                 # object itself. 
  24.                 tracker_states, _ = self.tracker(buffers, stacks) 
  25.             else
  26.                 tracker_states = itertools.repeat(None) 
  27.             lefts, rights, trackings = [], [], [] 
  28.             batch = zip(trans_batch, buffers, stacks, tracker_states) 
  29.             for transition, buf, stack, tracking in batch: 
  30.                 if transition == SHIFT: 
  31.                     stack.append(buf.pop()) 
  32.                 elif transition == REDUCE: 
  33.                     rights.append(stack.pop()) 
  34.                     lefts.append(stack.pop()) 
  35.                     trackings.append(tracking) 
  36.             if rights: 
  37.                 reduced = iter(self.reduce(lefts, rights, trackings)) 
  38.                 for transition, stack in zip(trans_batch, stacks): 
  39.                     if transition == REDUCE: 
  40.                         stack.append(next(reduced)) 
  41.         return [stack.pop() for stack in stacks] 

在調用 self.tracker 或 self.reduce 時分別運行 Tracker 或 Reduce 子模塊的向前方法,該方法需要在樣本列表上應用前向操作。在主函數的向前方法中,在不同的樣本上進行獨立的操作是有意義的,即為批處理中每個樣本提供分離的緩沖區和堆棧,因為所有受益于批處理執行的重度使用數學和需要 GPU 加速的操作都在 Tracker 和 Reduce 中進行。為了更干凈地編寫這些函數,我將使用一些 helper(稍后將定義)將這些樣本列表轉化成批處理張量(tensor),反之亦然。

我希望 Reduce 模塊自動批處理其參數以加速計算,然后解批處理(unbatch)它們,以便可以單獨推送和彈出。用于將每對左、右子短語表達組合成父短語(parent phrase)的實際組合函數是 TreeLSTM,它是普通循環神經網絡單元 LSTM 的變型。該組合函數要求每個子短語的狀態實際上由兩個張量組成,一個隱藏狀態 h 和一個存儲單元(memory cell)狀態 c,而函數是使用在子短語的隱藏狀態操作的兩個線性層(nn.Linear)和將線性層的結果與子短語的存儲單元狀態相結合的非線性組合函數 tree_lstm。在 SPINN 中,這種方式通過添加在 Tracker 的隱藏狀態下運行的第 3 個線性層進行擴展。

圖 2:TreeLSTM 組合函數增加了第 3 個輸入(x,在這種情況下為 Tracker 狀態)。在下面所示的 PyTorch 實現中,5 組的三種線性變換(由藍色、黑色和紅色箭頭的三元組表示)組合為三個 nn.Linear 模塊,而 tree_lstm 函數執行位于框內的所有計算。圖來自 Chen et al. (2016)。

  1. def tree_lstm(c1, c2, lstm_in): 
  2.     # Takes the memory cell states (c1, c2) of the two children, as 
  3.     # well as the sum of linear transformations of the children’s 
  4.     # hidden states (lstm_in) 
  5.     # That sum of transformed hidden states is broken up into a 
  6.     # candidate output a and four gates (i, f1, f2, and o). 
  7.     a, i, f1, f2, o = lstm_in.chunk(5, 1) 
  8.     c = a.tanh() * i.sigmoid() + f1.sigmoid() * c1 + f2.sigmoid() * c2 
  9.     h = o.sigmoid() * c.tanh() 
  10.     return h, cclass Reduce(nn.Module): 
  11.     def __init__(self, size, tracker_size=None): 
  12.         super(Reduce, self).__init__() 
  13.         self.left = nn.Linear(size, 5 * size
  14.         self.right = nn.Linear(size, 5 * size, bias=False
  15.         if tracker_size is not None: 
  16.             self.track = nn.Linear(tracker_size, 5 * size, bias=False
  17.  
  18.     def forward(self, left_in, right_in, tracking=None): 
  19.         leftright = batch(left_in), batch(right_in) 
  20.         tracking = batch(tracking) 
  21.         lstm_in = self.left(left[0]) 
  22.         lstm_in += self.right(right[0]) 
  23.         if hasattr(self, 'track'): 
  24.             lstm_in += self.track(tracking[0]) 
  25.         return unbatch(tree_lstm(left[1], right[1], lstm_in)) 

由于 Reduce 層和類似實現方法的 Tracker 都用 LSTM 進行工作,所以批處理和解批處理幫助函數在隱藏狀態和存儲狀態對(h,c)上運行。

  1. def batch(states): 
  2.     if states is None: 
  3.         return None 
  4.     states = tuple(states) 
  5.     if states[0] is None: 
  6.         return None 
  7.     # states is a list of B tensors of dimension (1, 2H) 
  8.     # this returns two tensors of dimension (B, H) 
  9.     return torch.cat(states, 0).chunk(2, 1)def unbatch(state): 
  10.     if state is None: 
  11.         return itertools.repeat(None) 
  12.     # state is a pair of tensors of dimension (B, H) 
  13.     # this returns a list of B tensors of dimension (1, 2H) 
  14.     return torch.split(torch.cat(state, 1), 1, 0) 

這就是所有。其余的必要代碼(包括 Tracker),在 spinn.py中,同時分類器層可以從兩個句子編碼中計算 SNLI 類別,并在給出最終損失(loss)變量的情況下將此結果與目標進行比較,代碼在 model.py中。SPINN 及其子模塊的向前代碼產生了非常復雜的計算圖(圖 3),最終計算出損失函數,其細節在數據集中的每個批處理中都完全不同,但是每次只需很少的開銷(overhead)即可自動反向傳播,通過調用 loss.backward(),一個內置于 PyTorch 中的函數,它可以從圖中的任何一點執行反向傳播。

完整代碼中的模型和超參數可以與原始 SPINN 論文中報告的性能相匹配,但是充分利用了批處理加工和 PyTorch 的效率后,在 GPU 上訓練的速度要快幾倍。雖然原始實現需要21 分鐘來編譯計算圖(意味著實施過程中的調試周期至少要那么長),然后訓練大約 5 天時間,這里描述的版本沒有編譯步驟,它的訓練在 Tesla K40 的 GPU 上需要約 13 個小時,或者在 Quadro GP100 上約 9 小時。

圖 3:具有批大小為 2 的 SPINN 計算圖的一小部分,它運行的是本文中提供的 Chainer 代碼版本。

調用所有的強化學習

上述沒有跟蹤器(Tracker)的模型版本實際上非常適合 TensorFlow 的新 tf.fold 域特定語言,它針對動態圖形的特殊情況,但是有跟蹤器的版本將難以實現。這是因為添加跟蹤器意味著從遞歸(recursive)方法切換到基于堆棧的方法。這(如上面的代碼)是最直接地使用依賴于輸入值的條件分支(conditional branch)來實現的。但是 Fold 缺少內置的條件分支操作,所以使用它構建的模型中的圖形結構只能取決于輸入的結構而不是其數值。此外,構建一個其跟蹤器在讀取輸入句子時就決定如何解析輸入句子的 SPINN 的版本是完全沒有可能的,因為一旦加載了一個輸入樣本 Fold 中的圖結構必須完全固定(圖結構依賴于輸入樣本的結構)。

DeepMind 和谷歌大腦的研究人員研究了一個這樣的模型,他們應用強化學習來訓練一個 SPINN 的跟蹤器解析輸入句子,而不使用任何外部解析數據。本質上,這樣一個模型從隨機猜測開始,當它的解析在整體分類任務上恰好產生良好的準確性時,它產生一個自我獎勵(reward)并通過獎勵來學習。研究人員寫道,他們「使用的批處理大小為 1,因為在每次迭代中計算圖需要根據每個來自策略網絡(policy network)的樣本重新構建 [Tracker]」——但 PyTorch 使得在像這樣一個復雜的、結構隨機變化的網絡上進行批處理訓練成為可能。

PyTorch 也是第一個以隨機計算圖(stochastic computation graph)形式建立強化學習(RL)庫的框架,使得策略梯度(policy gradient)強化學習如反向傳播一樣易于使用。要將其添加到上述模型中,你只需重新編寫主 SPINN 的 for 循環的前幾行,如下所示,使得 Tracker 能夠定義進行每種解析轉移矩陣的概率。

  1. !# nn.functional contains neural network operations without parametersfrom torch.nn import functional as F 
  2. transitions = []for i in range(len(buffers[0]) * 2 - 3):   
  3.     # we know how many steps 
  4.     # obtain raw scores for each kind of parser transition 
  5.     tracker_states, transition_scores = self.tracker(buffers, stacks) 
  6.     # use a softmax function to normalize scores into probabilities, 
  7.     # then sample from the distribution these probabilities define 
  8.     transition_batch = F.softmax(transition_scores).multinomial() 
  9.     transitions.append(transition_batch 

然后,隨著批處理一直運行,模型會得出它預測的類別的準確程度,我可以通過這些隨機計算圖的節點發出獎勵信號,另外在圖的其余部分以傳統方式進行反向傳播:

  1. # losses should contain a loss per example, while mean and std  
  2. # represent averages across many batches 
  3. rewards = (-losses - mean) / std 
  4. for transition in transitions: 
  5.     transition.reinforce(rewards) 
  6. connect the stochastic nodes to the final loss variable 
  7. # so that backpropagation can find them, multiplying by zero 
  8. # because this trick shouldn’t change the loss value 
  9. loss = losses.mean() + 0 * sum(transitions).sum() 
  10. # perform backpropagation through deterministic nodes and 
  11. # policy gradient RL for stochastic nodesloss.backward() 

谷歌研究人員報告了包含強化學習的 SPINN 的結果,比原始的在 SNLI 數據集的 SPINN 上獲得的結果要好一些——盡管強化學習版本不使用預先計算的解析樹信息。自然語言處理的深度強化學習領域是全新的,該領域的研究課題非常廣泛;通過將強化學習構建到框架中,PyTorch 大大降低了進入門檻。

從今天起開始使用 PyTorch

遵循 pytorch.org 網站上的說明安裝,選擇安裝平臺(即將推出 Windows 版本的支持)。PyTorch 支持 Python 2 和 3 以及使用 CUDA 7.5 或 8.0 和 CUDNN 5.1 或 6.0 的 CPU 或 NVIDIA GPU 上的計算。它有針對 conda 和 pip 的 Linux 二進制文件甚至含有 CUDA 本身,因此你不需要自己設置它。

官方教程包含 60 分鐘的介紹和深度 Q-學習(Deep Q-Learning,一種現代強化學習模型)的演練。斯坦福的 Justin Johnson 教授有一個非常全面的教程,官方示例還包括——深度卷積生成對抗網絡(DCGAN)、ImageNet 模型和神經機器翻譯模型(neural machine translation)。新加坡國立大學的 Richie Ng 制作了最新的其它 PyTorch 實現、示例和教程的列表。PyTorch 開發人員和用戶社區在討論論壇上的第一時間回答問題,但你應該首先檢查 API 文檔。

盡管 PyTorch 僅使用了較短時間,但三篇研究論文已經使用了它,幾個學術實驗室和業界實驗室也采用了 PyTorch。回溯過去,在當時動態計算圖比現在模糊時,我與同事在 Salesforce Research(https://metamind.io/research.html)也曾經考慮過 Chainer 作為我們的秘密配方;現在,在大公司的支持下,我們很高興 PyTorch 將這一水平的能力和靈活性帶入了主流。

責任編輯:武曉燕 來源: 36大數據
相關推薦

2017-07-27 10:46:44

神經網絡機器學習強化學習

2025-09-16 07:04:00

2017-11-29 14:41:48

神經網絡遞歸神經網絡RNN

2018-02-05 08:58:36

Python神經網絡識別圖像

2020-12-19 11:05:57

循環神經網絡PyTorch神經網絡

2024-04-30 14:54:10

2017-06-19 15:12:30

Uber神經網絡事件預測

2020-09-18 11:40:44

神經網絡人工智能PyTorch

2017-06-11 23:38:43

進化圖像神經網絡

2020-08-06 10:11:13

神經網絡機器學習算法

2025-02-25 14:13:31

2020-05-27 11:10:54

KerasLSTM神經網絡

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2025-02-19 15:12:17

神經網絡PyTorch大模型

2022-07-28 09:00:00

深度學習網絡類型架構

2017-08-29 09:40:26

JavaScript代碼神經網絡

2023-05-12 14:58:50

Java神經網絡深度學習

2024-11-05 16:19:55

2021-12-28 08:48:54

PyTorch神經網絡人工智能

2022-02-15 23:38:22

Python機器學習算法
點贊
收藏

51CTO技術棧公眾號

日韩和的一区二在线| 国产草草影院ccyycom| 亚洲尤物av| 欧美日韩在线电影| 欧美日韩视频免费| 暖暖视频在线免费观看| 精品一区二区在线看| 欧美激情奇米色| 法国空姐电影在线观看| 日韩精品一区二区三区中文| 欧美日韩在线视频一区| 在线观看精品视频| 日韩一级免费毛片| 麻豆国产一区二区| 91高清免费在线观看| 免费黄色激情视频| 蜜臀av免费一区二区三区| 91精品国产高清一区二区三区蜜臀| 奇米影视亚洲色图| 国产福利在线播放麻豆| 久久久久久久久久久电影| 97中文在线观看| 中文字幕精品在线观看| 国产视频亚洲| 欧美日韩第一页| 青青草华人在线视频| 欧美一级色片| 欧美大胆人体bbbb| 天堂av8在线| 亚洲成人短视频| 五月开心婷婷久久| 欧美中文字幕在线观看视频 | 国产av熟女一区二区三区| 粉嫩av在线播放| 日韩在线视频观看免费| 在线日韩电影| 久久精品视频导航| 国产精品久久久久久成人| 亚洲另类春色校园小说| 亚洲精品ady| 黑人无套内谢中国美女| 亚洲我射av| 欧美日韩免费在线视频| 国产三级三级三级看三级| 小视频免费在线观看| 性久久久久久久| 国产成人永久免费视频| 中文字幕免费高清电视剧网站在线观看 | 国产精品爽爽ⅴa在线观看| 日韩av在线电影| 99国产精品久久久久久久| 久久久久久久久久国产精品| 九九九免费视频| 欧美日韩国产亚洲一区| 欧美精品在线免费观看| 国产大片免费看| 欧美精品成人| 久久久久成人精品| 久久久精品国产sm调教网站| 欧美性久久久| 韩国福利视频一区| 97久久久久久久| 午夜在线视频观看日韩17c| 欧美一区二区色| 一二三区免费视频| 久久激情五月婷婷| 亚洲自拍欧美另类| 内射后入在线观看一区| 91网上在线视频| 日韩av影视| 免费a级在线播放| 亚洲黄色av一区| av在线播放亚洲| 成人日韩在线观看| 在线播放/欧美激情| 欧美xxxx日本和非洲| 色天下一区二区三区| 一本色道久久88综合亚洲精品ⅰ | 一区二区不卡在线视频 午夜欧美不卡在| 天天在线免费视频| 免费在线小视频| 欧美丝袜丝nylons| 欧美色图校园春色| 天堂网av成人| 精品国产拍在线观看| 国产真实乱偷精品视频| 老司机精品视频网站| 成人在线国产精品| 全部免费毛片在线播放一个| 国产亚洲综合色| 91xxx视频| 三级在线看中文字幕完整版| 欧美日韩的一区二区| 黄色性视频网站| 不卡视频在线| 久久青草福利网站| 亚洲天堂手机在线| av综合在线播放| 亚洲精品tv久久久久久久久| 天堂亚洲精品| 在线一区二区视频| 不许穿内裤随时挨c调教h苏绵| 伊人久久大香线蕉综合网站| 久久99精品视频一区97| 久久久黄色大片| 国产盗摄一区二区三区| 亚州欧美一区三区三区在线| 欧美性受ⅹ╳╳╳黑人a性爽| 欧洲一区二区三区在线| 国产一卡二卡三卡四卡| 日本高清免费电影一区| 51色欧美片视频在线观看| 国产精品玖玖玖| 91麻豆6部合集magnet| 欧美精品久久96人妻无码| 美女18一级毛片一品久道久久综合| 欧美一区二区女人| 久久亚洲AV无码专区成人国产| 欧美国产三级| 国产欧美日韩专区发布| 免费在线看v| 午夜在线电影亚洲一区| 熟妇女人妻丰满少妇中文字幕| 欧美呦呦网站| 国产精品18久久久久久麻辣| 欧美一区二不卡视频| 亚洲美女淫视频| 男人的天堂日韩| 亚洲a级精品| 4p变态网欧美系列| 五月婷婷丁香网| 亚洲成av人片| 男人操女人下面视频| 欧美hd在线| 国产成人午夜视频网址| 天堂成人在线| 精品日韩视频在线观看| 永久免费看片在线观看| 中文字幕一区二区三区欧美日韩| 国产精品黄色av| 国产乱理伦片a级在线观看| 精品欧美激情精品一区| 日本黄色录像片| 亚洲第一区色| 久久久综合香蕉尹人综合网| av在线视屏| 亚洲精品大尺度| 亚洲欧美精品一区二区三区| 91视频xxxx| 一本大道熟女人妻中文字幕在线 | 欧美在线se| 色哟哟网站入口亚洲精品| 中文人妻熟女乱又乱精品| 国产午夜精品福利| 国产免费999| 久久美女视频| 成人h片在线播放免费网站| 日本蜜桃在线观看| 日韩网站在线看片你懂的| 国产波霸爆乳一区二区| 国产**成人网毛片九色| av免费观看大全| 欧美日韩播放| 国产精品女人久久久久久| 日韩黄色影院| 日韩精品在线网站| 日本午夜精品理论片a级app发布| 不卡av在线网| 日本精品一区二区三区四区| 视频国产一区| 国产精品揄拍500视频| 免费成人黄色| 亚洲国产成人精品女人久久久| www欧美在线| 国产欧美日韩视频一区二区 | 成人免费观看av| 无码人妻精品一区二区三区在线| 国产精品一线天粉嫩av| 国产一区视频在线播放| 四虎影视国产在线视频| 精品偷拍各种wc美女嘘嘘| 亚洲一区二区三区高清视频| 亚洲女同一区二区| 欧美黑人欧美精品刺激| 麻豆精品久久精品色综合| 精品国偷自产一区二区三区| 国产成人黄色| 97神马电影| 456亚洲精品成人影院| 久久亚洲精品成人| 无码精品人妻一区二区| 69堂国产成人免费视频| 日本三级午夜理伦三级三| 国产欧美精品一区| 久久久久无码国产精品一区李宗瑞| 免费视频一区| 蜜桃视频一区二区在线观看| 在线成人动漫av| 91pron在线| 三上悠亚激情av一区二区三区| 免费成人高清视频| 久久av少妇| 欧美成人激情免费网| 国产第一页在线观看| 亚洲在线视频一区| 99热6这里只有精品| 99精品欧美一区二区蜜桃免费| 亚洲欧美aaa| 久久国产成人| av免费看网址| 国产精品99久久精品| 欧美精品七区| 最新精品在线| 91亚洲精品一区| 色8久久影院午夜场| 国外成人在线直播| 免费黄色电影在线观看| 中文字幕不卡av| 香蕉国产在线视频| 欧美va亚洲va香蕉在线| 97精品人妻一区二区三区香蕉| 色婷婷综合久久久久中文一区二区| 欧美精品99久久久| 亚洲欧洲www| 欧美黄色高清视频| 久久精品免费在线观看| 青青草视频成人| 不卡的av电影在线观看| 日本一级大毛片a一| 国产成人精品一区二区三区网站观看| 国产精品区在线| 日韩成人精品在线| 手机看片福利盒子久久| 美女爽到呻吟久久久久| 国产视频九色蝌蚪| 亚洲乱码视频| 日本中文字幕网址| 怡红院精品视频在线观看极品| 青青草原网站在线观看| 亚洲一区二区三区| 蜜臀av性久久久久蜜臀av| 国产精品福利在线观看播放| 伊人色综合影院| 91视频综合| 一本二本三本亚洲码| 天天揉久久久久亚洲精品| 特级毛片在线免费观看| 国产精品成人a在线观看| 中文字幕一区二区三区四区五区六区 | 99精品视频网站| 99精品在线| 特级西西444| 亚洲人www| 日韩精品视频久久| 蜜桃精品视频在线观看| 一女二男3p波多野结衣| 精品一区二区三区影院在线午夜 | 久久精品国产欧美亚洲人人爽| 欧美三级理伦电影| 欧美大成色www永久网站婷| 蜜桃传媒在线观看免费进入 | 99久久精品免费看国产 | 国产精品护士白丝一区av| 任你操精品视频| 一区二区三区中文字幕| 国产主播在线观看| 色欧美片视频在线观看| 91禁在线观看| 精品国产91洋老外米糕| 视频三区在线观看| 中文字幕日韩欧美在线| 国产欧美久久久久久久久| 欧美精品久久久久久久免费观看| 欧美一级鲁丝片| 国产精品久久二区| 国产亚洲高清在线观看| 狠狠色狠狠色综合人人| 欧美一区二区三| 日韩免费在线观看av| 视频精品一区二区| 色黄视频免费看| 91视频精品在这里| 国产激情无码一区二区三区| 亚洲高清免费观看高清完整版在线观看| 日韩久久中文字幕| 欧美高清你懂得| 性插视频在线观看| 日韩在线观看免费网站| sm久久捆绑调教精品一区| 国产精品高潮在线| 2020最新国产精品| 亚洲欧洲一区二区| 日韩视频在线一区二区三区 | 波多野结衣高清在线| 日韩午夜在线观看| 福利在线午夜| 国内精品国产三级国产在线专| 成人久久网站| 国产专区一区二区三区| 亚洲草久电影| 热久久精品国产| caoporn国产精品| 午夜激情福利电影| 日韩欧美中文免费| 黄色小视频免费在线观看| 中文字幕在线精品| www.精品| 国产女人水真多18毛片18精品| 欧美丰满日韩| 欧美精品一区二区三区免费播放| 国产成人精品网址| 国精产品视频一二二区| 91福利在线观看| 无码国产精品一区二区色情男同| 欧美日本高清视频| 四虎在线精品| 日本一区二区三区www| 亚洲免费影视| 91传媒理伦片在线观看| 一区二区三区在线免费播放| 91成人一区二区三区| 中文字幕一区二区三区电影| 免费成人在线电影| 精品日本一区二区三区在线观看| 午夜日韩激情| 美女被艹视频网站| 国产精品成人网| 中文 欧美 日韩| 中文字幕亚洲自拍| 国精品产品一区| 性欧美精品一区二区三区在线播放| 视频在线观看91| 精品人妻一区二区三区视频| 欧美日韩国产中文字幕| 人人妻人人澡人人爽人人欧美一区 | 欧美成人一区二区三区| 黄av在线免费观看| 91精品久久久久久久久不口人| 精品国产精品久久一区免费式| 50路60路老熟妇啪啪| 2020国产精品久久精品美国| 久草视频在线观| 精品一区二区三区四区| 日本蜜桃在线观看视频| 国产一区二区在线观看免费播放| 91久久综合| 美女又爽又黄免费| 黑人巨大精品欧美一区二区一视频| 天天躁日日躁狠狠躁喷水| 91精品国产高清自在线 | 中文字幕一区二区中文字幕| 七七婷婷婷婷精品国产| 后入内射无码人妻一区| 欧美美女一区二区| jizz性欧美| 国产精品区一区二区三含羞草| 91久久黄色| 午夜在线观看一区| 欧美性一区二区| 在线观看精品一区二区三区| 成人信息集中地欧美| 中文字幕一区二区三区乱码图片| 中文字幕第九页| 日韩欧美在线字幕| 在线观看av的网站| 91成人免费视频| 亚洲精品精选| 成人黄色a级片| 91精品国产91综合久久蜜臀| 黄污视频在线观看| 欧美日本韩国一区二区三区| 看电视剧不卡顿的网站| 国产va在线播放| 亚洲精品电影网| 开心久久婷婷综合中文字幕| 400部精品国偷自产在线观看| 成人午夜免费av| 亚洲精品91天天久久人人| yellow中文字幕久久| 日韩成人动漫在线观看| 日韩在线第三页| 亚洲欧美色图小说| 午夜性色福利影院| 国产日韩欧美中文在线播放| 国内精品久久久久国产盗摄免费观看完整版| 成人性生活免费看| 欧美天堂亚洲电影院在线播放| 在线h片观看| 日韩精品久久一区二区三区| 国产成人免费视频一区| 亚洲国产成人精品女人久久| 欧美xxxx做受欧美| 深爱激情综合网| 亚洲午夜久久久久久久久| 色综合久久88色综合天天| 日本高清在线观看| 99热国产免费| 免费观看日韩电影| 国产成人自拍视频在线| 久久精品视频在线播放|