Làm cách nào để khởi tạo một mô hình word2vec mới với trọng số mô hình được đào tạo trước?


13

Tôi đang sử dụng Thư viện Gensim trong python để sử dụng và đào tạo mô hình word2vector. Gần đây, tôi đã xem xét việc khởi tạo trọng lượng mô hình của mình với một số mô hình word2vec được đào tạo trước, chẳng hạn như (mô hình được xử lý trước của GoogleNewDataset). Tôi đã vật lộn với nó vài tuần. Bây giờ, tôi chỉ tìm kiếm rằng trong gesim có một chức năng có thể giúp tôi khởi tạo các trọng số của mô hình của mình với các trọng số mô hình được đào tạo trước. Điều đó được đề cập dưới đây:

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.

Tôi không biết chức năng này có thể làm điều tương tự hay không. Xin vui lòng giúp đỡ!!!


Là từ vựng của các mô hình giống nhau?
Hima Varsha

Tại sao không khởi tạo từng tham số word2vec với các số được tạo ngẫu nhiên cho mỗi lần chạy? Tôi có thể làm điều này và với việc lựa chọn cẩn thận các số ngẫu nhiên cho từng tham số (numFeatures, contextWindow, seed) Tôi đã có thể nhận được các bộ dữ liệu tương tự ngẫu nhiên mà tôi muốn cho usecase của mình. Mô phỏng một kiến ​​trúc hòa tấu. Người khác nghĩ gì về nó? Xin trả lời.
zorze

Câu trả lời:


17

Cảm ơn Abhishek. Tôi đã tìm ra rồi! Dưới đây là những thí nghiệm của tôi.

1). chúng tôi vẽ một ví dụ dễ dàng:

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()

nhập mô tả hình ảnh ở đây

Từ các ô trên, chúng ta có thể thấy rằng các câu dễ không thể phân biệt nghĩa của các từ khác nhau theo khoảng cách.

2). Tải từ nhúng được đào tạo trước:

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()

nhập mô tả hình ảnh ở đây

Từ hình trên, chúng ta có thể thấy rằng các từ nhúng có ý nghĩa hơn.
Hy vọng câu trả lời này sẽ hữu ích.


1
Câu trả lời này khá nhiều thông tin và hữu ích trong việc nhúng mô hình vào tệp vec.
Akash Kandpal

@ harrypotter0 Thx!
Shixiang Wan

bạn đời gọn gàng và rõ ràng !!!
vijay athithya

Khi tôi cố gắng sử dụng nó, tôi đã thử nghiệm nó với hai bộ dữ liệu giống hệt nhau. Các kết quả là khác nhau cho mỗi mô hình. Tôi đã hy vọng rằng vì tôi sẽ bắt đầu với cùng trọng lượng khởi tạo, các mô hình sẽ giống nhau sau đó. Tại sao điều này không phải là trường hợp?
Eric Wiener

1
@EricWiener Bởi vì ngay cả khi các bộ dữ liệu đào tạo giống nhau, các vectơ từ cho mỗi đào tạo là ngẫu nhiên. Các không gian vectơ từ được tính bởi cùng một tập dữ liệu phải giống nhau và hiệu suất được sử dụng trong các tác vụ NLP cũng tương tự nhau.
Shixiang Wan

4

Chúng ta hãy xem một mã mẫu:

>>>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

Do đó, chúng tôi quan sát rằng model1 đang được model2 đặt lại và do đó, từ 'thứ ba' và 'câu' nằm trong từ vựng của nó cuối cùng cũng có sự tương đồng. Đây là cách sử dụng cơ bản, bạn cũng có thể kiểm tra reset_weights () để đặt lại trọng số về trạng thái ban đầu / không được huấn luyện.


2

Nếu bạn đang tìm kiếm một mạng lưới được đào tạo trước để nhúng từ, tôi sẽ đề xuất GloVe. Blog sau đây từ Keras rất nhiều thông tin về cách thực hiện điều này. Nó cũng có một liên kết đến các nhúng GloVe được đào tạo trước. Có các vectơ từ được đào tạo trước, từ vectơ 50 chiều đến vectơ 300 chiều. Chúng được xây dựng trên cả Wikipedia, Dữ liệu thu thập thông tin chung hoặc dữ liệu Twitter. Bạn có thể tải chúng ở đây: http://nlp.stanford.edu/projects/glove/ . Ngoài ra, bạn nên kiểm tra blog của máy ảnh về cách triển khai chúng. https://blog.keras.io/USE-pre-trained-word-embeddings-in-a-keras-model.html


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.