.. _sec_glove: Incorporação de palavras com vetores globais (GloVe) ==================================================== Primeiro, devemos revisar o modelo skip-gram no word2vec. A probabilidade condicional :math:`P(w_j\mid w_i)` expressa no modelo skip-gram usando a operação softmax será registrada como :math:`q_{ij}`, ou seja: .. math:: q_{ij}=\frac{\exp(\mathbf{u}_j^\top \mathbf{v}_i)}{ \sum_{k \in \mathcal{V}} \text{exp}(\mathbf{u}_k^\top \mathbf{v}_i)}, onde :math:`\mathbf{v}_i` e :math:`\mathbf{u}_i` são as representações vetoriais da palavra :math:`w_i` do índice :math:`i` como a palavra central e a palavra de contexto, respectivamente, e :math:`\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}` é o conjunto de índices de vocabulário. Para a palavra :math:`w_i`, ela pode aparecer no conjunto de dados várias vezes. Coletamos todas as palavras de contexto sempre que :math:`w_i` é uma palavra central e mantemos duplicatas, denotadas como multiset :math:`\mathcal{C}_i`. O número de um elemento em um multiconjunto é chamado de multiplicidade do elemento. Por exemplo, suponha que a palavra :math:`w_i` apareça duas vezes no conjunto de dados: as janelas de contexto quando essas duas :math:`w_i` se tornam palavras centrais na sequência de texto contêm índices de palavras de contexto :math:`2, 1, 5, 2` e :math:`2, 3, 2, 1`. Então, multiset :math:`\mathcal{C}_i = \{1, 1, 2, 2, 2, 2, 3, 5\}`, onde a multiplicidade do elemento 1 é 2, a multiplicidade do elemento 2 é 4 e multiplicidades de os elementos 3 e 5 são 1. Denote a multiplicidade do elemento :math:`j` no multiset :math:`\mathcal{C}_i` as :math:`x_{ij}`: é o número da palavra :math:`w_j` em todas as janelas de contexto para a palavra central :math:`w_i` em todo o conjunto de dados. Como resultado, a função de perda do modelo skip-gram pode ser expressa de uma maneira diferente: .. math:: -\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij} \log\,q_{ij}. Adicionamos o número de todas as palavras de contexto para a palavra alvo central :math:`w_i` para obter :math:`x_i`, e registramos a probabilidade condicional :math:`x_{ij}/x_i` para gerar a palavra de contexto :math:`w_j` com base na palavra alvo central :math:`w_i` como :math:`p_{ij}`. Podemos reescrever a função de perda do modelo skip-gram como .. math:: -\sum_{i\in\mathcal{V}} x_i \sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}. Na fórmula acima, :math:`\sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}` calcula a distribuição de probabilidade condicional :math:`p_{ij}` para geração de palavras de contexto com base na central palavra-alvo :math:`w_i` e a entropia cruzada da distribuição de probabilidade condicional :math:`q_{ij}` prevista pelo modelo. A função de perda é ponderada usando a soma do número de palavras de contexto com a palavra alvo central :math:`w_i`. Se minimizarmos a função de perda da fórmula acima, seremos capazes de permitir que a distribuição de probabilidade condicional prevista se aproxime o mais próximo possível da verdadeira distribuição de probabilidade condicional. No entanto, embora o tipo mais comum de função de perda, a perda de entropia cruzada função às vezes não é uma boa escolha. Por um lado, como mencionamos em :numref:`sec_approx_train` o custo de deixar o a previsão do modelo :math:`q_{ij}` torna-se a distribuição de probabilidade legal tem a soma de todos os itens em todo o dicionário em seu denominador. Isso pode facilmente levar a sobrecarga computacional excessiva. Por outro lado, costuma haver muitos palavras incomuns no dicionário e raramente aparecem no conjunto de dados. No função de perda de entropia cruzada, a previsão final da probabilidade condicional a distribuição em um grande número de palavras incomuns provavelmente será imprecisa. O modelo GloVe -------------- Para resolver isso, GloVe :cite:`Pennington.Socher.Manning.2014`, um modelo de incorporação de palavras que veio depois de word2vec, adota perda quadrada e faz três alterações no modelo de grama de salto com base nessa perda. 1. Aqui, usamos as variáveis de distribuição não probabilística :math:`p'_{ij}=x_{ij}` e :math:`q'_{ij}=\exp(\mathbf{u}_j^\top \mathbf{v}_i)` e pegue seus logs. Portanto, obtemos a perda quadrada :math:`\left(\log\,p'_{ij} - \log\,q'_{ij}\right)^2 = \left(\mathbf{u}_j^\top \mathbf{v}_i - \log\,x_{ij}\right)^2`. 2. Adicionamos dois parâmetros do modelo escalar para cada palavra :math:`w_i`: os termos de polarização :math:`b_i` (para palavras-alvo centrais) e :math:`c_i` (para palavras de contexto). 3. Substitua o peso de cada perda pela função :math:`h(x_{ij})`. A função de peso :math:`h(x)` é uma função monótona crescente com o intervalo :math:`[0, 1]`. Portanto, o objetivo do GloVe é minimizar a função de perda. .. math:: \sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\mathbf{u}_j^\top \mathbf{v}_i + b_i + c_j - \log\,x_{ij}\right)^2. Aqui, temos uma sugestão para a escolha da função de peso :math:`h(x)`: quando :math:`x`__