[コード]ライティングネットワークの編集ソースコード解析

基本情報

著者:Qingyun王

论文:編集機構を介して紙抽象ライティング(ACL)

出典:https://github.com/EagleW/Writing-editing-Network

データ前処理

1.データのロード

  1. 抽象的で抽出された見出し
  2. ワード(単語を書くためには、もちろん、NLTKや他のツールでコーティングすることができます)
  3. 構成されたコーパス:リスト(すべてのサンプル)==>サブリスト(サンプル:見出し+抽象)==>サブサブリスト(トークン+文)

2.語彙を構築

  1. 語彙学習データ構造、vocab_sizeする単語頻度、省略低周波単語、語彙のサイズに応じてソート
  2. 単語、句読点の増加に<パッド>、<UNK>、<EOS>、<BOS>や他のいくつかのフラグに基づいて、
  3. 辞書の最初の<パッ​​ド>

3. word2id、id2word

  1. コーパスは、トークンIDにマッピングされる(パディングを行いません)
  2. 2つのフラグビット<EOS>の増加前後抽象<BOS>、(教師が訓練を強制的に)復号化入力シフトと等価であるように、タイトルを追加する必要があり、<EOS>、<BOS>
  3. コーパスは、(ソートするために長いから見出しに従ってコーパスの短い)長さ符号の入力順に並べ替えを行います
  4. 取得max_x_len、max_y_len

モデル構築

1.埋め込み

  1. マトリックス埋め込みランダム初期化、通過するnn.Embedding二つのパラメータ:vocab_size、embed_dimを
  2. 定義されて良い埋め込んだ後、タイトルのためのエンコーダ、ドラフト用のエンコーダ、デコーダ共通。その見出し、ドラフト、抽象共有同じエンコーディング

タイトル2.エンコーダ

  1. 単層の双方向GRU
  2. コードので、タイトルの入力順に従ってソートされているので、入力を使用することができる場合nn.utils.rnn.pack_padded_sequence、リサイクル得られた結果を符号化するためにnn.utils.rnn.pad_packed_sequenceパディングビットを記入します。だから彼らは、双方向エンコーディングのパディングビットの影響を除いた、より正確な結果を作ることができます
  3. input_sorted_by_length ==>パック==>エンコード==>パッド==> encoder_output

ドラフト3.エンコーダ

  1. 単層の双方向GRU
  2. 入力シーケンスの形状が[max_y_len、BATCH_SIZE]であるが、効果的に混合配列要素の数、ソートするこの時間は、バッチの回収中に符号化されたが、これは、デコーダの出力を符号化するためのドラフトエンコーダであります元の場所には多くの問題であるサンプル
  3. だから我々は持っていないnn.utils.rnn.pack_padded_sequencenn.utils.rnn.pad_packed_sequenceの二つの機能、および結果がパディングの符号化ビットによって影響を受けることになりますが、無害

オールパス復号のための4デコーダ

  1. 単層の単方向GRU
  2. 各パスをデコードし、同一のデコーダで使用されています
  3. これは、2つの注意が含まれています。
    1. 注目のデコーダ隠された状態の最後のパスのために
    2. 注目のエンコーダ隠れ状態のためのデコーダ隠れ状態の電流パス、

5.コンプリートモデル

エンコーダ、デコーダ、ワード確率層の上記2種類を含みます

6.インスタンス化モデル

# 为模型设置可见GPU
torch.cuda.set_device(0)

# 打印GPU信息
if torch.cuda.is_available():
    print("congratulations! {} GPU(s) can be used!".format(torch.cuda.device_count()))
    print("currently, you are using GPU" + str(torch.cuda.current_device()), 
          "named", torch.cuda.get_device_name(torch.cuda.current_device()))

    # 利用CUDA进行加速
    model = model.cuda()
    criterion = nn.CrossEntropyLoss(ignore_index=0).cuda()
    
else:
    print("sadly, CUDA is not available!")

出力:

Congratulations! 1 GPU(s) can be used!
Currently, you are using GPU0 named "GeForce GTX 1050 Ti"

訓練プロセス

  1. train_epoch機能を入力します。

    1. train_batch機能を入力します。

      1. Noneに設定以前に生成されたドラフト

      2. 入力[BATCH_SIZE、max_x_len]、ターゲット[BATCH_SIZE、max_y_len]

      3. 入力コード、[BATCH_SIZE、max_x_len]

      4. マルチパスデコーディングサイクルに

        1. 注目エンコーダ側 - 最初の音符を復号化なしに、以前に生成された案は、デコーダのみを行う場合
          1. 暗黙のデコードベクトル
          2. 確率分布を得るために、語彙サイズにマッピングされました
          3. サンプリングされた出力をデコード(欲張り探索)
          4. 作为以前に生成されたドラフト
        2. 以前に生成されたドラフトがNoneでない場合、復号化は、先に説明されているので、デコーダ、エンコーダの間に関心がなければならないが、また、状態はドラフトが出席され、生成暗示しました
        3. 各パス、即ちドラフトの復号結果の実装は、グランドトゥルース損失クロスエントロピー、(できるだけ近くも望ましいドラフト標的配列トレーニングBATCH、バック伝搬時間)バックプロパゲーション、更新パラメータを用いて算出されています
    2. 印刷エポック平均エポック損失の終了後に損失のレコードバッチ、

    3. ノー検証の各エポック

  2. エポックサイクルの終了後にパラメータのセットを保存

  3. 現在のエポック平均損失は、前のエポックの平均損失よりも大きい場合、オーバーフィッティングを防止するための訓練を停止する必要があるが、このモデルは損失の使用は、算出したトレーニングセットにここにあります

推論フェーズ

実行するには

  1. 各エポックは、損失が前の平均損失検証時間よりも大きい場合、訓練を停止し、検証一旦終了しました。
  2. 添加混合目的関数
  3. バッチに一度だけ符号化されたエンコーダにアウターループ
  4. 同じことをやっていないため、デコーダの各パス。それも、変圧器、1 RNN(2回ビームサーチ)であってもよいです。この実装、最初のいくつかのパス復号は欲張り探索しています
  5. デコード原則明確なトランス、寸法テンソルを入力するにはどのような明確な理由ビーム探索、注入を促進

おすすめ

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