STEAM在線
以下文章來源於大小孩er ,作者墨先sen
大小孩er
創新教育產品經理&學習科學研究僧
CrashCourse AI系列課程第8集:訓練語音機器人。
我們今天的目標是編寫一個程序,讓John Green bot接到像「早上好」這樣的字詞提示後,完成句子。
像任何AI一樣,John Green bot不會真正懂得語言,但人工智慧通常在找到並複製模式方面做的很好。當我們教人工智慧系統去理解並產生語言時,實際要求它可以查找並複製某些行為中的模式。
所以要建立自然語言處理的AI模型,我們需要做四件事:
首先,收集並清理數據;
其次,建立模型;
第三,訓練模型;
第四,做出預測。
00
—
準備工作
說明:實際操作需科學上網和谷歌帳號,如條件不具備,可跳過這一步直接看步驟介紹。
1.打開連結:
https://colab.research.google.com/drive/1f8ik5kSPEvDCcM7R_-Wb3AjifizVEsHD
2. 登錄谷歌帳號
3. 選擇「在Playground模式下打開」。
4.跟著課程點擊左上角的「播放」按鈕,依次運行每段代碼即可(注意如不從上到下依次運行,可能會報錯)
Step 1
—
收集並清理數據
讓我們從第一步開始:清理數據
在這種情況下,數據是很多人類John Green談話的例子,在網上有很多這樣的對話。我們需要某種方式來處理他的講話,該怎麼做呢?
答案是:字幕。
在nerdfighteria wiki上有一個完整的字幕文件資料庫,我收集了一堆文件放進一個大文件裡。
所以如果你想讓你的人工智慧聽起來像其他人,像來自vsaucoor我的Michael,如步驟1.1所示:加載字幕文本。
數據收集通常是任何機器學習項目中最困難和最慢的部分,但是在這個例子中它非常簡單。
現在我們需要清理和準備我們的數據模型,這被稱為數據預處理。
計算機只能把數據當作數字來處理,所以我們需要把句子分成幾個單詞,然後把單詞轉換成數字。
當我們在構建一個自然語言處理程序時,「詞」這個詞可能無法囊括我們需要知道的一切,一個單詞有多少個實例也很有用。
因此,我們將使用詞法類型和詞法標記,詞彙類型是一個詞,詞彙標記是一個詞的具體實例,包括一些重複的。
例如,在這句話中:The goal of machine learning is to make a learning machine.我們有十一個詞彙標記,但只有九個詞彙類型,因為「學習」和「機器」都會出現兩次。
在自然語言處理中,標記化是將句子分割成詞彙標記列表的過程。在英語中,我們在單詞之間加空格,所以我們先把句子的空格切掉。
「Good morning Hank, it’s Tuesday.」 會變成下面的列表,並且我們會獲得五個詞彙標記。
但是,這樣會有一些問題:我們不是真的想要Hank和Tuesday後面的逗號也算一個詞彙類型。
所以,讓我們為標點符號添加一些額外的規則,幸運的是有預先編寫好的庫。使用其中一個,列表看起來像這樣:
在這種情況下,我們將有8個標記而不是5個,標記化甚至有助於將我們的縮寫「it's」分解為「it」和「撇號-s」
回顧1.1中的代碼,在符號化之前,我們有超過30000種詞彙類型。
此代碼還將我們的數據拆分為一個訓練數據集和一個驗證數據集。我們想確保模型能從訓練數據中學習,也用以前從未見過的新數據來測試它。這就是驗證數據集的目的。
在步驟1.3中,我們可以用這段代碼來計算我們的詞彙類型和詞彙標記。
看起來我們實際上有23000種獨特的詞彙類型,但是一個單詞有多少個實例也是有用的。
步驟1.4的代碼允許我們區分兩次以上的詞彙類型。
看起來我們有很多罕見的單詞——幾乎10000個單詞只出現一次!
對於人工智慧系統來說,擁有罕見的單詞是非常棘手的,因為他們想要找到並複製模式。所以他們需要很多如何使用每個單詞的例子。
對於John Green bot的人工智慧來說,僅僅使用這個數據集是很難學習的。但是如果我們利用形態學似乎是可行的。
形態學是一個單詞通過變形來匹配時態的方式,就像加上一個「ed」來構成過去時態,或者縮短或組合單詞使之成為另一個詞。
在英語中,我們可以通過一個稱為詞幹處理的過程來刪除許多額外的詞尾,如ed、ing或ly。因此,通過一些簡單的規則,我們可以清理更多的數據。
我還將通過用#或其他符號替換數字來簡化數據(step1.6;step1.7)。這應該可以關照到很多罕見的詞。
現在我們減少了3000種詞彙類型,只有8000個單詞只出現一次。
我們確實需要每個單詞的多個例子來讓我們的AI可靠地學習模式,所以我們將通過用「unk」或「未知」來替換這8000個或幾乎所有罕見的詞彙標記來簡化。
我們不希望John Green bot看到一個他不知道的詞而感到尷尬。因此,通過隱藏一些單詞(step1.8;step1.9),我們可以教John Green bot在遇到像」殭屍寶寶」這樣的一次性拼湊詞時如何繼續寫作。
現在我們終於把所有的數據都整理好了.
Step 2
—
建立模型
我們已經完成了預處理,可以進入第2步:為John Green bot建立模型。
首先,我們需要將句子轉換為數字列表。
我們希望每個詞彙類型都有一個單詞,所以我們將構建一個詞典,它將詞彙中的每個單詞分配給一個數字。
第二,這個模型可以同時閱讀一堆單詞,我們想利用這些來幫助John Green bot快速學習。所以我們要把我們的數據分成幾個部分,叫做批量處理。
在這裡,我們告訴模型同時讀取20個序列(每個序列有35個單詞)
我們將用一個簡單的語言模型對John Green bot進行編程,這個模型只需要幾個單詞,之後AI試圖完成句子的其餘部分。
所以需要兩個關鍵部分,一個嵌入矩陣和一個遞歸神經網絡。
正如我們上節課在自然語言處理視頻中所討論的,這是一個「編碼器-解碼器」框架。所以我們把它拆開。
嵌入矩陣是一個很大的向量列表,基本上是一個很大的數字表,其中每一行對應一個不同的單詞。
這些向量行捕獲兩個詞之間的關聯程度。如果兩個詞的用法相似,那麼它們向量中的數字應該是相似的。
但首先,我們對單詞一無所知,所以我們只是給每個單詞分配一個帶有隨機數的向量(step2.1)。
我們在訓練數據中用數字替換了所有的單詞,所以現在當系統讀取一個數字時,它只需在表中查找該行並使用相應的向量作為輸入。
第一部分完成了:單詞成為索引,然後成為向量,我們的嵌入矩陣就可以使用了。
現在,我們需要一個能夠智能地使用這些向量的模型。這就是RNN的來歷。我們在上一個視頻中也討論了遞歸神經網絡的結構,但它基本上是一個模型,通過一次合併一個新詞來慢慢地建立一個隱藏的表徵。
根據任務的不同,RNN將以不同的方式組合新知識。有了John Green bot,我們用Vlogbrothers腳本中的單詞序列來訓練RNN。
最終,我們的人工智慧試圖建立一個良好的匯總,以確保一個句子有一些整體意義,它持續跟蹤最後一個單詞,以產生一個句子,聽起來就像說英語了。
在閱讀完一個句子的最後一個單詞之後,RNN的輸出就是我們用來預測下一個單詞的內容。
這就是我們將用來訓練John Green bot的方法。所有這些都包含在代碼塊2.3中。
所以第二部分就完成了。我們有了嵌入矩陣和RNN。
Step 3
—
訓練模型
現在,我們準備好了第三步:訓練我們的模型。
還記得我們將數據分割成稱為批處理的片段嗎?還記得之前課程中,我們用反向傳播訓練神經網絡嗎?、
我們可以把這些片段放在一起,在我們的數據集上迭代,並對每個示例運行反向傳播來訓練模型的權重。
所以在步驟3.1中,我們定義了如何訓練我們的模型。
在步驟3.2中,我們定義了如何評估我們的模型。
在步驟3.3中,我們實際上創建了我們的模型。實際上就是訓練和評估的過程。
在訓練這個模型的每一次迭代,神經網絡將循環遍歷每一批數據——讀入、構建表徵、預測下一個單詞,然後更新猜測。這將訓練超過10次迭代,可能需要幾分鐘。
我們在每一次迭代後列印兩個數字,模型的訓練和驗證問題在於:隨著模型的學習,它意識到下一個單詞的好選擇越來越少,衡量模型的好像縮小選擇了選擇範圍。看起來這個模型是經過訓練的,它的perplexity是訓練45個,驗證72個,但是它開始的時候有幾百個perplexity !
我們可以把perplexity解釋為模型在預測正確答案之前做出的猜測的平均數。
在看過一次數據之後,該模型需要對下一個單詞進行300次以上的猜測,但現在它已經縮小到了不到50次。
儘管它遠不及完美,這是一個相當好的改進。
Step 4
—
做出預測
是時候看看模型能寫些什麼了,但要做到這一點,我們需要最後一個要素。
到目前為止,在人工智慧速成課程中,我們已經討論了很多關於人工智慧所能做出的最好的標籤或最好的預測,但是這對於解決某些問題並不總是有意義的。
如果你總是讓角色做一件顯而易見的事情來,那就太無聊了。
所以第四步是預測。機器可以做出一些選擇,但我們仍然可以幫助它一點點,讓我們考慮一下RNN的最後一層實際上在做什麼。
我們談論它就像它輸出一個標籤或預測,但實際上神經網絡正在產生一堆分數或概率。最有可能的單詞具有最高的概率,其次有可能的單詞具有第二高的概率,依此類推。
因為我們在每一步都得到概率,而不是每次取最好的一個祠來產生一個句子,我們可以抽取3個單詞並開始3個新句子。這三個句子中的每一個都可以再開始三個新的句子…然後我們有一個可能性的分支圖。
推理是如此重要,因為模型能產生什麼和我們想要什麼並不一定是同一件事。我們想要的是一個非常好的句子,但是模型一次只能告訴我們一個單詞的分數。
讓我們看看這個分支圖。每當我們選擇一個詞,就創建一個新的分支,並跟蹤它的分數或概率。如果我們把每一個分數乘到分支的末尾,就會看到,最上面的分支,做出了最好的分數選擇,但總的來說是一個更差的句子。
所以我們要在程序中實現一個基本的採樣器,採取一系列隨機路徑,因此我們可以根據完整句子的概率對結果進行排序,並且我們可以看到哪些句子總體上最好。
另外,當要求John Green bot生成所有這些句子時,我們需要給他一個詞來開始。
我現在要嘗試「good」,但是你可以通過在4.1中修改代碼來嘗試其他事情。
還記得我們對數據做的預處理嗎?這就是為什麼這些句子看起來有點離譜,有數字的標籤,還有我們在詞幹分析時引入的詞尾前的空格。再看看你每次用概率最高的詞得到的句子。
得到的句子並不有趣,這是因為有兩點重要的事情:
首先,數據沒有多少例子來說明如何使用每個詞。
事實上,我們在訓練中不得不刪掉很多「罕見詞彙」,因為它們只出現過一次,所以我們無法教John Green bot 識別與它們相關的任何模式。
許多最先進的模型都是通過從維基百科、大量的書籍收藏中下載數據來解決這一問題的(課程中提供了一些連結供訓練高級模型)。
第二個更大的問題是,人工智慧模型缺少我們作為人類的理解。
即使John GreenBot完美地分割了單詞並預測了聽起來像英語的句子,它仍然是John GreenBot使用諸如標記化、嵌入矩陣和簡單的語言模型來預測下一個單詞。
當人類約翰·格林寫作時,他運用他對世界的理解,就像在《超人兄弟》的視頻中一樣,他考慮漢克的觀點或是觀看的人。他不只是想預測下一個單詞的概率最高。
建立與人和世界互動的模型是自然語言處理如此令人興奮的原因,也是讓John Green bot和人類John Green 一樣生成語言需要更多工作的原因。
(網頁代碼中有一些筆記供讀者改進模型、訓練更長時間、替換提示詞和文本數據等)
(完整視頻)
關聯閱讀:
CrashCourse AI系列課程:AI概述
CrashCourse AI系列課程第1集:什麼是AI
CrashCourse AI系列課程第2集:監督學習
CrashCourse AI系列課程第3集:神經網絡和深度學習
CrashCourse AI系列課程第4集:訓練神經網絡
CrashCourse AI系列課程第5集:手寫字母識別
CrashCourse AI系列課程第6集:無監督學習
CrashCourse AI系列課程第7集:自然語言處理
(聲明:除STEAM在線原創文章外,STEAM在線分享和轉載的文章皆為促進STEAM教育在中國的傳播,僅做學習交流,非商業用途,都會註明來源,如文章、照片的原作者有異議,請聯繫後臺快速處理或刪除,謝謝支持。)
STEAM在線交流群
1000+老師、家長,優質教育內容推薦
長按二維碼聯繫
重磅 | 教育部:2023年前將實驗操作納入考試,積極探索跨學科(STEAM)教育
沙有威專欄 | 再論中小學智慧機器人教育與競賽
於曉雅專欄 | STEM教育融入綜合實踐活動應避免的誤區辨析
獨家 | 徵集100萬條留言,著名創客教育專家吳俊傑倡導設立「世界編程日」
峰會 | STEAM教育國際峰會在同濟大學召開,中外專家論道創新教育
更多STEAM教育資訊,請點擊「閱讀原文」
點個「在看」,表示朕已閱閱讀原文
原標題:《CrashCourse AI系列課程第8集:訓練語音機器人》
閱讀原文