成人av在线资源一区,亚洲av日韩av一区,欧美丰满熟妇乱XXXXX图片,狠狠做五月深爱婷婷伊人,桔子av一区二区三区,四虎国产精品永久在线网址,国产尤物精品人妻在线,中文字幕av一区二区三区欲色
    您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
    此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
    人工智能開發(fā)者 正文
    發(fā)私信給AI研習(xí)社-譯站
    發(fā)送

    0

    都說AllenNLP好用,我們跑一遍看看究竟多好用

    本文作者: AI研習(xí)社-譯站 2018-04-08 14:35
    導(dǎo)語(yǔ):進(jìn)來,克服NLP學(xué)習(xí)困難綜合征

    雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題Deep Learning for text made easy with AllenNLP,作者為Déborah Mesquita 。

    翻譯 | 汪寧  徐瑋    整理 |  凡江

    都說AllenNLP好用,我們跑一遍看看究竟多好用

    良好學(xué)習(xí)過程的關(guān)鍵原則之一,就是讓學(xué)習(xí)的內(nèi)容略高于當(dāng)前的理解。如果該主題與你已知的內(nèi)容太過于相似,那么你就不會(huì)有很大的進(jìn)步。另一方面,如果這個(gè)主題太難的話,你就會(huì)停滯不前,幾乎沒有進(jìn)展。

    深度學(xué)習(xí)涉及很多不同的主題和很多我們需要學(xué)習(xí)的東西,所以一個(gè)好的策略就是開始研究人們已經(jīng)為我們構(gòu)建好了的東西。這就是為什么框架非常棒的原因。框架使我們不必太過于關(guān)心如何構(gòu)建模型的細(xì)節(jié),使得我們可以更多地關(guān)注我們想要完成的任務(wù)(而不是專注于如何實(shí)現(xiàn))。

    對(duì)于構(gòu)建深度學(xué)習(xí)中的NLP模型,AllenNLP框架使得任務(wù)變得十分有趣。這對(duì)我來說是一個(gè)驚喜,因?yàn)槲抑霸谏疃葘W(xué)習(xí)中的NLP的學(xué)習(xí)經(jīng)歷是痛苦的。

    處理NLP任務(wù)需要不同類型的神經(jīng)網(wǎng)絡(luò)單元,因此在開始學(xué)習(xí)如何使用AllenNLP框架之前,我們先快速回顧這些單元背后的理論。

    當(dāng)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)不夠時(shí)

    在簡(jiǎn)單的工作中,閱讀文本的任務(wù)包括構(gòu)建我們之前閱讀的內(nèi)容。舉個(gè)例子,如果之前你沒讀過這個(gè)句子你可能就不懂這個(gè)句子的意思,所以創(chuàng)建這些神經(jīng)網(wǎng)絡(luò)單元背后的想法是:

    “人類為了理解接下來會(huì)發(fā)生什么,把他們以前讀過的東西找出來,也許我們?cè)谀P椭惺褂眠@種機(jī)制,他們就能更好地理解文本,對(duì)吧?”

    遞歸神經(jīng)網(wǎng)絡(luò)

    為了使用考慮時(shí)間的網(wǎng)絡(luò),我們需要一種表示時(shí)間的方式。但我們?nèi)绾巫龅竭@一點(diǎn)?

    處理具有時(shí)間范圍的模式的一種顯而易見的方法是通過將模式的序列順序與模式向量的維度相關(guān)聯(lián)來顯式的表示時(shí)間。第一時(shí)間事件由模式向量中的第一個(gè)元素表示,第二個(gè)時(shí)間事件由模式向量中的第二個(gè)位置表示,依此類推。 - Jeffrey L. Elman

    問題是這種方法有幾個(gè)缺點(diǎn),例如:

    [...] 移位寄存器對(duì)模式的持續(xù)時(shí)間施加了一個(gè)嚴(yán)格的限制 (因?yàn)檩斎雽颖仨毺峁┳铋L(zhǎng)可能的模式),并且建議所有輸入向量具有相同的長(zhǎng)度。這些問題在語(yǔ)言等領(lǐng)域特別麻煩,因?yàn)樵谶@些領(lǐng)域中,人們希望具有可變長(zhǎng)度模式的類似表示。語(yǔ)言的基本單位(拼音段)與句子一樣也是如此。

    Jeffrey L. Elman討論了論文中發(fā)現(xiàn)的其他缺陷。本文介紹了 Elman網(wǎng)絡(luò),這是一個(gè)三層網(wǎng)絡(luò),增加了一組“上下文統(tǒng)一”。

    如果你對(duì)神經(jīng)網(wǎng)絡(luò)完全陌生,那么閱讀我寫的另一篇文章可能是個(gè)好主意。但簡(jiǎn)單地說,神經(jīng)網(wǎng)絡(luò)是有機(jī)會(huì)被激活的或者不是被輸入的。

    Elman根據(jù)Jordan(1986)提出的方法開始他的工作。Jordan引入遞歸連接。

    遞歸連接允許網(wǎng)絡(luò)的隱藏單元看到自己以前的輸出,以便隨后的行為可以被以前的響應(yīng)所決定。這些遞歸的連接是網(wǎng)絡(luò)存儲(chǔ)器的功能。緊接著Elman添加了上下文單元。這些上下文單元作為一個(gè)時(shí)鐘來說明什么時(shí)候我們應(yīng)該放棄以前的輸入。但是這又如何呢?上下文單元也具有調(diào)整權(quán)重的機(jī)制,就像其他神經(jīng)網(wǎng)絡(luò)單元一樣。

    上下文單元和輸入激活神經(jīng)網(wǎng)絡(luò)隱藏單元。 當(dāng)神經(jīng)網(wǎng)絡(luò)“學(xué)習(xí)”時(shí),這意味著它有一個(gè)表示所有輸入網(wǎng)絡(luò)處理的模式。上下文單元記住以前的內(nèi)部狀態(tài)。

    如果這些都沒有意義,不要擔(dān)心。只要想一想,現(xiàn)在我們有一個(gè)神經(jīng)網(wǎng)絡(luò)單元,它將先前的狀態(tài)考慮在內(nèi)以產(chǎn)生下一個(gè)狀態(tài)。

    “現(xiàn)在我們有一個(gè)神經(jīng)網(wǎng)絡(luò)單元,它考慮到以前的狀態(tài)來產(chǎn)生下一個(gè)狀態(tài)。”

    當(dāng)RNNs不夠時(shí):LSTM

    正如Christopher Ola 在另一篇文章解釋的那樣 (如果你想了解更多關(guān)于LSTM的信息,這篇文章是很棒的),有時(shí)我們需要更多的上下文,也就是有時(shí)我們需要存儲(chǔ)很久以前看到的信息。

    考慮嘗試預(yù)測(cè)“我在法國(guó)長(zhǎng)大......我會(huì)說流利的法語(yǔ) ”中的最后一句話。最近的信息表明,下一個(gè)詞可能是一種語(yǔ)言的名稱,但如果我們想要縮小到具體是哪種語(yǔ)言,我們需要從法國(guó)出發(fā)來考慮更長(zhǎng)遠(yuǎn)的東西。縮小相關(guān)信息與需要變得非常大的點(diǎn)之間的差距完全可能 - Christopher Ola

    LSTM單元解決了這個(gè)問題。它們是一種特殊的RNN,能夠?qū)W習(xí)長(zhǎng)期的依賴關(guān)系。我們將只使用LSTM單元,而不是構(gòu)建它們,因此對(duì)于我們而言,可以將LSTM單元看作具有不同架構(gòu)并能夠?qū)W習(xí)長(zhǎng)期依賴性的單元。

    構(gòu)建一個(gè)文本分類的高級(jí)模型

    好了,有了足夠的理論,現(xiàn)在讓我們進(jìn)入有趣的部分,并建立模型。

    都說AllenNLP好用,我們跑一遍看看究竟多好用

    訓(xùn)練過程

    上面的圖片向我們展示了我們?nèi)绾卧O(shè)置一切。首先我們得到數(shù)據(jù),然后將它編碼為模型將理解的格式('tokens'和'internal_text_encoder'),然后我們用這些數(shù)據(jù)來訓(xùn)練網(wǎng)絡(luò),對(duì)比標(biāo)記并調(diào)整權(quán)重。在這個(gè)過程結(jié)束時(shí),模型已經(jīng)準(zhǔn)備好做出預(yù)測(cè)了。

    現(xiàn)在我們終于會(huì)感受到AllenNLP的魔力!我們將用一個(gè)簡(jiǎn)單的JSON文件指定上圖中的所有內(nèi)容。

        {

          "dataset_reader": {

            "type": "20newsgroups"

          },

          "train_data_path": "train",

          "test_data_path": "test",

          "evaluate_on_test": true,

          "model": {

            "type": "20newsgroups_classifier",

            "model_text_field_embedder": {

              "tokens": {

                "type": "embedding",

                "pretrained_file": "https://s3-us-west-2.amazonaws.com/allennlp/datasets/glove/glove.6B.100d.txt.gz",

                "embedding_dim": 100,

                "trainable": false

              }

            },

            "internal_text_encoder": {

              "type": "lstm",

              "bidirectional": true,

              "input_size": 100,

              "hidden_size": 100,

              "num_layers": 1,

              "dropout": 0.2

            },

            "classifier_feedforward": {

              "input_dim": 200,

              "num_layers": 2,

              "hidden_dims": [200, 100],

              "activations": ["relu", "linear"],

              "dropout": [0.2, 0.0]

            }

          },

          "iterator": {

            "type": "bucket",

            "sorting_keys": [["text", "num_tokens"]],

            "batch_size": 64

          },

          "trainer": {

            "num_epochs": 40,

            "patience": 3,

            "cuda_device": 0,

            "grad_clipping": 5.0,

            "validation_metric": "+accuracy",

            "optimizer": {

              "type": "adagrad"

            }

          }

        }

    讓我們來看下這段代碼。

    1 數(shù)據(jù)輸入

    為了告訴AllenNLP輸入的數(shù)據(jù)集以及如何讀取它,我們?cè)贘SON文件中設(shè)置了“dataset_reader”鍵值。

    DatasetReader從某個(gè)位置讀取數(shù)據(jù)并構(gòu)造Dataset。除文件路徑之外的讀取數(shù)據(jù)所需的所有參數(shù)都應(yīng)

    遞給DatasetReader的構(gòu)造器。 — AllenNLP documentation

    數(shù)據(jù)集是 20個(gè)新聞組,我們將在稍后定義如何讀取(在 python 類中)。先來定義模型的其余部分。

    2  模型

    我們先設(shè)置'model'鍵值來指定模型,在'model'鍵值中還有三個(gè)參數(shù):'model_text_field_embedder','internal_text_encoder''classifier_feedforward'

    我們先來看一下第一個(gè),其余的兩個(gè)將在稍后說明。

    通過'model_text_field_embedder',我們告訴AllenNLP數(shù)據(jù)在傳遞給模型之前應(yīng)該如何編碼。 簡(jiǎn)而言之,我們希望使數(shù)據(jù)更“有意義”。 背后的想法是這樣的:如果可以像比較數(shù)字那樣比較文字會(huì)怎么樣?

    如果5 - 3 + 2 = 4 , 國(guó)王-男人+女人=女王,又何嘗不對(duì)呢?

    用詞嵌入我們可以做到這一點(diǎn)。 這對(duì)模型也很有用,因?yàn)楝F(xiàn)在我們不需要使用很多稀疏數(shù)組(具有很多零的數(shù)組)作為輸入。

    詞嵌入是自然語(yǔ)言處理(NLP)中的一組語(yǔ)言建模和特征學(xué)習(xí)技術(shù)的總稱,其中來自詞匯表的單詞或短語(yǔ)被映射為實(shí)數(shù)向量。 從概念上講,它涉及從每個(gè)單詞一個(gè)維度的空間到具有更低維度的連續(xù)向量空間的數(shù)學(xué)嵌入。— Wikipedia

    在我們的模型中將使用GloVe:用于詞匯表征的全局向量

    GloVe是一種用于獲取單詞向量表征的無監(jiān)督學(xué)習(xí)算法。 對(duì)來自語(yǔ)料庫(kù)的匯總的全局單詞共現(xiàn)統(tǒng)計(jì)進(jìn)行訓(xùn)練,表征結(jié)果展示了單詞向量空間的有趣的線性子結(jié)構(gòu)。— Glove

    如果還是難以理解,只要將Glove看作是一種將單詞編碼為向量的模型。我們將每個(gè)嵌入向量的大小設(shè)置為100。

    Glove把單詞編碼為向量

    這就是'model_text_field_embedder'所做的。

    3 數(shù)據(jù)迭代器

    像往常一樣,我們將分批分離訓(xùn)練數(shù)據(jù)。 AllenNLP提供了一個(gè)名為BucketIterator的迭代器,通過對(duì)每批最大輸入長(zhǎng)度填充批量,使計(jì)算(填充)更高效。 要做到這一點(diǎn),它將按照每個(gè)文本中的符號(hào)數(shù)對(duì)實(shí)例進(jìn)行排序。 我們?cè)?span style="background-color: #F2F2F2;">'iterator'鍵值中設(shè)置這些參數(shù)。

    4  訓(xùn)練器

    最后一步是設(shè)置訓(xùn)練階段的配置。 訓(xùn)練器使用AdaGrad優(yōu)化器作10代訓(xùn)練,如果最后3代的驗(yàn)證準(zhǔn)確性沒有提高,則停止。

    為了訓(xùn)練模型,我們只需要運(yùn)行:

    python run.py our_classifier.json -s /tmp/your_output_dir_here

    另一個(gè)很酷的事情是,通過框架我們可以停止并在稍后恢復(fù)訓(xùn)練。 但在此之前,我們需要指定dataset_reader和模型python類。

    編寫AllenNLP Python類

    dataset_reader.py

    我們將使用scikit-learn提供的20個(gè)新聞組。 為了引用JSON文件中的DatasetReader,我們需要注冊(cè)它:

        @DatasetReader.register("20newsgroups")

        class NewsgroupsDatasetReader(DatasetReader):

    你將實(shí)施三種方法:其中兩個(gè)為read()text_to_instance()

    • read()

    read()從scikit-learn獲取數(shù)據(jù)。通過AllenNLP,你可以設(shè)置數(shù)據(jù)文件的路徑(例如JSON文件的路徑),但在我們的例子中,我們只需像Python模塊一樣導(dǎo)入數(shù)據(jù)。 我們將讀取數(shù)據(jù)集中的每個(gè)文本和每個(gè)標(biāo)簽,并用text_to_instance()包裝它。

    • text_to_instance()

    此方法“進(jìn)行任何符號(hào)化或必要的處理,來把文本輸入轉(zhuǎn)為Instance”(AllenNLP Documentation)。在我們的實(shí)例中意味著這樣做:

            @overrides
            def text_to_instance(self, newsgroups_post: str, label: str = None) -> Instance: 
                tokenized_text = self._tokenizer.tokenize(newsgroups_post)
                post_field =
                fields = {'post': post_field}
                if label is not None:
                    fields['label'] =
                return Instance(fields)

    我們將來自20個(gè)新聞組的文本和標(biāo)簽包裝到TextField和LabelField中。

    model.py

    我們將使用雙向LSTM網(wǎng)絡(luò),該網(wǎng)絡(luò)是第一個(gè)循環(huán)層被復(fù)制的單元。 一層按原樣接收輸入,另一層接收輸入序列的反向副本。 因此,BLSTM網(wǎng)絡(luò)被設(shè)計(jì)為捕獲順序數(shù)據(jù)集的信息并保持過去和未來的上下文特征。 (來源:中文分詞雙向LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)

    首先我們來定義模型的類參數(shù)

    • vocab

    因?yàn)樵谀愕哪P椭薪?jīng)常會(huì)有幾種不同的映射,所以Vocabulary會(huì)追蹤不同的命名空間。 在這種情況下,我們?yōu)槲谋驹O(shè)置了“符號(hào)”詞匯(代碼中未顯示,是在背后使用的默認(rèn)值),以及我們?cè)噲D預(yù)測(cè)的標(biāo)簽的“標(biāo)簽”詞匯。—— Using AllenNLP in your Project)

    • model_text_field_embedder

    用于嵌入符號(hào)與作為輸入的TextField。 返回單詞的 Glove向量表征。

    • internal_text_encoder

    我們用來把輸入文本轉(zhuǎn)換為單個(gè)向量的編碼器(RNNs,還記得嗎?)。 Seq2VecEncoder是一個(gè)模塊,它將一個(gè)向量序列作為輸入并返回一個(gè)向量。

    • num_classes — 要預(yù)測(cè)的標(biāo)簽數(shù)量

    現(xiàn)在我們來實(shí)現(xiàn)模型類的方法

    • forward()

    前向法做的是

    模型所做的第一件事是嵌入文本,然后將其編碼為單個(gè)矢量。 為了對(duì)文本進(jìn)行編碼,我們需要獲得掩碼來表示符號(hào)序列的哪些元素僅用于填充。

    然后,將它經(jīng)過前饋網(wǎng)絡(luò)以獲得類別邏輯回歸。 將邏輯回歸經(jīng)過softmax來獲得預(yù)測(cè)概率。 最后,如果我們獲得了標(biāo)簽,我們可以計(jì)算損失并評(píng)估我們的度量。— Using AllenNLP in your Project

    正向法基本上是在做模型訓(xùn)練任務(wù)。 如果你想多了解一些,可以看這個(gè)。現(xiàn)在我們來談?wù)勀P皖悈?shù)的一個(gè)重要部分:classifier_feedforward

    我們需要Model.forward來計(jì)算損失。 訓(xùn)練代碼將查找由forward返回的字典中的損失值,并計(jì)算該損失的梯度以更新模型的參數(shù)。— Using AllenNLP in your

    • decode()

    decode有兩個(gè)功能:它接收forward的輸出,并對(duì)其進(jìn)行任何必要的推理或解碼,并將整數(shù)轉(zhuǎn)換為字符串以使其便于人類閱讀(例如,用于演示)。— Using AllenNLP in your 

    運(yùn)行代碼

    正如我之前所說,通過命令行來訓(xùn)練模型,可以使用以下命令:

    python run.py our_classifier.json -s /tmp/your_output_dir_here

    我還創(chuàng)建了一個(gè)筆記本,以便我們可以在Google Colaboratory上運(yùn)行實(shí)驗(yàn)并免費(fèi)使用GPU,以下是鏈接:https://colab.research.google.com/drive/1q3b5HAkcjYsVd6yhrwnxL2ByqGK08jhQ

    你也可以在這查看代碼:this repository

    我們建立了一個(gè)簡(jiǎn)單的分類模型,但可能性是無限的。 該框架是為我們的產(chǎn)品創(chuàng)建奇特的深度學(xué)習(xí)模型的絕佳工具。


    更多文章,關(guān)注雷鋒網(wǎng) 雷鋒網(wǎng)

    添加雷鋒字幕組微信號(hào)(leiphonefansub)為好友

    備注「我要加入」,To be an  AI  Volunteer !

    都說AllenNLP好用,我們跑一遍看看究竟多好用

    雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

    都說AllenNLP好用,我們跑一遍看看究竟多好用

    分享:
    相關(guān)文章

    知情人士

    AI研習(xí)社(yanxishe.com)譯站頻道,傳播前沿人工智能知識(shí),讓語(yǔ)言不再成為學(xué)習(xí)知識(shí)的門檻。(原雷鋒字幕組)
    當(dāng)月熱門文章
    最新文章
    請(qǐng)?zhí)顚懮暾?qǐng)人資料
    姓名
    電話
    郵箱
    微信號(hào)
    作品鏈接
    個(gè)人簡(jiǎn)介
    為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
    您的郵箱還未驗(yàn)證,完成可獲20積分喲!
    請(qǐng)驗(yàn)證您的郵箱
    立即驗(yàn)證
    完善賬號(hào)信息
    您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
    立即設(shè)置 以后再說