1. 導(dǎo)入
??這是語言表示系列的第1篇牺堰,主要講述了分布式表示里的Word2vec方法蚌讼。該系列目前暫定有4篇語言的分布式表示(Distributed Representations)學(xué)習(xí)苍姜,分別是Word2Vec、Doc2Vec、字符級別的Word2Vec和Glove翼闽;幾篇詞語的分布式表示(Distributional Representations)禽捆,分別是:潛在語義分詞模型(LSA)笙什、潛在地理克雷分配模型(LDA)和隨機(jī)索引(random indexing);還有幾篇是文本特征胚想,分別講了:VSM琐凭、n-gram、詞袋和TF-IDF等浊服。
??參考[1] 提到:詞語的離散表示一般獨(dú)熱編碼(one-hot encode)统屈,句子或篇章一般用詞袋模型、TF-IDF模型牙躺、N元模型等進(jìn)行轉(zhuǎn)換(我的理解:這就是文本的特征工程)愁憔,這些方法還需要引入人工知識(shí)庫,比如同義詞詞典孽拷、上下位詞典等吨掌,才能有效地進(jìn)行后續(xù)的語義計(jì)算。對這種方法的改進(jìn)有基于聚類的詞表示脓恕,比如Brown聚類算法膜宋,通過聚類得到詞的類別簇來改進(jìn)詞的表示。詞語除了離散表示外還有分布式表示(Distributional Representations)和分散式表示(Distributed Representations):分布式表示基于Harris的分布式假設(shè):如果兩個(gè)詞的上下文相似进肯,那么這兩個(gè)詞也是相似的激蹲;而分散式表示也稱為分布式表示,分散式表示將詞語的潛在語法或語義特征分散式地存儲(chǔ)在一組神經(jīng)元中(該層就是基于文本的深度學(xué)習(xí)網(wǎng)絡(luò)中的Embedding lookup 層)江掩,用稠密学辱、低維、連續(xù)的向量表示环形,也稱為嵌入(Embedding)策泣。上述兩種表示有一定的區(qū)別。 分散式表示是指一種語義分散存儲(chǔ)的表示形式抬吟,而分布式表示是通過分布式假設(shè)獲得的表示萨咕。 但這兩者并不對立,比如 Skip-Gram火本、 CBOW 和 glove等模型得到詞向量危队,即是分散式表示聪建,又是分布式表示。(我的理解:1茫陆、分布式表示得到的向量在使用的時(shí)候是不變的金麸。分散式表示得到的向量是隨著訓(xùn)練過程而更新的;2簿盅、在Encoder-Decoder神經(jīng)網(wǎng)絡(luò)中挥下,得到的中間語義向量就是分散式表示的一種;3桨醋、基于文本的深度學(xué)習(xí)網(wǎng)絡(luò)對Embedding層訓(xùn)練的1個(gè)Trick是在模型訓(xùn)練的開始階段不更新Embedding層參數(shù)棚瘟,到模型微調(diào)的時(shí)候再更新,防止過擬合)
2. Word Embedding的一種實(shí)現(xiàn):Word2Vec
??根據(jù)維基百科的概念喜最,Word embedding是指把一個(gè)維數(shù)為所有詞的數(shù)量的高維空間嵌入到一個(gè)維數(shù)低得多的連續(xù)空間向量中偎蘸,每個(gè)單詞或詞組被映射為實(shí)數(shù)域上的向量。其實(shí)就是把One-hot表示的詞轉(zhuǎn)化成分布式表示的詞瞬内,好處當(dāng)然是可以消除詞的語義鴻溝禀苦。關(guān)于分布式表示確實(shí)地降低了維度,但是能不能化簡計(jì)算這個(gè)問題遂鹊,在這篇蘇劍林同學(xué)的博文里有提到,并不會(huì)維度降低可以減少計(jì)算量蔗包。下面我會(huì)搬運(yùn)其中一部分進(jìn)來秉扑。
?? 搬運(yùn)中 ...
?? 搬運(yùn)中 ...
?? Word2Vec還有一個(gè)有趣的特性,Word Analogy调限,這里有一個(gè)Word Analogy的討論舟陆。
?? Word2Vec就是Word Embedding的一種方法,而且是目前為止效果最好的詞向量表示方法耻矮。
3. Word2Vec的原理
??Word2Vec可以看做是通過神經(jīng)網(wǎng)絡(luò)來訓(xùn)練N-gram語言模型秦躯,并在訓(xùn)練過程中求出word所對應(yīng)的vector的方法,根據(jù)語言模型的不同裆装,可以分為CBOW(連續(xù)詞袋模型)和Skip-gram兩種模型踱承,而根據(jù)兩種降低訓(xùn)練復(fù)雜度的方法又可以分為Hierarchical Softmax和Negative Sampling,根據(jù)排列組合哨免,Word2Vec有4種實(shí)現(xiàn)方式茎活。
3.1 連續(xù)詞袋模型(Continuous Bag-of-Word Model / CBOW)
?? CBOW也被稱為連續(xù)詞袋模型,是一個(gè)3層神經(jīng)網(wǎng)絡(luò)琢唾,如下圖所示载荔,神經(jīng)網(wǎng)絡(luò)的輸入層是當(dāng)前單詞w(t)的前n-1個(gè)詞w(t-n+1) ~ w(t-1) 和后n-1個(gè)詞w(t+1) ~ w(t+n-1),與n-gram不同采桃,n-gram是前n-1個(gè)詞預(yù)測第n個(gè)詞懒熙,神經(jīng)網(wǎng)絡(luò)的輸出層是當(dāng)前單詞w(t)丘损。CBOW是神經(jīng)網(wǎng)絡(luò)語言模型(Neural Network Language Model / NNLM)的一種,NNLM的介紹參見Deep Learning in NLP (一)詞向量和語言模型工扎,參考文獻(xiàn)[3] 提到徘钥,區(qū)別有3點(diǎn):1、(從輸入層到投影層的操作)NNLM是通過拼接定庵,CBOW是通過累加求和 2吏饿、(隱藏層)NNLM有隱藏層,CBOW沒有隱藏層 3蔬浙、(輸出層)NNLM是線性結(jié)構(gòu)猪落,CBOW是樹形結(jié)構(gòu)。
?? CBOW在Hierarchical Softmax下的加速在3.3.1畴博。
3.2 Skip-gram Model
??Skip-gram模型剛好是CBOW模型反過來笨忌,如下圖所示:Skip-gram模型的輸入時(shí)當(dāng)前詞w(t),輸出是當(dāng)前詞的前n-1個(gè)詞w(t-n+1) ~ w(t-1) 和當(dāng)前詞的后n個(gè)詞 w(t+1) ~ w(t+n-1)俱病。 其中投影層其實(shí)是多余的官疲,只是方便比較,是一個(gè)恒等投影亮隙。
??
3.3 Hierarchical Softmax
3.3.1 CBOW + Hierarchical Softmax
??
3.3.2 Skip-gram + Hierarchical Softmax
??
3.4 Negative Sampling
4. Word2Vec的實(shí)現(xiàn)和技巧
4.1 哈夫曼樹的構(gòu)造
??
4.2 負(fù)采樣
??
5. Word2Vec的Tricks
5.1 n-gram的n如何設(shè)置
??
6. Word2Vec的使用:gensim.models.Word2Vec
6.1 輸入途凫、輸出和流程
??輸入:已經(jīng)分詞好的語料,標(biāo)準(zhǔn)的格式為句子的序列溢吻,每個(gè)句子是一個(gè)單詞列表维费。
??輸出:Word2Vec模型
??流程:
????1、建立一個(gè)空的模型對象:model = gensim.model2.Word2Vec()
????2促王、遍歷一次語料庫建立詞典:model.build_vocab(sentences)
????3犀盟、第2次遍歷語料庫簡歷神經(jīng)網(wǎng)絡(luò)模型:model.train(sentences)
6.2 相關(guān)參數(shù)
??gensim.models.Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH, compute_loss=False)
????sentences:可迭代對象,提供了BrownCorpus和Text8Corpus兩個(gè)語料庫的可迭代對象蝇狼,同時(shí)提供了如果分詞好的語料是一行一個(gè)句子阅畴,單詞之間用空格隔開,使用gensim.models.word2vec.LineSentence(corpus_file_path)可以幫忙處理得到標(biāo)準(zhǔn)的輸入格式
????sg:訓(xùn)練方式:CBOW或Skip-gram
????size:詞向量維度
????alpha:初始學(xué)習(xí)率迅耘,會(huì)慢慢降到min_alpha
????windows:n-gram里的n
????min_count:忽略出現(xiàn)次數(shù)少于min_count的單詞
????max_vocab_size:限制詞典大小贱枣,超出這個(gè)數(shù)時(shí)會(huì)把出現(xiàn)次數(shù)最少的數(shù)去掉
????sample:
????seed:
????workers:worker threads個(gè)數(shù)
????hs:是否使用Hierarchical Softmax
????negative:負(fù)采樣的個(gè)數(shù):通常5-20
????cbow_mean:if 0, use the sum of the context word vectors. If 1 (default), use the mean. Only applies when cbow is used.
????hashfxn:hash function to use to randomly initialize weights, for increased training reproducibility. Default is Python's rudimentary built in hash function.
????iter:在語料庫上的迭代次數(shù)
??build_vocab(sentences, keep_raw_vocab=False, trim_rule=None, progress_per=10000, update=False)
????trim_rule:vocabulary trimming rule, specifies whether certain words should remain in the vocabulary, be trimmed away, or handled using the default (discard if word count < min_count). Can be None (min_count will be used), or a callable that accepts parameters (word, count, min_count) and returns either utils.RULE_DISCARD
, utils.RULE_KEEP
or utils.RULE_DEFAULT
. Note: The rule, if given, is only used to prune vocabulary during build_vocab() and is not stored as part of the model.
????keep_raw_vocab:
????update:If true, the new provided words in word_freq
dict will be added to model's vocab.
??model.train(sentences, total_examples=None, total_words=None, epochs=None, start_alpha=None, end_alpha=None, word_count=0, queue_factor=2, report_delay=1.0, compute_loss=None)
????total_examples:To support linear learning-rate decay from (initial) alpha to min_alpha, and accurate progres-percentage logging, either total_examples (count of sentences) or total_words (count of raw words in sentences) MUST be provided. 如果和上一步驟的語料庫一樣,設(shè)置為corpus_count
????epochs:必須設(shè)置豹障。To avoid common mistakes around the model's ability to do multiple training passes itself, an explicit epochs
argument MUST be provided. In the common and recommended case, where train()
is only called once, the model's cached iter
value should be supplied as epochs
value.
6.3 模型的使用
??模型的保存:
??模型的加載:
??獲取詞向量:
??計(jì)算1個(gè)詞的最近似詞冯事,倒排序:
??計(jì)算2個(gè)詞之間的余弦相似度:
??計(jì)算2個(gè)集合之間的余弦相似度:
??選出集合中不同類的詞語:
7. 連詞成句和連詞成篇
8.1 連詞成句
8.2 連詞成篇
7. 后記
??1、Sentence2Vec和Doc2Vec
??2血公、語言模型其實(shí)就是看一句話是不是正常人說出來的昵仅。這玩意很有用,比如機(jī)器翻譯、語音識(shí)別得到若干候選之后摔笤,可以利用語言模型挑一個(gè)盡量靠譜的結(jié)果够滑。語言模型形式化的描述就是給定一個(gè)字符串,看它是自然語言的概率 P(w1,w2,…,wt)吕世。w1 到 wt 依次表示這句話中的各個(gè)詞彰触。有個(gè)很簡單的推推論:
???? P(w1,w2,…,wt) = P(w1)×P(w2|w1)×P(w3|w1,w2)×…×P(wt|w1,w2,…,wt?1)
常用的語言模型都是在近似地求 P(w1,w2,…,wt)。比如 n-gram 模型就是用 P(wt|wt?n+1,…,wt?1) 近似表示前者命辖。NNLM就是用神經(jīng)網(wǎng)絡(luò)來近似計(jì)算n-gram况毅。
參考
[1] 中文信息處理發(fā)展報(bào)告:http://202.119.24.249/cache/10/03/cips-upload.bj.bcebos.com/6707f4dec86696713877d94afa2fab44/cips2016.pdf
[2] 詞向量和Embedding究竟是怎么回事?: http://kexue.fm/archives/4122/
[3] Word2Vec中的數(shù)學(xué):https://spaces.ac.cn/usr/uploads/2017/04/2833204610.pdf
[4] Deep Learning實(shí)戰(zhàn)之Word2Vec:https://spaces.ac.cn/usr/uploads/2017/04/146269300.pdf