事前にトレーニングされた埋め込みをモデルに追加したくありません。しかし、語彙外(OOV)トークン応答はないようです。目に見えない単語のベクトルは存在しません。
では、遭遇したOOVトークンを処理するために何ができるでしょうか。私にはいくつかのアイデアがありますが、どれも非常に良いとは思えません。
このトークンのランダムなベクトルを作成することもできますが、理想的には、既存のモデルのロジック内にベクトルを配置する必要があります。ランダムに作成しただけでは、ベクトルが誤って「the」、「for」、「that」などの非常に頻繁な単語に非常に似ている可能性がありますが、これは私の意図ではありません。
または、代わりに単純なゼロでベクトルを初期化する必要がありますか?
別のアイデアは、他の既存のベクトルに対してトークンを平均化することです。しかし、どのベクトルを平均すると?すべての上?これも決定的なものではないようです。
このベクトルをトレーニングすることも考えました。ただし、トレーニング中に残りの埋め込みをフリーズしたい場合、これはあまり便利ではありません。
(一般的な解決策はありがたいですが、PyTorchがこの問題の便利な解決策をすでに提供している場合に備えて、PyTorchを使用していることを追加したいと思います。)
では、そのようなベクトルを作成するための優れた簡単な戦略は何でしょうか?
対処できる方法は複数あります。どちらがうまくいくかについての参考文献を引用することはできないと思います。
訓練不可能なオプション:
訓練可能なオプション:
OOVの個別の埋め込みベクトルを宣言し、他の埋め込みを固定したままトレーニング可能にすることができます。このためにルックアップを埋め込むforwardメソッドを上書きする必要があるかもしれません。新しいトレーニング可能Variable
を宣言できます。フォワードパスでは、ルックアップを実行する代わりに、このベクトルをOOVの埋め込みとして使用します。
OPのコメントへの対処:
3つの訓練不可能な方法のどれがよりうまくいくかはわかりませんし、これについていくつかの作業があるかどうかもわかりません。しかし、方法4)はうまく機能するはずです。
訓練可能なオプションについては、以下のように新しい埋め込みレイヤーを作成できます。
class Embeddings_new(torch.nn.Module):
def __init__(self, dim, vocab):
super().__init__()
self.embedding = torch.nn.Embedding(vocab, dim)
self.embedding.weight.requires_grad = False
# vector for oov
self.oov = torch.nn.Parameter(data=torch.rand(1,dim))
self.oov_index = -1
self.dim = dim
def forward(self, arr):
N = arr.shape[0]
mask = (arr==self.oov_index).long()
mask_ = mask.unsqueeze(dim=1).float()
embed =(1-mask_)*self.embedding((1-mask)*arr) + mask_*(self.oov.expand((N,self.dim)))
return embed
使用法:
model = Embeddings_new(10,20000)
out = model.forward(torch.tensor([-1,-1, 100, 1, 0]))
# dummy loss
loss = torch.sum(a**2)
loss.backward()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加