torch.nn.Embedding到底在幹嘛

更新於 發佈於 閱讀時間約 6 分鐘

其實跟word2vec, skipgram都沒什麼關係

如果你跟我一樣是先看了transformers或者是至少word embeddings相關的papers才回去設法用pytorch來實作 一開始一定會非常非常困惑
會不知道這個 torch.nn.Embedding在搞什麼鬼
查了官方文件你可能會跟我一樣更困惑...
A simple lookup table that stores embeddings of a fixed dictionary and size.
This module is often used to store word embeddings and retrieve them using indices. The input to the module is a list of indices, and the output is the corresponding word embeddings.
Parameters:
  • num_embeddings (int) – size of the dictionary of embeddings
  • embedding_dim (int) – the size of each embedding vector
... 以下略
什麼 simple lookup table?沒有訓練過這個東西 到底哪來的word embedding? 底下到底是word2vec, gloVe, 還是什麼pretrained的東西?

答案

其實答案很簡單: 都不是
其實就是"隨機"

我們再看一次這個document

其實
num_embeddings, 第一個參數的意思就是, 隨便給定一個vocabulary size, 比方說 3, 那麼
nn.Embedding 就會幫你準備 3個空位
第二個參數embedding_dim 會直接幫決定他幫你準備的隨機的representation要有幾個dimensions, 你幫說5

背後在做什麼

當你設了 nn.Embedding(3, 5)
那麼你可以想成其實就是這樣
{
0: [.123123, .123123, .123123, .12312, .123123], # 五個隨機的floats來代表0 這個token
1: [.456456,.456456,.456456,.456546,.456456,.42342],# 五個隨機的floats來代表1 這個token
2: [.789789, .987987, .98798, .5789, .7896, .794] #五個隨機的floats來代表2 這個token
}
為什麼是5個數字呢? 因為你embedding_dim設成5, 如果你設成384就會有384個隨機數字對應到每一個id

可是我想處理文字 又不是數字 - Tokenizer在幹嘛

你可能接下來會感到困惑的點是... 可是我想處理文字 又不是數字...
所以... 其實tokenizer就是在做這件事
假設你想要把 "你好嗎" 這句話拿去配合什麼東西訓練
那麼你就可能會有個tokenizer做這件事:
{你: 0, 好:1, 嗎:2}
你的文字input經過tokenizer之後就會變成一串數字
比方說"你好好嗎嗎"就會變成[0, 1, 1, 2, 2]
"你嗎嗎好"就會變成[0,2,2,1]

所以

然後經過nn.Embedding的時候他就把剛剛的隨機數字塞進去
所以"你好好嗎嗎" 會被轉成這樣 (就只是去查[0, 1, 1, 2, 2])
[[.123123, .123123, .123123, .12312, .123123],
[.456456,.456456,.456456,.456546,.456456,.42342],
[.456456,.456456,.456456,.456546,.456456,.42342],
[.789789, .987987, .98798, .5789, .7896, .794],
[.789789, .987987, .98798, .5789, .7896, .794]]
"你嗎嗎好"就會變成(就只是去查[0,2,2,1]) (我們這邊先不管padding)
[[.123123, .123123, .123123, .12312, .123123],
[.789789, .987987, .98798, .5789, .7896, .794],
[.789789, .987987, .98798, .5789, .7896, .794],
[.456456,.456456,.456456,.456546,.456456,.42342]
]

更新參數

接下來你會有一個task可能是要訓練model來分類什麼東西
比方說聽起來像不像髒話
那麼
[[.123123, .123123, .123123, .12312, .123123],
[.456456,.456456,.456456,.456546,.456456,.42342],
[.456456,.456456,.456456,.456546,.456456,.42342],
[.789789, .987987, .98798, .5789, .7896, .794],
[.789789, .987987, .98798, .5789, .7896, .794]]
可能會對應到 0 (不像)
[[.123123, .123123, .123123, .12312, .123123],
[.789789, .987987, .98798, .5789, .7896, .794],
[.789789, .987987, .98798, .5789, .7896, .794],
[.456456,.456456,.456456,.456546,.456456,.42342]
]
可能會對應到 1 (有點像)等等
然後只要你不鎖住nn.embedding的參數
那麼這些隨機的數字就會被更新, 已讓你的classification更準

Vocabulary Size的影響

你的第一個參數會影響到你有幾個place holders可以用
剛剛我們設3
所以只有三個不同的tokens可以用
所以一但傳進去的index超過2, 就會出錯(list out of range)
所以大部分的語言模型都會設一個很大的數字像是80000
再搭配tokenizer
為什麼會看到廣告
avatar-img
10會員
15內容數
對工程師友善的(目前免費)英文教材 #工程師 #Coding #Python #Django #English #英文 #文法 #語言學習 #程式
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
寂寞小冬瓜的沙龍 的其他內容
基本原則 對於不是從小長大在該語言環境的人來說,學語言一定是需要刻意練習的。 犯一些錯誤後被直接糾正學到最多也最快 用英文去學習你本來就在乎的主題會好學很多You get what you care for. 你的學習歷程不一定跟學校、補習班、文法書上規劃的一樣。請尊重並站在自己的學習歷程這邊
英文的口說練習有個重要的迷思,就是好像沒有明確範圍,好像無從準備起 -- 其實完全不是這樣的。因為每個人一生的知識量會是有限的,一個人習慣談論的主題其實也相當有限。只要觀察自己平常都喜歡用中文談論什麼主題,就可以知道自己在講英文的時候需要講到什麼主題。 把自己當作每個普通的話題,例如食物、旅遊、對於
今天參加了一個有趣的開源社群的講座,在講公開透明監督政府等等的。但是裡面講者多少也有提到跟同溫層外的人溝通最容易碰到的問題就是「參加開源project對我到底有什麼好處」,老實說,**我自己身為同溫層外的人,也真的非常需要知道這個問題的答案**。 我覺得針對個人的話,好像可以這樣回答:
如果你跟我一樣是個論文生不出來的博士生,也許你會跟我一樣迷惘到去學八字、看人類圖的書、算塔羅之類的。然而這些東西很貴,而且其實底層邏輯好像滿類似的,這裡我們就來創造一套屬於自己的占卜系統。首先,我們要了解占卜的基本元素...
如果你的機器學習模型或是任何統計最後的結果可以轉變成二分法, 假設由1和0來代表「是」與「不是」, 可以變成簡單的vector(例如pd.Series)或者dataframe的方式儲存的話, 這個簡單的教學就適用於你 如果你原本計算models的過程非常繁複,  model已經算出來了, 可是當初
Django in production is a different beast from its development counterpart. 這句怎麼解呢
基本原則 對於不是從小長大在該語言環境的人來說,學語言一定是需要刻意練習的。 犯一些錯誤後被直接糾正學到最多也最快 用英文去學習你本來就在乎的主題會好學很多You get what you care for. 你的學習歷程不一定跟學校、補習班、文法書上規劃的一樣。請尊重並站在自己的學習歷程這邊
英文的口說練習有個重要的迷思,就是好像沒有明確範圍,好像無從準備起 -- 其實完全不是這樣的。因為每個人一生的知識量會是有限的,一個人習慣談論的主題其實也相當有限。只要觀察自己平常都喜歡用中文談論什麼主題,就可以知道自己在講英文的時候需要講到什麼主題。 把自己當作每個普通的話題,例如食物、旅遊、對於
今天參加了一個有趣的開源社群的講座,在講公開透明監督政府等等的。但是裡面講者多少也有提到跟同溫層外的人溝通最容易碰到的問題就是「參加開源project對我到底有什麼好處」,老實說,**我自己身為同溫層外的人,也真的非常需要知道這個問題的答案**。 我覺得針對個人的話,好像可以這樣回答:
如果你跟我一樣是個論文生不出來的博士生,也許你會跟我一樣迷惘到去學八字、看人類圖的書、算塔羅之類的。然而這些東西很貴,而且其實底層邏輯好像滿類似的,這裡我們就來創造一套屬於自己的占卜系統。首先,我們要了解占卜的基本元素...
如果你的機器學習模型或是任何統計最後的結果可以轉變成二分法, 假設由1和0來代表「是」與「不是」, 可以變成簡單的vector(例如pd.Series)或者dataframe的方式儲存的話, 這個簡單的教學就適用於你 如果你原本計算models的過程非常繁複,  model已經算出來了, 可是當初
Django in production is a different beast from its development counterpart. 這句怎麼解呢
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
PyTorch 是一個開源的 Python 機器學習庫,基於 Torch 庫,底層由 C++ 實現,應用於人工智慧領域,如電腦視覺和自然語言處理等。 PyTorch 2.4 引入了多項新功能和改進,包括支援 Python 3.12、AOTInductor 凍結功能、新的高階 Python 自訂運算
前言 對標題上的這兩個項目有疑惑,不知道它們返回的資料的不同;查找資料後記錄下來,讓自己以後可以回來翻閱。 正文 numpy.ndarray.flatten:返回攤平的一維array,可參考NumPy: numpy.ndarray.flatten() function,有示意圖 te
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
大語言模型通常會生產自己的「嵌入 Embedding」作為部分的輸入層, 並且在大語言模型的訓練途中不斷優化嵌入的方式, 以對特定的任務特定的數據優化。 而大語言模型使用的「嵌入維度 Embedding Dimension」通常是高維度的, 例如最小的GPT-2模型有1億1千
Thumbnail
上回我們講到 Word Embedding 能夠將字詞表示從使用字典索引改成詞向量表示,且這個詞向量能夠包含一定程度上的語義訊息,今天就讓我們探討 Word Embedding 到底是如何訓練成的。
大語言模型是一種特殊的神經網路,設計來理解,生成與回應人類的文本。 大語言模型是使用大量文本數據訓練的深度神經網路,其訓練使用的文本數據甚至包括了整個網路公開的文本。 大語言模型的「大」,體現於模型的參數個數以及其使用的訓練數據集。如此大的模型可以有百億甚至千億的參數。這些參數都是神經網
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
PyTorch 是一個開源的 Python 機器學習庫,基於 Torch 庫,底層由 C++ 實現,應用於人工智慧領域,如電腦視覺和自然語言處理等。 PyTorch 2.4 引入了多項新功能和改進,包括支援 Python 3.12、AOTInductor 凍結功能、新的高階 Python 自訂運算
前言 對標題上的這兩個項目有疑惑,不知道它們返回的資料的不同;查找資料後記錄下來,讓自己以後可以回來翻閱。 正文 numpy.ndarray.flatten:返回攤平的一維array,可參考NumPy: numpy.ndarray.flatten() function,有示意圖 te
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
大語言模型通常會生產自己的「嵌入 Embedding」作為部分的輸入層, 並且在大語言模型的訓練途中不斷優化嵌入的方式, 以對特定的任務特定的數據優化。 而大語言模型使用的「嵌入維度 Embedding Dimension」通常是高維度的, 例如最小的GPT-2模型有1億1千
Thumbnail
上回我們講到 Word Embedding 能夠將字詞表示從使用字典索引改成詞向量表示,且這個詞向量能夠包含一定程度上的語義訊息,今天就讓我們探討 Word Embedding 到底是如何訓練成的。
大語言模型是一種特殊的神經網路,設計來理解,生成與回應人類的文本。 大語言模型是使用大量文本數據訓練的深度神經網路,其訓練使用的文本數據甚至包括了整個網路公開的文本。 大語言模型的「大」,體現於模型的參數個數以及其使用的訓練數據集。如此大的模型可以有百億甚至千億的參數。這些參數都是神經網
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。