Implementación de gramática múltiple de red neuronal recurrente (tomando Big Grammar como ejemplo)

(Referencia: Li Mu: Aprendizaje profundo práctico, Capítulo 8, Sección 3)       

En la aproximación del modelo autorregresivo, usamos los últimos valores de tau para predecir el siguiente, no todos. Siempre que esto sea aproximadamente exacto, decimos que la sucesión satisface la condición de Markov. En particular, si tau=1, se obtiene un modelo de Markov de primer orden.

P\izquierda (x _{1},x _{2}...x _{T} \derecha )=\prod_{t=1}^{T}P\izquierda (x _{t}| x _ {t-1}\derecho)​​​​​​​

       Ahora lo aplicamos al modelado del lenguaje. si

​​​​​​​P\izquierda (x _{t+1}|x _{1},x _{2}...x _{t} \right )=P\izquierda ( x _{t+1}| x _{{ t}\derecho)

       Luego, la distribución en la secuencia satisface la propiedad de Markov de primer orden, que es una gramática binaria en el modelado del lenguaje. La traducción es: creo que el valor predicho solo está relacionado con el valor conocido anterior. Cuanto mayor sea el orden, más largas serán las dependencias correspondientes. Esta propiedad conduce a una serie de formulaciones aproximadas que se pueden aplicar al modelado de secuencias:

Sintaxis unaria (independientes entre sí):P\izquierda (x _{1},x _{2},x _{3},x _{4} \derecha )=P\izquierda (x _{1} \derecha )P\izquierda (x _{{1} 2} \derecha)P\izquierda (x _{3} \derecha)P\izquierda (x _{4} \derecha)

Bigramas (relevantes solo para el anterior):P\izquierda (x _{1},x _{2},x _{3},x _{4} \derecha )=P\izquierda (x _{1} \derecha )P\izquierda (x _{{1} 2}| x _{1}\derecha)P\izquierda (x _{3}| x _{2} \derecha)P\izquierda (x _{4}| x _{3} \derecha)

Trigramas (relevantes solo para los dos primeros):P\izquierda (x _{1},x _{2},x _{3},x _{4} \derecha )=P\izquierda (x _{1} \derecha )P\izquierda (x _{{1} 2}| x _{1} \derecha )P\izquierda (x _{3}| x _{1}, x _{2} \derecha )P\izquierda (x _{4}| x _{2} , x _{3} \right )

Análisis de implementación de código:

(1) Primero importe el conjunto de datos y cree un vocabulario

import random
import torch
from d2l import torch as d2l

tokens = d2l.tokenize(d2l.read_time_machine())
# 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起
corpus = [token for line in tokens for token in line] # 二重循环把文本生成list
vocab = d2l.Vocab(corpus) #生成词表
print(vocab.token_freqs[:10]) #调用.token_freqs类方法

(2) Implementación de la gramática binaria

bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = d2l.Vocab(bigram_tokens)
print(bigram_vocab.token_freqs[:10])

El proceso de zip aquí se analiza de la siguiente manera:

corpus=['a','b','c','d','e','f']
print(corpus[:-1]) # 打印从索引0到最后一个(不含),也就是去掉最后一个
print(corpus[1:]) # 打印从索引1到最后,也就是去掉第一个
print(list(zip(corpus[:-1], corpus[1:]))) # 打包
['a', 'b', 'c', 'd', 'e']
['b', 'c', 'd', 'e', 'f']
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('e', 'f')]

Hasta ahora hemos generado un vocabulario binario. Luego, el resultado final de ejecución imprime los 10 primeros dígitos con la frecuencia más alta:

[(('of', 'the'), 309),
 (('in', 'the'), 169),
 (('i', 'had'), 130),
 (('i', 'was'), 112),
 (('and', 'the'), 109),
 (('the', 'time'), 102),
 (('it', 'was'), 99),
 (('to', 'the'), 85),
 (('as', 'i'), 78),
 (('of', 'a'), 73)]

Supongo que te gusta

Origin blog.csdn.net/qq_54708219/article/details/129218472
Recomendado
Clasificación