WWDC2020講稿之Make apps smarter with Natural Language

開場白

您好,歡迎來到WWDC。大家好。歡迎參加我們有關自然語言處理的會議。本課程的目的是通過在自然語言框架中使用NLP的功能來幫助您使應用更智能。我是Vivek,我將與我的同事Doug Davidson共同介紹本次會議。

因此,讓我們開始吧。讓我們從語言的中心概念開始。

語言是一種代碼系統

語言是一種代碼系統,可以幫助我們人類通過溝通來解決難題,它還爲我們提供了一種非常獨特的社交互動類型。

語言是一種代碼系統

語言的作用

您可能會想到我們如何使用語言進行交流。語言是一種中間表示,可以幫助我們將概念轉換爲符號,然後可以以具有某種語法結構的單詞,短語或句子的形式來表達它們。表達的媒介可以是語音,也可以是在鍵盤或Apple Pencil上的書寫。它甚至可以是您使用相機捕獲的圖像或視頻。現在,語言也具有這一非凡的特性,不僅可以幫助我們將概念轉換爲符號,還可以幫助我們將內容吸收爲概念。在過去的幾年中,當我們從人類智能轉移到機器智能時,語言的中心概念已被NLP取代。 NLP現在已成爲中間表示,可以幫助機器將概念轉換爲符號並將內容同化爲概念。

Apple的NLP歷史

但是,Apple的NLP設備上是什麼樣的?直到2017年,NLP在蘋果公司曝光的主要方式是通過NS LinguisticTagger類和基礎功能。現在,這提供了基本的文本處理,例如語言識別,標記化等

2018年我們引入了自然語言框

在2018年,我們引入了自然語言框架。自然語言框架提供了NSLinguisticTagger可以提供的所有功能,並且在此之上,我們開始關注最新的機器學習和現代語言技術,例如文本嵌入和自定義模型。

三類處理領域

不僅如此,我們還通過與Create ML和Core ML的緊密集成,開始將Natural Language框架與Apple的其他機器學習生態系統緊密集成。現在,在我們進入剩下的會話之前,我們想告訴您,已將ENSLinguisticTagger標記爲不贊成使用。我們強烈建議您爲滿足所有語言處理需求而轉向自然語言。現在,如果您查看自然語言框架中提供的各種功能,則可以將它們大致分爲三類。

大致分爲三類
  • 首先是基本文本處理領域。
  • 第二個是文本嵌入領域。
  • 第三是定製模型領域。

文本處理

文本處理

因此,讓我們從基本的文本處理開始。自然語言框架提供了幾個基本的基本構建塊,例如語言識別,標記化,語音標記的一部分,詞形化和命名實體識別。我們提供了多種語言的這些API。有關這些API的更多信息,請參閱我們的2018年和2019年WWDC會議。

但從較高的角度來看,所有這些API都在一段文本上運行,它們給出的輸出是假設或預測。但是,它沒有告訴我們與該預測相關的信心概念。今年,我們推出了全新的API信心課程。因此,這是建立在現有功能之上的。除了假設或預測標籤外,您還可以使用API​​獲得置信度過程。

讓我們看看如何使用它。我們先創建一個NLTagger實例,然後將標記方案指定爲type。到目前爲止,您已經習慣了這一點。現在,我們有了一個全新的API,稱爲tagHypotheses。

import NaturalLanguage 

let tagger = NLTagger(tagSchemes: [.nameType])
let str = "Tim Cook is very popular in Spain."
let strRange = Range(uncheckedBounds: (str.startIndex, str.endIndex))
tagger.string = str
tagger.setLanguage(.english, range: strRange)
 
tagger.enumerateTags(in: str.startIndex..<str.endIndex, unit: .word, scheme: .nameType, options: .omitWhitespace) { (tag, tokenRange) -> Bool in
    let (hypotheses, _) = tagger.tagHypotheses(at: tokenRange.lowerBound, unit: .word, 
                                               scheme: .nameType, maximumCount: 1)
    print(hypotheses)
    return true
}

因此,當您使用tagHypotheses不僅在句子級別或令牌級別獲得預測時,還將獲得與該預測關聯的置信度代碼。

讓我們看看如何通過一個名爲Buzz的假設應用程序來使用這些置信度分數。 Buzz是新聞閱讀器應用。作爲此應用程序的一部分,您可以瀏覽文章,可以爲文章添加書籤,也可以組織文章,以便以後閱讀。

新聞閱讀器應用

我們要做的是向該應用程序添加新功能。然後,我們從您撰寫的文章中提取最近的實體。

因此,我們要在右側倉中填充這些實體。並且,當您單擊一個實體時,您可以回到已經閱讀的文章。那麼我們該怎麼做。因此,我們想使用命名實體識別API自動分析此文本並提取這些命名實體,以便獲得這些命名實體,例如Cartagena等。

現在,如果您仔細查看右側的實體,您會發現這是一個虛假的條目。我們在開車時有個請勿打擾的提示。

因此,命名實體識別API爲我們提供了人員名稱,組織名稱以及位置名稱。從該機器學習API來看,這似乎是錯誤的肯定。那麼我們如何解決這個問題。假設我們有一個輸入句子,例如他在開車時駕駛“請勿打擾”。

實體識別

當我們通過命名實體識別API傳遞句子時,它所做的是分析標記的順序併產生一系列標記作爲組織名稱。現在,該假設在該機器學習模型中是不正確的。現在,通過置信度冪訓練,您還可以獲取每個標籤的置信度訓練。如您所見,置信度得分非常低。通過設置組織名稱的閾值(例如,第8點),您可以輕鬆過濾掉這種誤報。這樣一來,如果您現在返回應用程序並將其合併到您的應用程序中,則可以輕鬆濾除誤報,您將獲得更好和增強的用戶體驗。

關於最佳實踐,我們確實有一些建議。首先,我們建議您避免對這些閾值進行啓發式硬編碼,並根據與您的應用和操作域相關的代表性數據對其進行校準。

我們還建議您考慮基於每個類創建閾值,而不是爲基於每個類考慮的特定應用程序中的所有類設置全局閾值,這樣您就可以最終控制誤報,因爲其中存在誤報。您的應用。

文本嵌入Text Embedding

現在,讓我們繼續將注意力轉移到文本嵌入上。文本嵌入非常重要。實際上,它們已經成爲現代最新進展的基石,並且爲了真正理解文本嵌入,讓我們從文本語料庫的概念開始。

什麼是文本語料庫?

文本語料庫

語料庫是文檔的集合,這些文檔由段落,短語和單詞以及傳統的NLP組成。然後我們從文本語料庫開始。我們要做的第一件事是標記該語料庫。然後,我們標記了文本語料庫。我們得到的是該文本語料庫中的單詞清單。這種單詞表可以看作是每個單詞都是獨立的一袋單詞表示。現在,如果您從機器表示的角度來看這件事,它也被稱爲“一次性編碼”。


One-hot encoding

因此,在此示例中,如果您有一堆單詞“食物”,“漢堡”,“比薩餅”,“汽車”,“公共汽車”和“汽車”,我們已經遍歷了文本語料庫並提取了這些單詞。現在,這裏的每個字都由一個位向量表示,該位向量的一個位爲開,其餘的位爲關。而且此向量的長度與文本語料庫中唯一詞的數量相同。

現在,作爲人類,我們可以看到食物,漢堡和比薩餅是相關的概念。


相關的概念

同樣,汽車,汽車和公共汽車也是相關概念。但是,如果僅查看此位向量表示,則不會提供有關商品相似性或不相似性的任何信息。因此,如果我們有一個表示形式也包含有關單詞相似性的信息,那不是很好嗎?這確實是單詞和嵌入詞出現的地方。

當您再次使用單詞嵌入時,您將從文本語料庫開始,並且作爲輸出得到的是單詞的矢量表示。相似的詞聚在一起,不相似的詞聚在一起。

因此,在此示例中,您可以看到漢堡,比薩餅和食物聚集在一起,並且脫離了汽車,汽車和公共汽車的概念。爲了獲得這些詞的嵌入,您可以使用不同種類的機器學習算法,這些算法可以是線性模型或非線性模型。但是在較高的層次上,他們通過分析文本語料庫中單詞的全局核心重合來捕獲此向量表示。如果您考慮這一點並從機器表示的角度來看它,那麼現在的表示與一種熱編碼不同。每個單詞都會獲得這些維的實數值向量,也可以將其視爲D列。現在,如果您查看向量中的食物,漢堡和比薩餅,它們在向量空間中彼此接近。


向量空間中彼此接近

同樣,汽車,汽車和公共汽車的向量也彼此接近,但與食物概念相距甚遠。

Static Word Embedding

截屏2020-06-26 下午3.47.06.png

現在您已經瞭解了詞嵌入,現在讓我們看一下詞嵌入的不同類型。第一個稱爲靜態詞嵌入。讓我們瞭解一下這個概念。

假設我們有一個輸入句子。 “我想要快餐店裏的漢堡。”我們想提取出單詞embed的embedding。對於靜態嵌入的情況,我們對詞彙表中的所有單詞都進行了預計算,並將其存儲爲查找表。現在,該查找表已被有效地計算並存儲在-evice上。因此,當我們需要查找針對諸如食物之類的特定單詞的單詞嵌入時,我們只需進入該查找表,選擇相應的向量並將其作爲輸出即可。現在,靜態單詞嵌入非常有用。

它們對於在向量空間中賦予單詞最近的鄰居非常有用,並且對於神經網絡算法的輸入也非常有用。

但是它們確實有一些缺點。假設我們有一個輸入語句,例如“ It is供人們思考”,其中food一詞是根據上下文以另一種含義表示的。在靜態單詞嵌入中發生的事情是,您仍然會將其傳遞給查找表,併爲單詞food提取相同的向量。即使我們知道內涵不同且上下文不同。因此,即使由於食物的使用環境不同,食物一詞的語義含義也有所不同,我們仍然獲得相同的向量表示形式。那我們可以做得更好嗎?這就是圖片中動態詞嵌入的地方。因此,在動態詞嵌入中,我們要做的是使每個句子都經過神經網絡。我們得到的是對該序列中每個單詞的動態嵌入,完全是上下文相關的。因此,我們通過動態詞嵌入傳遞了這兩個句子,這些詞可以是諸如變壓器網絡或ELMo樣式模型之類的神經網絡。我們得到的輸出是每個詞的一個向量,該詞根據上下文而不同。


輸出是每個詞的一個向量

因此,因爲這兩個句子中的食物上下文不同,所以食物一詞現在獲得了完全不同的向量表示形式。現在,在OS上,我們還支持跨多種Apple語言的靜態嵌入,也適用於不同的Apple平臺。有關靜態詞嵌入的更多信息,請參閱我們的2019年WWDC會議。除了靜態詞嵌入之外,我們還支持所謂的自定義詞嵌入,您可以在其中使用第三方工具包(例如fasttext,word2vec,GloVe甚至是TensorFlow或PyTorch中的自定義神經網絡)來訓練自己的嵌入。完成此操作後,您就可以將這些嵌入程序帶到Apple平臺上,對其進行壓縮,存儲和有效使用。

將它們轉換爲設備上的表示形式後,就可以像使用靜態單詞嵌入一樣使用它們。現在,爲了使用單詞嵌入,讓我們看看如何使用它。因此,您將創建NLM嵌入,Word嵌入的實例,並指定語言。有了這個,您就可以執行三種不同的操作。

  • 首先給一個單詞,您可以獲取單詞的向量表示。
  • 第二個給定兩個單詞,您可以獲得矢量空間中這兩個單詞之間的距離。
  • 第三個給定單詞,您可以在向量空間中找到單詞的最近鄰居。


    Nosh的假設應用程序

現在,讓我們通過一個名爲Nosh的假設應用程序來研究單詞嵌入的使用。 Nosh是一個送餐應用程序,作爲此應用程序的一部分,我們有一個FAQ部分。現在,此應用程序中的用戶體驗特別是在“常見問題解答”部分中不是很好。因此,如果要查找一些信息,則必須滾動到所有這些問題,然後尋找我感興趣的問題,然後尋找相應的答案。因此,我們希望通過添加自動搜索功能來改善Nosh應用程序中的用戶體驗,以便您可以鍵入或可以說出查詢內容,還可以選擇相應的問題並向您顯示相關的答案。我們如何使用單詞嵌入來構建它?因此,一種構建方法是使用靜態單詞嵌入。假設您有一個輸入查詢。您將其交付給庫比蒂諾嗎?通過Word Embeddings API將其傳遞時,您可以枚舉每個單詞,併爲序列中的每個單詞獲取一個矢量表示形式。


每個FAQ問題pe-計算單詞嵌入

一旦做到這一點,一種獲取句子表示的啓發式方法就是簡單地取每個單詞的向量的平均值,而得到的結果就是一個相同維數的向量。現在,您還可以爲數據庫中的每個FAQ問題pe-計算單詞嵌入。

應用流程

因此,您將提出每個問題,通過詞嵌入進行處理,獲取向量,對其求平均,然後預先計算嵌入。因此,在運行時,給定查詢,您會找到最接近輸入查詢向量的問題,然後選擇問題並在UI中顯示相應的答案。

現在,這似乎是解決此問題的一種合理方法,但確實存在一些缺點。第一個是單詞覆蓋率的問題,因爲靜態單詞嵌入可以使用有限的詞彙表,如果您的輸入查詢在查找表中沒有單詞,則它將丟失信息。

第二個是使用這種平均過程非常嘈雜。這類似於失去了組成知識的一袋單詞表示法。例如,如果我們有一個查詢,例如“您從庫比蒂諾(Cupertino)運送到聖何塞(San Jose)嗎?”通過簡單地取平均值,我們使單詞變得混亂,我們丟失了諸如from和to之類的單詞中包含的成分信息。

因此,最大的問題是我們可以做得更好嗎?是的,我們當然可以。我們很高興地告訴您,我們擁有一種稱爲句子嵌入的全新技術,可以解決此問題。現在,通過使用Sentence Embedding API,您可以對一個句子傳遞輸入查詢,例如“您是否交付給Cupertino”,它將分析整個句子並將該信息編碼爲當前API中的有限維向量。該向量的維數爲512維。那麼這是如何工作的呢?直觀地,您可以認爲它是從文本語料庫和文本語料庫開始的,如果要在通過句子嵌入而不是使用單詞傳遞時在句子級別對文本進行標記化,則現在有了句子表示形式。這些句子中的每個句子都在此向量空間中表示,以使概念上相似的句子聚在一起,而異類句子彼此聚類。現在,在此之下的技術相當複雜,並且利用了幾種機器學習技術,其中一種是與自定義層(例如雙向列表以及完全連接的層)結合的預訓練模型。而且,我們通過多任務訓練對這些網絡進行訓練,該訓練針對不同的任務進行設置,例如自然語言推理,二進制文本相似性以及下一句預測。

但是使用它,您不必擔心這些細節。您只需要要求它。因此,您首先要導入NaturalLanguage。然後創建NLEmbedding和句子Embedding的實例,並將語言指定爲英語。一旦有了這個,就可以要求輸入句子的向量。

當您執行此操作時,句子將通過神經網絡運行。得到的是一個有限的512維向量,該向量對這句話的含義進行了編碼。給定兩個句子,您還可以在向量空間中找到這兩個句子之間的距離。

您只需通過神經網絡在此API下運行這兩個句子,獲取向量表示形式,然後計算距離即可。現在,該技術還有許多其他潛在的應用程序。

但是,由於我們現在沒有句子的有限列表,因此您無法預先計算所有句子的嵌入,因爲先驗是該技術無法使用的最近鄰居API。但是在本課程的稍後部分,道格將告訴您如何使用句子嵌入以及如何利用自定義嵌入技術來處理最近的鄰居。現在,如果您必須返回Nosh應用程序,那麼當您遇到諸如“是否傳遞給Cupertino”之類的查詢時,只需將其通過Sentence Embedding API傳遞即可,然後獲得一個編碼所有含義的向量。同樣,對於索引中的所有FAQ問題,您都可以預先計算句子嵌入,而在運行時只要輸入即可簡單地找到最接近的問題。

完成此操作後,您將在UI級別的應用程序中顯示相關答案。爲了查看句子的嵌入效果,我將其交給Doug,Doug將向我們展示在Nosh應用程序中如何工作的演示。道格謝謝Vivek。因此,讓我們看看其中的一些操作。在我們的Nash應用程序中,我們要做的是讓用戶鍵入查詢字符串,然後我們將使用句子嵌入從常見問題中返回一個適當的答案。

因此,讓我們看一些代碼。因此,在此方法中,我們要做的第一件事就是獲取句子嵌入,在這種情況下爲英語。很簡單。

然後,我們將要求爲用戶的查詢字符串的向量進行嵌入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章