(第7回)リンクMRCとRetrieval

31238 ワード

1. Introduction to Open-domain Question Answering (ODQA)


Linking MRC and Retrieval: Open-domain Question Answering (ODQA)



  • の投入は産出に相当する.参考指紋の数が違うだけです.ODQAは大量の文章を読む必要がある.
  • 最近、グーグルなどの検索エンジンのウェブサイトは、検索語に関するドキュメントだけでなく、質問の答えも提供している.
  • History of ODQA


  • は以前にも議論されたテーマです.3つのテーマで公開される方法と最近の方法はあまり違いません.
  • は当時高度な方法がなかったので、指紋からキーワードを答えのタイプとして選択する方法が唯一でした.

  • 例えば、
  • 、この質問の答えは「場所」であるべきです.あるいは「場所」の中でも「国」であるべきだ.などは、ルールまたはキーワードに基づいて定義されます.
  • 2号のような場合もTF−IDFやBM 25のような方法論が用いられる.
  • 3特徴とheristicを用いて分類器を構築し,与えられた問題がどの段落に関係しているかを判断した.
  • 最近のMRCは単純な指紋だけでなく、指紋内の答えがどのような範囲内にあるかを知る必要があるため、より進化したと言える.当時はspanレベルで答えを出す技術力がなかったからだ.また,技術の発展により,ユーザの興味がより具体化される.
  • IBM製WatsonというAIがテレビクイズで優勝し、注目を集めている.
  • 実際の方法論は従来の方法とあまり変わらない.各種の機能とこれらの機能のために蓄積されたSVMなどの初期の機械学習技術を採用した.
  • 以降,深い学習が進むにつれてパターンが変化し,NLPパターンが変化した.
  • Recent ODQA Research


  • 17年から本格的に発展している.
  • 2. Retriever-Reader Approach


    検索-リーダメソッド



  • の2つの方法を接続すればよいので、これは簡単な方法です.
  • 学習段階



    Distant supervision


  • の学習では、データを追加したい場合は、リモートモニタリングを使用できます.
  • MRCは質問と答えを提供し、指紋で得られた答えと比較して学習する方式ですが、一般的にはどの指紋に答えが与えられるか分からないので、直接調べる必要があります.
  • まず
  • ウィキペディアに質問し、指紋を見つけます.このときは上記の条件を持って探します.
  • ビットを条件としてフィルタリングしても、この指紋は質問に答えられない可能性がある.しかし,このようなフィルタリングにより可能性が高まったと仮定し,それを見つける.
  • を利用して、多くの問答-短文対(問答対のみであっても)を作成することができ、ウィキペディアから短文を持参することもできます.
  • Inference


  • の5つは増加しても減少してもよい.
  • 3. Issues and Recent Approaches


    Different granularities of text at indexing time


  • ウィキペディアでは、文書単位で500万個、段落単位で3000万個、文単位で7.5千万個が存在する.
  • のような割合で、どのくらいのメッセージを転送するかを考慮する必要があります.必ずしも比例する必要はありませんが、一般的には比例して取ります.
  • kの増加に伴い、性能は向上するようだが、必ずしもそうではない.
  • Single-passage training vs Multi-passage training


  • は、直接比較ではなく間接比較と見なすことができる.全体的な脈絡が必要です
  • の欠点は、大量のメモリリソースと計算が必要であることです.モデルを調整するときはいろいろ考えなければなりません.
  • Importance of each passage


    リーダーの立場では、点数ではなくtop-kチャネルを受け入れることであり、最終結果にtop-k scoreを加算して合算として考えると、よく表現される場合もあります.

    実習


    Requirements

    !pip install datasets==1.4.1 > /dev/null 2>&1 # execute command in silence
    !pip install transformers==4.4.1 > /dev/null 2>&1
    !pip install tqdm==4.41.1 > /dev/null 2>&1
    import random
    import numpy as np
    from pprint import pprint
    
    from datasets import load_dataset, load_metric
    from sklearn.feature_extraction.text import TfidfVectorizer
  • pprintは、印刷をきれいにするためのツールです.
  • TF−IDFを実行するためにsklearnはそれをロードする.
  • データのロードと評価指標

    dataset = load_dataset("squad_kor_v1")
    # metric = load_metric('squad')

    Sparse Retrieverのインポート

    corpus = list(set([example['context'] for example in dataset['train']])) 
    corpus.extend(list(set([example['context'] for example in dataset['validation']])))
    tokenizer_func = lambda x: x.split(' ')
    
    vectorizer = TfidfVectorizer(tokenizer=tokenizer_func, ngram_range=(1,2))
    sp_matrix = vectorizer.fit_transform(corpus)
  • trainデータセットからコンテキストをインポートし、コーパスを構築し、検証データとマージして寸法を付けます.
  • ベクトルマシンはunigramとbigramのみを使用します.その後fit transformを行い,コーパスに対するすべての疎行列を生成する.
  • corpus = list(set([example['context'] for example in dataset['train']])) 
    corpus.extend(list(set([example['context'] for example in dataset['validation']])))
    tokenizer_func = lambda x: x.split(' ')
    
    vectorizer = TfidfVectorizer(tokenizer=tokenizer_func, ngram_range=(1,2))
    sp_matrix = vectorizer.fit_transform(corpus)
  • の問題が提起されたが,データセットに問題に関する語彙がないためassertエラーが発生する.
  • の結果は、すべての問題についてTF−IDFの値を求め、scoreおよびidsにソートして返される.
  • テスト

    """ 1. 정답이 있는 데이터셋으로 검색해보기 """ 
    # random.seed(1)
    # sample_idx = random.choice(range(len(dataset['train'])))
    # query = dataset['train'][sample_idx]['question']
    # ground_truth = dataset['train'][sample_idx]['context']
    # answer = dataset['train'][sample_idx]['answers']
    
    """ 2. 원하는 질문을 입력해보기 """
    query = input("Enter any question: ") # "미국의 대통령은 누구인가?"
    # query = "미국의 대통령은 누구인가?"
    _, doc_id = get_relevant_doc(vectorizer, query, k=1)
    
    """ 결과 확인 """
    print("{} {} {}".format('*'*20, 'Result','*'*20))
    print("[Search query]\n", query, "\n")
    print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
    print(corpus[doc_id.item()])
    # print(answer)
    Enter any question: 에이핑크의 리더는 누구인가
    ******************** Result ********************
    [Search query]
     에이핑크의 리더는 누구인가 
    
    [Relevant Doc ID(Top 1 passage)]: 446
    오바마는 어린 시절에 대하여 "아버지는 내 주변 사람들과 전혀 다르게 생겼다는 점 - 아버지는 피치처럼 시꺼멓고, 어머니는 우유처럼 하얗다 - 을 나는 개의치 않았다"라고 회상하였다. 그는 그의 투쟁을 자신의 다민족 혈통과 사회적 인식을 화해시키기 위한 어린 성년이라고 말하였다. 오바마는 호놀룰루에서 지낸 자신의 성장기를 반추하며, "하와이에서 얻는 기회 - 상호 존중의 분위기 속에서 다양한 문화를 경험한 것 - 는 내 세계관에서 중요한 부분이 되었으며, 내가 가장 아끼는 가치의 근간이 되었다"라고 썼다. 오바마는 또 십대 시절 알코올, 마리화나, 코카인을 복용한 사실에 대해 "나는 누구인가 하는 질문을 머리 속에서 잊으려" 했던 것이라고 밝혔다. 2008년 대통령 후보 공개 토론(Civil Forum on the Presidency)에서 오바마는 자신의 고등학교 시절 마약에 손 댄 일이 자신의 "최대의 도덕적 과오"라고 말하였다.

    研修済みMRCモデルのインポート

    import torch
    from transformers import (
        AutoConfig,
        AutoModelForQuestionAnswering,
        AutoTokenizer
    )
    
    model_name = 'sangrimlee/bert-base-multilingual-cased-korquad'
    mrc_model = AutoModelForQuestionAnswering.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(
        model_name,
        use_fast=True
    )
    mrc_model = mrc_model.eval()
  • korQuadは学習したモデルにロードされます.実践の中でこれを直接学ぶには長い時間がかかるので、
  • def get_answer_from_context(context, question, model, tokenizer):
        encoded_dict = tokenizer.encode_plus(  
            question,
            context,
            truncation=True,
            padding="max_length",
            max_length=512,
        )
        non_padded_ids = encoded_dict["input_ids"][: encoded_dict["input_ids"].index(tokenizer.pad_token_id)]
        full_text = tokenizer.decode(non_padded_ids)
        inputs = {
        'input_ids': torch.tensor([encoded_dict['input_ids']], dtype=torch.long),
        'attention_mask': torch.tensor([encoded_dict['attention_mask']], dtype=torch.long),
        'token_type_ids': torch.tensor([encoded_dict['token_type_ids']], dtype=torch.long)
        }
    
        outputs = model(**inputs)
        start, end = torch.max(outputs.start_logits, axis=1).indices.item(), torch.max(outputs.end_logits, axis=1).indices.item()
        answer = tokenizer.decode(encoded_dict['input_ids'][start:end+1])
        return answer
    context = corpus[doc_id.item()]
    answer = get_answer_from_context(context, query, mrc_model, tokenizer)
    print("{} {} {}".format('*'*20, 'Result','*'*20))
    print("[Search query]\n", query, "\n")
    print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
    pprint(corpus[doc_id.item()], compact=True)
    print(f"[Answer Prediction from the model]: {answer}")
    ******************** Result ********************
    [Search query]
     에이핑크의 리더는 누구인가 
    
    [Relevant Doc ID(Top 1 passage)]: 446
    ('오바마는 어린 시절에 대하여 "아버지는 내 주변 사람들과 전혀 다르게 생겼다는 점 - 아버지는 피치처럼 시꺼멓고, 어머니는 우유처럼 '
     '하얗다 - 을 나는 개의치 않았다"라고 회상하였다. 그는 그의 투쟁을 자신의 다민족 혈통과 사회적 인식을 화해시키기 위한 어린 성년이라고 '
     '말하였다. 오바마는 호놀룰루에서 지낸 자신의 성장기를 반추하며, "하와이에서 얻는 기회 - 상호 존중의 분위기 속에서 다양한 문화를 '
     '경험한 것 - 는 내 세계관에서 중요한 부분이 되었으며, 내가 가장 아끼는 가치의 근간이 되었다"라고 썼다. 오바마는 또 십대 시절 '
     '알코올, 마리화나, 코카인을 복용한 사실에 대해 "나는 누구인가 하는 질문을 머리 속에서 잊으려" 했던 것이라고 밝혔다. 2008년 '
     '대통령 후보 공개 토론(Civil Forum on the Presidency)에서 오바마는 자신의 고등학교 시절 마약에 손 댄 일이 '
     '자신의 "최대의 도덕적 과오"라고 말하였다.')
    [Answer Prediction from the model]: [CLS]

    統合後のODQAシステムの構築

    def open_domain_qa(query, corpus, vectorizer, model, tokenizer, k=1):
        # 1. Retrieve k relevant docs by usign sparse matrix
        _, doc_id = get_relevant_doc(vectorizer, query, k=1)
        context = corpus[doc_id.item()]
    
        # 2. Predict answer from given doc by using MRC model
        answer = get_answer_from_context(context, query, mrc_model, tokenizer)
        print("{} {} {}".format('*'*20, 'Result','*'*20))
        print("[Search query]\n", query, "\n")
        print(f"[Relevant Doc ID(Top 1 passage)]: {doc_id.item()}")
        pprint(corpus[doc_id.item()], compact=True)
        print(f"[Answer Prediction from the model]: {answer}")
    query = input("Enter any question: ") # "미국의 대통령은 누구인가?"
    open_domain_qa(query, corpus, vectorizer, mrc_model, tokenizer, k=1)
    Enter any question: 미국의 마지막 대통령은 누구인가
    ******************** Result ********************
    [Search query]
     미국의 마지막 대통령은 누구인가 
    
    [Relevant Doc ID(Top 1 passage)]: 7859
    ('리오넬 조스팽 전 프랑스 총리는 "김 대통령은 나에게 살아가야 할 힘, 살아가야 할 도덕적 스승이자 길잡이다"라고 극찬했다. 요하네스 '
     '라우 전 독일 대통령은 "김 대통령에 대한 존경심이 독일이 한국의 금융위기 때 한국을 돕는 동기가 됐다"라고 밝혔다. 빌 클린턴 전 미국 '
     '대통령은 한미 정상 백악관 기자회견에서 대북정책에 대해 "김 대통령은 지금 한반도의 정세를 본질적으로 변화시키는 전주곡을 연주하고 '
     '있습니다. 김 대통령의 일관된 비전과 강인한 의지는 이를 성공작으로 만들것이라 믿습니다. 그렇게 되면 국방예산을 줄여 사회복지를 늘릴 수 '
     '있겠지요"라고 평가했다. 클린턴 전 대통령이 김대중에게 "나에게 1년이라는 시간만 더 있었다면 한반도의 명운이 달라졌을 것"이라며 '
     '아쉬워했다고 밝혔다. 한종우 시러큐스 대학교 교수는 "김 전 대통령은 민주화에 가장 큰 공헌을 하셨고, IMF 경제위기를 극복하시고, '
     '북한과의 교류를 탄탄대로에 올려놓으셨다"라고 평가했다.')
    [Answer Prediction from the model]: 빌 클린턴