[コード]要約ソースコードの読み取り用の変圧器[3]

1.ラベルスムージング

分類問題のために、私たちは願ってラベル上の確率分布モデル出力、実際のラベルでワンホット表現に近いです。問題が原因で発生します。

  1. 汎化は保証されません
  2. オーバー自信予測モデルのカテゴリに得広げることができるような実際のカテゴリと他のカテゴリとの間の隙間にワンホット励まし、

論文のヘルプをスムージングラベル、どのようなときですか。説明を平滑化数学のラベルには:

  1. (マルチタグ)一定クロスエントロピー損失方程式は、KLダイバージェンスを用いたソースコードはまた、損失関数であり、実際には、損失関数を最小化するためには、2つの種類(定数エントロピー複数)と等価です
  2. 典型的に使用Yの実際のワンホット表現を用いて、Yの予測確率分布ラベルを用いて平滑化、クロスエントロピー計算スムーズOFF Y、及びYの予測確率分布クロスエントロピー計算
  3. ラベルスムージングのため、多くの場合、U(K)として導入一様分布、

そして独立分布の導入はu(k)、事前確率が均等に分散させることができるように機能することができます。

2つのステップがあります。

  1. 真ラベルディラック分布、およびuの分布(k)を決定します
  2. (1-イプシロン)では、2つの重量の加重和としてそれぞれイプシロンウェイト

コードの実装に対応します:


def label_smoothing(inputs, epsilon=0.1):
    K = inputs.get_shape().as_list()[-1]    # number of labels
    return ((1-epsilon) * inputs) + (epsilon / K)

効果は、元のワンホット表現は、モデル空間の一般化を残して、他のラベルにある確率の少ない絶対、分離なります。その主な役割のオーバーフィット防止しているので、オーバーフィットトレーニングを深刻に、ラベルの平滑化を参加を検討

2.コピーメカニズム

この実装で使用される紙に似たコピーメカニズムは、ポイントを得る:ポインタと要約 -Generatorネットワーク一貫した。

プロセスのコピーメカニズム:

  1. コピーモード:入力記事単語リストの確率分布を計算するためにデコーダ・エンコーダ注目重みを使用して、現在の時間ステップ

  2. 生成モードを:固定語彙上の確率分布を計算するためにデコーダ隠れ状態、デコーダ入力、デコーダ、エンコーダコンテキスト3を使用して

  3. ゲート:選択するための上記2つのモード、生成モードの現在の選択の確率を計算するためにデコーダ隠れ状態、デコーダ入力三のデコーダ・エンコーダコンテキストを使用して

  4. (以下)同時確率を計算します。

Wordのプロパティ次のカテゴリ:

  1. 固定語彙V
  2. 入力語リストX
  3. OOV(X - V)
  4. 拡張語彙X + V

単語の確率分布を計算する方法チャートから見ることができます。

単語のX確率を(重み付けによる)コピーモードによって算出され、Vは確率X∩Vワードが2つのモードの確率であり、単語の確率は(重みによって)生成モードによって算出される合計を重み付け前記別のゲートへのニューラルネットワークによって得られた重み。

もともと我々は唯一の確率分布の単語の固定された語彙を取得し、今の確率分布を取得の上に語彙を拡張(および原因別の入力に、Xは動的です)。我々は、固定された語彙に表示されていない出力をデコードすることができますが、これは言葉を介して入力テーブルで発生します。

如果在解码的时候,从X中拷贝了一个单词y,但是是属于X-V集合中,即OOV单词。因为只有V中的单词有embedding,所以y单词并没有embedding,那么下一时刻的解码输入应该如何处理?参考李丕绩前辈的实现:

next_y = []
for e in last_traces:
    eid = e[-1].item()
    if eid in modules["i2w"]:
        next_y.append(eid)
        else:
            next_y.append(modules["lfw_emb"]) # unk for copy mechanism

如果当前解码时刻的输出是从input word list中拷贝出来的OOV word的数,那么下一时刻的解码输入,就是 对应的embedding ,但是当前输出就不是UNK了,而是copy的词。

3. Recurrent Decoder?

在没有看Transformer在sequence generation任务上的具体实现的时候,一直好奇Decoder如果也是auto-regressive的话,那么是不是也是recurrent的?

在进行解码的时候(training 阶段使用teacher forcing,inference逐词输出),每次解码一个单词。在copy(pointer-generator network)机制下,当前decoder的输入如下:

y_pred, attn_dist = model.decode(ys, tile_x_mask, None, tile_word_emb, tile_padding_mask, tile_x, max_ext_len)
def decode(self, inp, mask_x, mask_y, src, src_padding_mask, xids=None, max_ext_len=None):
        pass
    

可以看出decoder的输入对应关系:

  1. 解码输入就是[seq_len, beam_width],其中seq_len是beam search已经得到的部分解码序列的长度

  2. 不对input_y进行mask,计算attention的时候,考虑全部的input_y序列中的元素;故mask_y=None

  3. src 是 tile_word_emb,输入序列的embedding,[max_x_len, beam_width, embedding_dim]

  4. src_padding_mask 是 tile_padding_mask,[max_x_len, beam_width]

  5. xid 是 tile_x,[max_x_len, beam_width]

    x = torch.tensor([1, 2, 3])
    
    x.shape
    Out[7]: torch.Size([3])
    x.repeat(4,2).shape
    Out[8]: torch.Size([4, 6])
    x.repeat(4,2,1).shape
    Out[9]: torch.Size([4, 2, 3])

    torch.Tensor.repeat函数,可以将指定维度进行复制。x的维度为[dx_0],x.repeat(dy_3, dy_2, dy_1, dy_0),需要先进行unsequeeze操作,将x的维度数目拓展到与repeat函数中的参数数目相同。再对应每个维度进行repeat。

decoder内部需要进行基于解码输入的self-attention,以及基于编码输出的external attention,输出有二:

  1. y_dec 解码器的解码输出,形状为 [seq_y_len, beam_width, vocab_size]。
    通过y_pred = y_pred[-1, :, :],取最后一个隐含状态作为当前的解码输出。
  2. attn_dist 是 word_prob_layer 计算出的,external attention的注意力权重,形状为 [seq_y_len, beam_width, max_x_len]

* Beam Search的Inference阶段,按照batch读取数据,进行编码,但是按照每个样本分别进行解码

In a nutshell,这不算recurrent,但还是auto-regressive的解码模式。recurrent指的是,当前时刻的解码,接受来自上一时刻的隐含状态。而Transformer decoder在解码每一个词的时候,不仅考虑了前一个词,还考虑了之前已经生成了的所有单词,并且利用其进行self-attention计算。

4. 参考资料

  1. 【Network】优化问题——Label Smoothing
  2. 【机器学习基础】熵、KL散度、交叉熵
  3. github repository: lipiji/TranSummar

おすすめ

転載: www.cnblogs.com/lauspectrum/p/11237421.html