• <button id="c6aq4"></button>
    腦洞大開:可以模仿韓寒小四寫字的神奇循環神經網絡(附代碼)

    腦洞大開:可以模仿韓寒小四寫字的神奇循環神經網絡(附代碼)

    學習資料巨鯊網2023-06-21 14:16:4115A+A-

    作者| 韓曉陽&&龍新辰

    致謝 | 歐文負責part1的翻譯及部分內容

    出處|

    大數據文摘“機器學習”專欄成立了!

    歡迎留言提供寶貴意見,歡迎為我們貢獻力量。 如何加入我們? 文章末尾有說明:)

    ◆◆◆簡介

    在我們離人工智能越來越近的今天,研究界和產業界對神經網絡和深度學習的興趣越來越大,期望也越來越高。

    我們在深度學習與計算機視覺專欄中看到,計算機是通過卷積神經網絡——模仿人類視覺來學習識別圖片內容的,而在業界的大量應用也證明了神經網絡可以讓計算機學會識別圖片內容。聽(比如百度的語音識別),于是大量的精力開始投入到NLP領域。 讓計算機學會寫字一定很有趣。 試想一下,如果計算機能通過閱讀韓寒和小四的小說寫出同樣的曲子,這是多么令人興奮的事情。

    更不用說,真的有這么一種神經網絡可以在NLP中發揮巨大的作用,處理從語言模型()到雙語翻譯,到文本生成,甚至代碼風格模仿的問題。 這就是我們今天要介紹的RNN(循環神經網絡)。

    ◆◆◆神奇的RNN,令人難以置信的性能

    RNN是與時間序列相關的神經網絡。 想一想,對于單張圖片來說,像素信息是靜態的,但是對于一段文字來說,里面的文字組成是有順序的,通常后面的文字和前面的文字是順序關聯的。 這時,具有獨立層次結構的卷積神經網絡通常很難處理這種時序相關信息,但RNN卻可以有效處理。

    RNN 在處理時間序列內容方面效果如何? 我們來看一些 RNN 處理的例子。

    我們知道卷積神經網絡在0-9數字的識別上已經可以達到人類的識別精度,但是對于一串數字,還是有一些特殊的處理。 比如下面是讓RNN學習從左到右讀取數字門牌號。

    我們還可以讓RNN學習從右到左繪制門牌號圖片:

    RNN 可以模仿各種格式的文件。 例如,以下是RNN學習到的XML文件,以及Latex代數幾何文件的示例:

    我們暫時不關心內容的正確性。 這格式化能力已經讓我傻眼了。

    愛折騰GG的程序員,當然會掌握所有可以學習的資源,于是拉下了Linux的源碼,然后喂給循環神經網絡學習。 兩三天后...我們發現它可以自己生成如下代碼塊

    且不說代碼內容是否有意義,這種標準的C代碼風格,讀起來有種嚇尿的傾向。

    哦,對了,剛才我們提到了RNN處理文本的能力。 讓我們自己看一下并做一個實驗,將所有莎士比亞的作品串成一個(4.4MB)文件。 訓練了具有 512 個隱藏節點的 3 層 RNN 網絡。 對網絡進行幾個小時的訓練后,得到了以下樣本結果:

    好吧,作為一個文學功底薄弱的碼農,我讀不懂莎士比亞這樣的大作家的文筆。 但是我們有韓寒,我們有四娘這個受女中學生歡迎的人,所以我們就去網上扒了一個可以處理中文的char-rnn代碼。 四娘名作集,從《幻城》到《左手的倒影右手的時代》,再到《逆流而上的悲傷》和《小時代》,加工整理(咳咳,我只是作為實驗學習的,不是傳播的。。。版權問題形式找博主。。。),丟給RNN學習,然后,嗯,看看它能學到什么。

    小四的話我聽不懂,但是RNN生成的詞讓我有點“45度角仰望天空,眼淚就不會掉下來”的感覺。 當然,這些段落已經是輸出結果中比較好的內容,也有一定的流暢性,但足以證明遞歸神經網絡在NLP中有著不可思議的學習能力。

    ◆◆◆遞歸神經網絡講解

    剛才被循環神經網絡驚呆的朋友們,讓我們把目光從小四身上收回來。 讓我們看看這個神奇的循環神經網絡到底是什么樣的神物,以及它背后的原理是什么。

    在傳統的神經網絡(包括 CNN)中,我們假設所有輸入和輸出都是相互獨立的。 不幸的是,對于許多任務來說文獻類型代碼怎么看,這個假設并不成立。 如果你想預測下一個單詞或句子,你需要知道前面的單詞。 遞歸神經網絡之所以稱為遞歸,是因為每個元素執行相同的任務序列,但輸出取決于先前的計算。 我們換一種方式來解釋RNN:你可以想象RNN模型是有“記憶”的,“記憶”里存放的是之前計算過的信息。 理論上,RNN可以記住并使用任意長度序列中的信息,但在實際應用中,我們通常只會回退幾步(稍后詳細討論)。 我們來看一個典型的RNN圖例:

    上圖展示了RNN展開為完整網絡的過程。 之所以使用詞擴展,是因為循環神經網絡每一層(或者我們稱之為每個時間點t)到下一層(下一個時間點)的變換過程(權重W)是一致的。 例如,如果我們關心的序列是包含5個單詞的句子,則循環神經網絡將按照順序擴展為5個神經網絡,每個單詞為一層。 RNN按照以下步驟迭代計算:

    對于上面的步驟,我們再說明幾點:

    ◆◆◆不同類型的RNN

    剛才我們提到的RNN只是RNN最原始的版本。 近年來,隨著研究的深入,一系列新的RNN網絡類型被提出。 例如:

    4.1 雙向循環神經網絡

    雙向RNN的思想與原始版本的RNN略有不同,只要認為當前輸出不僅與前面的序列元素相關,還與后面的序列元素相關。 比如說我們現在要在一個句子中填一個空字,那么我們會直觀的感覺到空位置填什么字其實和前后的內容有關系吧? 雙向RNN其實很簡單。 我們來直觀地理解一下。 事實上,我們可以將它們視為兩個 RNN 的疊加。 根據此時兩個RNN的隱藏狀態計算輸出結果。

    4.2 深度雙向RNN

    深度雙向 RNN 與雙向 RNN 類似,不同之處在于我們在每個步驟/時間點設置多層結構。 在實踐中,這種方法可以讓我們的神經網絡擁有更大的容量(但這也意味著我們需要更多的訓練數據)

    文獻類型代碼怎么看_參考文獻 文獻類型_張橋貴,孫浩然 宗教旅游類型,特點和開發的文獻

    4.3 LSTM 神經網絡

    LSTM(Long Short Term)可能是目前最流行的,各種論文中提到最多的就是RNN神經網絡。 LSTM 和基線 RNN 在結構上并沒有特別不同,但它們使用不同的函數來計算隱藏狀態。 LSTM的“記憶”被稱為細胞/細胞。 您可以直接將它們視為黑匣子。 這個黑盒子的輸入是之前的狀態$h_{t-1}$和當前的輸入$x_t$。 這些“單元”決定哪些先前的信息和狀態需要保留/記住以及哪些應該被刪除。 在實際應用中發現,該方法可以有效保存很久以前的關聯信息。 關于LSTM的細節,我們會在以后的博文中繼續向大家提及。

    ◆◆◆簡單RNN的實際操作

    下面我們使用該庫實現一個簡單的 RNN,并解決最常見但最有用的 NLP 問題之一:語言模型。

    5.1 語言模型介紹

    語言模型是 NLP 中最常見、最通用的概念之一。 它可以幫助我們確定短語字符串或句子(給定語料庫)的概率。 這在各種評分機制中非常非常有用,比如翻譯系統中翻譯結果的選擇,比如語音識別的中文文本字符串的選擇。 語言模型的具體內容可以參考我們之前的博文《從樸素貝葉斯到N-gram語言模型》()。

    我們這里的目標是利用RNN構建語言模型,即輸出短語串/句子的概率

    $$\begin{} P(w_1,...,w_m) = \prod_{i=1}^{m} P(w_i \mid w_1,..., w_{i-1}) \end{} $$

    在上面的公式中,$w_i$取決于前序$i-1$單詞。 理論上,RNN可以捕獲并記憶所有的前序信息和依賴關系,但實際情況會稍微復雜一些。 時間/序列越長,需要記住的信息就越多,但可能丟失的信息也就越多。

    5.2 數據和預處理

    我們需要一些文本語料庫供 RNN 學習。 幸運的是,與監督學習不同,每個樣本都需要標記一個結果。 在這里,只需句子或短語字符串就足夠了。 于是我們從(類似百度貼吧)抓取了15000條長評論。 我們希望RNN能夠學習這些評論者的評論風格(比如神奇的迪吧),并能夠模仿他們生成一些單詞。 但我們都知道,對于機器學習問題來說,效果的上限其實取決于你的數據,所以我們都需要先對數據做一些預處理。

    5.2.1 分詞與處理

    初始語料文本需要進行一些簡單的處理,然后才能交給機器學習算法進行學習。 例如,最常見的句子處理就是分詞。 對于英語來說,有純粹自然的空間來分隔它們。 對于漢語來說,我們需要自己做句子和分詞。 例如,英文句子“He left!” 可以分為三個部分:“他”、“左”、“!”。 這里使用的NLTK包進行分詞。

    5.2.2 去除低頻/停用詞

    事實上,大多數單詞在我們的文本中只出現一兩次,而這些極不常見的單詞實際上可以被刪除,這對最終的結果是有幫助的。 太多的單詞,一方面使模型的訓練非常慢,而且由于它們只出現一兩次,我們無法從語料庫中了解更多關于它們的信息。 所以我們有非常簡單的處理方法來處理它們。

    例如,我們將語料庫限制為 8,000 個單詞,我們使用這個特殊字符來標記 8,000 個單詞之外的單詞。 例如,單詞“”不在我們的8000詞匯集中,那么句子“are in”就會被我們處理為“are in”。 我們完全可以把它當成一個新詞匯,它的預測和其他詞一模一樣。

    5.2.3 開始和結束

    分詞之后,一個句子就變成了一個詞/短語串,我們做了一些特殊的處理,比如在第一個詞/短語串上添加 和 作為特殊的開始和結束標記。 這樣,對句子第一個詞的預測就可以看成是第一個詞出現后出現的概率。

    5.2.4 詞向量映射

    對于詞向量的編碼,我們打算使用最簡單的詞序列編碼。 解釋一下,大概是這樣。 一個簡單句子“I left home”的輸入 x 可能會被翻譯為 [0, 179, 341, 416],其中 0 對應句子起始字符,詞匯表中 I 的下標為 179,輸出 y將被翻譯為 [179, 341, 416, 1]。 這是可以理解的,因為我們所做的就是從前面的單詞推斷出下面的單詞。

    代碼大概是這樣的:

    以下是這個 8000 個單詞的語料庫中映射到 X 和 Y 的實際句子,

    X:

    你對這件事不感興趣是什么?

    [0、51、27、16、10、856、53、25、34、69]

    是:

    你對這件事不感興趣是什么?

    [51、27、16、10、856、53、25、34、69、1]

    5.2.5 手工構建RNN

    我們還記得RNN的結構如下:

    讓我們先進行一些數據設置和構建。

    假設輸入 x 是一個單詞序列(如前所述),其中每個 $x_t$ 是一個獨立的單詞。 不過還有一點需要說一下,因為我們這里要做的是矩陣運算,而單詞之間其實沒有數值上的區別(雖然代碼是856,51是什么,但是并不代表之間有關系)什么和什么),所以這里我們還需要做一個簡單的處理,即根據詞匯表的大?。?000)對單詞進行one-hot編碼。 也就是說每個單詞都是一個8000*1的向量,其中只有一個位置(這個單詞對應的位置)為1,其余位置的值全部為0。輸出$o$為也有類似的表示。 每個$o_t$都是詞匯表大小和長度的向量,每個元素代表該位置的單詞被預測為下一個單詞的概率。

    那么我們回顧一下前面提到的RNN前向計算公式:

    \begin{} s_t &= \tanh(Ux_t + Ws_{t-1}) \\ o_t &= \{}(Vs_t) \end{}

    咳咳,我們是嚴謹的,然后確認各種輸入輸出的維度。 我們假設詞匯量C = 8000,隱藏狀態向量維數H = 100。這里需要說明的是,正如我們之前提到的,這個隱藏狀態有點類似于人類的“記憶”,存儲著之前所有的數據信息。 事實上,將其維度設置得更高可以存儲更多內容,但隨之而來的是更大的計算量,所以這是一個權衡。 所以我們有以下設置:

    $$\begin{} x_t & \in \{R}^{8000} \\ o_t & \in \{R}^{8000} \\ s_t & \in \{R}^{100} \\ U & \in \{R}^{100 \times 8000} \\ V & \in \{R}^{8000 \times 100} \\ W & \in \{R}^{100 \times 100} \\ \結束{}$$

    順便說一下,其中U、V、W是RNN神經網絡的參數,也就是我們要通過學習語料庫得到的參數。 所以,一般來說,我們需要$2HC + H^2$參數。 在我們當前的場景中,C=8000,H=100,所以我們可能有一個參數需要估計。 同時參數的大小其實也給了我一些提示,比如可能需要多少計算資源,可以提前知道多少。 我們這里的大部分計算其實都還可以,因為把one-hot 矩陣和其他矩陣相乘其實可以看成是選擇其中的一列(行),最大的計算量在$Vs_t$處。 也就是說,如果計算資源有限,我們最好限制詞匯量的大小,不要太大。

    初始化參數

    我們定義一個類,初始化U、V、W還是有一些特殊性的,不能直接全部初始化為0,這樣在計算過程中會出現“對稱”的問題。 不同的初始化對最終的訓練結果有不同的影響。 有很多論文對這個問題做了相關研究。 事實上,參數初始值的選擇與我們選擇的激活函數有關。 比如我們這里選擇$\tanh$,相關論文推薦我們使用$\left[-\frac{1}{\sqrt{n}}, \frac{1}{\sqrt{n}}\right ]$ 的隨機數作為初始值,其中n是與上一層的連接數。 嗯,看起來有點復雜,不過不用擔心,一般來說,只要將參數初始化為小的隨機數,就可以正常訓練神經網絡了。

    張橋貴,孫浩然 宗教旅游類型,特點和開發的文獻_參考文獻 文獻類型_文獻類型代碼怎么看

    下面是對應的代碼,就是詞匯表的大小和隱藏層的大小。 別擔心,我們稍后會介紹。

    正向計算

    這與卷積神經網絡的前向操作完全相同。 是根據權重計算下一層/下一個時間點的輸出和隱藏狀態的過程。 一個簡單的實現如下:

    從上面的代碼我們也可以看出,我們不僅計算了輸出o,還計算了隱藏狀態s。 我們后面還要用到它們來計算梯度,再重復一遍,這里的每一個$o_t$都是一個概率向量,代表每個單詞輸出的概率。 順便說一句,在我們的場景中,我們只想知道下一個詞是什么,而不太關心它的概率,所以我們只取概率最高的詞。 好吧,我們定義一個函數來實現這個功能:

    來來來,試試吧:

    對于句子中的每個單詞(此處長度為 45),我們的模型獲得 8000 個概率(對應于詞匯表中的單詞)。 嗯,這里只是驗證是否可以正常進行正向操作,但是參數U,V,W是隨機選擇的,沒有訓練文獻類型代碼怎么看,所以得到的結果其實是隨機的。

    然后驗證功能:

    計算損失函數

    和其他機器學習算法一樣,我們需要一個損失函數/loss來表示當前預測結果和真實結果的差異,也方便我們后續的迭代和訓練。 更一般的損失函數稱為交叉熵損失。 有興趣仔細了解的同學可以看看我們之前的博客 SVM and 。 如果我們有N個訓練樣本(這里顯然是句子中的單詞數),C個類別(這里顯然是詞匯量的大?。?,那么我們可以這樣定義損失函數來描述預測結果之間的差距o 和實際結果 y:

    $$\begin{} L(y,o) = - \frac{1}{N} \sum_{n \in N} y_{n} \log o_{n} \end{}$$

    公式看起來有點嚇人,其實它做的是把每個樣本的loss相加,然后輸出。 我們定義一個函數:

    使用隨機梯度下降和隨時間反向傳播訓練 RNN

    現在還有一個損失函數。 我們要做的就是最小化這個損失函數,讓我們的預測結果最接近真實結果。 最常用的優化算法稱為 SGD(隨機梯度下降)。 你可以理解為我們要下山,所以我們每走到一個位置,就環顧四周,看看最陡(下坡最快)的方向是什么。 那就順其自然吧,“隨機”是指我們實際上并不是用所有的樣本來計算這個方向,而是用一些樣本(有時是一個)來計算。

    計算這個方向就是計算梯度的過程。 從數學上講,其實就是給定損失函數$L$后的偏置向量的方向。 這里,因為有U、V、W三個參數,所以我們其實需要$\frac{\L}{\U}, \frac{\L}{\V}, \frac{\L}{\W} $。

    詳細內容后面會提到。 這里簡單告訴大家,我們需要一個反向傳播(在時間軸上)用求導的鏈式法則來計算梯度。 代碼如下:

    好吧,那么我們需要根據梯度迭代更新參數,也就是沿著坡度下坡。

    嗯,呃,我們必須測試一下,這東西是否真的能讓我們下山。 嗯,就是走步的過程,你要看我們的高度是不是每次都下降一點點。 讓我們也檢查一下這個地方:

    嗯,沒關系,看來確實是在帶領我們走向成功,O(∩_∩)O~

    好了,上面就是一個完整的簡單的RNN實現,至少,是可用的。

    但是很尷尬。 。 。 同學們有沒有發現,在CPU上,這樣的每輪迭代大約需要160ms。 破蛋的速度,再加上RNN龐大的訓練輪數,要把小四的作品全部學完,咳咳,估計后面幾本書都要出。 于是只好求助于大殺器——GPU,借助某個深度學習庫來加速:

    這就是使用開源庫的好處。 N行代碼純手打,這里調了幾個功能就Done了。。。嗯,感謝開源精神。。。

    輸出文本

    有了模型之后,我們就可以嘗試生成概率最高的文本。

    然后你會發現上面的模型可以模仿里面的評論,生成一些句子。 例如:

    連標點符號以及一些由標點符號組成的表達方式都模仿出來,還是很神奇的。 當然,RNN 的基線版本也產生了很多不流暢的句子。 這和我們的語料庫以及中間的隱藏狀態有關。 尺寸很重要。 但還有一點是,這樣的RNN“記憶”并不是最合適的。 例如最近流行的LSTM和GRU可以更好地處理歷史信息的記憶和遺忘過程。 我們將在以后的博客中提及這一點。

    ◆◆◆總結

    以上就是本次RNN入門的全部內容。 RNN確實是一個非常神奇的神經網絡,在時間序列信息(如NLP自然語言處理)方面也有著得天獨厚的優勢。 更多關于RNN和NLP處理(比如LSTM)的知識會在以后的博文中提到。 現在RNN可以基于大量語料庫學習寫一些簡單的句子。 我相信有一天,計算機也能寫出大段文字。 美麗的詩,悅耳的文字,跌宕起伏的長篇小說。

    參考:

    1. ,第 1 部分 – 到 RNN

    2. ,第 2 部分 – 具有 、Numpy 和

    3.的

    4. char-rnn-

    點擊這里復制本文地址 以上內容由巨鯊網整理呈現,請務必在轉載分享時注明本文地址!如對內容有疑問,請聯系我們,謝謝! 一米陽光
    qrcode

    巨鯊網 © All Rights Reserved.  巨鯊網 www.buyxanaxonline.net 微信:網站地圖 VBXR
    Powered by Z-BlogPHP Themes by jvsha.com
    聯系我們| 關于我們| 留言建議| 網站管理| |

    日本久久久
  • <button id="c6aq4"></button>