# W4_自然語言處理_高宏宇.m4a|長度 01:19:25|model large-v3 on cuda [00:00:27] 有些網路的問題,不過我們就開始上課,這個echo很大,不是有電,但是echo很大。 [00:01:54] 今天我們會把W2的頭影片講完。 [00:02:24] 我們今天的下半場會是TA Lab課,但是因為TA Lab課的教材是比較技術性的,而且大概沒什麼改變。 [00:02:41] 所以我們之前就是用預錄的方式。 [00:02:45] 所以我們今天大概會上一半的時間。 [00:02:49] 然後剩下一半的時間就是讓大家回去看TA Lab課的第一段。 [00:02:56] 其實是介紹這些從前面PyTorch到整個,有點像帶領一下、勸一下NN的過程。 [00:03:06] 這個當然對如果有一些人已經有機器學習的經驗,或是已經都在玩這些東西的,他可能會覺得很簡單。 [00:03:16] 不過anyway,你就是看一下。 [00:03:19] 這是我們自己需要的部分。 [00:03:22] 那第一段的那個PyTorch的Tutorial大概是一個半小時。 [00:03:27] 這個影片已經放上去了。 [00:03:30] 那我們今天大概就是會接著把W2的頭影片講完,這樣子。 [00:03:37] 好,我先在這一張頭影片。 [00:03:40] 這一張之前有同學問BM25了。 [00:03:44] 雖然這個東西是蠻舊的東西。 [00:03:46] 不過因為其實還蠻長的。 [00:03:48] 這個其實還蠻重要的。 [00:03:50] 而且現在還是一直有在用。 [00:03:55] 什麼問題? [00:03:57] 直播。 [00:04:04] 對,為什麼這個? [00:04:07] 應該是畫面機器。 [00:04:09] 這個嗎? [00:04:28] OK,好。 [00:04:32] 好,那我就繼續了。 [00:04:34] 這個公式其實當初我並沒有細講。 [00:04:39] 但是這一個精神就是說。 [00:04:41] 因為我們知道這個Sparse Matrix。 [00:04:44] 然後用IDF來表示一個Document。 [00:04:47] 然後我們把Query跟Document都用這種方式來描述。 [00:04:52] 然後算向量的相似度這樣子。 [00:04:55] 所以當初我們一個重點就是說BM25其實它就是在這樣的一個Space Model裡面去算Query跟Document的相似度。 [00:05:07] 這個公式其實也是TFIDF之間的關係。 [00:05:09] 那我並沒有細講。 [00:05:15] 不過可能有一個概念可以再提一下。 [00:05:20] 大家其實再細看這個公式。 [00:05:22] 就可以發現前面是這個IDF的式子。 [00:05:29] 這個Q其實基本上是跟Query有關的term。 [00:05:33] 因為它其實算內積的時候。 [00:05:36] 它其實只算跟Query有出現。 [00:05:38] 所以基本上它其實就算在這個Document有出現這個Query這個term的frequency。 [00:05:45] 所以這個F function其實是frequency的一個概念而已。 [00:05:49] 所以你先不要看後面這些。 [00:05:51] 其實你看了這個F你就大概知道說它其實就是在算Query有出現的term的這個TFIDF的這樣的一個成績。 [00:06:02] 就是內積的這樣子。 [00:06:04] OK。 [00:06:05] 那BM25之所以它會有一些參數可以調整。 [00:06:10] 重點就是在於是說。 [00:06:12] 因為你們知道TFIDF它其實TF就算次數。 [00:06:17] 那算次數這種東西其實對於大的文章小的文章是非常的權重是非常不一的。 [00:06:25] 比如說一篇文章只有寫五個字。 [00:06:27] 然後另外一篇文章寫五萬個字。 [00:06:29] 那五萬個字出現的frequency一定就相當的高。 [00:06:33] 所以我們之前也有提到一些。 [00:06:34] 正規化的機制。 [00:06:37] 那在BM25裡面它這樣的一個公式它其實是想要去。 [00:06:43] 利用一些參數來控制說它對於frequency的增加的敏感度。 [00:06:50] 所以其實這個這個AVGDL其實是所有document的平均的size。 [00:07:02] 所以這個只是一個constants。 [00:07:04] 就是有點像是比重說你現在這篇文章跟整個document size的大小的一個ratio。 [00:07:13] 那這個也是一個調整的。 [00:07:15] 不過它基本的量你大概可以用這個公式來看。 [00:07:18] 它其實它的TF就是靠這個K的這個值去做一點調整。 [00:07:24] 這K的值的調整你會發現說。 [00:07:28] 我這個turn frequency其實會對於比如說我是一個短文章。 [00:07:33] 我這個頻率從一次到兩次。 [00:07:36] 或者是從100次到101次。 [00:07:40] 因為都是多一次。 [00:07:42] 但是多一次在這個公式裡面呢。 [00:07:44] 它其實它成長的幅度是不一樣的。 [00:07:47] 成長幅度是不一樣的。 [00:07:49] 所以它可以用這個K呢。 [00:07:51] 其實是K1標準上是K1。 [00:07:53] 但是我當初頭裡面寫K啦。 [00:07:55] 不過就把它補上K1。 [00:07:57] 不過它這只是一個index。 [00:08:00] 那。 [00:08:01] 那它就用這個K來調整說。 [00:08:03] 好吧。 [00:08:04] 那我現在要讓這個turn frequency的成長的敏感度到什麼地步。 [00:08:10] 所以你自己可以畫這個曲線。 [00:08:12] 就是說如果我K1帶2。 [00:08:15] 或是帶20。 [00:08:17] 它這個turn frequency。 [00:08:19] 就是你本來的這個low frequency呢。 [00:08:21] 會轉換到真正的BM25 turn frequency的一個ratio是什麼這樣子。 [00:08:27] 所以之所以可以。 [00:08:30] 它會比一般的TFIDF好。 [00:08:32] 就是說它有對一個這樣的東西做Normalization。 [00:08:35] 當然另外一個參數是B啦。 [00:08:37] 那這個就是另外一個調整的機制這樣子。 [00:08:41] 那另外當然IDF它也有。 [00:08:43] 它也不是一個正規的IDF。 [00:08:45] 它其實也有做一些。 [00:08:47] 其實跟我們前面講的那個一樣。 [00:08:49] 就是它有一個Normalization的機制這樣子。 [00:08:51] 所以我才會摘要是說OK好。 [00:08:55] 它就是一個改良版的TFIDF。 [00:08:57] 所以其實你大概就有這種精神。 [00:09:00] 那。 [00:09:01] 如果你在用BM25的時候。 [00:09:03] 基本上你也不會設這些參數。 [00:09:05] 就是D4就是這樣。 [00:09:07] 當然你覺得。 [00:09:08] 我的BM25好像跑的不是很好。 [00:09:10] 那也許你可以試著改這個東西。 [00:09:13] 不過通常現在也不太會去改。 [00:09:15] 因為它有點像是一個Base Line。 [00:09:20] 或者是說。 [00:09:21] 你居然你講的BM25。 [00:09:23] 那它就大家都知道它的行為跟參數的設定就是這樣子。 [00:09:27] 所以這大概是BM25的一個衝了。 [00:09:29] OK。 [00:09:31] 好。 [00:09:32] 那我們就跳回。 [00:09:45] 其實我們的W2的投影片跟W1其實。 [00:09:49] 其實本來是接在一起的。 [00:09:51] 它只是說。 [00:09:52] 這投影片實在太長。 [00:09:54] 就把它切掉這樣子。 [00:10:03] 這個OK嗎? [00:10:12] 感覺我們這系統Temperature蠻高的這樣。 [00:10:16] 每次都不太一樣。 [00:10:18] 上次。 [00:10:21] 我們有提到這個Facility的。 [00:10:24] 的問題。 [00:10:26] 就是在計算這個東西。 [00:10:28] 是用來。 [00:10:30] 度量一個Language Model的。 [00:10:32] 對於你的Data Set Alignment的過程。 [00:10:35] 的一個標準。 [00:10:37] 那當然這個東西其實它可以用來度量很多東西。 [00:10:40] 這其實是。 [00:10:42] 我們上次有提到的部分。 [00:10:44] 那。 [00:10:45] 那以前在做Language Model這件事情。 [00:10:50] 因為基本上不是用模型去Change的。 [00:10:52] 所以基本上我們會說。 [00:10:54] 我們就用機率的概念。 [00:10:56] 把這樣的東西切成N-Grant的。 [00:10:58] 假設去做。 [00:11:00] 那。 [00:11:02] 之前我們列一個公式。 [00:11:04] 那發現說。 [00:11:05] 這個Grant太長的時候。 [00:11:07] 我算這個Probability其實有點困難。 [00:11:10] 所以一開始呢。 [00:11:11] 我們可能會先採用所謂的Bigrant Model。 [00:11:14] 就是。 [00:11:15] 下一個字。 [00:11:16] 這個字。 [00:11:17] 它只會跟前一個字出現機率有關。 [00:11:20] 就是一個Bigrant Model。 [00:11:22] 就是兩兩之間的關係。 [00:11:24] OK。 [00:11:25] 所以基本上用Bigrant Model。 [00:11:27] 我們就不用去計算說。 [00:11:29] 哇。 [00:11:30] 這個T-H-E在這一串字的後面。 [00:11:33] 出現了Probability。 [00:11:34] 這樣子。 [00:11:35] OK。 [00:11:36] 那。 [00:11:37] 這樣的東西其實。 [00:11:38] 是一個很簡單的概念。 [00:11:40] 但是它。 [00:11:41] 呃。 [00:11:42] 表現就會。 [00:11:44] 就會。 [00:11:45] 呃。 [00:11:46] 不太一樣啦。 [00:11:47] 就是跟我們之前在用簡單的方式。 [00:11:49] 在計算的時候就不太一樣。 [00:11:51] 但是當然你會覺得是說。 [00:11:53] 誒。 [00:11:54] 我當然是Grant越長越好。 [00:11:56] 記憶力越高。 [00:11:57] 這樣。 [00:11:58] 越能夠Catch。 [00:11:59] 這樣的東西。 [00:12:00] 但是它的計算複雜度就。 [00:12:02] 就很高。 [00:12:03] 這樣子。 [00:12:04] OK。 [00:12:05] 那。 [00:12:06] 這樣的東西。 [00:12:07] 其實也跟我們之前有提到。 [00:12:08] 那個Mockup的。 [00:12:09] 的。 [00:12:10] 它做的東西。 [00:12:11] 其實。 [00:12:12] 也是Based on這樣的精神。 [00:12:13] 其實它就雖然是看前一個字。 [00:12:15] 但是。 [00:12:16] 它會在那個前一個字的。 [00:12:18] 的。 [00:12:19] Accumulate的東西。 [00:12:21] 會進入一個。 [00:12:22] 一個Hidden State。 [00:12:23] 所以從Mockup Assumption演變出來的。 [00:12:27] 比如說。 [00:12:28] 這個Hidden Markov Model。 [00:12:30] 它其實有一些這樣的概念的延伸。 [00:12:33] 這樣。 [00:12:34] 好。 [00:12:35] 那當然。 [00:12:36] 我們如果切N-Grant來做。 [00:12:38] 比如說我給你一個。 [00:12:39] 一個Deja-Vue。 [00:12:40] 然後你誒。 [00:12:41] 好吧。 [00:12:42] 那我們就自己切N-Grant。 [00:12:43] 自己做一個Language Model。 [00:12:44] 我們不要自己Change這個。 [00:12:46] 大語言模型。 [00:12:47] 我們從語料庫裡面。 [00:12:49] 自己去做這個N-Grant Model。 [00:12:51] 其實它會有很多的問題。 [00:12:52] 當然。 [00:12:53] 我們現在還沒有用Change的方式。 [00:12:55] 我們就是算Premobility的方式。 [00:12:57] 它其實。 [00:12:59] 問題就在於說。 [00:13:00] 誒。 [00:13:01] 那我要。 [00:13:02] 我要更精確的時候。 [00:13:03] 我會。 [00:13:05] 我會去。 [00:13:06] 拉長我的Context。 [00:13:08] 我的。 [00:13:09] 我的N就會拉大。 [00:13:10] 但N拉大的時候。 [00:13:11] 其實。 [00:13:12] 這個。 [00:13:13] 計算複雜度很高。 [00:13:15] 然後呢。 [00:13:16] 最大問題通常是來自於這個Data Sparsity。 [00:13:18] 就是說。 [00:13:19] 你要所有的字。 [00:13:21] 之間的。 [00:13:22] 共同出現的機率。 [00:13:23] 或是說。 [00:13:24] 你要能夠知道說。 [00:13:25] 我講了這句話。 [00:13:27] 後面會跟著所有種的可能。 [00:13:29] 這件事情。 [00:13:30] 你要收集非常多的語料。 [00:13:32] 所以依照你的。 [00:13:33] 語料的大小。 [00:13:34] 通常你沒辦法。 [00:13:35] Catch到所有的。 [00:13:37] 所有的Concept。 [00:13:38] 所以你的Data的。 [00:13:39] 吸收度是很高的。 [00:13:41] 那吸收度很高。 [00:13:43] 會有一個問題。 [00:13:44] 就是我們在算。 [00:13:45] 條件機率的時候。 [00:13:46] 它搞不好就發生一次。 [00:13:48] 誒。就是你語料庫中。 [00:13:50] 就出現一次這樣子。 [00:13:52] 那出現一次。 [00:13:53] 你在算這個機率。 [00:13:54] 其實這個。 [00:13:55] 那個。 [00:13:56] BIOS會相當的高。 [00:13:59] 那另外一個就是說。 [00:14:01] 我如果不要拉長。 [00:14:03] 我的片段變短的時候。 [00:14:05] 片段變短比較好做。 [00:14:07] 但是。 [00:14:08] 短的時候。 [00:14:09] 我的。 [00:14:10] 這個。 [00:14:11] 字的順序的這種。 [00:14:13] 這種特性就不見了。 [00:14:14] 這樣子。 [00:14:15] 那當然。 [00:14:16] 用這種硬算的方式。 [00:14:18] 不是硬算。 [00:14:19] 就是這種。 [00:14:20] 直接。 [00:14:21] 直接。 [00:14:22] 字跟字之間的關聯。 [00:14:23] 它其實就少了一些。 [00:14:24] 比如說。 [00:14:25] 像。 [00:14:26] 像同一字啊。 [00:14:27] 這種。 [00:14:28] 這種概念的東西的延伸。 [00:14:29] 它其實彈性度就很低。 [00:14:30] 這樣子。 [00:14:31] 那所以上。 [00:14:32] 如果你用這種。 [00:14:33] 統計的方式。 [00:14:34] 去切圓。 [00:14:35] 在算的時候。 [00:14:36] 其實你會遇到一些。 [00:14:37] 比如說。 [00:14:38] 你沒看過的字。 [00:14:39] 或是很少出現的字。 [00:14:41] 其實就剛才提到。 [00:14:42] 這些Spacity的問題。 [00:14:43] 其實你都很難去計算。 [00:14:45] 那或者說。 [00:14:47] 換一個Domain。 [00:14:48] 就是。 [00:14:49] 完全不懂的。 [00:14:50] 詞彙。 [00:14:51] 或者是。 [00:14:52] 看得懂的詞彙。 [00:14:53] 但是。 [00:14:54] 它的解釋。 [00:14:55] 是不太一樣的時候。 [00:14:56] 這個其實都會有。 [00:14:57] 很大的問題。 [00:14:58] 所以。 [00:14:59] 以前的做法。 [00:15:00] 當然就是。 [00:15:01] 好。 [00:15:02] 那我們就是。 [00:15:03] 描述完。 [00:15:04] 這樣的一個。 [00:15:05] 向量之後。 [00:15:06] 其實。 [00:15:07] 我們能不能去學。 [00:15:08] 更。 [00:15:09] 更。 [00:15:10] 複雜一點。 [00:15:11] 更具有。 [00:15:12] Semantic。 [00:15:13] 含義的東西。 [00:15:14] 而不是。 [00:15:15] 直接來。 [00:15:16] 算。 [00:15:17] 這樣的。 [00:15:18] 語言的模式。 [00:15:19] 那我這邊呢。 [00:15:20] 再。 [00:15:21] 再把。 [00:15:22] 前面講。 [00:15:23] TFIDF。 [00:15:24] SPARTS FACTOR。 [00:15:25] 放在這裡。 [00:15:26] 其實主要是。 [00:15:27] 為了要代出。 [00:15:28] 後面的這種。 [00:15:29] Dense Factor的概念。 [00:15:30] 那在這邊。 [00:15:31] 當然SPARTS FACTOR。 [00:15:32] 我們其實會。 [00:15:33] 前面就提到。 [00:15:34] TFIDF。 [00:15:35] 那其實以。 [00:15:36] 以。 [00:15:37] 字的。 [00:15:38] 之間的。 [00:15:39] 貢獻性來講。 [00:15:40] 其實以前有算。 [00:15:41] 所謂的。 [00:15:42] PMI的。 [00:15:43] 這樣的概念。 [00:15:44] 就算一個。 [00:15:45] 條件機率。 [00:15:46] 共同。 [00:15:47] 出現的。 [00:15:48] 機率的。 [00:15:49] 很常拿來做的。 [00:15:50] 我們其實等一下。 [00:15:51] 可以用一個小例子。 [00:15:52] 來看一下。 [00:15:53] 用。 [00:15:54] 這個PPMI。 [00:15:55] 怎麼做一個。 [00:15:56] Vector。 [00:15:57] 一個Turn的。 [00:15:58] Vector的表示。 [00:15:59] OK。 [00:16:00] 那。 [00:16:01] 顧名思義。 [00:16:02] 這個SPARTS FACTOR。 [00:16:03] 就是它一個稀疏。 [00:16:04] 啊。 [00:16:05] 稀疏其實它是一個。 [00:16:06] 在高維空間。 [00:16:07] 然後。 [00:16:08] 大多數都是0。 [00:16:09] 因為你可以想像。 [00:16:10] 我們當初的。 [00:16:11] Vector Space Model。 [00:16:12] 如果是一個。 [00:16:13] 三萬個字的。 [00:16:14] 字典的時候。 [00:16:15] 一篇文章。 [00:16:16] 三百個字。 [00:16:17] 其實它大概只有。 [00:16:18] 1%的。 [00:16:19] 1%的。 [00:16:20] 這個。 [00:16:21] 數值是有1的。 [00:16:22] 所以它。 [00:16:23] 我們會叫它。 [00:16:24] SPARTS FACTOR的。 [00:16:25] 概念是這樣。 [00:16:26] 那這邊。 [00:16:27] 在RECAP下。 [00:16:28] 這個TFITF的。 [00:16:29] 的。 [00:16:30] 那。 [00:16:31] 這其實也是我們。 [00:16:32] 前面有提到。 [00:16:33] 的部分。 [00:16:34] 那。 [00:16:35] 也有秀說。 [00:16:36] 這些東西。 [00:16:37] 其實是有。 [00:16:38] 很多的。 [00:16:39] 變形。 [00:16:40] 有很多。 [00:16:41] 根據你的。 [00:16:42] 你的。 [00:16:43] 假設的。 [00:16:44] 一些變形。 [00:16:45] 好。 [00:16:46] 所以你。 [00:16:47] 你算完這個之後呢。 [00:16:48] 你的。 [00:16:49] 這是你原來那一句話。 [00:16:51] 這是你得到的。 [00:16:52] 這個SPARTS FACTOR。 [00:16:53] 你會發現。 [00:16:54] 有出現這個字呢。 [00:16:55] 它有一個FREQUENCY。 [00:16:57] 但是沒有出現這個字呢。 [00:16:58] 它就是。 [00:16:59] 就是0。 [00:17:00] 這樣子。 [00:17:01] 這個當然是為了簡化。 [00:17:03] 不然。 [00:17:04] 這不見得會是這個順序。 [00:17:06] 你的VACTOR. [00:17:07] VACTOR SPACE MODEL。 [00:17:08] 不見得這個字的順序。 [00:17:09] 是這樣。 [00:17:10] 只是用來。 [00:17:11] HIGHLIGHT說。 [00:17:12] 有。 [00:17:13] 有這個字的。 [00:17:14] FREQUENCY會是。 [00:17:15] 出現。 [00:17:16] 其他這些。 [00:17:17] 都是0。 [00:17:18] 這樣子。 [00:17:19] 這個大概就是用TFIDF來描述一個文章。 [00:17:22] 的一個VACTOR的。 [00:17:24] 這樣的一個想法。 [00:17:27] 好。 [00:17:28] 那當然這件事情我們前面有提到說。 [00:17:30] 那你需不需要斷詞。 [00:17:32] 需不需要取這個關鍵字。 [00:17:34] 我需要做STEMMING。 [00:17:35] 或是做FITUAL SELECTION。 [00:17:37] 其實這邊取的FITUAL SELECTION這件事情。 [00:17:39] 就跟前面我講。 [00:17:41] 要不要取關鍵字。 [00:17:42] 要不要去兜出更長的詞。 [00:17:45] 或是有意義的TOKEN。 [00:17:46] 其實是一樣的。 [00:17:48] 那。 [00:17:49] 這個。 [00:17:50] 這個動作其實在以前。 [00:17:52] 在以前。 [00:17:53] 就是在DANCE FACTOR。 [00:17:54] 其實也是。 [00:17:55] 需要。 [00:17:56] 只是DANCE FACTOR的時候。 [00:17:58] 我們不見得會去人工去。 [00:18:00] 做這件事情。 [00:18:01] 而是讓模型去學會。 [00:18:03] 我們該取。 [00:18:04] 什麼樣的FITUAL。 [00:18:05] 這樣子。 [00:18:06] 好。 [00:18:08] 但是其實這個。 [00:18:10] 問題以前就提過了。 [00:18:11] 它其實是一個稀疏。 [00:18:13] 然後。 [00:18:14] 第一個。 [00:18:15] 它要完全一樣的東西才會。 [00:18:17] 才會能夠HIT的到。 [00:18:18] 那個概念。 [00:18:19] 而且。 [00:18:20] 它其實是非常不。 [00:18:22] 不均勻分佈的一個東西。 [00:18:25] 因為你可以想像。 [00:18:26] 這麼稀疏的東西。 [00:18:28] 那很多的概念。 [00:18:29] 它其實是散落在。 [00:18:30] 空間。 [00:18:31] 而且是可能很聚集的點。 [00:18:33] 這樣子。 [00:18:34] 那這邊舉的例子是說。 [00:18:36] 這兩個字其實是。 [00:18:37] 一樣的意思。 [00:18:38] 但是。 [00:18:39] 以BACTER來表示的時候。 [00:18:40] 它就是完全不同的。 [00:18:42] 那這邊我秀一下這個。 [00:18:44] PPMI。 [00:18:45] 它其實。 [00:18:46] 以前在統計。 [00:18:47] 在。 [00:18:48] 進入NLP的這個。 [00:18:50] 時間點。 [00:18:51] 它其實就。 [00:18:53] 在大量的資料的。 [00:18:55] 一個Background下。 [00:18:56] 它。 [00:18:57] 大家覺得它還蠻有用的。 [00:18:59] 我們來看它怎麼做。 [00:19:00] 我們先來看。 [00:19:02] 這個公式。 [00:19:03] Mutual Information。 [00:19:04] 這其實還蠻常在。 [00:19:06] 這個做。 [00:19:07] 尤其是。 [00:19:09] 做。 [00:19:10] 資料分析。 [00:19:11] 或是。 [00:19:12] 機器學習的一些。 [00:19:13] 評估上。 [00:19:14] 也常用這種Mutual Information的。 [00:19:16] 角度去算。 [00:19:17] 它其實在算。 [00:19:18] 兩個EVENT XY。 [00:19:20] 就是共同發生的。 [00:19:22] 一個。 [00:19:23] 一個。 [00:19:24] 一個度量值。 [00:19:25] 就是。 [00:19:26] 呃。 [00:19:27] Mine。 [00:19:28] 就是它們之間有。 [00:19:29] 多有關係。 [00:19:30] 所以你看這個公式。 [00:19:31] 大家就知道是說。 [00:19:32] 個別發生的。 [00:19:33] 機率當分母。 [00:19:35] 然後。 [00:19:36] 它們一起發生的。 [00:19:37] 當分子。 [00:19:38] 所以如果。 [00:19:39] X跟Y。 [00:19:40] 其實是完全沒有相關的。 [00:19:41] 沒有相關的東西。 [00:19:43] 那。 [00:19:44] 我這個。 [00:19:45] 分子。 [00:19:46] 跟分母是。 [00:19:47] 完全一樣的。 [00:19:48] 因為它是獨立世界。 [00:19:49] 我就把它相稱。 [00:19:50] 所以。 [00:19:51] 所以它是得到。 [00:19:52] 這個。 [00:19:53] 完全一樣的。 [00:19:54] 就是它們之間的。 [00:19:55] 機率是。 [00:19:56] 不會互相影響的。 [00:19:58] 那。 [00:19:59] 為什麼這個以前。 [00:20:00] 在做基因學習。 [00:20:01] 會常用的。 [00:20:02] 以前這個。 [00:20:03] 我們拿到TRAINING DATA的時候。 [00:20:04] 常常會去分析說。 [00:20:05] 哪一個Future。 [00:20:06] 跟哪一個Future。 [00:20:07] 是。 [00:20:08] 有直接相關。 [00:20:09] 就是它們之間。 [00:20:10] 也許是。 [00:20:11] 有。 [00:20:12] 有一個因果關係。 [00:20:13] 或是。 [00:20:14] 有一個共同影響什麼的關係。 [00:20:17] 所以比如說。 [00:20:18] 你把身高跟體重。 [00:20:20] 放進來的時候。 [00:20:21] 你會發現。 [00:20:22] 身高跟體重。 [00:20:23] 會呈現一個比較正比的關係。 [00:20:25] 所以它們的。 [00:20:26] 這個共同出現的PROPRIETY。 [00:20:29] 就是那個高的值的分佈。 [00:20:31] 就會不太一樣。 [00:20:32] 所以。 [00:20:33] 就用這種方式。 [00:20:34] 去度量。 [00:20:35] 兩個EVENT。 [00:20:36] 或是兩個FUTURE。 [00:20:37] 之間的DISPUTION的相關性。 [00:20:39] 當然度量相關性。 [00:20:40] 這件事情有太多的。 [00:20:42] INDEX可以做了。 [00:20:43] 那。 [00:20:44] 可以算什麼。 [00:20:45] 相關係數。 [00:20:46] 或是什麼。 [00:20:47] 什麼這種。 [00:20:48] CORRELATION COEFFICIENT。 [00:20:50] 不過。 [00:20:51] 各式各樣。 [00:20:52] 那我們把這個MI呢。 [00:20:54] 用所謂的。 [00:20:56] 把。 [00:20:57] 一個字。 [00:20:58] 跟CONTEXT WORLD的。 [00:20:59] 角色。 [00:21:00] 把它放進這個公式。 [00:21:01] 它其實就是我們這邊。 [00:21:02] 所謂的POINT WISE。 [00:21:04] 的MUTUAL INFORMATION。 [00:21:06] 就是我現在。 [00:21:07] 我的TARGET WORLD。 [00:21:08] 跟我的周邊的字。 [00:21:11] 到底有沒有存在一個關係。 [00:21:13] 就是。 [00:21:14] 這個字寫在這裡。 [00:21:16] 到底是獨立的呢。 [00:21:17] 還是因為旁邊的字影響。 [00:21:19] 我才會必須寫這個字。 [00:21:21] 我們會去算這個PMI。 [00:21:23] 那PMI因為它這個是取LOG。 [00:21:26] 取LOG。 [00:21:27] 所以其實它有時候會是負的。 [00:21:29] 但是我們不希望有負的。 [00:21:31] 所以我們就定義這個叫PPMI。 [00:21:33] 它其實就是POSITIVE PMI。 [00:21:35] 其實就是把剛才那個。 [00:21:37] 那個MI的公式。 [00:21:39] 換上W跟。 [00:21:41] 那個TARGET WORLD跟CONTEXT。 [00:21:43] 把它全部的取正的字。 [00:21:45] 這樣子。 [00:21:47] 就是不會有負的字。 [00:21:49] 好。 [00:21:50] 所以一個很簡單的公式。 [00:21:51] 那我們來看一下。 [00:21:52] 我們現在如果這個。 [00:21:54] 這個例子。 [00:21:58] 我應該把原來的CONTEXT放進來。 [00:22:00] 不過。 [00:22:02] 這個是。 [00:22:03] 從某個教材。 [00:22:05] 延伸出來的。 [00:22:06] 它是一個DATASET。 [00:22:07] 小的DATASET。 [00:22:09] 然後我們去看它這邊有。 [00:22:11] 四個字。 [00:22:12] 跟這。 [00:22:13] 五個字。 [00:22:15] 那。 [00:22:17] 我這邊的。 [00:22:18] 這個情境是這樣。 [00:22:20] 我把這五個字呢。 [00:22:21] 當成所謂的CONTEXT。 [00:22:23] 你不要把它當成另外一個字。 [00:22:25] 就是有點想想像說。 [00:22:27] 我現在就是。 [00:22:28] 要對這樣的一個問題。 [00:22:30] 做這個。 [00:22:31] 五個。 [00:22:32] 維度的。 [00:22:33] 分類。 [00:22:34] 或是這五個維度的特徵。 [00:22:36] 所以我現在指呢。 [00:22:38] 這些字。 [00:22:40] 我要算它在這五個情境下的一個分數。 [00:22:44] 其實也是另外一個字。 [00:22:46] 沒錯。 [00:22:47] 這個當然是。 [00:22:48] 那我也可以自己定義一個別的字。 [00:22:50] 只是說你可以從語料庫裡面。 [00:22:52] 去算出這些東西。 [00:22:54] 譬如說我們一開始已經定義好這五個CONTEXT。 [00:22:57] 然後我現在要算這四個字。 [00:22:59] 在這邊的。 [00:23:01] 用這五個CONTEXT來描述的。 [00:23:04] 一種表示方式。 [00:23:06] 那。 [00:23:07] 我會先算。 [00:23:09] 會先算說。 [00:23:10] 譬如說。 [00:23:11] 這個CHERRY跟COMPUTER。 [00:23:13] 這個。 [00:23:14] 在這個CONTEXT WINDOW底下共同出現的次數是兩次。 [00:23:18] 那CHERRY跟DATA是八次。 [00:23:20] 那在整個DATASET裡面呢。 [00:23:22] CHERRY總共出現四百八十六次。 [00:23:24] 這樣子。 [00:23:25] OK。 [00:23:26] 那值的我們也可以算。 [00:23:28] 因為我們現在把這個CONTEXT當成是一個。 [00:23:30] 也是一個SINGLE的WORD。 [00:23:32] 所以我也可以算這樣的。 [00:23:34] 當然你說。 [00:23:35] 老師那我們要取什麼CONTEXT。 [00:23:37] 這個。 [00:23:38] 這個就。 [00:23:39] 在我們這邊我們可以隨意的去假設。 [00:23:41] 或是說。 [00:23:42] 你覺得你的問題。 [00:23:44] 你現在這個應用。 [00:23:46] 你現在比如說要做情緒分類。 [00:23:48] 你現在要定義什麼樣的CONTEXT。 [00:23:50] 你可以自己取出那個字。 [00:23:52] 但是你待會說。 [00:23:53] 那我這個CONTEXT越多越好。 [00:23:55] 就是有點像記憶學習裡面。 [00:23:57] 我的DIMENSION越高越好。 [00:23:59] 其實是可以。 [00:24:00] 不過我們這邊先做一個這樣的例子。 [00:24:02] 那給你一個語料庫呢。 [00:24:03] 你就可以統計出這個表格。 [00:24:06] 就是。 [00:24:07] 其實有點像字跟字之間的共同出現的一個FREQUENCY。 [00:24:11] 所以你會發現說。 [00:24:12] 像INFORMATION跟COMPUTER。 [00:24:14] 很常出現。 [00:24:15] 所以它這個COUNT很高。 [00:24:17] 那這邊比較像是食物。 [00:24:20] 所以它就會跟PIE、SUGAR比較多。 [00:24:23] FREQUENCY多一點這樣子。 [00:24:25] 好。 [00:24:27] 那這個。 [00:24:28] 這個圖表做出來。 [00:24:29] 大家可能就覺得。 [00:24:30] 這跟我們當初在講SVD的過程有點像。 [00:24:34] 也是在做DOCUMENT跟TURN。 [00:24:36] 然後FREQUENCY。 [00:24:37] 然後算一些共同出現的狀況這樣子。 [00:24:40] 好。 [00:24:41] 那我們現在就用這個。 [00:24:42] 這樣的一個CORE CURRENCY的MATRIX。 [00:24:44] 去算這個PPMI。 [00:24:46] 那我們先對它做NOMINATION。 [00:24:49] 算這個。 [00:24:50] 這個出現的PROPRIETY。 [00:24:53] 就是其實。 [00:24:54] 其實演算法只是把這個當分母。 [00:24:57] 這個當分母。 [00:24:58] 去NOMINALIZE這些東西這樣子。 [00:25:00] OK。 [00:25:04] 所以我們會得到一個分數的值。 [00:25:07] 那總量我們也可以得到一個分數的一個RATIO。 [00:25:10] 就是TOTAL的FREQUENCY。 [00:25:11] 去除的這樣子。 [00:25:13] 那得到這樣的一個RATIO值。 [00:25:15] 我們就可以去計算。 [00:25:16] 譬如說。 [00:25:23] 我們要去算說。 [00:25:25] 那REFERENCE這個。 [00:25:26] 應該把它框起來。 [00:25:27] 這個SUGAR跟CHERRY。 [00:25:29] 就是CHERRY的PROPRIETY。 [00:25:31] 跟SUGAR共同出現的。 [00:25:34] 但是CHERRY本身的PROPRIETY。 [00:25:36] 是0.0415在這裡。 [00:25:39] 那SUGAR自己的PROPRIETY呢。 [00:25:41] 是這個0.0052。 [00:25:44] 那它們共同出現的是0.0021。 [00:25:48] 那我們就根據PMI的公式呢。 [00:25:51] 得到這樣一個值。 [00:25:52] 所以我算出來。 [00:25:54] 這個PPMI。 [00:25:55] 這個。 [00:25:57] 這個CHERRY這個TARGET WALL。 [00:25:59] 在SUGAR這個CONTEXT底下。 [00:26:01] 得到3.3這樣子。 [00:26:03] 那我們就可以根據這樣的方式呢。 [00:26:05] 去計算出。 [00:26:06] 我要的TARGET WALL。 [00:26:08] 在我定義好的CONTEXT。 [00:26:10] 的。 [00:26:12] 的一個PPMI值。 [00:26:14] 當然另外一種做法。 [00:26:16] 你也可以把所有的TARGET WALL。 [00:26:18] 跟所有的把。 [00:26:20] 另外的TARGET WALL。 [00:26:21] 當成是CONTEXT。 [00:26:22] 去計算這些事情。 [00:26:24] 不過計算方式其實是一樣。 [00:26:27] 那算完之後呢。 [00:26:28] 我就得到一個新的MATRIX。 [00:26:30] 那這新的MATRIX其實意思是什麼。 [00:26:32] 我就可以把CHERRY呢。 [00:26:34] 用這五個數字來表示。 [00:26:37] 0004.38跟3.3。 [00:26:40] 它就得到一個這樣的VACTORY。 [00:26:42] 那。 [00:26:43] 這個跟TFIDF其實是。 [00:26:46] 有點像。 [00:26:48] 有點像。 [00:26:49] 只是說在這邊。 [00:26:50] 我們的維度。 [00:26:51] 就不是。 [00:26:52] 我們的DIMENSION。 [00:26:53] 就不是VOCABULARY的每一個字。 [00:26:55] 而是我們定義的。 [00:26:57] 我現在的情境是什麼。 [00:26:59] 我現在情境是什麼。 [00:27:01] 而且我上面的值。 [00:27:02] 也不是FREQUENCY。 [00:27:03] 也不是IDF。 [00:27:04] 我是用MATRIX INFORMATION的概念去計算。 [00:27:07] 那你也可以自己比較。 [00:27:09] 就是說。 [00:27:10] 那如果。 [00:27:11] 我可以拿到這個文獻。 [00:27:12] 那我用TFIDF做一遍。 [00:27:14] 然後再把這個。 [00:27:18] 用PBMI算每一個TURN的表示。 [00:27:21] 然後再把這個每個表示呢。 [00:27:23] 再INVADE回去整個Document的表示。 [00:27:26] 那當然中間還是有一個INTEGRATION的過程。 [00:27:30] 你可以發現其實。 [00:27:32] 會很接近。 [00:27:33] 會很接近。 [00:27:34] 因為基本上。 [00:27:35] 就是一個貢獻性的關係。 [00:27:38] 好。 [00:27:39] 不過這個。 [00:27:40] 這個當然。 [00:27:41] 這個會比之前我們在做SVD簡單許多。 [00:27:43] 這個會比之前我們在做SVD簡單許多。 [00:27:44] 因為SVD需要拆解整個矩陣。 [00:27:46] 然後需要去做。 [00:27:47] 做這種Principle的Vector出來這樣子。 [00:27:49] 然後需要去做。 [00:27:50] 做這種Principle的Vector出來這樣子。 [00:27:51] 那這邊呢。 [00:27:52] 我們就直接。 [00:27:53] 做統計。 [00:27:54] 印算。 [00:27:55] 然後算這個PMI這樣子。 [00:27:56] 然後算這個PMI這樣子。 [00:27:57] 好。 [00:27:58] 那只是說你可以想像。 [00:27:59] 就是說。 [00:28:00] 那我就可以用貢獻性的方式。 [00:28:01] 那我就可以用貢獻性的方式。 [00:28:02] 算這種Probability。 [00:28:03] 算這種Probability。 [00:28:04] 共同出現的關係。 [00:28:05] 共同出現的關係。 [00:28:06] 我可以知道。 [00:28:07] 每一個字在我設定的情境底下。 [00:28:11] 它的程度有多少。 [00:28:13] 所以如果你的應用。 [00:28:15] 所以如果你的應用。 [00:28:16] 在這五個空間中。 [00:28:17] 在這五個空間中。 [00:28:18] 這五個維度裡面。 [00:28:19] 就有辦法在你的應用區分出。 [00:28:21] 就有辦法在你的應用區分出。 [00:28:22] 你想要的結果的時候。 [00:28:23] 其實你也可以這樣做。 [00:28:24] 其實你也可以這樣做。 [00:28:25] 就是我把Digital。 [00:28:26] 就是我把Digital。 [00:28:27] 切出這五個數字。 [00:28:28] 就代表我認為很重要的。 [00:28:29] 就代表我認為很重要的。 [00:28:30] 五個Dimension的分數。 [00:28:31] 五個Dimension的分數。 [00:28:32] 那這五個Dimension的分數呢。 [00:28:33] 那這五個Dimension的分數呢。 [00:28:34] 你可以去算。 [00:28:35] 比如說。 [00:28:36] 這個語意之間的相關度。 [00:28:37] 比如說。 [00:28:38] 這個語意之間的相關度。 [00:28:39] 或者是。 [00:28:40] 我要去計算一些距離。 [00:28:41] 我要去計算一些距離。 [00:28:42] 或者是什麼。 [00:28:43] 我都可以用這種方式來計算。 [00:28:44] 我都可以用這種方式來計算。 [00:28:45] 這個計算量就小很多。 [00:28:46] 這個計算量就小很多。 [00:28:47] 這樣子。 [00:28:48] 這是我們之前舉的一個例子。 [00:28:49] 這是我們之前舉的一個例子。 [00:28:50] 不過。 [00:28:51] 我們是。 [00:28:52] 把它用一個壓縮後的。 [00:28:53] 把它用一個壓縮後的。 [00:28:54] 叫五個。 [00:28:55] 八個Dimension。 [00:28:56] 當中一個Concept Space。 [00:28:57] 當中一個Concept Space。 [00:28:58] 來去做。 [00:28:59] 當初這個Sentiment World。 [00:29:00] 當初這個Sentiment World。 [00:29:01] 這幾個Term。 [00:29:02] 去描述這樣子。 [00:29:03] 去描述這樣子。 [00:29:04] 但這個其實已經到。 [00:29:05] Dense Vector 的。 [00:29:06] 的。 [00:29:07] 的。 [00:29:08] 的地步了。 [00:29:09] 那其實你當初這個。 [00:29:10] 的地步了。 [00:29:11] 那其實你當初這個。 [00:29:12] 這個Context的部分呢。 [00:29:13] 這個Context的部分呢。 [00:29:14] 你如果用. [00:29:15] 我們現在。 [00:29:16] 你如果word2vec去想像。 [00:29:17] 那個700多維。 [00:29:18] 或是300維的空間。 [00:29:19] 或是300維的空間。 [00:29:20] 其實有點像。 [00:29:21] 其實有點像。 [00:29:22] 只是我們這邊是。 [00:29:23] Given的字。 [00:29:24] 就是我必須知道是哪一個字。 [00:29:25] 哪一個字我才能算 [00:29:26] 但是你在做Wall-to-Vector [00:29:29] 或是一些Wall-Embedding的時候 [00:29:31] 那個維度空間 [00:29:32] 我們是不需要去給它說 [00:29:35] 第一維是什麼概念 [00:29:37] 第二維是什麼概念 [00:29:38] 它就直接用一個壓縮後的 [00:29:42] Concept的一個Dimension [00:29:44] 去度量這些東西 [00:29:46] 那怎麼去算這些東西 [00:29:48] 就是有各式各樣的方法 [00:29:50] 只是說後來都用Trend的方式 [00:29:53] 讓它去逼近我想要的語料的特性 [00:29:57] 然後去學會這些Vector的表現 [00:30:00] 就像我們當初Wall-to-Vector講的部分 [00:30:02] 所以PPMI [00:30:06] 其實你也可以把它想像是 [00:30:08] 某一種Sparse Vector [00:30:10] 只是你的Context [00:30:12] 通常我們會取比較多一點 [00:30:13] 那維度大一點 [00:30:15] 然後它就是字跟字之間 [00:30:17] 或字跟Context之間的Relation [00:30:19] 那轉換過來之後 [00:30:21] 我們希望說 [00:30:22] 這個這麼大 [00:30:24] 但是又有稀疏 [00:30:25] 好像不太有意義 [00:30:26] 這計算量又很高 [00:30:28] 然後也沒有真正Capture出 [00:30:30] 重點的Semantic的相似度 [00:30:33] 所以當然後面就所謂的Dense Vector [00:30:35] 那我們當然希望說 [00:30:39] 我們把這個稀疏性 [00:30:40] 把它破壞掉 [00:30:41] 希望這整個Dense Vector的Embedding [00:30:43] 能夠是一個比較連續型的向量空間 [00:30:47] 我不要這麼的01 [00:30:49] 或者是非常的稀疏 [00:30:51] 我希望所有的語言 [00:30:52] 都有然後能夠去 [00:30:55] 完全表現我的字的語義 [00:30:58] 但這件事情 [00:30:59] 當你在做第一個作業的時候 [00:31:00] 你可以思考一下 [00:31:01] 就是說我如果用300維度 [00:31:03] 或是768維度 [00:31:04] 去做一個字的Embedding的時候 [00:31:08] 你可以想像說 [00:31:09] 那我有點像是把人類所有的Token的表示 [00:31:15] 就用這768個數字來描述 [00:31:18] 這個以前在做機器學習的時候 [00:31:20] 你會覺得好像 [00:31:22] 不太夠 [00:31:23] 就是一個所有的人類的語言的Token [00:31:26] 怎麼可能只靠768個數字就可以足夠表示 [00:31:30] 你一定會覺得應該要到一萬維度這樣子 [00:31:33] 不過後來也發現說 [00:31:35] 其實以字的Static Wall Embedding的角色來看 [00:31:40] 那個700多其實是蠻夠的 [00:31:43] 那以Dense Vector來講 [00:31:44] 我們這邊會秀這兩個 [00:31:47] 當然這個大家都知道 [00:31:48] 是我們這個字當初的Static的Embedding [00:31:52] 那到後來所謂Contextual Embedding [00:31:54] 當然就是大家所熟知的這些BERT [00:31:57] 或是LM他們在講的事情 [00:32:00] 那我們還是在Recap下 [00:32:02] 我Embedding在看的東西 [00:32:05] 那Embedding我們是希望說 [00:32:07] 我只要靠短的東西 [00:32:09] 或是壓縮厚的東西 [00:32:11] 去把這樣的概念能夠更連續 [00:32:14] 更分散式的呈現 [00:32:16] 所以他靠這樣的表示 [00:32:19] 我們希望能夠做到更好的這件事情 [00:32:22] 其實SPARTS的東西不見得做不到 [00:32:27] 只是沒那麼好而已這樣子 [00:32:30] 那只是說以前我也想要說這個字 [00:32:33] 其實老實說以前在做IR的時候 [00:32:36] Search Engine 2000年的時候 [00:32:38] 其實並沒有這個字並沒有太被大家所這樣用 [00:32:42] 就算Wall-to-Vector出來之後 [00:32:45] 大家才會把它當成是所謂的Wall Embedding [00:32:48] 所以它比較像是一個遷路 [00:32:50] 比較像是用我一個壓縮後的空間去描述 [00:32:53] 一個更大量的語義的Space [00:32:57] 所以會用這種Embedding [00:32:59] 本身當然是變密變小 [00:33:04] 但是他也有一點是有壓縮的概念這樣子 [00:33:08] 這個例子是一個這個Analogy的例子 [00:33:11] 就對比的例子 [00:33:12] 這也是在裡面第一個作業會做到的部分 [00:33:15] 那其實在這種對比的 [00:33:17] 或是說你做Wall Embedding的東西 [00:33:19] 其實他有很多很有趣的東西 [00:33:22] 包含這邊我提到的 [00:33:23] 是這種Semantic Drift [00:33:26] 就是語義的概念的飄移 [00:33:30] 就是比如說我這邊提到這個Broadcast [00:33:33] 這Broadcast其實在以前可能會講的是 [00:33:38] 因為他其實你可以想像做Wall Embedding [00:33:40] 大概不外乎是跟其他字共同出現 [00:33:44] 去算一些Relations出來 [00:33:46] 那以前在講Broadcast可能是廣播電臺 [00:33:50] 或者是什麼 [00:33:51] 但是後來的 [00:33:53] 媒體也變成電視 [00:33:55] 變成報紙什麼什麼之類的 [00:33:58] 甚至你現在可能做Broadcasting [00:34:01] Broadcast的東西也許是在網路上 [00:34:03] 真正Physical的東西的Broadcast [00:34:06] 所以這個字的概念 [00:34:08] 或是說跟他共同出現的字的分佈 [00:34:11] 會隨著年份有所不同 [00:34:15] 所以如果 [00:34:16] even你只是用Wall-to-Vector這麼簡單的Model [00:34:20] 只要你有很長的時間的語料庫 [00:34:23] 你就可以辦法做這件事情 [00:34:26] 比如說你就 [00:34:27] 這個你有 [00:34:29] 可能有100年的資料 [00:34:31] 你就10年切一組 [00:34:34] 10年然後每一個給這個每一個字一個編號 [00:34:37] 比如說這叫Broadcast1 Broadcast2 [00:34:40] 那你就根據這樣10個Broadcast去算 [00:34:43] 把它當成不同的字 [00:34:45] 然後你就可以算出 [00:34:47] 發現他們的字 [00:34:49] 其實他們的Vector表現是不太一樣 [00:34:51] 那這個另外一個例子是 [00:34:55] Network [00:34:58] 當然這種越Genial的Term [00:35:00] 其實他本來 [00:35:02] 他本來涵蓋的概念就多了 [00:35:04] 只是說後來他的 [00:35:05] 每個年份 [00:35:06] 每個議題的重點會不太一樣 [00:35:08] 所以他很容易會造成這種Semantic Drip的狀況 [00:35:12] 這樣子 [00:35:14] OK [00:35:15] 那其實這樣的東西 [00:35:16] 其實他 [00:35:20] 這是一個好像很正面的現象 [00:35:22] 但其實這種用貢獻性來做這些 [00:35:25] 其實會有很大的問題 [00:35:27] 就是說 [00:35:29] 我們等一下會秀一下說 [00:35:46] 這是新的嗎 [00:35:49] 好 [00:35:49] 沒關係 [00:35:49] 我用嘴巴講 [00:35:51] 就是在以前那個年代 [00:35:54] 大概在2000年代的時候 [00:35:56] Google的演算法有很多是靠著所謂Anchor Tags [00:36:01] 就是比如說 [00:36:03] 就是連接到一個學校 [00:36:06] 然後你希望這個比如說Stanford [00:36:10] 好 [00:36:11] 那你會擺在個人網頁 [00:36:13] 你會放一個連接 [00:36:15] 當然你會寫Stanford [00:36:16] 但是你可能會寫說 [00:36:17] 這是你心目中最好的一個大學 [00:36:21] 這樣子 [00:36:21] 你會用那個Anchor Tags去描述 [00:36:24] 你要連接到的東西 [00:36:26] 所以以前當時在Google剛起來的時候 [00:36:29] 它其實Anchor Tags [00:36:31] 其實它是一個很重要去度量 [00:36:34] 這個網頁的一個特徵 [00:36:37] 當然它這是一個正面的 [00:36:39] 但是後來大家發現 [00:36:41] Google有這個特性之後 [00:36:43] 就假造了很多假的Anchor [00:36:47] 就是你做了很多假網頁 [00:36:50] 然後上面都用一些很負面的Anchor Tags [00:36:56] 然後連接到這個個人網頁 [00:36:59] 就是你很容易可以造這種東西 [00:37:02] 因為都是你自己做 [00:37:03] 你只要擺連接 [00:37:05] 比如說你把它指到學校的首頁 [00:37:08] 然後你就說 [00:37:09] 這個學校很爛這樣子 [00:37:11] 然後你就造了一大堆這樣的連接 [00:37:14] 然後Google就會把它Cloud回去 [00:37:16] 然後算一算之後發現 [00:37:18] 這個被指到的這個連接 [00:37:20] 就會帶有這些負面的概念 [00:37:23] 所以以前這樣的東西出來之後 [00:37:27] Google本來不覺得怎樣 [00:37:29] 就是你了不起 [00:37:30] 只能做幾個假的Anchor [00:37:32] 但是後來這個自動化的工具出來之後 [00:37:36] 這個Anchor就太多很容易造假的部分 [00:37:41] 所以當初有所謂的這種Google的Bomb [00:37:46] 就是它其實名稱就叫Google Bomb [00:37:48] 就是Google炸彈 [00:37:50] 就是我可以用這種方式去做 [00:37:53] 去讓某些人的網頁的排名下降 [00:37:58] 甚至我要去對一些 [00:38:00] 尤其是政治人物 [00:38:02] 我要給他一些很負面的詞彙的時候 [00:38:04] 我就可以利用這種方式去做 [00:38:06] 因為這個掌控權都在自己 [00:38:08] 因為網頁自己做的 [00:38:10] 連接你自己放 [00:38:11] Anchor text你自己設計 [00:38:13] 所以都可以這樣做 [00:38:14] 所以有點 [00:38:15] 就抓住他們在計算演算法的這種 [00:38:18] 貢獻性的詞彙之後 [00:38:20] 你就可以做造假這種東西 [00:38:23] 那這個東西其實一直有在用 [00:38:26] 其實一直有在用 [00:38:26] 其實像 [00:38:29] 你如果有機會去下載 [00:38:32] 比如說川普 [00:38:34] 他在競選總統時候的言論 [00:38:37] 或者是新聞稿 [00:38:38] 或者是什麼 [00:38:39] 你可以把它的東西抓出來之後 [00:38:42] 你會發現他在形容對手的時候 [00:38:46] 都一定會加一些很負面的形容詞 [00:38:50] 這樣子 [00:38:52] 像這其實是事實 [00:38:53] 都有點統計過 [00:38:54] 像當初他就會說這個拜登 [00:38:58] 叫做sleepy joe [00:39:00] 就是愛睡覺的這樣子 [00:39:02] 他就會前面放一些 [00:39:04] 比較不是這麼誇張 [00:39:06] 但其實是負面的形容詞去形容對手 [00:39:09] 那隻要他不斷提到這個事情的時候 [00:39:13] 這個對手常常在搜尋 [00:39:16] 在搜尋運行在搜尋的時候 [00:39:18] 通常就會被很容易被帶到這種 [00:39:20] 比較負面的概念進去 [00:39:23] 這樣子 [00:39:24] 那這個當然是有點像是道高與子 [00:39:28] 魔高與藏這種東西 [00:39:29] 就是你怎麼去破壞各種的ranking的機制 [00:39:33] 然後達到你想要的效果 [00:39:37] 當然以前搜尋運行剛剛很正常的樣子 [00:39:38] 當然以前搜尋運行剛剛很正常的樣子 [00:39:38] 當然以前搜尋運行剛剛很正常的樣子 [00:39:38] 當然以前搜尋運行剛剛很正常的樣子 [00:39:38] 當很重要很紅的時候 [00:39:40] 就有這種SEO的公司 [00:39:42] 幫你去做一些最佳化 [00:39:45] 就排名最佳化 [00:39:46] 一個新公司出來之後 [00:39:47] 你可能不會被搜尋到 [00:39:49] 你就付一些錢給這些公司 [00:39:52] 他就可以幫你做一些內容農場 [00:39:54] 然後去導引到你的網站 [00:39:56] 然後去promote你的東西這樣 [00:39:58] 其實那個其實是 [00:40:01] 也有正面也有負面的case [00:40:04] 不過anyway [00:40:05] 這個可能就大家自己在想象 [00:40:07] 好 [00:40:08] 好 [00:40:08] ,我們當初提了what-to-vector這兩個方式 [00:40:13] 你用這個這樣的一個角色去講 [00:40:15] 就比較知道是說 [00:40:17] 我在做C-Ball的時候 [00:40:18] 其實我是根據這個context [00:40:21] 去predict我現在的target [00:40:23] 那這個在 [00:40:28] 這有點像磕漏字 [00:40:30] 有點像我們後面要提到這個masking [00:40:32] language model在做的事 [00:40:34] 但是其實上以我們這個當初在做 [00:40:37] what-to-vector的語料庫 [00:40:38] 的取得的時候 [00:40:40] 其實我覺得這種角色 [00:40:42] 這種方向是比較容易訓練 [00:40:44] 就是我只要去抓我這個中間這一個字 [00:40:48] 然後他周邊的字predict他可能是哪些 [00:40:52] 這個在training data上是比較直覺 [00:40:55] 當然不是說有很大差別 [00:40:59] 但是我覺得用這種訓練方式 [00:41:01] 可能比較容易理解 [00:41:04] 這個是我們當初有提到這樣的一個角色 [00:41:07] 其實就是 [00:41:08] 就是這一個兩層的NN [00:41:12] 其實我們在上一W1的投影片後面有提到 [00:41:17] 那其實 [00:41:19] 他整個一個flow [00:41:21] 當然就是以一個兩層的NN的training的過程 [00:41:26] 那我需要有supervised data [00:41:28] 所以我們說我們會根據語料做一個sliding window [00:41:32] 切這樣的一個pair [00:41:33] 這個pair其實都是positive example [00:41:37] 就是A有共同處理的 [00:41:38] A有共同出現的字碼 [00:41:40] 但是機器學習我們需要negative sample [00:41:44] 這樣才比較知道告訴模型說他應該是 [00:41:49] 這個是yes這個是no這樣子 [00:41:51] 這個模型才知道算這樣的一個分數去算loss [00:41:55] 當然這樣講不見得是這麼嚴謹 [00:41:57] 不過一般機器學上都會需要所謂negative sample [00:42:00] 而且negative sample選擇相當重要 [00:42:05] 因為你如果隨便選 [00:42:06] 如果隨便選模型 [00:42:08] 很聰明 [00:42:09] 他知道說原來這次考試這麼簡單 [00:42:12] 這個看起來就是很明顯的negative [00:42:15] 我就就隨便回答就好了 [00:42:18] 那這個問題其實我們到時候在講這個transformer [00:42:23] 在pretrain的那個時候 [00:42:25] 在講有一個NSP的train法 [00:42:28] 其實也會有negative sample選擇的不好的問題 [00:42:33] 所以其實以前如果你做過機器學 [00:42:35] 你就知道說 [00:42:37] 如果我不是一個given [00:42:38] 已經給你好的train data的時候 [00:42:41] 你要自己去建造或是選擇你所謂的positive或negative data的時候 [00:42:47] 這時候就學問就來 [00:42:50] 就是你需要好好的選擇 [00:42:52] 第一個你可能要balance [00:42:55] 就是你不能差太多這樣子 [00:42:57] 差太多其實模型也會就都回答 [00:43:01] 比如說你的negative很多 [00:43:04] 但positive只有一個 [00:43:05] 那以後模型都是回答不是這樣子 [00:43:08] 它分數就很高 [00:43:10] 那另外你也希望能夠讓這個negative [00:43:14] 越接近positive越好 [00:43:17] 有點像是說 [00:43:19] 這個考試難度要增加 [00:43:21] 不是讓他很容易就可以判斷這一題的對錯 [00:43:25] 他必須要稍微思考一下 [00:43:27] 必須要模型要稍微去看一下說 [00:43:30] 原來隨便答的是會錯的 [00:43:32] 所以他必須要探究更細的特徵跟差距值的時候 [00:43:36] 模型才能學到一些相似的東西 [00:43:38] 細的美感這樣子 [00:43:40] 但是這句話其實也是有trade-off [00:43:44] 就是很容易會有一些over-fitting的狀況 [00:43:48] 我想這個在做基因學習的過程 [00:43:51] 應該如果你有經驗 [00:43:52] 大概可以體會出這種感覺 [00:43:54] 不過在做Wall-to-Vector的時候 [00:43:56] negative選擇非常重要 [00:43:59] 因為一個字在整個vocabulary裡會出現 [00:44:04] 跟它共同出現的字是在佔整個詞彙的位置 [00:44:08] 因為這個詞彙的比例非常低的 [00:44:10] 那你不太可能把 [00:44:12] 比如說你用一萬維度的vocabulary size [00:44:15] 那每一個字了不起就是十個字跟它共同出現 [00:44:19] 你不太可能把所有的9990個都算成negative sample [00:44:25] 第一個非常不balance [00:44:27] 第二個你要算這所有東西的cost相當的高 [00:44:30] 那你可以再去看一下Wall-to-Vector本身 [00:44:35] 它在做training data的sampling的時候 [00:44:38] 它的一個process是什麼 [00:44:40] 它其實是有一個 [00:44:42] 裡面有各式各樣的做法 [00:44:44] 但是一般都是會用一個簡單的sampling方式 [00:44:47] 它不會去sample所有的case出來去算loss [00:44:50] 它只會跟你的training data一個比例 [00:44:54] 去對照那個positive跟negative去算那個loss [00:44:59] 當然也有不同的做法 [00:45:02] 你可能可以用這個Hoffman的方式 [00:45:05] 以code這些每一個vocabulary來做 [00:45:08] anyway你可以去看一下它的細節 [00:45:12] 這個用這個regression的角度來看這件事情 [00:45:17] 其實跟我們原先的那個NN在做的其實是一樣的 [00:45:21] 只是說我們在後面的Wall-to-Vector其實 [00:45:27] 一般都是用我們前面講那樣的一個簡單的NN的方式 [00:45:34] 在做這件事情 [00:45:36] 那只是說 [00:45:37] 勸完之後的模型 [00:45:39] 勸完之後的模型它只能做一件事 [00:45:46] 它就是給一個字 [00:45:48] 然後它去預測跟它的context的perplexity [00:45:52] 但這個模型其實不是我們要 [00:45:54] 這個模型能夠output的東西不是我們要的東西 [00:45:59] 我們要的是它勸出來這個第一層的weight [00:46:03] 因為第一層的weight [00:46:05] 在這樣的一個語義的表示的空間 [00:46:08] 其實是一個 [00:46:09] 一個space vector [00:46:11] 透過一個學習的過程 [00:46:13] 轉換出我要的一個embedding的space的呈現 [00:46:18] 比如說這個字 [00:46:20] 我在這300個NN裡面應該要用哪些數字來表示 [00:46:24] 透過這些數字的表示之後 [00:46:26] 我可以靠著它的一個weighted sum [00:46:31] 就是第二個矩陣的學習的過程 [00:46:34] 比如說我這個字的維度是 [00:46:37] 應該第一個維度跟第三個維度乘以多少 [00:46:40] 然後就可以構成 [00:46:42] 這個字典裡的第一個字的共同出現的perplexity [00:46:46] 這個也是學出來的 [00:46:48] 只是說我們其實是用第一層學會的結果 [00:46:52] 去轉換出我的字的embedding的分佈 [00:46:59] 然後第二個metric [00:47:01] 其實是把這樣的一個wall embedding [00:47:04] 靠著某種組合 [00:47:06] 學到來組合去預測這個字的 [00:47:10] 共同出現的一個perplexity [00:47:13] 這也是我們當初講過embedding比較強調的部分 [00:47:17] 不然它就是一個非常小的NN的metrics [00:47:21] 好 [00:47:28] 這是在計算的過程 [00:47:30] 這個summax就看了 [00:47:33] 其實在predict最後的perplexity [00:47:36] 那我這邊舉一個例子 [00:47:38] 這是一個target wall [00:47:41] ABC三個字 [00:47:43] 其實這個字 [00:47:44] 這個例子 [00:47:46] 只是讓大家感覺一下這個計算過程 [00:47:49] 因為這個U其實是 [00:47:53] 它並不是ABC的embedding [00:47:56] 而是這個 [00:47:58] 我們後來學到第二層的那個metric [00:48:01] 那個weight [00:48:03] 跟我現在target wall這個embedding之間 [00:48:06] 該怎麼去做一個weighted sum [00:48:09] 去得到這個字的一個perplexity [00:48:12] 這樣子 [00:48:13] 它只是說我們 [00:48:14] 我們這個例子是告訴你說 [00:48:16] 我這樣乘出來之後 [00:48:17] 我再做一個這個neuron的 [00:48:20] 這樣的一個計算summax的方式 [00:48:23] 然後去得到這個值 [00:48:27] 所以最後的perplexity就是 [00:48:29] 我看到這一個target wall之後 [00:48:31] 我的ABC它共同出現perplexity是這樣 [00:48:36] 其實大概只是帶用這個例子 [00:48:38] 帶一下這個這個值 [00:48:42] 那你大概就可以predict說 [00:48:45] 如果我現在的vocabulary只有這三個字 [00:48:48] 那我大概就可以算出我現在的perplexity [00:48:52] 但是因為你的vocabulary很大 [00:48:54] 你可能有一萬個字 [00:48:56] 一萬個字裡面 [00:48:57] 我去算這些全部都算出來 [00:48:59] 其實cost相當高 [00:49:02] 所以我們通常會做negative sampling的地方的概念 [00:49:07] 就在這裡 [00:49:08] 好 [00:49:09] 不過這個例子只是數字 [00:49:11] 讓你帶一下這個感覺 [00:49:12] 不過大概你可以發現 [00:49:14] 它是也是一個正比的關係 [00:49:16] 也是一個正比的關係 [00:49:18] 不過因為這個本來就會對這個數值 [00:49:21] 做一個normalization [00:49:22] 然後有些東西會有點壓縮 [00:49:25] 所以當然它並不是一個很線性的部分 [00:49:29] 好 [00:49:33] 這其實大概就是在在recap下 [00:49:35] 這些Value to Vector的東西 [00:49:38] 那 [00:49:39] 這個東西其實隨著大家在使用上 [00:49:44] 覺得這種東西 [00:49:45] 如果是一個static的角色的時候 [00:49:47] 它就有時候不是這麼好用 [00:49:50] 或者根本是不對的東西 [00:49:52] 所以我們希望做一個叫contextual embedding [00:49:55] 就是我會隨著前後文的東西 [00:49:58] 這個字的表示就會有所不同 [00:50:01] 這當然大家覺得現在好像都是這樣 [00:50:04] 但是其實在Value to Vector那個年代 [00:50:07] 其實大家也想這樣 [00:50:09] 只是做不太到這樣子 [00:50:11] 所以從Value to Vector到後面的transformer [00:50:15] 這個過程 [00:50:16] 大家就一直希望從所謂的Value embedding [00:50:20] 轉換到這種contextual embedding [00:50:22] 能夠去capture這個字 [00:50:24] 同樣的字在這個句子裡面 [00:50:26] 該有什麼樣不同的表示 [00:50:29] OK [00:50:31] 所以我想這個概念大家都知道 [00:50:33] 就是比如說我在蘋果公司吃蘋果 [00:50:37] 同樣一句話裡面的兩個蘋果 [00:50:39] 這概念本來就是不一樣 [00:50:41] 它應該用不同的向量的字來表示 [00:50:45] OK [00:50:46] 那這種contextual embedding [00:50:47] 當然後面就爆出大家非常重要的一個技術 [00:50:52] 就是BERT [00:50:53] 這種transformer based的這種encoder的東西 [00:50:56] 當然GPT也是 [00:50:58] 它雖然是decode [00:51:00] 但是它也可以拿來當成是這種embedding的用法 [00:51:06] 那這種context會影響字 [00:51:08] 大家用這個例子 [00:51:09] 大家可能比較有感覺 [00:51:10] 這是網路上的一個Cast [00:51:12] 這其實是一張圖片 [00:51:15] 那這個影像辨識器 [00:51:17] 把這隻 [00:51:19] 因為它頭也沒看到 [00:51:20] 把它視成Tiger [00:51:23] 為什麼 [00:51:24] 它其實它是一隻狗 [00:51:25] 這看起來像拉不拉多 [00:51:27] 這一隻狗在透過這個欄杆的影子的照射下 [00:51:30] 它有老虎的斑紋 [00:51:33] 那這個意思就是說 [00:51:34] 我用這個context [00:51:36] 這就像它前後紋 [00:51:37] 這前後紋會影響原來這個物體 [00:51:40] 使它的語義的表示有所不同 [00:51:43] 這大概是這樣的一個情境的介紹 [00:51:46] 不過我想這個大家都知道 [00:51:48] 那比如說我想蘋果公司跟蘋果派 [00:51:51] 雖然兩個都是蘋果 [00:51:52] 但在這個句子裡面 [00:51:54] 這個turn [00:51:55] 它所代表的vector [00:51:57] 應該是要不一樣 [00:51:59] 當然你也可以試著用wall embedding來做 [00:52:03] 那其實有時候效果也沒有很差 [00:52:06] 因為基本上你那麼多維度裡面 [00:52:09] 應該也有一些相似的東西 [00:52:11] 其實你如果有興趣 [00:52:13] 你可以把這個birth出來的 [00:52:16] 每一個字的token去看一下 [00:52:19] 如果這個在蘋果公司持蘋果 [00:52:22] 把這兩個蘋果的 [00:52:24] 在birth出來的這個logic [00:52:27] 你去算一下它們的相似度 [00:52:30] 你就會發現好像有一點故事 [00:52:36] 那像這兩句話 [00:52:38] 它其實前面講同樣的東西 [00:52:41] 但是後面這個人不一樣的時候 [00:52:45] 你這一句話所代表的含義 [00:52:49] 對模型來講應該是不一樣 [00:52:51] 就是到底改變 [00:52:53] 怎麼改變這樣子 [00:52:55] 雖然你說字面上的意思就是 [00:52:57] 改變它的意思 [00:52:59] 但是這裡面的蘋果 [00:53:01] 跟這邊的蘋果意思也不一樣 [00:53:03] 所以如果你現在沒有birth的 [00:53:06] 這樣的技術 [00:53:08] 你想象說 [00:53:09] 如果我們只有static embedding的時候 [00:53:11] 你覺得你會怎麼做這件事情 [00:53:14] 你覺得你會怎麼做這件事情 [00:53:16] 你會說 [00:53:17] 那我就把這個蘋果 [00:53:18] 跟後面的字算一下相關性 [00:53:21] 對不對 [00:53:22] 如果我這些每一個字的token [00:53:26] 我都有一些static embedding的時候 [00:53:29] 那我算一算相似度 [00:53:31] 也許我可以找出一些 [00:53:33] 不同的度量的方式 [00:53:35] 去改變這個token [00:53:37] 說後面的字是長這個樣子 [00:53:39] 那你自己的描述 [00:53:41] 應該要做一點調整 [00:53:44] 你可以先去想這件事情 [00:53:46] 如果你的想法 [00:53:49] 就像我剛才講的那樣 [00:53:51] 這個其實就是 [00:53:52] 後面在做attention的機制 [00:53:54] 會去看的東西 [00:53:56] 就是每個句子 [00:53:57] 我們會去看說 [00:53:58] 前後字到底是什麼 [00:54:00] 然後算算一些權重 [00:54:02] 算算那個QKB的值 [00:54:04] 然後改變一下我自己的embedding [00:54:06] 然後再去做那個weight的學習 [00:54:10] 然後每過一層 [00:54:12] 我都要再去看看別人變成什麼樣子 [00:54:14] 然後再學 [00:54:15] 所以他就是不斷看別人變成什麼 [00:54:18] 然後再學新的東西 [00:54:20] 所以attention機制就是這樣出來的 [00:54:22] 所以你可以用你自己的想法去思考說 [00:54:26] 如果你要做一個contextual embedding [00:54:29] 我給你這兩個句子 [00:54:31] 你怎麼把這個蘋果 [00:54:33] 這樣的一個stack embedding [00:54:35] 變成有點不一樣 [00:54:37] 你當然會說 [00:54:40] 那我就跟後面的去做一些度量 [00:54:43] 做一些計算去幹嘛 [00:54:45] 那你自己有這樣想過之後 [00:54:48] 等在學到transformer [00:54:50] 在學到stepattention的時候 [00:54:51] 你就會比較有點感覺 [00:54:54] 原來你自己在找出生十年 [00:54:58] attention is all you need [00:55:00] 就是你寫的這樣子 [00:55:02] OK [00:55:03] 好 [00:55:04] 那當然以前我們講contextual word embedding [00:55:07] 最重要最簡單的做法 [00:55:09] 也不是最簡單 [00:55:10] 最直覺的做法就是long context [00:55:12] 反正這個字它會出現的perplexity [00:55:15] 就跟前面的字有關這樣子 [00:55:18] 這是一個基本的這樣的一個language model [00:55:22] 只是說我的context拉的比較長 [00:55:25] 但是其實我們後來 [00:55:27] 這個後面也有人做一些東西 [00:55:28] 就是說它其實不是跟前面 [00:55:30] 這個字的意義 [00:55:32] 它其實也會跟後面有關 [00:55:34] 只是說一般我們在看字的時候 [00:55:37] 或是在聽字的時候 [00:55:39] 其實都只聽到前面那個字 [00:55:41] 但是你會發現 [00:55:43] 你聽到前面這個字的意思 [00:55:46] 跟你把整句聽完 [00:55:48] 你這個字的意思其實有時候也會不一樣 [00:55:51] 所以這樣的perplexity [00:55:54] 其實也會有一點bias [00:55:58] OK [00:55:59] 那只是說以前我們是用這種比較片段 [00:56:02] 這種統計式的方式來學這件事情 [00:56:05] 但是後來發現 [00:56:06] 第一個語料沒那麼多 [00:56:08] 第二個這個計算其實也是非常恐怖的 [00:56:10] 而且有很高的spacity [00:56:13] 所以我們就讓模型來學 [00:56:17] 那你一定覺得說 [00:56:19] 那用統計跟用模型來學的差別到底是什麼 [00:56:23] 其實你可以回想一下 [00:56:26] 當初你如果有學過機器學習 [00:56:30] 如果你有用過 [00:56:32] 角色數 [00:56:34] 有用過所謂的哪一base的這種 [00:56:37] 機率的統計的分類的數的做法 [00:56:42] 然後你在對照所謂的NN [00:56:47] 就是小顆的模型的NN這樣子 [00:56:50] 它們的精神是有點不太一樣 [00:56:53] 你如果在做哪一base的時候 [00:56:55] 其實基本上 [00:56:56] 因為哪一base其實是 [00:56:58] 我們叫做ZZ的runner [00:57:00] 就是說它其實是不用學的 [00:57:02] 不用學習就是它是統計 [00:57:04] 就是說你以前看到這個特徵 [00:57:06] 是什麼什麼什麼 [00:57:08] 然後它會跟以前的case怎麼樣 [00:57:11] 它會算出一個機率 [00:57:12] 然後預測你在這class的probability是什麼 [00:57:16] 它其實根據以前發生的過程 [00:57:19] 去算出那個機率 [00:57:20] 就是哪一base的精神 [00:57:22] 但是呢 [00:57:23] 這種NN或者是比較學習的方式 [00:57:27] 它可以去延伸 [00:57:30] 或是說它可以去 [00:57:32] 看到說你這樣的pattern [00:57:34] 其實在以前的狀況底下 [00:57:36] 它應該會演變成什麼 [00:57:38] 它會多看到一些 [00:57:40] 可能是數據統計上 [00:57:42] 沒辦法告訴你的東西 [00:57:44] 但這些東西可能不見得是對的 [00:57:46] 但是通常是有幫助於 [00:57:49] 你去延伸你的訓練資料庫的 [00:57:52] 所以用統計的跟用學的 [00:57:54] 它會有一點點差距 [00:57:56] 但是可能你可以從哪一base [00:58:00] 或是基本上NN學習的過程 [00:58:03] 去想像這件事的差別 [00:58:06] 所以以前用CPU算不夠好 [00:58:10] 那為什麼用這種模型的training的角度 [00:58:15] 它就可以變得比較好 [00:58:16] 這件事情 [00:58:17] 你可能可以用這種角度去做思考 [00:58:20] 好 [00:58:21] 我們現在先不管說 [00:58:22] 怎麼學這contextual embedding [00:58:24] 假設我已經有一個這樣的 [00:58:26] contextual embedding的東西 [00:58:29] 那就表示說 [00:58:30] 我一個句子來 [00:58:32] 我就可以把它轉換成一個 [00:58:33] 電腦看得懂的Semantic的表示 [00:58:36] 而且是整句它都知道 [00:58:38] 然後我再去切換到 [00:58:40] 那我去做一些判斷 [00:58:42] 比如說我要去算 [00:58:44] 算情緒分數 [00:58:46] 或者是算這些相似度 [00:58:49] 做搜尋 [00:58:50] 做QA之類的 [00:58:52] 就可以自己設計這個東西 [00:58:54] 這個架構可能大家也不陌生 [00:58:57] 其實現在的UAM就是前面有一個 [00:58:59] 從我embedding進去的 [00:59:01] 然後它會去做encode的過程 [00:59:03] 然後當然自己可以在 [00:59:05] Pretrained的model底下 [00:59:06] 後面設計一個下游任務 [00:59:08] 去做這件事情 [00:59:10] OK [00:59:12] 那這個過程當然 [00:59:14] 整顆是你的任務 [00:59:17] 整顆是你的任務 [00:59:18] 那這個embedding呢 [00:59:19] 是一個Pretrained [00:59:21] 就是 [00:59:22] 這可能是某一個模型告訴我 [00:59:24] 你這句話應該要叫這個意思 [00:59:26] 但是有時候我們通常 [00:59:28] 因為整顆是你的任務 [00:59:30] 所以你也會有一個訓練的資料 [00:59:32] 來訓練這顆東西 [00:59:34] 因為你要做一些邏輯 [00:59:36] 所以這邊 [00:59:38] 我需不需要publicate到這邊的東西 [00:59:40] 因為它可能也是一個NN的架構 [00:59:42] 不是一個不一樣的長相的東西 [00:59:44] 你沒辦法publicate [00:59:46] 所以有時候是可以embed在一起的 [00:59:48] NN的架構的時候 [00:59:49] 有時候你就可以train together [00:59:51] 就是 [00:59:52] 這個當初是用一個common的 [00:59:55] Corpus train的東西 [00:59:56] 那我現在如果要做一個 [00:59:58] Medical application [01:00:00] 那我這邊都是Medical的一個應用的字 [01:00:03] 那我如何讓它去理解這些東西 [01:00:06] 或是說 [01:00:07] 在我這邊這個字 [01:00:08] 可能是應該要那樣的表示的時候 [01:00:10] 我可以去update我這個東西 [01:00:13] 我去update我前面這個embedding的東西 [01:00:17] 這個可能大家覺得好像很直覺 [01:00:20] 就很像你現在拿這個 [01:00:22] Pretrained Language Model [01:00:24] 再接一個下游任務 [01:00:25] 去做這個fine-tune的這件事情一樣 [01:00:28] 但是我們這邊講的只是說 [01:00:31] 我要去改變前面的embedding的東西 [01:00:34] 就是 [01:00:35] 文字進來怎麼表示 [01:00:37] 圖片進來怎麼表示 [01:00:38] 這樣的這一塊內容 [01:00:41] 那這塊內容當然 [01:00:43] 都會拿Pretrained好的東西 [01:00:45] 因為我不太可能用那麼大的語料庫去做訓練 [01:00:48] 那Pretrained好之後 [01:00:50] 我們再根據我們的Domain [01:00:53] 我們的新的Corpus [01:00:55] 去做這件事情 [01:00:56] 所以它跟現在的fine-tune [01:00:58] 它的精神是一樣 [01:01:00] 所以如果你有fine-tune過 [01:01:02] 你大概知道說 [01:01:03] 這時候我的Logs怎麼publish [01:01:06] 我的Logs都要怎麼設計 [01:01:08] 我如何讓這個有點改變 [01:01:10] 又不會把它變爛這樣子 [01:01:12] 所以這個embedding的這樣的co-training [01:01:15] 其實是一個這樣的精神 [01:01:18] 當然你也可以說我不要 [01:01:19] 我不要去動 [01:01:20] 因為你圈不太動 [01:01:21] 因為這個可能也很大這樣子 [01:01:23] 雖然這個以現在來講啊 [01:01:28] 如果是你拿Pretrain來當成 [01:01:30] 是一個Contextual Embedding的時候 [01:01:33] 你會覺得現在Pretrain很小 [01:01:35] 反正一個B點都不大的東西 [01:01:38] 但是呢這個在 [01:01:40] 在這個七八年前 [01:01:42] 這個Pretrain已經是一個 [01:01:44] 對我們來講是一個龐然大物 [01:01:46] 這個非常大的東西 [01:01:48] 這個我還記得 [01:01:49] 我們當年參加一個DiversDN的比賽 [01:01:52] 那時候只有Pretrain [01:01:54] 拿來做一些這個 [01:01:56] 我記得那個 [01:01:58] 那個比賽是一個Gender Bias [01:02:01] 就是怎麼去判斷句子裡面 [01:02:03] 有性別歧視的這件事情 [01:02:05] 當然所有的參賽隊伍 [01:02:07] 都是用BERT來做這件事情 [01:02:09] 只要我們也是用BERT [01:02:12] 但是我們是Foreign [01:02:14] 我們就BERT都不動這樣子 [01:02:16] 然後那時候其實我們數據還不錯 [01:02:19] 我們還拿到第二名 [01:02:20] 然後那時候去Post的時候 [01:02:23] 其他隊伍就也很好奇我們的做法這樣子 [01:02:27] 但是他們最好奇的是 [01:02:29] 你們為什麼要Foreign BERT這樣子 [01:02:32] 我們只能說 [01:02:34] 我們圈不太動這樣子 [01:02:36] 對他們來講他們就很不可思議 [01:02:39] BERT你們沒辦法Tune他這樣子 [01:02:42] 當然這個就跟 [01:02:44] 那個國家的算力有點關係 [01:02:46] 應該說我個人的算力不足 [01:02:49] 不過Anyway其實Foreign也有Foreign的做法 [01:02:53] 那重點是有時候你Train Together也會比較好 [01:02:56] 你只會把他搞爛而已 [01:02:58] 這樣子所以也是要評估一下 [01:03:02] 好那這邊後面會提到NN的東西 [01:03:08] 那這個可能會跟著第一堂的Lab課有點關係 [01:03:13] 第一堂Lab課其實就是教你怎麼裝PyTorch [01:03:18] 然後怎麼去做一個很簡單的NN的訓練 [01:03:21] 所以我們這邊的課程還是有帶一些NN的東西 [01:03:24] 不過這基本上應該是在 [01:03:26] 機器學習的課程會提到 [01:03:28] 那這個我在這邊就很快的帶過了 [01:03:34] 那因為一般的NN的架構 [01:03:36] 或者是說現在機器學習 [01:03:38] 或者是所謂的Deep Learning [01:03:40] 其實都是Based on這個NN的一個 [01:03:43] 這樣的一個Architecture在做 [01:03:46] 其實幾乎沒有別的選擇 [01:03:49] 幾乎沒有別的選擇 [01:03:51] 只是說這個Architecture的不同 [01:03:53] 或是說是不是你現在是不是要 [01:03:56] Transformer或不是Transformer這樣 [01:03:58] 那基本上還是NN [01:04:00] 你現在已經沒有別種的Training的方式 [01:04:03] 沒有Training的這種Model [01:04:07] 不同的Model在做這件事情 [01:04:10] 我所謂的Model是說 [01:04:12] 你不太會用以前的所謂 [01:04:14] 像什麼SVN啊 [01:04:16] Dishon Tree啊 [01:04:18] 去做這樣的事情 [01:04:20] 那一個這樣的學習的Deep Learning的Project [01:04:25] 或是一個Model [01:04:26] 它其實大概包含的 [01:04:27] 本身的模型的部分 [01:04:29] 那這個模型其實 [01:04:31] 如果你有經驗大概知道 [01:04:32] 它就是把Input跟Output之間的關聯 [01:04:35] 靠著一些Weight的方式把它串接起來 [01:04:38] 那這東西當然裡面有所謂的 [01:04:41] 這個所謂的Optimizer跟Loss Function [01:04:44] 這兩個東西其實 [01:04:49] 你應該能夠區分 [01:04:50] 如果你學過機器學習 [01:04:53] 應該知道說Loss Function是用來度量說 [01:04:56] 你現在距離目標還有多遠 [01:05:00] 就告訴你說 [01:05:01] 我現在還有十門課還沒有讀 [01:05:04] 那怎麼樣去達到這個目標 [01:05:06] 怎麼樣把這十門課讀得更好 [01:05:08] 就是你的Optimizer在做的事情 [01:05:10] 就是該怎麼走 [01:05:12] 接下來該怎麼走 [01:05:13] 一個是度量你現在還差多遠 [01:05:15] 另外一個是告訴你 [01:05:17] 接下來你的參數要怎麼改變 [01:05:19] 做這件事情 [01:05:21] 當然這些都是有標準的 [01:05:23] 或是常用的 [01:05:24] 或是什麼應用 [01:05:25] 會用什麼Optimizer [01:05:27] 用什麼Loss Function在做 [01:05:29] OK [01:05:30] 那通常你在設計的時候 [01:05:33] 這個架構你可能會改變 [01:05:36] 那你會自己設計你自己的Loss Function [01:05:39] 如果你是要做一些比較小型的Deep Learning的研究 [01:05:44] 大概會這樣 [01:05:45] Optimizer比較少 [01:05:46] 除非你想做Optimizer的研究了 [01:05:50] 這邊通常變動性不會很高 [01:05:52] 這樣子 [01:05:53] 好 [01:05:54] 那這個大概是一個 [01:05:56] 有點像比較 [01:05:58] 接陳一點 [01:05:59] 細一點的 [01:06:00] 就是你在Train一個NNN的時候的一個比較細部的過程 [01:06:04] 就是準備資料建構你的Model [01:06:07] 其實當初Deep Learning出來之後 [01:06:10] 有TensorFlow其實蠻紅的 [01:06:12] 因為它比較好入手 [01:06:14] 但是後來它包裝的太多 [01:06:16] 其實不太容易改太多的東西 [01:06:19] 所以現在多半都以PyTorch為主 [01:06:22] 那怎麼計算這整個NNN呢 [01:06:24] 我們的Loss Function其實有很多種 [01:06:26] 比較常用的Close Entropy在做 [01:06:29] 那Optimizer其實也有一些標準的 [01:06:31] 基本上都是算一些Momentum [01:06:33] 算一些你跟目標距離的差距 [01:06:37] 你要怎麼改變 [01:06:38] 你這次要跨大步一點跨小步一點 [01:06:41] 或是你要怎麼跳 [01:06:43] 這樣子就是Optimizer [01:06:45] 比較有名的像Aden或是什麼 [01:06:48] 這個就是比較動態去調整這個Momentum的 [01:06:52] 的誤刷 [01:06:54] 這時候我該緩慢 [01:06:56] 這時候我該快一點 [01:06:58] 這樣子 [01:07:00] 那Aden是一個很常用的名字 [01:07:03] 那每次講到這個我都要講這個笑話 [01:07:07] 對 [01:07:08] 這是一個事實 [01:07:10] 真實發生的事情 [01:07:11] 是國內一個老師他的論文 [01:07:13] 他在論文寫說 [01:07:15] 在模型怎樣怎樣 [01:07:17] 然後他的Optimizer是 [01:07:19] 他是說用Aden來說是 [01:07:21] 就是說用Aden來做了 [01:07:23] 當然是英文是英文 [01:07:25] 那因為這Aden看起來 [01:07:28] 他寫的就是It's done by Aden [01:07:30] 這樣子 [01:07:32] 那他拿到那個Reviewer的意見 [01:07:35] 那個Reviewer就問他說 [01:07:39] 我們不知道Aden是誰 [01:07:41] Aden到底是誰 [01:07:42] 為什麼你在論文中去說這個東西是誰做的 [01:07:45] 這樣子 [01:07:46] 那就看到就傻眼 [01:07:48] 就說這個等到這個Reviewer不知道Aden是什麼 [01:07:51] 所以這個也凸顯出 [01:07:54] 現在頂潰很多審稿是有點問題的 [01:07:59] 就是這個其實不是那麼專業 [01:08:02] 因為就是那句話 [01:08:04] 他就寫Who is Aden這樣子 [01:08:06] 我覺得是蠻特別的 [01:08:08] 不過至少那個Reviewer應該是他自己寫的 [01:08:12] 如果叫AI Reviewer [01:08:13] 應該不會出現Who is Aden這樣子 [01:08:16] 不過這個大概就是 [01:08:18] 有時候你會特別去描述你的模型 [01:08:21] 是這些細部的 [01:08:23] 其實比較像超參數怎麼做 [01:08:25] 然後你就會訓練 [01:08:27] 然後你就會評估這樣子 [01:08:29] 我想這個是一個標準的流程 [01:08:31] 只是說讓 [01:08:33] 因為在做第一個作業的時候 [01:08:35] 你就要做這件事情 [01:08:37] 只是說因為我們的code都現成的 [01:08:39] 所以你大概需要自己變動的東西不是很多 [01:08:42] 這樣子 [01:08:44] 所以我在講這個我們就下課了 [01:08:47] 我們今天就上到這邊 [01:08:49] 然後接下來的一個半小時 [01:08:51] 你們就回去看我們第一個lab課程的錄影 [01:08:56] 這樣子 [01:08:57] 有問題都可以在slide上再問 [01:09:00] 主教會再回復 [01:09:02] 其實activation function的概念其實非常重要 [01:09:06] 因為它其實比較像是NN能夠跨入 [01:09:10] 真正現在很有用的年代的一個很大的工程 [01:09:16] 它可以做一些non-linear的mapping [01:09:19] 因為 [01:09:20] 你如果學過機器學 [01:09:22] 你就知道這個故事 [01:09:23] 就是 [01:09:24] 就是它沒辦法做一些這種 [01:09:27] 一刀兩切的 [01:09:29] 就是如果是linear的這種separator的時候 [01:09:32] 它沒辦法做這種 [01:09:34] 不是一刀兩切的一個data [01:09:37] 那NN其實基本上因為 [01:09:40] 它核心的長相也是 [01:09:43] 一些weight上也是regression [01:09:45] 只是說它靠著neuron之間的串接 [01:09:48] 靠這些activation的串接 [01:09:49] 使它可以做到一些non-linear的問題 [01:09:53] 那大家所熟悉的activation function [01:09:55] 這個大家可能都聽過 [01:09:57] 用sigmoid,relu,tangent h [01:10:01] 或者是給入這樣子 [01:10:03] 那這其實也不太會動 [01:10:06] 不太會動 [01:10:07] 那這個圖其實想呈現的是它們的關係 [01:10:10] 像比如說很標準的sigmoid就是 [01:10:15] 這個顏色是這樣的 [01:10:17] 就是從你可以想象 [01:10:19] 從大到無窮大 [01:10:20] 就是我現在input x [01:10:22] 那我的output f就是y [01:10:26] 那sigmoid是從0到1 [01:10:29] 所以它就是 [01:10:30] 負窮大就會開始從0 [01:10:32] 然後慢慢增加到1這樣子 [01:10:34] 就是這一條線 [01:10:36] 這條線其實它比較敏感的地方就在中間 [01:10:40] 就是在x介於0的正負的範圍內就是中間 [01:10:44] 所以越大跟負的越大跟正的越大 [01:10:47] 不是很敏感這樣子 [01:10:50] 那比較暴力的像relu [01:10:52] relu就是這一條 [01:10:55] 因為蓋在一起的 [01:10:57] 這個圖是AI幫我畫的 [01:11:00] 就是它是這一條線然後長上來 [01:11:03] 就是把小於0的都把它變成0這樣子 [01:11:06] 然後大於0的就是原子output這樣子 [01:11:11] 那大家可能要先有個概念就是activation [01:11:14] 這個東西其實當初 [01:11:16] 因為類神經網路其實是源自於人類的腦袋 [01:11:20] 人類腦袋在這個神經元在串接的時候 [01:11:24] 它其實是用一些化學物質 [01:11:27] 像是鉀離子鈉離子這種濃度 [01:11:31] 到一定地步的時候它會trigger [01:11:33] 它會發出一個訊號 [01:11:35] 那這種就是把它轉換成這種控制 [01:11:39] 我們就用activation function的角色來做這件事情 [01:11:42] 那當然這個東西你說 [01:11:46] 那我們是要模擬人的activation function嗎 [01:11:48] 其實也沒有 [01:11:49] 就是我們就靠著這種 [01:11:51] 有點像過濾的機制 [01:11:53] 去達到我們所要做到的控制的效果 [01:11:58] 那大家可能常聽到tangent action [01:12:00] 或者是給入 [01:12:01] 其實後面這兩個比較像是把累入 [01:12:04] 因為累入其實是非常不連續的 [01:12:07] 因為它前面就是0 [01:12:08] 然後這邊直接上升這樣子 [01:12:10] 這邊就不可為分 [01:12:13] 這種東西對模型來講很不好 [01:12:16] 所以它就把它變成一個比較連續的 [01:12:19] 連續的函式可為 [01:12:21] 然後去做一些這樣的調整 [01:12:25] 讓它子逼近這樣子 [01:12:27] 但是現在在做一些hardware的implementation [01:12:31] 都會覺得這些function [01:12:33] 實在太難做硬體的加速了 [01:12:36] 因為根本沒辦法去用電路去模擬 [01:12:40] 就是要做一些邏輯判斷 [01:12:42] 甚至還要算tangent去這樣子 [01:12:45] 這個成本很高 [01:12:47] 因為等於你每一個neural都要做一件這件事情 [01:12:50] 那個cost相當高 [01:12:51] 所以現在有很多做硬體加速 [01:12:53] 就直接在edification的方式裡做手腳 [01:12:55] 就是設計一個函式 [01:12:58] 然後它可以逼近這些圖案 [01:13:02] 那些函式是很容易可以靠著電路做出來的 [01:13:07] 只是說它是逼近 [01:13:09] 逼近這樣的一個pattern [01:13:11] 所以還是行為有點不太一樣 [01:13:13] 所以他們常做就是這樣 [01:13:15] 是轉換之後 [01:13:16] 然後去看最後的模型的效能 [01:13:19] 跟原來效能差多少 [01:13:21] 但是速度會快很多 [01:13:23] 因為這個計算過程都可以用硬體加速 [01:13:26] ok [01:13:27] 這個是在做NN後面 [01:13:29] 我有一個edification function這一段 [01:13:32] 這個是它的敘述 [01:13:35] 其實你可以想象它就是 [01:13:37] 特殊的一個正規化的一個function [01:13:41] 去做一點壓縮做一點調整 [01:13:43] 這樣子 [01:13:47] 好 [01:13:48] 我想我們今天呢 [01:13:49] 就上到這邊 [01:13:50] 其實剛好你去看 [01:13:52] 這個PyTorch的那個tutorial [01:13:54] 你會發現其實 [01:13:55] 因為就是從安裝開始 [01:13:57] 然後再帶類似NN網路的 [01:14:00] 的python的code [01:14:02] 怎麼做 [01:14:03] 其實有些是講tf啦 [01:14:05] 就是講tensorflow [01:14:08] 不過你大概可以知道這整個過程 [01:14:10] 但如果對你已經有一些基礎 [01:14:12] 你已經有訓練模型的基礎的話 [01:14:14] 可能會稍微簡單 [01:14:16] 不過你就挑你你認為需要的 [01:14:19] 就閱讀這樣子 [01:14:21] 那第一部分的PyTorch的tutorial [01:14:23] 大概是一個半小時 [01:14:25] 所以大概可以先去看那邊的部分 [01:14:30] 好 [01:14:31] 我們今天的課程就到這裡 [01:14:39] slido上有沒有問題需要回復 [01:14:42] 跳出slido [01:14:53] 那之前有人在slido上問 [01:14:55] 那個作業的效能 [01:14:57] 那其實那個過程 [01:15:01] 其實基本上 [01:15:02] 你都可以在你個人的collab的quota上 [01:15:07] 跑得起來這樣子 [01:15:09] 所以如果你要跑很久的時候 [01:15:11] 你可能你自己要看哪邊有問題 [01:15:14] 這樣子 [01:15:15] 好 [01:15:23] ntu庫好吧 [01:15:25] 這個的確一開始都會有這個問題 [01:15:28] 可能對於後面才加選的 [01:15:30] 他的名單的導入會稍微慢一點 [01:15:33] 這個 [01:15:35] 這個可能我問一下辦公室 [01:15:39] 好 [01:15:41] 好context怎麼取 [01:15:43] 這個當然這個context [01:15:45] 你可能講的是 [01:15:47] 比如說我們PPMI那邊 [01:15:49] 我那個例子只是一個舉例 [01:15:51] 就是說好比如說我現在應用 [01:15:53] 要用這樣的五個維度 [01:15:55] 或是幾個重要的 [01:15:58] 的字來capture [01:16:01] 我現在字的所有的表示 [01:16:03] 我可以自己設計 [01:16:05] 那或者是說 [01:16:07] 我你在waterbag裡面 [01:16:09] 你這個context [01:16:10] 你可以取更大一點 [01:16:11] 你可以取這個window size是2 [01:16:14] 去看他的context有哪些字 [01:16:16] 共同出現這樣子 [01:16:19] ficial selection的select [01:16:21] 其實這邊的 [01:16:22] 當初那個投影片的ficial selection [01:16:24] 比較像是 [01:16:25] 就像我們在做PPMI那邊 [01:16:27] 我要用一個 [01:16:29] 我要用什麼樣的維度 [01:16:31] 來描述一個文字 [01:16:33] 其實當初的研究 [01:16:35] 有很多人去做這件事情 [01:16:37] 比如說他特別設計 [01:16:39] 這個比較語法的 [01:16:41] 或是這個詞性的什麼什麼 [01:16:45] 其實以前有人做這樣的 [01:16:47] 這種人工設計的embedding [01:16:50] 然後去學這些東西 [01:16:52] 或者是用程式去 [01:16:54] attract他的ficial出來 [01:16:56] 這個是一個概念 [01:16:57] 是用人去設計 [01:16:58] 那我embedding [01:17:00] 你在做的時候 [01:17:01] 你可能300維度或千百維度 [01:17:03] 765維度的時候 [01:17:04] 其實那個維度就是你的ficial [01:17:06] 其實這個ficial的select [01:17:08] 是模型自己去學的 [01:17:10] lab的算分 [01:17:13] 沒有 [01:17:14] 它只是有點像 [01:17:15] 帶這些比較實作 [01:17:17] 不是實作 [01:17:18] 就是 [01:17:20] 搞不好對你們來講 [01:17:21] 你會覺得比較有收穫這樣 [01:17:23] 因為老師都 [01:17:25] 講太泛泛的東西 [01:17:27] 那邊其實就是帶你真正 [01:17:29] 真正要帶這個code [01:17:31] 真正在券的時候 [01:17:32] 你該怎麼寫這樣子 [01:17:34] 有點像助教課 [01:17:36] 那邊是沒有 [01:17:37] 有點像也是為了帶 [01:17:39] 帶這個作業相關的部分 [01:17:41] 其實也是考量 [01:17:42] 有些同學 [01:17:43] 可能經驗沒那麼多 [01:17:46] 這樣子 [01:17:52] 下載那個cobus [01:17:53] 可能 [01:17:55] 我不知道 [01:17:56] 這個語料應該是 [01:17:58] 我們在github上 [01:17:59] 應該是可以嗎 [01:18:00] 還是你們助教 [01:18:02] 再回復一下這個問題 [01:18:03] OK好 [01:18:06] 其實以前一直有 [01:18:07] 其實第一年 [01:18:08] 第一年非常慘 [01:18:09] 因為第一年我們好像 [01:18:10] 沒放在github還是什麼 [01:18:12] 放在學校這邊 [01:18:13] 就有點掛掉了 [01:18:15] 這樣子 [01:18:17] 那 [01:18:20] OK [01:18:29] lab應該在 [01:18:31] ntucool跟 [01:18:32] github都有 [01:18:33] 這樣子 [01:18:34] 它有投影片 [01:18:35] 跟助教預錄的影片 [01:18:39] 這樣子 [01:18:41] OK好 [01:18:42] 那我們就回復到這 [01:18:45] 那如果你在看lab的課的影片 [01:18:48] 有問題都可以在Style上問 [01:18:51] 助教都可以回覆這樣子 [01:18:54] 好 [01:18:55] 我們今天就上到這邊 [01:18:56] 我們就下課