(参考: Li Mu: 実践的な深層学習、第 8 章、セクション 3)
自己回帰モデルの近似では、すべてではなく、最後のタウ値を使用して次のタウ値を予測します。これがほぼ正確であれば、その数列はマルコフ条件を満たしていると言えます。特に、tau=1 の場合、一次マルコフ モデルが得られます。
次に、それを言語モデリングに適用します。もしも
この場合、シーケンス上の分布は、言語モデリングにおけるバイナリ文法である一次マルコフ特性を満たします。翻訳すると、「予測値は以前の既知の値にのみ関連していると思います。」順序が高くなるほど、対応する依存関係は長くなります。この特性により、シーケンス モデリングに適用できるいくつかの近似公式が導き出されます。
単項構文 (互いに独立):
バイグラム (前のバイグラムにのみ関連):
トリグラム (最初の 2 つにのみ関連):
コード実装分析:
(1) まずデータセットをインポートし、語彙を構築します
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) バイナリ文法の実装
bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = d2l.Vocab(bigram_tokens)
print(bigram_vocab.token_freqs[:10])
ここでの zip のプロセスは次のように分析されます。
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')]
これまでのところ、バイナリ語彙を生成しました。次に、最終的な実行結果では、最も高い頻度で上位 10 桁が出力されます。
[(('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)]