Posted in Machine Learning

Word2vec : The amazing power of word vectors

Word vector là gì?

Nói đơn giản , nó chỉ là một vector của các trọng số biểu diễn cho từ đó . Trong dạng biểu diễn  1-of-N (hay ‘one-hot’) mã hoá các phần tử trong vector kết hợp với một từ trong vocabulary. Cách mã hóa của một từ cho trước chỉ đơn giản là vector trong đó các phần tử liên quan được thiết lập là một, và tất cả các phần tử  khác là số không.

Giả sự bộ từ điển của chúng ta chỉ gồm có 5 từ . Chúng ta có thể mã hoá từ  ‘Queen’ như sau:

Sử dụng loại mã hóa này , không có cách so sánh có ý nghĩa giữa hai word vectors hay kiểm tra bằng nhau .

Trong word2vec , một biểu diễn phân tán(distributed representation) của một từ được sử dụng . Sử dụng một vector với vài trăm chiều . Mỗi từ được biểu diễn bới tập các trọng số của từng phần tử trong nó. Như thế thay vì kết nối  one-to-one giữa các phần từ trong vector và 1 từ , biểu diễn từ sẽ là dàn trải tất cả các thành phần của vector , và mỗi phần tử trong vector sẽ góp phần định nghĩa nhiều từ khác

Word2vec có thể được nhìn nhận kiểu kiểu như thế này :

Mỗi vector như vậy cũng đại diện cho một cách tóm lược của ý nghĩa của một từ. Và như chúng ta sẽ thấy tiếp theo, chỉ đơn giản bằng cách kiểm tra một ngữ liệu lớn nó có thể học word vectors , ta có thể nắm bắt các mối quan hệ giữa các từ trong một cách đáng ngạc nhiên. Chúng ta cũng có thể sử dụng các vector là đầu vào cho một mạng nơ ron.

Suy luận với word vectors

We find that the learned word representations in fact capture meaningful syntactic and semantic regularities in a very simple way. Specifically, the regularities are observed as constant vector offsets between pairs of words sharing a particular relationship. For example, if we denote the vector for word i as xi, and focus on the singular/plural relation, we observe that xapple – xapples ≈ xcar – xcars, xfamily – xfamilies ≈ xcar – xcars, and so on. Perhaps more surprisingly, we find that this is also the case for a variety of semantic relations, as measured by the SemEval 2012 task of measuring relation similarity.

Các vectơ rất tốt ở khía cạnh trả lời câu hỏi tương tự của các hình thức “a is to b as c is to?”. Ví dụ , man is to woman as uncle is to ? (aunt) chỉ cần sử dụng khoảng cách cosine

Ví dụ , đây là vector offsets cho 3 cặp từ trong mối quan hệ giới tính :

Và đây là mối quan hệ số nhiều / số ít :

Việc tương tác với vector cho phép chúng ta trả lời câu hỏi  “King – Man + Woman = ?” và sẽ nhận được kết quả “Queen” !  Đây quả là điều đáng ghi nhớ khi mà chúng ta có được những kiến thức này đơn giản chỉ nhìn vào các từ trong các context mà không có thêm một thông tin ngữ nghĩa gì cả .

Somewhat surprisingly, it was found that similarity of word representations goes beyond simple syntatic regularities. Using a word offset technique where simple algebraic operations are performed on the word vectors, it was shown for example that vector(“King”) – vector(“Man”) + vector(“Woman”) results in a vector that is closest to the vector representation of the word Queen.

Vectors cho King, Man, Queen, & Woman:

Kết quả của  King – Man + Woman = ?

Đây là 1 vài kết quả đạt được sử dụng cùng một kĩ thuật :

Đây là mối quan hệ đất nước – thủ đổ trong phép chiếu PCA 2 chiều :

Đây là một vài ví của  ‘a is to b as c is to ?’ trả lời bởi word vectors:

Chúng ta có thể dùng phép cộng vector để hỏi câu hỏi như “German + airlines” bằng cách tìm từ nào gần nhất:

Word vectors với quan hệ ngữ nghĩa như thế có thể được sử dụng để cải thiện rất nhiều các ứng dụng NLP như  machine translation, information retrieval and question answering systems, và các ứng dụng khác chưa được phát minh

Bài kiểm tra mối quan hệ  ngữ nghĩa – cú pháp for understanding of a wide variety of relationships as shown below. Sử dụng 640-dimensional word vectors, một skip-gram model đạt được 55% độ chính xác ngữ nghĩa và 59% độ chính xác cú pháp.

Quá trình học word vectors

Mikolov không phải là người đầu tiên sử dụng continuous vector biểu diễn các từ ,nhưng họ đã làm là chỉ ra cách để giảm thiểu độ phức tạp tính toán của quá trình học để biểu diễn – tạo ra nó thực hiện được để học high dimensional word vectors trong một lượng cực lớn dữ liệu. Ví dụ , “We have used a Google News corpus for training the word vectors. This corpus contains about 6B tokens. We have restricted the vocabulary size to the 1 million most frequent words…”

Độ phức tạp của  neural network language models (feedforward or recurrent) tới từ các tầng ẩn không tuyển tính (non-linear hidden layer(s)).

While this is what makes neural networks so attractive, we decided to explore simpler models that might not be able to represent the data as precisely as neural networks, but can posssible be trained on much more data efficiently.

Hai kiến trúc mới được đề xuất: Continuous Bag-of-Words model, và  Continuous Skip-gram model. Hãy cùng nhìn vào mô hình continuous bag-of-words (CBOW) trước .

Một đoạn trong bài báo có viết : “The recently introduced continuous Skip-gram model is an efficient method for learning high-quality distributed vector representations that capture a large number of precises syntatic and semantic word relationships.” Tưởng tượng một cửa sổ trượt qua text , nó sẽ bao gồm từ trung tâm mà đang focus , cùng với đó là 4 từ trước nó và 4 từ theo sau nó :

The context words form the input layer. Mỗi từ sẽ được mã hoá kiểu one-hot , như thế nếu vocabulary size là V thì sẽ là  V-dimensional vectors với chỉ một phần tử được đặt là 1 và tất cả các phần tử khác là 0 . Như thế sẽ chỉ có một tầng ẩn và một output layer.

Mục đích huẩn luyện đó là làm cục đại hoá xác suất có điều kiện  nhìn thấy output thật sự (the focus word) cho trước bởi  input context words. Trong ví dụ này , cho input(“an”, “efficient”, “method”, “for”, “high”, “quality”, “distributed”, “vector”) chúng ta muốn cực đại hoá xác suất lấy  đc từ “learning” là output.

Bởi vì input vector của chúng ta có dạng one-hot, nhân  input vector với ma trận trọng số  W1 hay đơn giản là lấy hàng  từ W1.

Cho trước  C input word vectors, “activation function: cho lớp ẩn tính tổng các hàng”hot” trong W1, và rồi chia cho C để lấy trung bình .

This implies that the link (activation) function of the hidden layer units is simply linear (i.e., directly passing its weighted sum of inputs to the next layer).

Từ  hidden layer cho tới output layer, ma trận trọng số thứ 2  W2 có thể được sử dụng để tính toán score cho từng từ trong vocabulary, và softmax có thể được sử dụng để phân bổ lại giá trị cho các từ .

Mô hình skip-gram là một mô hình đối lập hoàn toàn với mô hình CBOW . Nó được xây dựng  tập trung vào từ như một single input vector, và  target context words bây giờ là output layer:

Activation function cho hidden layer  đơn giản sao chép hàng tương ứng trong ma trận trọng số  W1 (linear) mà chúng ta đã thấy trước đó . Tại output layer , chúng ta cho ra C multinomial distributions thay vì chỉ một . Mục đích huấn luyện sẽ là tối thiểu hoá tổng lỗi dự đoán cho tất cả các context words trong  output layer. Trong ví dụ của chúng ta , đầu vào sẽ là  “learning”, và chúng ta sẽ mong muốn là sẽ nhìn thấy (“an”, “efficient”, “method”, “for”, “high”, “quality”, “distributed”, “vector”) tại output layer.

Tối ưu hoá

Phải cập nhật tất cả output vector  cho tất cả các từ trong tập huấn luyện rất là tốn kém ….

To solve this problem, an intuition is to limit the number of output vectors that must be updated per training instance. One elegant approach to achieving this is hierarchical softmax; another approach is through sampling.

Hierarchical softmax  sử dụng cây nhị phân để biết diễn tất cả các từ trong vocabulary. Mỗi từ là một lá trong cây . Với mỗi lá , tồn tại duy nhất một đường từ gốc tới lá này , như thế đường này sẽ được sử dụng để ước lượng xác suất mối từ biểu diễn bởi lá .

“We define this probability as the probability of a random walk starting from the root ending at the leaf in question.”

The main advantage is that instead of evaluating V output nodes in the neural network to obtain the probability distribution, it is needed to evaluate only about log2(V)words… In our work we use a binary Huffman tree, as it assigns short codes to the frequent words which results in fast training.

Negative Sampling chỉ đơn giản là chúng ta chỉ cập nhật sample của output word mỗi vòng lặp . Target output word sẽ được giữ trong sample và được cập nhật và chúng ta sẽ thêm một vài (non-target) từ như  negative samples.

“A probabilistic distribution is needed for the sampling process, and it can be arbitrarily chosen… One can determine a good distribution empirically.”

Milokov cũng sử dụng một cách tiếp cận subsampling đơn giản để chống lại sự mất cân bằng giữa các từ hiếm và thường xuyên trong tập huấn luyện (ví dụ, “in”, “the”, and “a” cung cấp ít giá trị thông tin hơn các từ hiếm ). Mỗi từ trong tập huấn luyện được loại bỏ với một xác suất P(wi)

f(wi là tần suất của từ  wi và t là 1 ngưỡng được chọn , thường xung quanh 10-5)

DeepLearning4j

Loading Data

Bây giờ tạo và đặt tên cho một class mới trong Java . Say đó , bạn sẽ cho raw sentences vào trong file .txt của bạn , đưa chúng qua iterator của bạn , và một số loại tiền xử lý , chẳng hạn chuyển đổi tất cả các từ về chữ thường .

        String filePath = new ClassPathResource("raw_sentences.txt").getFile().getAbsolutePath();

        log.info("Load & Vectorize Sentences....");
        // Strip white space before and after for each line
        SentenceIterator iter = new BasicLineIterator(filePath);

Nếu bạn muốn tải dữ liệu text của bạn từ ngoài folder của project :

        log.info("Load data....");
        SentenceIterator iter = new LineSentenceIterator(
             new File("/Users/cvn/Desktop/file.txt"));
        iter.setPreProcessor(new SentencePreProcessor() {
            @Override
            public String preProcess(String sentence) {
                return sentence.toLowerCase();
            }
        });

 

Tokenizing the Data

Word2vec cần được cung cấp các từ hơn các các câu , nên bước tiếp theo sẽ là tách từ từ dữ liệu . Để tách từ từ dữ liệu , ta có thể dùng space để nhận biết , ví dụ :

        // Split on white spaces in the line to get words
        TokenizerFactory t = new DefaultTokenizerFactory();
        t.setTokenPreProcessor(new CommonPreprocessor());

Nó sẽ cho chúng ta mỗi từ nằm trên một dòng

Training the Model

Chúng ta có thể tuỳ chỉnh mạng nơ ron Word2vec của chúng ta :

        log.info("Building model....");
        Word2Vec vec = new Word2Vec.Builder()
                .minWordFrequency(5)
                .iterations(1)
                .layerSize(100)
                .seed(42)
                .windowSize(5)
                .iterate(iter)
                .tokenizerFactory(t)
                .build();

        log.info("Fitting Word2Vec model....");
        vec.fit();

Tuỳ chỉnh các siêu tham số với ý nghĩa như sau :

  • batchSize là số từ chúng ta xử lý trong một thời điểm.
  • minWordFrequency là số lần xuất hiện ít nhất phải xuất hiện trong bộ ngữ liệu . Ở đây , nếu mà một từ xuất hiện ít hơn 5 lần , nó sẽ không được học . Các từ phải xuất hiện trong nhiều ngữ cảnh(context) để học các feature hữu ích về nó . Trong một bộ ngữ liệu lớn , hoàn toàn hợp lý để tăng ngưỡng minimum này lên .
  • useAdaGrad – Adagrad tạo ra các gradient khác nhau cho từng feature . Ở đây chúng ta sẽ không quan tâm đến nó .
  • layerSize chỉ rõ số features trong word vector . Nó bằng với số chiều trong featurespace . Từ được biểu diễn bới 500 features sẽ trở thành một điểm trong không gian 500 chiều .
  • iterations : đây là số lần mà bạn cho phép mạng của bạn cập nhật các hệ số của nó cho 1 batch của dữ liệu . Quá ít iterations có nghĩa là có thể không có đủ thời gian để học tất cả , quá nhiều sẽ kiến thời gian huấn luyện của mạng lâu hơn .
  • learningRate là step size cho mỗi lần cập nhật các hệ số , như các từ được bố trí trong feature space.
  • minLearningRate là mức sàn của  learning rate. Learning rate như số lượng từ bạn huấn luyện giảm xuống . Nếu  learning rate co lại quá nhiều , mạng huấn luyện sẽ không hiệu quả . Nó giữ các hệ số biến đổi .
  • iterate bảo mạng rằng batch của dataset nào nó đang huấn luyện.
  • tokenizer cho các từ vào  các batch hiện tại .
  • vec.fit() bắt đầu huấn luyện.

Evaluating the Model, Using Word2vec

Bước tiếp theo sẽ là đánh giá chất lượng feature vectors của bạn .

        // Write word vectors
        WordVectorSerializer.writeWordVectors(vec, "pathToWriteto.txt");

        log.info("Closest Words:");
        Collection<String> lst = vec.wordsNearest("day", 10);
        System.out.println(lst);
        UiServer server = UiServer.getInstance();
        System.out.println("Started on port " + server.getPort());
        
        //output: [night, week, year, game, season, during, office, until, -]

Dòng vec.similarity("word1","word2") sẽ trả lại độ tương đồng cosine của hai từ .Càng gần 1 , thì mạng nhận thức được 2 từ càng tương đồng  . Ví dụ như:

        double cosSim = vec.similarity("day", "night");
        System.out.println(cosSim);
        //output: 0.7704452276229858

Với vec.wordsNearest("word1", numWordsNearest), cho phép bạn lấy ra các từ tương tự về mặt ngữ nghĩa . Bạn có thể đặt số từ gần nhất mà bạn muốn ở tham số thứ 2 của wordsNearest. Ví dụ như:

        Collection<String> lst3 = vec.wordsNearest("man", 10);
        System.out.println(lst3);
        //output: [director, company, program, former, university, family, group
                               , such, general]

Saving, Reloading & Using the Model

Bạn sẽ muốn lưu lại model của bạn . Các thông thường để lưu models trong Deeplearning4j là thông qua serialization utils (Java serialization  tương tự như Python pickling , biến đổi một đối tượng sang series of bytes).

        log.info("Save vectors....");
        WordVectorSerializer.writeFullModel(vec, "pathToSaveModel.txt");

Nó sẽ lưu các vectors sang một file là  words.txt mà sẽ xuất hiện trong root của thư mục mà Word2vec được huấn luyện. Đầu ra của file sẽ phải có mỗi từ một dòng theo sau đó sẽ là một chuỗi các từ mà cùng nhau biểu diễn features vector của từ này .

Để làm việc tiếp với các vectors, đơn giản chỉ cần goi các phương thức trong  vec như sau:

Collection<String> kingList = vec.wordsNearest(Arrays.asList("king", "woman"), 
Arrays.asList("queen"), 10);

Ví dụ kinh điển của Word2vec’s là “king – queen = man – woman” và “king – queen + woman = man”.

Ví dụ bên trên sẽ cho ra 10 từ gần nhất với vector  king - queen + woman, mà sẽ phải bao gồm  man. Tham số đầu tiên của  wordsNearest sẽ có các từ “positive” kingwoman, sẽ có dấu + kết hợp chúng , tham số thứ 2 sẽ bao  gồm từ “negative” queen, mà sẽ kết hợp với dấu – ; và tham số thứ 3 là độ dài của list các từ gần nhất bạn muốn nhìn thấy .

Bạn có thể reload vectors như sau :

        Word2Vec word2Vec = WordVectorSerializer.loadFullModel("pathToSaveModel.txt");

Bạn có thể sử dụng Word2vec như một  lookup table:

        WeightLookupTable weightLookupTable = wordVectors.lookupTable();
        Iterator<INDArray> vectors = weightLookupTable.vectors();
        INDArray wordVector = wordVectors.getWordVectorMatrix("myword");
        double[] wordVector = wordVectors.getWordVector("myword");

Nếu một từ không có trong vocabulary, Word2vec returns zeros.

Importing Word2vec Models

Google News Corpus model we use to test the accuracy of our trained nets is hosted on S3. Người dùng với phần cứng hiện tại có thể tốn rất lâu để huấn luyện bộ ngữ liệu lớn , thay vào đó có thể đơn giản download nó về

Nếu bạn huấn luyện với  C vectors hoặc Gensimm, có thể import model như sau :

    File gModel = new File("/Developer/Vector Models/
                               GoogleNews-vectors-negative300.bin.gz");
    Word2Vec vec = WordVectorSerializer.loadGoogleModel(gModel, true);

Với một models rất lớp , bạn có thể gặp vấn đề với heap space . Google model sẽ cần tới 10G RAM , và JVM chỉ có thể chạy tới 256 MB RAM, như thế bạn sẽ phải điều chỉnh heap space của bạn . Với IntelliJ có thể làm

    //Click:
    IntelliJ Preferences > Compiler > Command Line Options 
    //Then paste:
    -Xms1024m
    -Xmx10g
    -XX:MaxPermSize=2g
    // Or
    Click File->Settings->Build,Execution,Deployment->Complier->Build 
process heap size


 Nếu bạn truy vấn Word2vec model một từ không xuất hiện trong tập huấn luyện , nó sẽ trả về null

Doc2vec & Other NLP Resources

Other Deeplearning4j Tutorials

Word2Vec in Literature

It's like numbers are language, like all the letters in the language are turned 
into numbers, and so it's something that everyone understands the same way.You 
lose the sounds of the letters and whether they click or pop or touch the palate,
or go ooh or aah, and anything that can be misread or con you with its music or 
the pictures it puts in your mind, all of that is gone, along with the accent, 
and you have a new understanding entirely, a language of numbers, and everything 
becomes as clear to everyone as the writing on the wall. So as I say there comes 
a certain time for the reading of the numbers.
                                     -- E.L. Doctorow, Billy Bathgate
Advertisements

3 thoughts on “Word2vec : The amazing power of word vectors

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s