BERTの自然言語処理

1はじめに

         静けさ!BERTは、11個のNLPタスクレコードを同時に更新したモデルです。本質的に、バートは事前トレーニングモデルに属しています。モデルは、コンテキストと単語の関係、および文と文の関係を理解できます。さまざまなタスクについて、BERTをさまざまな転移学習に使用できます。等価であるモデル構造の点でトランス層エンコーダ(に積層B idirectional  E nCoder  R&LTからepresentations  Tのransformers)。本質的にそのような気取らないモデルは、どのようにしてしばらくの間波をかき立て、平和なNLPの世界をひっくり返しましたか。その魅力的なものを一緒に見てみましょう。Transfomerを知らない場合は、最初にTransformerを学ぶことを強くお勧めします

2.BERT理論

      1.ネットワーク構造

              まず、bertが実行するプロセス全体を理解しましょう。図から、事前トレーニングと微調整に使用される主な構造は変更されていないことがわかります。まず、各入力は2つの文で構成される文のペアであり、一部の単語はランダムにマスクされ、CLSを開始マークとして使用し、SEPを文間の分離マークとして使用します。次に、これらの単語は、図2の埋め込みレイヤーを通過します。埋め込み情報には、単語埋め込み情報、文埋め込み情報、位置埋め込み情報の3つのレベルがあります。次に、Transfomerで複数のエンコーダレイヤーを接続します。最終的な出力は、マスクの単語と、文Bが文Aの次の文であるかどうかを予測することです。

       

     

   2.マルチタスク学習 

           上記の紹介から、bertはマルチタスク学習モデルであることがわかります。

              1.マスクされた言語モデル:最初に、単語の一部が各文でランダムにマスクされます。これは、Transfomerのデコーダー部分のマスクにいくぶん似ています。実際のトレーニングでは、各文の単語の15%がランダムにマスクされます。マスクを80%使用し、マスクの代わりに別の単語を10%使用し、すべての文情報を10%使用します。

             なぜマスクを使用するのですか?前述したように、bertはトランスフォーマーでエンコーダーをスタックするのと同じです。エンコーダーの自己注意の最初のレイヤーは、単語間でペアワイズ計算を実行します。つまり、各単語にはすべての単語に関する情報が含まれます(これは、予測される情報が公開されていないことに相当します)。エンコーダーの本質はワードをエンコードするプロセスと同等であり、入力と出力の長さは同じです(予測タスク用に設計されていません)。したがって、情報公開の問題を解決しながら、モデルに予測機能を持たせるために。エンコーダーを変更する必要があり、自然言語モデルの中間の単語を予測するために周囲の単語を使用するメカニズムが参照に使用され、デコーダーのマスクメカニズムが参照に使用されます。予測するとき、いくつかの単語をランダムにマスクして、これらの単語を予測します。
             2.次の文の予測:同時に、モデルに文と文の関係を理解できるようにする必要があります。たとえば、2つの文が与えられた場合、それらが文脈上の関係にあるかどうかを判断します。このために、入力用の文のペアとして2つの文を使用するように設計しました。後続の埋め込みレイヤーは、各単語にそれが属する文情報を伝達させます。

            このようにして、入力と出力を変換します。事前トレーニングモデルに複数の機能があるため、簡単な微調整により、テキストの分類、シーケンスのラベル付け(単語のセグメンテーション、エンティティの認識、音声の一部のラベル付け)、文の関係の判断(QA、自然言語)などのさまざまなタスクを完了できます。推論)など。

    3.微調整

            BERTモデルの本来の目的は、さまざまなダウンストリームタスクに適応するように微調整することです。そのデザインは微調整にも非常に便利です。微調整には、一般的に2つのアイデアがあります。

           1.既存のモデルを特徴抽出器として使用し、その出力レイヤーを削除してから、対応するタスクに必要な出力レイヤーに従います。もちろん、実際の状況に応じて、最後のレイヤーの機能出力だけを言及する必要はありません。必要な任意のレイヤーにすることができます。

           2.既存のモデルに基づいてトレーニングを行い、新しいモデルをタスクにより適したものにします。

           3.実際の状況によっては、すべてのレイヤーを微調整する必要がない場合もありますが、現時点では、一部のレイヤーのみを微調整し、次に独自の出力レイヤーを調整します。

   4.理論的要約

             上記では、Transfomerに基づくエンコーダのスタッキングモデルであるbertの理論的な部分を紹介しました。予測を行い、情報漏えいを防止するため、マスク機構を採用しています。より高度なセマンティック情報を抽出するために、モデルに文の関係を判断する機能があるため、次の文のメカニズムが使用されます。派手な操作はあまり多くありません。話しすぎてください。しかし、その効果は確かに人々の認識をリフレッシュしました。これはいわゆるDao Zhi Jianかもしれません!敬意を表する!

3.ソースコード

         この記事では、学習にBERTソースのテンソルフローバージョンを使用しています元のgithubリンクはこちらです。BERTの運用には比較的高いハードウェア要件があり、私は今でも比較的貧弱です。だから私はFine-Tuning自身のプロジェクトにBERTを使おうとしたところ、当然失敗しました。もちろん、自分にふさわしいものにするために、いろいろな方法を試しましたが、失敗しました!現時点では、これが神の意味だと感じています。革命はまだ成功しておらず、仲間はまだ諦めることができます。どんなに粘り強くても時間の無駄なので断固として諦めます。

         しかし、私はまだコードを真剣に読んでいます、私は最善を尽くさなければなりません!コードは2つの部分に分かれていると思います。1つはソースコードにコメントを書き込もうとしている部分で、もう1つは自分で学ぶ価値があります。最も重要なことは、リラックスして気を配ることです。それでは、ソースコードの旅を始めましょう!

1.トレーニングプロセスを考える

         実際、従来のトレーニングプロセスはテンソルフローと同じであり、データの前処理、モデルの構築、トレーニング、検証のステップにすぎません。それらはすべてコアモデルを中心に展開します。私たちはモデルを赤ちゃんとして想像します。データは食べ物であり、モデルの構築は彼自身であり、トレーニングは彼が学び成長するためのものであり、検証は人生から渡された解答用紙です。彼はこのプロセスを継続的に繰り返すことで成長を続けています。アンダーフィットとは、子供が劣っていることを意味し、オーバーフィットは傲慢すぎます。究極の目標は、成長して社会に貢献すること、つまりモデルの使用です。完璧な人がいないように、グローバルな最適値を見つけるためにモデルを必要としません。これは、モデルを使用できるという原則があることを意味します。

        データは異なります。つまり、家族が豊富な子供もいれば、貧しく生まれた子供もいます。データはモデルの上限を決定するので、人の出生の高さはある程度生命の高さの範囲を決定します。もちろん、よく学ぶことでパフォーマンスが向上する可能性があります。学習率が異なるということは、子供たちの性格が異なることを意味します。前向きで衝動的な人もいれば、用心深いが臆病な人もいます。

        もちろん、結局のところ、みんなの運命は完全に異なります。BERTと同じくらい素晴らしい、それは何千人もの人々、そして時代のスターによって求められています。私の4Gビデオメモリのように、遊びの精神で訓練されたモデルは運命にあります。これは私たちのモデルであり、これは私たちの一部です。

2.パラメータの定義 

        data_dir(データ)、bert_config_file(構成ファイル)、task_name(タスク名)、vocab_file(ワードリスト)、init_checkpoint(事前トレーニングモデル)、およびいくつかのオプション項目など、BERTの実行時にいくつかのパラメーターを指定する必要があります。tf.flagsクラスを使用して、コマンドラインパラメータを取得する機能を実現します。tf.app.run()メソッドは定義されたメインメソッドを検索し、検証パラメータを渡す必要があります。   

#使用tf.flags来定义命令行参数,然后使用FLAGS来获取对应的参数
def main(_):
    print('she is a very beautilful girl,she name is',FLAGS.name)
flags = tf.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('name', None, 'who is the one you love')
flags.mark_flag_as_required('name')
tf.app.run()

3.トレーニング手順に関する疑問

  エポックとステップの違いについて混乱してきました。次に、この機会に説明します。

     batch_size:バッチあたりのサンプル数

     ステップ:トレーニングステップの数。パラメータを更新するたびに、1つのステップに対応します(勾配を1つ下げることに相当します)。

     エポック:すべてのデータ数回トラバースする必要があること示します。

    もちろん、通常はウォームアップ(ウォームアップステップの数)が続き、モデルを安定させるために、通常、特定のラウンドをトレーニングするために小さな学習率が使用されます。ある程度のオーバーフィットを防ぐことができます。

  if FLAGS.do_train:
    #获取训练的数据
    train_examples = processor.get_train_examples(FLAGS.data_dir)
    #训练步数 = 总样本数*轮次/批次大小
    num_train_steps = int(
        len(train_examples) / FLAGS.train_batch_size * FLAGS.num_train_epochs)
    #根据warmup比例计算warmup的步数
    num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion)

4.埋め込みレイヤー

      まず、各入力ワードに対応する埋め込みを取得し、次に位置情報埋め込みレイヤーを初期化し、そのワードが属する文に基づいてToken_Typeの埋め込みを計算します。3つを追加して、最終的な埋め込みレイヤーを取得します。これは、紙の3層の埋め込みに対応します。位置の埋め込みはコサインサイン関数を使用せず、ネットワーク学習によって取得されるだけです。

5.マスクの実現

      Attention_maskでは、通常の単語は1で、マスクされた単語は0です。最終計算後に得られた加算器で、通常のワードは0、マスクワードは-10000です。その後、スコアが元のアテンションスコアに加算され、マスクされたワードは非常に小さい値になります。このようにマスクします。

  if attention_mask is not None:
    # `attention_mask` = [B, 1, F, T]
    attention_mask = tf.expand_dims(attention_mask, axis=[1])

    # Since attention_mask is 1.0 for positions we want to attend and 0.0 for
    # masked positions, this operation will create a tensor which is 0.0 for
    # positions we want to attend and -10000.0 for masked positions.
    adder = (1.0 - tf.cast(attention_mask, tf.float32)) * -10000.0

    # Since we are adding it to the raw scores before the softmax, this is
    # effectively the same as removing these entirely.
    attention_scores += adder

6.可変コンテキスト管理

        tf.variable_scopeは、tf.get_variable()を使用して変数を定義し、変数コンテキストマネージャーとして使用できます。つまり、多くの変数があり、変数名が繰り返される場合、変数はコンテキストに属します。この方法は、異なるコンテキストで変数を区別するために使用できます。変数名は同じですが、異なるコンテキストでは、異なる変数に属します。

        同時に、再利用を使用してコンテキストを再利用できます。

with tf.variable_scope("lover"):
    v=tf.get_variable("V",[1])
with tf.variable_scope("lover",reuse=True):
    v1 = tf.get_variable("V", [1])
if v == v1:
    print('两者是同一个变量')
else:
    print('两者不是同一个变量')

4.ナンセンス

             愛はすべての力の源であり、私はいつも魂が体に閉じ込められていると思っていました。それはもともととてもシックで自由でした。ある日まで、魂の世界がどんなに自由であっても、それは孤独なものに過ぎないことに突然気づきました。それは時間と空間を楽しんでいます。しかし、他の世界とコミュニケーションを取り、融合する方法はありません。この体を通してのみ、この世界の愛が流れ出し、他の世界の愛が流れ込むことができます。私たちの魂は水のようであり、温度が必要であり、愛は魂の温度です。温度のない水は流れなくなり、幸福もなくなります。もちろん、それは死ぬことはなく、一時的に凍結するだけです。ある日また暖かい日差しが差し込んでも、溶けることがあります。愛する能力も、さまざまな形で大小さまざまです。偉大な土地には愛があり、空と白い雲には愛があり、太陽、月、星には絶え間ない愛があります。彼らの目と心がどこにあるのかはわかりません。結局のところ、私は表面に住んでいる小さな人です。しかし、彼らが住む世界はより豊かな色とより美しい音楽を持ち、その大きな世界はもっと活気に満ちているに違いないと私は信じています。短い人生が終わったら、参加することもできます。ですから、この人生が終わった後、私は暗闇に直面することを恐れません。人々が見ることができる光はごくわずかです。ある日、私がすべての光を見ることができると想像してみてください。もちろん、別の目があります。これまでのところ、私はこの人生が大好きです、時間をかけて、恐れることは何もありません!

[トラップミュージックXザマトリックス]

 

おすすめ

転載: blog.csdn.net/gaobing1993/article/details/108711664