0
如果你對機器學習感興趣的話,那么有很多很棒的學習資源。像 fast.ai 就可以幫助任何具有技術背景的人學習機器學習的基礎,并訓練他們自己的模型。
但是,如果你對用機器學習構建生產軟件感興趣,那么可以使用的資源就少多了。把機器學習應用到生產中的基礎設施挑戰根本就沒有那么豐富的寫作內容。
本文旨在充當基于 NLP 構建的軟件項目的指導,任何人甚至沒有 ML 經驗的人都可以構建文中的這些項目。
當然,這些項目也不是玩玩而已,它們都是受當今真實公司銷售的真實軟件的啟發而產生的。
寫在開始之前
以下每個項目將使用類似的架構:
你將實現一個相關的預訓練模型
你將把模型部署為一個 API
你將把 API 連接到主應用程序
這種設計模式稱為實時推理,它有很多好處。
首先,它消除了主應用程序的計算負擔,將其卸載到專門為 ML 模型構建的服務器上。其次,它允許你通過 API 合并 ML 進行預測,這是大多數軟件開發人員都熟悉的模式。最后,還有像 Cortex 這樣的開源工具,它自動地將這些模型部署為 API 所需的所有基礎設施工作,這意味著你不必花費大量時間來研究如何配置 AWS 來為機器學習模型服務。
要使用 Cortex 部署任何模型,你都需要做三件事:
編寫一個 Python 腳本來提供來自模型的預測
編寫一個配置文件來定義你的部署
從命令行運行 cortex deploy
把所有這些都排除在外,讓我們開始吧。
項目 1:自動完成功能
傳統上,自動完成是通過鍵值查找來實現的,在鍵值查找中,將用戶輸入的不完整單詞與字典進行比較,并給出潛在單詞。
然而,使用機器學習,自動完成可以更進一步。與引用靜態的單詞或短語詞典不同,模型可以根據真實世界的用戶輸入進行訓練,以預測最有可能出現的下一個短語。
一個常見的例子是 Gmail 的智能回復,它對你收到的電子郵件的回復提出建議:

圖片來源于 Google
讓我們看看如何構建自己的 ML 自動完成功能。
我應該用什么模型?
在這種情況下,我們要用 RoBERTa。
RoBERTa 是 Facebook 開發的一個 NLP 模型。它建立在谷歌著名的 BERT 的基礎上,因此在 RoBERTa 中使用了奇怪的大寫字母,并通過實現稍微不同的訓練方法改進了 BERT 的性能。
預先訓練好的 RoBERTa 通過 PyTorch Hub 加載,它帶有一個內置的 fill_mask()方法,允許你傳入一個字符串,指向 RoBERTa 應該預測的下一個單詞/短語的位置,并接收你的預測。
現在,你只需要將 RoBERTa 部署為一個 API,并在前端編寫一個函數,用用戶的輸入查詢你的模型。
如果遇到任何問題,可以使用這個 Cortex 示例部署 RoBERTa:https://github.com/cortexlabs/cortex/tree/master/examples/pytorch/search-completer 。
項目 2:客戶支持機器人
支持機器人絕不是一個新的概念,但隨著機器學習的發展,整個領域都向前邁進了一步。
在過去,一個支持機器人可能已經預先準備好了一些問題的答案。如果這個問題的措辭沒有被機器人識別,或者它涉及了一個主題之外的內容,機器人就不會工作。
然而,現在,ML 驅動的機器人可以解析和理解用戶輸入,而不僅僅是將其與問題列表進行比較,還可以自行生成答案。
像 Reply.ai 這樣構建自定義支持機器人的公司就是一個典型的例子。根據 Reply.ai 的數據,平均一家公司可以通過一個 ML 驅動的機器人來處理 40% 的入站支持請求,下面就是哪一個例子:

圖片來源:Reply.ai
現在,讓我們構建自己的客戶支持機器人。
我應該用什么型模型?
DialoGPT 非常適合這個任務。
DialoGPT 是微軟公司構建的一個模型, 是用 Hugging Face 的 pytorch transformer 和 OpenAI 的 GPT-2 開發的。該模型接受了 Reddit 對話的訓練,并將返回查詢到的任何文本的答案。
然而,因為微軟地保留了這個模型的解碼器(有人擔心 Reddit 訓練模型的潛在輸出),所以你必須實現你自己的 GPT-2 解碼器來將模型的響應翻譯成人類語言。幸運的是,這對你來說并不太困難,你可以通過克隆此 repo 來運行 DialoGPT 的整個部署。
一旦部署了 DialoGPT API,就可以將其連接到前端并開始處理客戶請求。
額外提示:如果你對使用 DialoGPT 有問題,這里有一個教程:https://towardsdatascience.com/how-to-actually-use-ml-in-production-reading-comprehension-1597095a54b2 。
項目 3:文本預測生成器
如果你隱約知道機器學習社區,你應該聽說過 AI Dungeon 2。這是一款經典的文本冒險游戲,其中的故事完全由 GPT-2 生成。這款廣受歡迎的游戲最初被關閉的原因是,它的云托管成本超過 10000 美元/天。
你可以用這款游戲做任何事情,比方說,吃掉月亮:

AI Dungeon 2 是使用 OpenAI 的 GPT-2 構建的,雖然交互式 RPG 可能不是你想要的商業案例,但 AI Dungeon 2 展示了自動生成文本的說服力。
Deep TabNine 是自動生成文本的一個很好的例子。Deep TabNine 是一款使用機器學習在 IDE 中實現自動完成功能的產品,適用于多種編程語言:

圖片來源:TabNine Blog
如果你是一名軟件工程師,那么使用 ML 立即生成準確、完整的代碼行的想法一定令人激動。
讓我們看看如何構建自己的版本。
我應該用什么模型?
對于這個項目,你應該使用這個龐然大物本身,也就是 OpenAI 的 GPT-2。
當 GPT-2 第一次發布的時候,它引起了一系列的轟動。首先,它非常強大。其次,OpenAI 的團隊沒有發布完整的預訓練模型,因為他們擔心它可能被濫用。不出所料,這引發了媒體對一個可能「對公眾太危險」的人工智能的猛烈抨擊。
而如今,完整的模型已經發布,并且在 Skynet 上沒有相關報道。
和這個模型交互非常簡單,給它發一段文本,然后等著它生成就行。
要使用 Cortex 部署 GPT-2,可以使用這個存儲庫:https://github.com/cortexlabs/cortex/tree/master/examples/tensorflow/text-generator。
項目 4:語言標識符
你有沒有瀏覽過 Google Chrome 中的一個網站并看到這個彈出窗口?

你有沒有想過 Chrome 如何識別頁面的語言?答案很簡單:它使用語言標識符。
語言識別是出了名的棘手。不同的語言有許多共同的詞匯,不同的方言和俚語使語言更難被識別,而且沒有法律禁止在一個網頁上使用多種語言。
這個模糊的任務是確定一個給定的文本用哪種語言對于機器學習來說是完美的。讓我們看看如何在下面構建自己的語言標識符。
我應該用什么模型?
Facebook 的 fastText。
fastText 是一個使用單詞嵌入來理解語言的模型。在我關于將 fastText 部署為 API 的教程中,我簡要解釋了使 fastText 如此特殊的原因:
單詞嵌入將單詞表示為浮點數的 n 維向量,其中每個數字表示單詞含義的一個維度。使用單詞向量,你可以根據單詞的語義來「映射」單詞——例如,如果你從「king」的向量中減去「man」的向量,再加上「woman」,你將得到「queen」的向量。換句話說,king-man+woman=queen
word2vec 是最早流行的生成 word 嵌入的工具之一,fastText 是 word2vec 的擴展。word2vec 處理單個單詞,而 fastText 將單詞分解為 n 個單詞。這使得 fastText 能夠更好地理解晦澀難懂的單詞。當給出一個罕見的單詞如「deminiquavers」時,fastText 會分析其中較小的 n 個字母(「demi」、「semi」等),以幫助找到它的語義,這類似于你分析熟悉的詞根來理解一個陌生的單詞。
部署 fastText 相當簡單。你可以使用這個存儲庫:https://github.com/cortexlabs/cortex/tree/master/examples/pytorch/language-identifier,如果需要額外的幫助,可以按照本教程進行操作。
項目 6:媒體監視器
現代商業的現實狀況是,如果用戶對你的產品有意見,他們會在大量的平臺上表達自己的不滿。為了有效地保持品牌的領先地位,監控社交媒體以了解公司的情況是必要的。
這類產品的一個例子是 Keyhole,它是一個社交分析平臺,使用機器學習來監控與貴公司相關的社交媒體:

然而,在構建這種工具時,最大的挑戰之一是弄清楚你的品牌是怎么被提及的。
假設你想為你的品牌建立一個監控黑客新聞的服務,每天刪除 HN 評論是相當簡單的,搜索這些評論中與你的品牌相關的詞也很容易。但是,這就是癥結所在,你怎么能肯定地知道,這些關鍵詞正被用于你的品牌?
例如,如果我在監控 cortex,我怎么知道「cortex」這個詞在給出的評論中是指開源平臺,而不是一個人大腦的前額葉皮層?
這就是機器學習發揮作用的地方。
我應該用什么模型?
Flair 的 SequenceTagger。
Flair 是一個基于 PyTorch 的開源 NLP 庫,它在很多方面都很出色,尤其是在命名實體識別(NER)方面,這正是我們試圖解決的問題。
例如,以下內容直接取自 Flair 存儲庫:
示例用法
讓我們對一個示例語句運行命名實體識別。你只需要造一個句子,加載一個預先訓練好的模型,然后用它來預測句子的標簽:
from flair.data import Sentence
from flair.models import SequenceTagger
# make a sentence
sentence = Sentence('I love Berlin .')
# load the NER tagger
tagger = SequenceTagger.load('ner')
# run NER over sentence
tagger.predict(sentence)
完成!這個句子現在有實體注釋。把句子打印出來看看標語者發現了什么。
print(sentence)
print('The following NER tags are found:')
# iterate over entities and print
for entity in sentence.get_spans('ner'):
print(entity)
其輸出應該是:
Sentence: "I love Berlin ." - 4 Tokens
The following NER tags are found:
LOC-span [3]: "Berlin"
你可以使用 Cortex 的 Predictor API 來實現 Cortex 的 Flair,這是我們到目前為止用于部署所有 PyTorch 模型的方法。
使用機器學習不需要博士學位
機器學習通常給人一種感覺,那就是它只適合那些有著強大數學或理論背景的計算機科學的人來學習使用。
如果你想開發新的模型架構或者突破機器學習的界限,那可能是真的,你需要從理論上理解機器學習。然而,如果你只是想用機器學習來構建軟件,那么這個障礙只是想象出來的。
我上面列出的每一個項目都可以構建,即使你對軟件開發只有一個初步的了解。而且所有這些項目都模仿真實的、成功的產品的功能——它們不是玩具項目。
雷鋒網雷鋒網雷鋒網
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。