# HW1_助教說明_自然語言處理.m4a|長度 00:24:02|model large-v3 on cuda [00:00:01] 今天我們要介紹的是NLP課的第一次作業,主題是Word Analogy。 [00:00:06] 這次作業希望大家熟悉Word Embedding的基本概念,包含怎樣使用預訓練的Word Embedding,以及怎麼自己訓練Word Embedding。 [00:00:19] 首先介紹一下什麼是Word Analogy。 [00:00:23] Word Analogy主要是可以用來評估一個Word Embedding的模型。 [00:00:29] 看這個Word Embedding模型有沒有學到單字之間的語意關係和語法關係。 [00:00:37] 最常見的形式是A is to B as C is to D。 [00:00:43] 它的意思就是A跟B的關係相當於C跟D的關係。 [00:00:48] 比方說King跟Queen的關係就相當於Man跟Woman的關係。 [00:00:53] 我們希望這些單字之間的聯繫可以透過Word Embedding模型, [00:00:58] 以Word Embedding空間的向量來表達出來。 [00:01:02] 因此給定前三個單字之後,我們可以利用它來預測第四個單字。 [00:01:08] 這次作業使用的是Google Word Analogy Dataset。 [00:01:15] 這個Dataset有接近2萬筆資料,裡面有不同的Category。 [00:01:21] 語意的關係有5個Category,語法的關係有9個Subcategory。 [00:01:30] 每一筆的Category有5個Category,語法的關係有9個Subcategory。 [00:01:31] 每一筆資料都有4個單字組成,也就是ABCD。 [00:01:35] 這個ABCD就是之前所介紹的A跟B的關係相當於C跟D的關係。 [00:01:45] 這邊有兩個小範例。 [00:01:49] 首先第一個是語意關係。 [00:01:53] 這裡就是之前我們所提到的King跟Queen的關係相當於Man跟Woman的關係。 [00:01:58] 第二個是語法的範例。 [00:02:01] 這是同一個單詞的不同形式。 [00:02:05] Infrequent跟Infrequently的區別就是後面有加ly。 [00:02:10] 它在詞性上面會有一些變化。 [00:02:13] Cheerful跟Cheerfully也是同樣的,在後面加一個ly。 [00:02:18] 所以第一個單字跟第二個單字的關係等於第三跟第四個之間的關係。 [00:02:25] 它們是一個語法上的關係。 [00:02:29] 接下來, [00:02:31] 我們就開始介紹這次作業的Code Template。 [00:02:34] 我們已經有提供Notebook和程式架構。 [00:02:37] 大家不需要從零開始寫整個程式碼。 [00:02:43] 而是可以按照我們的範例程式裡面的To-Do一個一個來完成。 [00:02:50] 接下來,我會介紹每一個To-Do會需要大家做什麼。 [00:02:55] 這次作業比較推薦大家使用的是Google Colab。 [00:02:59] 這是一個線式。 [00:03:01] 它是網上的Python Notebook平臺。 [00:03:06] 大家如果用Google Colab的話,就可以不需要用到自己的Python環境。 [00:03:15] 如果之前沒有使用過Colab,就可以把它理解成一個Online的Jupyter Notebook。 [00:03:22] 直接在瀏覽器裡面就可以寫Python,然後執行Python。 [00:03:27] 也可以使用GPU或者TPU。 [00:03:31] 就是免費使用GPU或者TPU。 [00:03:37] 這裡簡單介紹一下Colab的介面。 [00:03:41] 左邊是你目前正在編輯的Notebook的File Region。 [00:03:54] 也就是它目錄下的File的文檔。 [00:03:58] 右邊就是你所在編輯的程式碼,就是Notebook檔。 [00:04:03] Notebook裡面分為兩個區塊。 [00:04:05] 一個叫TextBlock。 [00:04:06] 這個就是各位如果要編輯TextBlock的話,就需要用Markdown來撰寫。 [00:04:14] 這個TextBlock是無法執行的。 [00:04:17] 它可以起到一些說明的作用。 [00:04:20] 另外一個區塊叫做CodeBlocks。 [00:04:24] CodeBlocks大家可以在這裡面寫Python的程式碼。 [00:04:29] 寫完了以後,按左上角的小圓圈。 [00:04:33] 就可以執行。 [00:04:35] 執行的結果會在下面顯示。 [00:04:41] 我們在GitHub上面有提供投影片跟程式碼。 [00:04:46] 希望各位可以自行取用。 [00:04:48] 第一步,首先是下載Google Word Analogy Dataset。 [00:04:53] 這個Dataset讀取的程式碼已經給各位寫好了。 [00:04:57] 讀取完了以後會獲得一個QuestionWords.txt。 [00:05:01] 之後會用作Word Embedding的驗證。 [00:05:06] 在這個QuestionWords.txt裡面, [00:05:10] 它每一筆資料就是之前我所提到的四個單字。 [00:05:14] 雅典跟希臘的關係相當於首都的關係。 [00:05:21] 它跟後面的這些C跟D之間的關係是一樣的。 [00:05:28] 這一堆資料都屬於一個關係類別。 [00:05:34] 叫做首都。 [00:05:40] 最上面這個以冒號開頭的, [00:05:43] 就是表示語意關係下面的一個子類別。 [00:05:47] 就是首都跟國家的關係。 [00:05:51] 接下來我們會把資料讀到Python裡面。 [00:05:59] 這邊可以顯示前十筆的資料。 [00:06:04] 在這次作業當中, [00:06:10] 會希望大家玩起來。 [00:06:12] 每個TODO都有各自的分數。 [00:06:16] 前半部分從TODO1到3。 [00:06:19] 我們需要各位去使用已經訓練好的Word Embedding來做預測。 [00:06:28] 然後再用TSNE來觀察單字之間的關係。 [00:06:33] 後四個TODO是大家需要利用Wikipedia的語料來訓練自己的Word Embedding。 [00:06:41] 訓練完以後, [00:06:43] 依舊還是要用Word Analogy來做預測跟TSNE的視覺化。 [00:06:50] 所以大家可以把這個作業理解成兩部分。 [00:06:54] 第一部分是利用別人的Word Embedding。 [00:06:57] 第二部分是訓練自己的。 [00:07:01] 首先第一個TODO就是把前面讀進來的Word Analogy資料整理成Pandas的DataFrame。 [00:07:11] 這個DataFrame需要包含, [00:07:14] 題目本身, [00:07:16] 四個單字, [00:07:17] 他們是語意還是語法的關係, [00:07:19] 和他們的Subcategory, [00:07:21] 就是具體是什麼語意關係, [00:07:23] 或者什麼語法關係。 [00:07:26] 這裡展示的是一個範例。 [00:07:29] 接下來會用到一個叫做GenSim的Python套件。 [00:07:33] GenSim是一個常見的自然語言處理套件, [00:07:36] 提供很多的Word Embedding相關的功能。 [00:07:39] 這次作業裡面, [00:07:40] 不管是下載Word Embedding, [00:07:42] 或者是後面用自己來訓練Word2Vec, [00:07:47] 都會需要用到GenSim的這個套件。 [00:07:51] 這邊示範如何用GenSim載入一個已經訓練好的Word Embedding模型。 [00:07:56] 範例使用的是Globe Wiki Gigaword100。 [00:08:02] 大家需要使用這一個預訓練好的Word Embedding, [00:08:10] 做第一階段的Word Analogy的預測。 [00:08:15] 我們寫好的Code已經幫大家載入預訓練的Word Embedding。 [00:08:27] 第二個Todo佔10%。 [00:08:30] 大家需要使用剛剛載入的預訓練Word Embedding, [00:08:33] 來完成Word Analogy的預測。 [00:08:36] 這邊也是一個需要各位能夠完成的Code。 [00:08:42] 那具體預測的時候需要各位完成的功能, [00:08:49] 也就是之前我所提到的, [00:08:50] 給定前三個Word, [00:08:54] 那各位需要去預測的第四個Word是什麼。 [00:08:58] 然後最後會有一個準確率之類的。 [00:09:05] 那預測完之後就可以進行評估。 [00:09:10] 那這部分的評估也有幫各位寫好。 [00:09:15] 那因為這是一個範例Code的部分, [00:09:21] 所以各位就希望各位不要去改。 [00:09:24] 應該說我們要求各位不改我們所提供的範例程式。 [00:09:29] 所以這部分大家是不能改的。 [00:09:31] 那最後會算出一個每一個Category的準確率。 [00:09:36] 那每一個都會有一個自己的準確率。 [00:09:43] 那第三個Todo佔5%。 [00:09:45] 除了前面的數值評估之外, [00:09:47] 大家需要畫TSNE來觀察Word Embedding, [00:09:54] 就是這些Word Embedding之間的空間關係。 [00:09:58] 那這個會希望各位在完成以後, [00:10:06] 各位完成以後, [00:10:10] 執行程式碼以後, [00:10:12] 最後的TSNE的圖會顯示在Notebook的Output裡面。 [00:10:19] 那大概是,範例大概是一個像這樣的圖。 [00:10:26] 那圖裡面的每一個點就代表了一個單字。 [00:10:31] 大家可以通過這張圖觀察具有語意或者是其他關係的單字。 [00:10:38] 那在Word Embedding空間中, [00:10:42] 可以看一下是不是也存在一些近似的, [00:10:46] 就是一些單字聚集在一起的這樣一個結構。 [00:10:50] 那前面的部分是已經用訓練好的Word Embedding。 [00:10:58] 那接下來是第二個部分, [00:11:00] 訓練自己的Word Embedding。 [00:11:02] 那這次給大家提供的語料是Wikipedia, [00:11:06] 就是Wikipedia的資料量非常大。 [00:11:09] 這份投影片中的Wikipedia已經有超過600萬篇的文章。 [00:11:15] 但因此呢, [00:11:17] 因此如果從原始的Wikipedia資料開始下載清理, [00:11:22] 在預訓練整個會花費非常非常多的時間。 [00:11:28] 所以我們已經幫大家預先處理好其中一些比較花時間的部分。 [00:11:37] 那這一頁讓大家看一下原始PDI資料大概長什麼樣子。 [00:11:43] 那可以看到原始的資料是XML的格式。 [00:11:47] 那除了文章內容之外, [00:11:48] 也包含Title啊,ID啊,Revision啊等等等等之類的內容。 [00:11:53] 那這些資料其實是不能拿來直接訓練Word to Vector的, [00:11:57] 而是需要先進行資料的清洗跟前處理。 [00:12:03] 如果真的需要自己來處理Wikipedia的原始資料, [00:12:08] 那GenSim有一個叫做Wikicorpus的工具, [00:12:12] 它可以協助我們從Wikipedia dump裡面取出文章的內容。 [00:12:18] 那由於Wikipedia的資料非常大, [00:12:20] 它可以使用比較節省劑, [00:12:22] 比較節省記憶體的方式逐步處理, [00:12:25] 而不需要一次性把所有的資料全部載到記憶體裡面。 [00:12:32] 不過這次作業大家不需要從最原始的Wikipedia dump來開始處理, [00:12:37] 因為下面, [00:12:38] 因為下載原始資料需要比較多的時間, [00:12:43] 所以我們已經在這個部分幫大家把這部分的任務完成了。 [00:12:51] 那最後有11個像這樣的檔案。 [00:12:53] 大家可以按照Notebook裡面的指令下載, [00:12:56] 並解壓縮即可。 [00:12:58] 那如果原本提供的下載方式無法使用的話, [00:13:05] 我們另外有給一個下載鏈接。 [00:13:08] 那第4個Todo佔5%。 [00:13:11] 首先把剛剛下載的Wikipedia資料合併成一個檔案。 [00:13:17] 然後因為完整的資料量還是很大, [00:13:20] 所以Todo4要求大家去前20%。 [00:13:24] 然後再去下載它的Wikipedia文章。 [00:13:26] 那這裡要注意的是每一行代表一篇Wikipedia的文章, [00:13:32] 因此我們是以文章為單位進行取樣。 [00:13:39] 另外後面的報告要求我們比較使用5%、10%、20%語料時的結果。 [00:13:46] 所以大家在寫這個程式的時候, [00:13:50] 可以取樣, [00:13:51] 就可以讓取樣的比例做出一定的調整。 [00:13:53] 那第5個Todo佔10%。 [00:14:01] 取得訓練的語料之後, [00:14:03] 就要開始訓練自己的Word Embedding。 [00:14:06] 這邊可以使用GenSim提供的Word2Vec。 [00:14:10] 投影片下面提供了一個簡單的Word2Vec使用範例。 [00:14:14] 那不過在正式訓練開始之前, [00:14:18] 大家需要先思考一下怎樣對資料進行前處理。 [00:14:25] 那這可能會直接影響到之後的訓練。 [00:14:28] 那這個前處理的方法是各位自行發揮的。 [00:14:33] 這也是算在Todo5裡面的內容。 [00:14:38] 那這邊提供一些各位可以參考的方法。 [00:14:46] 那比方說移除非英文字, [00:14:49] 移除Stop Words, [00:14:50] 進行Limitization, [00:14:52] 就是把一些不是標準形式的單字變成標準形式。 [00:14:58] 然後另外也可以想一下有一些斷詞的方式。 [00:15:04] 然後或者是篩除掉一些不太常見的單字。 [00:15:11] 那這邊可能會需要提醒大家的一點, [00:15:15] 就是不是前處理越多越好。 [00:15:18] 所以各位可以做一定的嘗試。 [00:15:22] 那看怎樣的前處理會對各位的Word Embedding的訓練好。 [00:15:28] 會更加有幫助。 [00:15:32] 那第六個Todo佔10%。 [00:15:34] 那這一部分跟前面的Todo2基本一樣。 [00:15:38] 那差別只在於Todo2使用的是預訓練的Word Embedding。 [00:15:42] 那這次就是各位自己訓練的Word Embedding。 [00:15:47] 那第七個Todo還是畫一個tsn1, [00:15:52] 跟前面的也是一樣。 [00:15:54] 那跟Todo3也是一樣的。 [00:15:59] 那這一頁就是本次作業的評分方式。 [00:16:04] 那整個作業分為兩個部分。 [00:16:07] 程式碼呢,佔55%。 [00:16:09] 然後報告佔45%。 [00:16:11] 那這裡面有一些非常重要的點。 [00:16:15] 就是各位的Python Notebook裡面, [00:16:19] 需要包含你的程式碼執行結果和report。 [00:16:27] 那這個執行結果是20%資料量的wikipedia。 [00:16:32] 那這個執行結果是20%資料量的wikipedia。 [00:16:33] 那這個執行結果是20%資料量的wikipedia。 [00:16:36] 而不是其他的。 [00:16:38] 然後下面report的部分呢, [00:16:45] 是會需要各位寫在Notebook的最下面。 [00:16:51] 也就是在我們提供的範例程式碼的在下面有一個text block。 [00:16:57] 那那個block希望各位用markdown的形式來撰寫。 [00:17:01] 就是在我們提供的範例程式碼的在下面有一個text block。 [00:17:02] 也就是我們需要各位回答的問題的解答。 [00:17:04] 也就是我們需要各位回答的問題的解答。 [00:17:08] 那這邊大概解釋一下每個問題主要是在問什麼。 [00:17:09] 那這邊大概解釋一下每個問題主要是在問什麼。 [00:17:14] 那第一個是各位使用了什麼樣的模型, [00:17:16] 那第一個是各位使用了什麼樣的模型, [00:17:21] 然後preprocessing大概用了什麼樣的方法, [00:17:22] 然後還有一些超參數的設定。 [00:17:23] 然後還有一些超參數的設定。 [00:17:28] 那第二個就是如果各位用不同資料量的wikipedia的話, [00:17:30] 如果各位用不同資料量的wikipedia的話, [00:17:31] 那會對最後的performance [00:17:35] 就最後的分數accuracy [00:17:37] 會有怎樣的影響 [00:17:39] 那第三個 [00:17:41] 那第二個第二題是 [00:17:43] 不需要各位提供 [00:17:46] 實現它的程式 [00:17:47] 各位只需要在上面展示出自己的分數 [00:17:51] 然後進行討論就可以 [00:17:54] 但第三個就是 [00:17:55] 如果說各位使用其他的語料 [00:17:58] 那這個語料可以是各種各樣的語料庫 [00:18:01] 可能就是各位可以自行從網路上面去選擇 [00:18:08] 隨便什麼樣的語料都可以 [00:18:10] 那這一部分 [00:18:13] 就第三個問題這部分 [00:18:15] 我們會需要各位把實驗的code [00:18:20] 寫在report的下面 [00:18:23] 那我們會在code template的下面 [00:18:26] 給各位一些提示 [00:18:30] 就會有一個write your code here [00:18:32] 那在那個部分 [00:18:34] 各位可以提供自己實現 [00:18:37] 第三題這個 [00:18:38] 第三題這個問題的代碼 [00:18:42] 的程式碼 [00:18:43] 所以這個部分呢 [00:18:46] 是各位可以自行修改的地方 [00:18:49] 就是隨意撰寫的地方 [00:18:51] 那這邊會需要各位 [00:18:56] 就是展示出 [00:18:58] 這個部分的代碼 [00:18:58] 你用其他語料所執行出來的結果 [00:19:02] 然後另外呢 [00:19:05] 需要解釋一下 [00:19:06] 你所選用的語料跟wiki之間 [00:19:09] 有什麼樣的不同 [00:19:10] 然後並且分析一下 [00:19:12] 就是他們就是 [00:19:14] 他跟wikipedia [00:19:16] 為什麼會有最終效能上的差別 [00:19:21] 那 [00:19:22] 然後再來佔10%的是 [00:19:28] 他用的語料 [00:19:28] 大家需要至少選擇五個單字 [00:19:30] 然後使用他們的word embedding [00:19:32] 找出和他們最相似的五個單字 [00:19:35] 然後從中 [00:19:37] 就是去討論一下 [00:19:40] 你從這五個跟他們相似的單字當中 [00:19:44] 有發現什麼規律 [00:19:45] 那最後5%是各位可以 [00:19:48] 自行發想 [00:19:51] 就是各位覺得什麼可以增強你的report [00:19:56] 就是還有什麼想要討論的 [00:19:58] 就是可以在下面補充你自己的實驗 [00:20:01] 或者是一些分析 [00:20:03] 那最後一個就是如果各位有 [00:20:06] 各位需要不管有沒有使用AI工具 [00:20:09] 都需要在後面寫一個generative AI usage [00:20:13] 那如果你沒有用 [00:20:14] 那就寫 [00:20:15] 那就在這裡寫 [00:20:16] 我沒有用 [00:20:17] 那如果有用的話就寫 [00:20:19] 你在什麼地方用什麼AI工具 [00:20:22] 就用了哪一 [00:20:24] 就是那個生成了哪一個部分 [00:20:30] 然後是關於作業絞交 [00:20:32] 那本次作業 [00:20:33] 我們希望各位絞交python notebook [00:20:36] i.ipinb的這種檔案 [00:20:39] 那這種檔案 [00:20:41] 如果各位是用colab來執行的話 [00:20:45] 可以通過檔案下載的這個地方 [00:20:47] 選擇下載.ipinb來下載 [00:20:51] 那如果各位是在自己的環境下執行的話 [00:20:55] 各位需要額外 [00:20:57] 在絞交的文檔裡面多一個report [00:21:00] requirements.txt [00:21:02] 那裡面是 [00:21:04] 裡面包含各位需要 [00:21:08] 執行各位的執行各位的程式碼需要的套件版本 [00:21:14] 那如果你是用colab來執行的話 [00:21:17] 那這個檔案就不必要 [00:21:19] 各位只需要在report裡面的系統環境跟python環境裡面寫上colab就可以 [00:21:29] 那 [00:21:30] 以上這兩個文檔會需要各位 [00:21:33] 集合成一個壓縮文檔.zip檔 [00:21:38] 然後是關於命名 [00:21:43] 各位需要把自己的notebook跟zip檔都命名成nlp作業1 [00:21:52] 學校的名字和你的學號 [00:21:57] 然後這個是之前講的 [00:22:02] 在report的開頭 [00:22:04] 會需要各位寫running environment和python version [00:22:09] 那如果用colab的話就直接寫colab [00:22:12] 如果不是用colab就要寫具體是什麼 [00:22:15] 就是什麼作業系統 [00:22:17] 然後什麼cpu之類的 [00:22:23] 那最後是一些作業的規則 [00:22:27] 如果各位有使用ai工具的話 [00:22:32] 各位需要在程式碼的旁就ai生成的程式碼旁邊 [00:22:36] 就ai生成的程式碼旁邊 [00:22:37] 加一個註解說以下的內容是ai生成的 [00:22:42] 並且在report的最後有一個generative ai usage的部分 [00:22:48] 那需要在裡面寫清楚用了什麼ai [00:22:52] 然後生成了哪些部分 [00:22:56] 那再來就是希望各位不要抄襲 [00:23:01] 那這邊有一些懲罰 [00:23:03] 如果檔案名稱錯誤的話會扣5分 [00:23:07] 然後如果在自己的環境下跑 [00:23:09] 但是又沒有requirements.txt也會少5分 [00:23:13] 然後如果沒有寫aiusage的話會扣10分 [00:23:17] 那就是如果沒寫python的版本會扣5 [00:23:23] 就沒寫這種環境的內容會扣5分 [00:23:27] 那如果亂改了code template也會扣5分 [00:23:31] 那最重要的就是不要抄襲 [00:23:33] 如果發現有兩份code [00:23:37] 是完全一模一樣的 [00:23:39] 就是我們會不管誰抄誰 [00:23:42] 這兩個人都是0分 [00:23:46] 那最後希望各位在完成作業以後 [00:23:49] 把 zip 檔上傳到ntucool上面 [00:23:53] 那各位有三個禮拜來完成這個作業1 [00:23:58] 那如果有問題的話可以寄信來問助教 [00:24:01] 好謝謝大家