作者:Arnault
編譯:ronghuaiyang
導(dǎo)讀
如何把你的人工智能想法轉(zhuǎn)化為可用的軟件。
建立一個 AI PoC 是困難的。在這篇文章中,我將解釋我的思維過程,使我的人工智能 PoCs 成功。
“我的鬧鐘能不能利用交通信息及時叫醒我去上班?”我們都想過求助于人工智能來解決我們的一個問題。概念證明(PoC)的目標(biāo)是測試是否值得在其中投入時間。構(gòu)建 PoC 是困難的,但構(gòu)建 AI PoC 則更加困難,因為它需要大量的技能。
在構(gòu)建 AI PoC 時,數(shù)據(jù)科學(xué)只是工作的一小部分,但它是最重要的技能之一。很容易找到一些非常好的教程來教你如何解決一個特定的任務(wù),如何構(gòu)建一個檢測算法來停車入庫。如何部署一個 flask app 到云上。但是,為你的特定問題設(shè)計一個解決方案要困難得多,這主要是因為你需要后知后覺地將問題重新組織成標(biāo)準(zhǔn)化的任務(wù)。
在這篇文章中,我將解釋我實現(xiàn)這一目標(biāo)的方法。
首先,我將回顧一下人工智能系統(tǒng)是什么樣子的。然后,我將描述我設(shè)計一個人工智能的 3 個步驟的過程。最后,我們將看到兩個示例,一個簡單的示例和一個完整的帶有 python 實現(xiàn)的示例。
人工智能系統(tǒng)概述
作為一個例子,我將使用一個分類文件的系統(tǒng)來說。它回答的問題是,“這是什么類型的文件?答案是類似于“電子發(fā)票”或“待辦事項”這樣的類。
AI 工作流程包含 5 個步驟:
- 收到問題:“這是什么類型的文件?”
- 在用戶或上下文中添加補充數(shù)據(jù):“用戶擁有什么類型的文件?”
- 使用數(shù)據(jù)回答問題:“這個文件屬于哪種類型?”,"這是能源發(fā)票"
- 存儲結(jié)果:添加新文件到數(shù)據(jù)庫
- 回答客戶的問題:“這是能源發(fā)票”
你可以把它分成 3 個任務(wù)或語義塊:
- 處理客戶:接受問題,讓他等待……示例:HTTP 服務(wù)器
- 數(shù)據(jù)調(diào)?。号c“公司知識庫”溝通,增加或接收相關(guān)數(shù)據(jù)。與數(shù)據(jù)庫的通信
- AI 部分:回答這個問題的 AI 本身,以及上下文。例子:專家系統(tǒng),支持向量機,神經(jīng)網(wǎng)絡(luò)…
回答問題“這是什么類型的文件?
你可以在網(wǎng)上找到關(guān)于如何架設(shè)你的服務(wù)器或數(shù)據(jù)調(diào)取層的教程。Python 中最簡單的 AI PoC 解決方案是使用 Flask 和 SQL 數(shù)據(jù)庫,但這在很大程度上取決于你的需要和你已經(jīng)擁有的東西。我們將專注于設(shè)計 AI 本身。
設(shè)計 AI 部分
人工智能任務(wù)可能涉及多個異構(gòu)輸入。例如,用戶的年齡和位置或整個電子郵件討論。
人工智能的輸出取決于任務(wù):我們想要回答的問題。人工智能有很多不同的任務(wù)。在下面的圖片中,你可以看到一些常見的計算機視覺任務(wù)。
一旦你從標(biāo)準(zhǔn)化的輸入和任務(wù)中走出來,想辦法構(gòu)建一個人工智能就會變得很復(fù)雜。
為了讓我了解構(gòu)建 AI 的復(fù)雜性,我使用了一個 3 步的過程。
步驟 1:瀏覽相關(guān)的輸入
首先,收集你覺得能夠回答手頭任務(wù)的所有輸入,并選擇在大多數(shù)情況下能夠自給自足的輸入。
在測試人工智能想法時,很容易變得貪婪,并考慮包含大量輸入的解決方案:例如,用戶的位置可能會讓我了解他們的下一封電子郵件是什么。事實是:人們很容易迷失在各種不同含義或性質(zhì)的輸入中,最終什么也得不到。
在建造你的 AI 時,堅持簡單的,自給自足的輸入。
步驟 2: 數(shù)據(jù)向量化
第二步是對這些輸入進(jìn)行預(yù)處理,使其可用于各種算法。在某種程度上,每一個 AI 過程都要經(jīng)過一系列的步驟來獲得一個向量表示。
文本到向量:基于詞的計數(shù)來構(gòu)建向量
這個過程非常簡單,比如計算單詞在文檔中出現(xiàn)的頻率,或者直接使用圖像像素的值。它也可以變得非常復(fù)雜的多層預(yù)處理。
圖像矢量化:根據(jù)像素值將PNG圖像矢量化為48×48灰度矢量
輸入可以是非常不同的:不同的大小、顏色比例或圖像格式。請記住,這里的思想是構(gòu)建所有輸入的有意義的、規(guī)范化的表示。
構(gòu)建規(guī)范化的輸入和有意義的表示。
步驟 3:處理向量
第三步是考慮輸出和如何實現(xiàn)輸出的時刻。
與輸入一樣,輸出也需要“向量化”。對于分類,它很簡單:按類劃分一個字段。
然后,我們需要找到從輸入向量到輸出向量的方法。最后,這是我們開始尋找 AI 時學(xué)到的第一件事。它可以涉及到一些簡單的任務(wù),比如找到最近的向量或最大值,也可以涉及到更復(fù)雜的任務(wù),比如使用巨大的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
大多數(shù)任務(wù),如回歸、分類或推薦,都有詳細(xì)的文檔記錄。對于 PoC,最簡單的操作是使用一個預(yù)先實現(xiàn)的算法庫,如scikit-learn并進(jìn)行測試。
分類任務(wù)上的向量輸出
找一些簡單的和預(yù)先實現(xiàn)好的算法。
一個直接的例子
任務(wù):文本是法語還是英語?
解決方案:
步驟 1:瀏覽相關(guān)輸入。如果沒有任何源或其他元數(shù)據(jù),文本是惟一可能的輸入。
步驟 2:向量化數(shù)據(jù)。向量化的一個簡單方法是計算英語單詞和法語單詞的數(shù)量。我們將使用特定語言中最常用的單詞。它們被稱為停用詞:the, he, him, his, himself, she, her…
步驟 3:處理向量。然后,我們可以選擇使用這兩個值中最高的值進(jìn)行分類,以獲得二進(jìn)制輸出:True 或 False。
維基百科中法語和英語的頁面按照詞綴比例隨機劃分。藍(lán)色的異常值是關(guān)于 Ferroplasmaceae 的法語頁面,遺憾的是,它包含的英語參考文獻(xiàn)比法語句子還多。
構(gòu)建人工智能通常是人類專長(商業(yè)知識)和計算機智能(機器學(xué)習(xí))的混合。在這個例子中,由于法語和英語的停用詞,我使用了人類的專業(yè)知識來選擇如何構(gòu)建我的向量。我也可以使用機器學(xué)習(xí)來訓(xùn)練一個模型,要么構(gòu)建一個相應(yīng)的向量(步驟 2),要么學(xué)習(xí)更復(fù)雜的向量的分類(步驟 3)。
一個更復(fù)雜一點的問題
在一次會議上,我與一個從事數(shù)字安全項目的人交談。他告訴我,他想幫助他的用戶對他們的個人文檔進(jìn)行分類和排序:合同、賬單、文件……他注意到,隨著存儲的內(nèi)容越來越多,文件夾樹也越來越復(fù)雜,人們往往會對自己的文檔進(jìn)行錯誤的分類。找到他們想要的內(nèi)容也變得更加困難。搜索引擎只是在“修補”問題,而不是消除根本原因:只有在知道準(zhǔn)確信息的情況下才能找到文檔,而文件夾仍然很混亂。
那么我們該如何解決這個問題呢?
注:我真的開發(fā)了這樣一個系統(tǒng):https://github.com/Wirg/digital-safe-document-classification
闡明 PoC 的思想并定義其范圍
我們將設(shè)計一個用戶界面,用戶可以上傳一個文檔,然后提示用戶這個文檔最適合的文件夾是什么。我們希望支持這些類型的文件:txt、text、markdown 和 pdf。
“data_to_read”是我放想要閱讀的文章的文件夾。Work 是一個文件夾,里面有我以前的學(xué)校報告(主要是數(shù)據(jù)科學(xué)項目)。在 15 個文件夾中選擇 2 個。具體實現(xiàn):https://github.com/Wirg/digital-safe-document-classification。
我們想要提示用戶的是他們當(dāng)前的文件夾,而不是舊的或來自其他人的文件夾:答案必須是特定于用戶和特定于時間的。
步驟 1:瀏覽相關(guān)的輸入
首先,我們需要知道用戶的文件夾,否則我們將無法回答。要做出選擇,我們可以使用:
- 文件的內(nèi)容
- 添加時間:有些賬單可能是按月支付的,有些任務(wù)可能大部分是在特定時間內(nèi)完成的
- 文件名和類型:" energy_invoice_joe_march.pdf "、“pdf”
在我們的例子中,最可靠的輸入可能是文檔的內(nèi)容。我們將使用上傳的文檔和用戶文件夾的內(nèi)容作為比較。我們來關(guān)注一下。
步驟2: 輸入向量化
現(xiàn)在,我們有不同的輸入格式:pdf、markdown、text、txt…我們可以直接處理 markdown 和其他文本格式的文件內(nèi)容。但是我們必須處理 pdf 文件,才能像其他文件一樣使用它們。
我通過谷歌搜索找到了這里使用的工具 Pdftotext。它是有效的,但有一個巨大的缺點,它不執(zhí)行光學(xué)字符識別(OCR)。這意味著它將讀取大多數(shù) pdf 文件,但無法讀取由圖像或掃描件創(chuàng)建的文件。為了解決這個問題,我可以使用像 Tesseract 這樣的替代方法,但是我不會在這個例子中使用。
我們想把文本轉(zhuǎn)換成向量,讓我們來看看scikit-learn。我們找一個文本向量化的工具,我們找到一個文本的特征提取包。這正是我們要找的。它有兩個向量化工具:一個基于單詞計數(shù),另一個稱為 TfidfVectorizer,我們使用的就是這個。
首先將發(fā)票pdf轉(zhuǎn)換為文本,然后轉(zhuǎn)換為向量
Tfidf 表示詞頻和逆文檔頻率。它基本上是數(shù)字,但用了一種更聰明的方法。其思想是,我們不只是計算單詞的數(shù)量,而是通過計算單詞的頻率,并將其與文檔中的單詞數(shù)量進(jìn)行比較,從而了解文檔中某個單詞的重要性:詞頻(term frequency, TF)。然后,我們將其頻率與文檔數(shù)量進(jìn)行比較。文檔中出現(xiàn)的頻率越少,它對文檔的影響就越大:逆文檔頻率(IDF)
步驟 3:處理向量
我們需要一個最佳文件夾的列表作為最終輸出。將文件夾名映射到數(shù)字很簡單。但是我們不能得到一個簡單的標(biāo)準(zhǔn)化輸出向量因為輸出向量的大小會改變。實際上,文件夾的數(shù)量在很大程度上取決于用戶及其當(dāng)前文件夾。由于這個原因,我們不能使用固定數(shù)量的類的普通分類算法。我們需要每次都對模型進(jìn)行重新訓(xùn)練,并為每個用戶構(gòu)建一個模型,或者為所有用戶構(gòu)建一個大型模型。
但是我們已經(jīng)在向量化過程中加入了“智能”。因此,我們將采取另一種方法,更類似于搜索引擎:對上傳的文檔、文件夾中已經(jīng)存在的文檔進(jìn)行矢量化,并比較結(jié)果向量。
為了找到最好的文件夾,我們尋找與上傳文檔最匹配的文檔。
我們找到向量表示與上傳文檔最相似的文檔,并將通過它找到原始文件夾。
使用余弦相似性查找最佳文件夾。
總而言之,解決 AI 問題可以簡化為以下 3 個步驟:
- 首先,瀏覽相關(guān)輸入
- 其次,向量化數(shù)據(jù)
- 第三,處理向量
我希望它能幫助你實現(xiàn)你的人工智能想法。
英文原文:https://www.sicara.ai/blog/2019-03-29-how-build-succesful-ai-poc
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。