วิธีเริ่มต้นรุ่น word2vec ใหม่ด้วยน้ำหนักแบบฝึกอบรมล่วงหน้า?


14

ฉันใช้ Gensim Library ในหลามเพื่อใช้และฝึกอบรม word2vector model เมื่อเร็ว ๆ นี้ฉันกำลังดูที่การเริ่มต้นน้ำหนักแบบจำลองของฉันด้วยแบบจำลอง word2vec ที่ผ่านการฝึกอบรมล่วงหน้าเช่น (รุ่น GoogleNewDataset แบบฝึกที่มีการฝึกฝน) ฉันดิ้นรนกับมันสองสามสัปดาห์ ตอนนี้ฉันเพิ่งค้นพบว่าใน gesim มีฟังก์ชั่นที่สามารถช่วยฉันเริ่มต้นน้ำหนักของแบบจำลองของฉันด้วยน้ำหนักแบบจำลองที่ผ่านการฝึกอบรมมาแล้ว ที่กล่าวถึงด้านล่าง:

reset_from(other_model)

    Borrow shareable pre-built structures (like vocab) from the other_model. Useful if testing multiple models in parallel on the same corpus.

ฉันไม่รู้ว่าฟังก์ชั่นนี้สามารถทำสิ่งเดียวกันได้หรือไม่ กรุณาช่วย!!!


คำศัพท์ของแบบจำลองเหมือนกันหรือไม่?
Hima Varsha

ทำไมไม่เริ่มแต่ละพารามิเตอร์ word2vec ด้วยตัวเลขที่สร้างแบบสุ่มสำหรับการทำงานแต่ละครั้ง? ฉันสามารถทำได้และด้วยการเลือกตัวเลขสุ่มอย่างระมัดระวังสำหรับแต่ละพารามิเตอร์ (numFeatures, contextWindow, seed) ฉันสามารถรับสิ่งอันดับคล้ายกันแบบสุ่มซึ่งฉันต้องการสำหรับกรณีของฉัน การจำลองสถาปัตยกรรมทั้งมวล คนอื่น ๆ คิดอย่างไรกับมัน? กรุณาตอบกลับ
zorze

ขอบคุณสำหรับความช่วยเหลือของคุณ. มันช่วยฉันได้มาก
frhyme

คำตอบ:


18

ขอบคุณ Abhishek ฉันคิดออก! นี่คือการทดลองของฉัน

1) เราพล็อตตัวอย่างง่าย ๆ :

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
# define training data
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
            ['this', 'is', 'the', 'second', 'sentence'],
            ['yet', 'another', 'sentence'],
            ['one', 'more', 'sentence'],
            ['and', 'the', 'final', 'sentence']]
# train model
model_1 = Word2Vec(sentences, size=300, min_count=1)

# fit a 2d PCA model to the vectors
X = model_1[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

ป้อนคำอธิบายรูปภาพที่นี่

จากแปลงข้างต้นเราจะเห็นว่าประโยคง่าย ๆ ไม่สามารถแยกความหมายของคำที่แตกต่างกันตามระยะทาง

2) โหลดการฝังคำที่ผ่านการฝึกอบรมล่วงหน้า:

from gensim.models import KeyedVectors

model_2 = Word2Vec(size=300, min_count=1)
model_2.build_vocab(sentences)
total_examples = model_2.corpus_count
model = KeyedVectors.load_word2vec_format("glove.6B.300d.txt", binary=False)
model_2.build_vocab([list(model.vocab.keys())], update=True)
model_2.intersect_word2vec_format("glove.6B.300d.txt", binary=False, lockf=1.0)
model_2.train(sentences, total_examples=total_examples, epochs=model_2.iter)

# fit a 2d PCA model to the vectors
X = model_2[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

ป้อนคำอธิบายรูปภาพที่นี่

จากรูปด้านบนเราจะเห็นว่างานแต่งงานคำนั้นมีความหมายมากกว่า
หวังว่าคำตอบนี้จะเป็นประโยชน์


1
คำตอบนี้ค่อนข้างให้ข้อมูลและเป็นประโยชน์ในการฝังโมเดลลงในไฟล์ vec
Akash Kandpal

@ harrypotter0 ขอบคุณ!
Shixiang Wan

คู่ที่เรียบร้อยและชัดเจน !!!
vijay athithya

เมื่อฉันพยายามใช้สิ่งนี้ฉันได้ทำการทดสอบด้วยชุดข้อมูลที่เหมือนกันสองชุด ผลลัพธ์มีความแตกต่างกันในแต่ละรุ่น ฉันหวังว่าตั้งแต่ฉันจะเริ่มต้นด้วยน้ำหนักเริ่มต้นเดียวกันแบบจำลองจะเหมือนกันหลังจากนั้น ทำไมไม่เกิดขึ้น?
Eric Wiener

1
@EricWiener เพราะถึงแม้ว่าชุดข้อมูลการฝึกอบรมจะเหมือนกันคำว่าเวกเตอร์สำหรับการฝึกอบรมแต่ละครั้งก็เป็นแบบสุ่ม คำว่าปริภูมิเวกเตอร์ที่คำนวณโดยชุดข้อมูลเดียวกันควรจะคล้ายกันและประสิทธิภาพที่ใช้ในงาน NLP ก็ควรจะเหมือนกัน
Shixiang Wan

4

ให้เราดูโค้ดตัวอย่าง:

>>>from gensim.models import word2vec

#let us train a sample model like yours
>>>sentences = [['first', 'sentence'], ['second', 'sentence']]
>>>model1 = word2vec.Word2Vec(sentences, min_count=1)

#let this be the model from which you want to reset
>>>sentences = [['third', 'sentence'], ['fourth', 'sentence']]
>>>model2 = word2vec.Word2Vec(sentences, min_count=1)
>>>model1.reset_from(model2)
>>>model1.similarity('third','sentence')
-0.064622000988260417

ดังนั้นเราสังเกตว่า model1 ถูกรีเซ็ตโดย model2 และด้วยเหตุนี้คำว่า 'สาม' และ 'ประโยค' จึงอยู่ในคำศัพท์ของมันในที่สุดก็ให้ความคล้ายคลึงกัน นี่คือการใช้งานพื้นฐานคุณยังสามารถตรวจสอบ reset_weights () เพื่อรีเซ็ตน้ำหนักให้เป็นสถานะที่ไม่ได้รับการฝึกฝน / เริ่มต้น


2

หากคุณกำลังมองหาเครือข่ายที่ได้รับการฝึกฝนมาก่อนสำหรับงานแต่งงานคำศัพท์ฉันจะแนะนำ GloVe บล็อกต่อไปนี้จาก Keras เป็นข้อมูลอย่างมากเกี่ยวกับวิธีการใช้งานนี้ นอกจากนี้ยังมีลิงก์ไปยังงานแต่งงานของ GloVe ที่ผ่านการฝึกอบรมมาล่วงหน้า มีคำศัพท์ที่ได้รับการฝึกฝนมาล่วงหน้าตั้งแต่เวกเตอร์ 50 มิติถึงเวกเตอร์ 300 มิติ พวกเขาถูกสร้างขึ้นบนวิกิพีเดียข้อมูลการรวบรวมข้อมูลทั่วไปหรือข้อมูล Twitter คุณสามารถดาวน์โหลดได้ที่นี่: http://nlp.stanford.edu/projects/glove/ นอกจากนี้คุณควรตรวจสอบบล็อก keras เกี่ยวกับวิธีการนำไปใช้ https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.