[{"data":1,"prerenderedAt":335},["ShallowReactive",2],{"content-\u002Fcontents\u002Fbertshap":3,"surroundPost-\u002Fcontents\u002Fbertshap":326},{"id":4,"title":5,"body":6,"createdAt":314,"description":86,"draft":315,"extension":316,"meta":317,"navigation":108,"path":318,"seo":319,"stem":320,"tags":321,"thumbnail":324,"updatedAt":314,"__hash__":325},"contents\u002Fcontents\u002Fbertshap.md","自然言語処理：BERTでSHAPを使用した説明性可視化",{"type":7,"value":8,"toc":307},"minimark",[9,13,16,19,22,25,30,33,36,39,50,54,57,60,63,71,80,231,234,239,242,246,249,252,255,258,261,264,270,278,281,284,295,303],[10,11,12],"p",{},"超雑記事です。",[10,14,15],{},"機械学習モデルの説明を与える手法として SHAP があります。",[10,17,18],{},"今回はこの SHAP を自然言語処理の機械学習に使用してみたいと思います。",[10,20,21],{},"使用するモデルは BERT です。",[10,23,24],{},"SHAP の説明はだいぶ大雑把なので SHAP の正確な理解をしたい場合は他の書籍やサイトを閲覧することをお勧めします。",[26,27,29],"h2",{"id":28},"shap-は何を見てる","SHAP は何を見てる？",[10,31,32],{},"model の出力に対する各特徴量の寄与度を計算しています。何を見ているか、と言うと入力の特徴量とモデル出力の関連でしょうか。",[10,34,35],{},"計算に使用されるのは学習済みのモデルとデータのみです。",[10,37,38],{},"SHAP はローカル説明性の手法とも言われています。（1 入力に対して、その入力のどこが重要だったかを提示するため）",[10,40,41,42,49],{},"より詳細な説明は",[43,44,48],"a",{"href":45,"rel":46},"https:\u002F\u002Fwww.datarobot.com\u002Fjp\u002Fblog\u002Fexplain-machine-learning-models-using-shap\u002F",[47],"nofollow","DataRobot さんの記事","が参考になります",[26,51,53],{"id":52},"bert-で-shap-を使う方法","BERT で SHAP を使う方法",[10,55,56],{},"早速使ってみます。",[10,58,59],{},"SHAP は Python で気軽に使うことができます。",[10,61,62],{},"使用するデータは livedoor です。",[10,64,65,66,70],{},"今回使用するファインチューニング済みの BERT は、事前学習済みモデルに",[67,68,69],"code",{},"cl-tohoku\u002Fbert-base-japanese-v2","、ファインチューニング時は livedoor データのうち後述する 4 つのラベルのみを使用しました。",[10,72,73,74,79],{},"以下がコードです。全て載せると冗長なので、重要な部分の抜粋です。\n詳しいことは",[43,75,78],{"href":76,"rel":77},"https:\u002F\u002Fshap.readthedocs.io\u002Fen\u002Flatest\u002Fexample_notebooks\u002Ftext_examples\u002Fsentiment_analysis\u002FEmotion%20classification%20multiclass%20example.html",[47],"SHAP: Emotion classification multiclass example","に記載されてます。",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-py shiki shiki-themes github-dark","from transformers import pipeline\nimport shap\n\n# ファインチューニング済みBERTのロード\nmodel = BertForSequenceClassification.from_pretrained(settings.pretrained_model, num_labels=4)\ntokenizer = BertJapaneseTokenizer.from_pretrained(\n        \"cl-tohoku\u002Fbert-base-japanese-v2\",\n        #do_subword_tokenize=False,\n        #mecab_kwargs={\"mecab_dic\": None, \"mecab_option\": \"-d 'C:\\mecab-unidic-neologd'\"\n    )\n\n\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\npred = pipeline(\"text-classification\", model=model, tokenizer=tokenizer, device=device, return_all_scores=True)\n\n# label_mapはlivedoorのラベルと学習時のラベルをマッピングさせるものです\nexplainer = shap.Explainer(pred, output_names=list(label_map.keys()))\n\n# filterd_test_dfは4つに絞ったlivedoorデータのdataframe\n# 512は今回のBERTの設定で指定したトークンの長さです。今回は3文書をテスト用にリスト化\ninput_text = [text[:512] for text in filterd_test_df.text[:3].tolist()]\n\nshap_values = explainer(input_text)\nshap.plots.text(shap_values)\n","py","",[67,88,89,97,103,110,116,122,128,134,140,146,152,157,162,168,174,179,185,191,196,202,208,214,219,225],{"__ignoreMap":86},[90,91,94],"span",{"class":92,"line":93},"line",1,[90,95,96],{},"from transformers import pipeline\n",[90,98,100],{"class":92,"line":99},2,[90,101,102],{},"import shap\n",[90,104,106],{"class":92,"line":105},3,[90,107,109],{"emptyLinePlaceholder":108},true,"\n",[90,111,113],{"class":92,"line":112},4,[90,114,115],{},"# ファインチューニング済みBERTのロード\n",[90,117,119],{"class":92,"line":118},5,[90,120,121],{},"model = BertForSequenceClassification.from_pretrained(settings.pretrained_model, num_labels=4)\n",[90,123,125],{"class":92,"line":124},6,[90,126,127],{},"tokenizer = BertJapaneseTokenizer.from_pretrained(\n",[90,129,131],{"class":92,"line":130},7,[90,132,133],{},"        \"cl-tohoku\u002Fbert-base-japanese-v2\",\n",[90,135,137],{"class":92,"line":136},8,[90,138,139],{},"        #do_subword_tokenize=False,\n",[90,141,143],{"class":92,"line":142},9,[90,144,145],{},"        #mecab_kwargs={\"mecab_dic\": None, \"mecab_option\": \"-d 'C:\\mecab-unidic-neologd'\"\n",[90,147,149],{"class":92,"line":148},10,[90,150,151],{},"    )\n",[90,153,155],{"class":92,"line":154},11,[90,156,109],{"emptyLinePlaceholder":108},[90,158,160],{"class":92,"line":159},12,[90,161,109],{"emptyLinePlaceholder":108},[90,163,165],{"class":92,"line":164},13,[90,166,167],{},"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",[90,169,171],{"class":92,"line":170},14,[90,172,173],{},"pred = pipeline(\"text-classification\", model=model, tokenizer=tokenizer, device=device, return_all_scores=True)\n",[90,175,177],{"class":92,"line":176},15,[90,178,109],{"emptyLinePlaceholder":108},[90,180,182],{"class":92,"line":181},16,[90,183,184],{},"# label_mapはlivedoorのラベルと学習時のラベルをマッピングさせるものです\n",[90,186,188],{"class":92,"line":187},17,[90,189,190],{},"explainer = shap.Explainer(pred, output_names=list(label_map.keys()))\n",[90,192,194],{"class":92,"line":193},18,[90,195,109],{"emptyLinePlaceholder":108},[90,197,199],{"class":92,"line":198},19,[90,200,201],{},"# filterd_test_dfは4つに絞ったlivedoorデータのdataframe\n",[90,203,205],{"class":92,"line":204},20,[90,206,207],{},"# 512は今回のBERTの設定で指定したトークンの長さです。今回は3文書をテスト用にリスト化\n",[90,209,211],{"class":92,"line":210},21,[90,212,213],{},"input_text = [text[:512] for text in filterd_test_df.text[:3].tolist()]\n",[90,215,217],{"class":92,"line":216},22,[90,218,109],{"emptyLinePlaceholder":108},[90,220,222],{"class":92,"line":221},23,[90,223,224],{},"shap_values = explainer(input_text)\n",[90,226,228],{"class":92,"line":227},24,[90,229,230],{},"shap.plots.text(shap_values)\n",[10,232,233],{},"以下が 1 つ目の文書の結果です。正解ラベルが sports に対して、スポーツ系の単語の寄与度が高いことがわかります。\nただ、日付の関連度が高いのは謎ですね。データを確認する必要がありそうです。",[235,236],"img",{"alt":237,"img-src":238},"BERT SHAP","\u002Fimg\u002Fbert-shap\u002Fshap1.png",[10,240,241],{},"試しにネットで拾った最近のスポーツに関する話題を入力してみました。",[235,243],{"alt":244,"img-src":245},"BERT SHAP2","\u002Fimg\u002Fbert-shap\u002Fshap2.png",[10,247,248],{},"やはりそれっぽい単語には着目してるようです。もしかして、数字が重要になってるのは点数とかが記事中に多く含まれるからなのかもしれない。",[26,250,251],{"id":251},"使った感想",[10,253,254],{},"SHAP を使用することで、なんとなくそれっぽい説明性が得られることがわかった。また SHAP 自体はかなり使いやすい。",[10,256,257],{},"一方で、SHAP で得られた結果の読み取り方がいまいちなのか「ん？」と思う結果もある。",[10,259,260],{},"加えて、 4 ラベルの結果を出力しているつもりなのだが、2 つ分のラベルの結果のみで、残り二つはどの単語も全く結果に貢献していないことになっている。\nライブラリ理解も必要。",[26,262,263],{"id":263},"ハマったところ",[10,265,266,269],{},[67,267,268],{},"shap.plots.text","の計算が終わらず、何故だろうと思っていたら以下の部分で入力が文章ではなく単語ごとのリストになっていた。",[81,271,272],{"className":83,"code":224,"language":85,"meta":86,"style":86},[67,273,274],{"__ignoreMap":86},[90,275,276],{"class":92,"line":93},[90,277,224],{},[10,279,280],{},"エラーにはならないので待ち時間分を溶かした",[26,282,283],{"id":283},"参考",[10,285,286,289,290],{},[90,287,288],{},"1"," ",[43,291,294],{"href":292,"rel":293},"https:\u002F\u002Famzn.to\u002F3E0O6Aq",[47],"機械学習を解釈する技術",[10,296,297,289,300],{},[90,298,299],{},"2",[43,301,78],{"href":76,"rel":302},[47],[304,305,306],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":86,"searchDepth":99,"depth":99,"links":308},[309,310,311,312,313],{"id":28,"depth":99,"text":29},{"id":52,"depth":99,"text":53},{"id":251,"depth":99,"text":251},{"id":263,"depth":99,"text":263},{"id":283,"depth":99,"text":283},"2022-09-25",false,"md",{},"\u002Fcontents\u002Fbertshap",{"title":5,"description":86},"contents\u002Fbertshap",[322,323],"2022","機械学習","\u002Fimg\u002Ftwitter-card.png","pULMDm4gr7lrzUyR4Y69oGjHQA6bAyQuBgVVNgWtgkE",[327,331],{"title":328,"path":329,"stem":330,"children":-1},"Bayesian-Agent: Posterior-Guided Skill Evolution for LLM Agent Harnesses","\u002Fcontents\u002Fbayesian-agent","contents\u002Fbayesian-agent",{"title":332,"path":333,"stem":334,"children":-1},"BM25 Wins at Scale: A Scaling Study of Retrieval-Augmented Generation Paradigms","\u002Fcontents\u002Fbm25-wins-at-scale","contents\u002Fbm25-wins-at-scale",1785870871172]